Skip to content

elliptic-curve: simplify BatchInvert trait#2455

Merged
tarcieri merged 1 commit into
masterfrom
batchinvert-redux
Jun 21, 2026
Merged

elliptic-curve: simplify BatchInvert trait#2455
tarcieri merged 1 commit into
masterfrom
batchinvert-redux

Conversation

@tarcieri

@tarcieri tarcieri commented Jun 21, 2026

Copy link
Copy Markdown
Member

The previous BatchInvert trait was based on blanket impls bounded by Field, unfortunately k256 needs to provide its own to handle normalization.

The new version operates in-place requiring a temporary buffer, whereas the previous version return a value. This winds up making the generic implementation of something like batch normalization significantly simpler, since it can be in complete charge of the storage. It also means we don't need separate methods for arrays vs slices / Vec.

I'm sure we discussed and considered that at one point in the past and I probably said no at the time, but this style of API makes the downstream code significantly simpler.

Also, rather than blanket impls it has a generic provided implementation which can work everywhere except k256, which needs to do its own normalization.

Companion PR: RustCrypto/elliptic-curves#1829

The previous `BatchInvert` trait was based on blanket impls bounded by
`Field`, unfortunately `k256` needs to provide its own to handle
normalization.

The new version operates in-place requiring a temporary buffer, whereas
the previous version return a value. This winds up making the generic
implementation of something like batch normalization significantly
simpler, since it can be in complete charge of the storage. It also
means we don't need separate methods for arrays vs slices / `Vec`.

I'm sure we discussed and considered that at one point in the past and I
probably said no at the time, but this style of API makes the downstream
code *significantly* simpler.

Also, rather than blanket impls it has a generic provided implementation
which can work everywhere except `k256`, which needs to do its own
normalization.
@tarcieri tarcieri force-pushed the batchinvert-redux branch from 94dee16 to b3b04e0 Compare June 21, 2026 02:45
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Jun 21, 2026
Companion PR to RustCrypto/traits#2455, which switches to in-place batch
inversion.

This massively simplifies the batch normalization implementation which
no longer requires a litany of generic parameters to abstract over
slices versus arrays because it accepts a temporary storage buffer the
caller can allocate however they choose.

It requires every curve add an `impl BatchInvert for FieldElement` but
also lets curves provide their own implementation, which is needed for
`k256` due to its lazy normalization.
@tarcieri tarcieri merged commit 592e9c3 into master Jun 21, 2026
15 checks passed
@tarcieri tarcieri deleted the batchinvert-redux branch June 21, 2026 03:00
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Jun 21, 2026
Companion PR to RustCrypto/traits#2455, which switches to in-place batch
inversion.

This massively simplifies the batch normalization implementation which
no longer requires a litany of generic parameters to abstract over
slices versus arrays because it accepts a temporary storage buffer the
caller can allocate however they choose.

It requires every curve add an `impl BatchInvert for FieldElement` but
also lets curves provide their own implementation, which is needed for
`k256` due to its lazy normalization.
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Jun 21, 2026
Companion PR to RustCrypto/traits#2455, which switches to in-place batch
inversion.

This massively simplifies the batch normalization implementation which
no longer requires a litany of generic parameters to abstract over
slices versus arrays because it accepts a temporary storage buffer the
caller can allocate however they choose.

It requires every curve add an `impl BatchInvert for FieldElement` but
also lets curves provide their own implementation, which is needed for
`k256` due to its lazy normalization.
tarcieri added a commit that referenced this pull request Jun 21, 2026
Instead of supplying our own generic implementation of Montgomery's
trick, we can use the one in `ff` supplied by `BatchInverter`, which
just so happens to have a signature that's very close to the one we
switched to in #2455 (great minds think alike).

The main difference between that PR and what `BatchInverter` provides is
instead of returning a `Choice` in the event of zero elements, it
ignores them and returns the inverse of the product of all non-zero
field elements.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant