Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ecdsa: add hazmat primitives; remove/reverse curve dependencies #96

Merged
merged 1 commit into from
Jul 13, 2020

Conversation

tarcieri
Copy link
Member

Adds "hazmat" ECDSA signing and verification traits intended to be implemented by individual elliptic curve implementations:

  • SignPrimitive: intended to be implemented on Scalar
  • VerifyPrimitive: intended to be implemented on AffinePoint

The traits are generic over elliptic curves, allowing one type to potentially support multiple curves. This is potentially useful for things like FFI bindings to multi-curve libraries, or host libraries for hardware devices which support ECDSA signing for multiple elliptic curves.

These traits must be consumed directly by elliptic curve implementations, which means we need to reverse the current relationship where the ecdsa crate has optional features for k256, p256, and p384.

Instead, we can add an ecdsa feature to the k256, p256, and p384 crates which optionally pulls this crate in.

With the dependency relationship reversed, we can support an open ended number of elliptic curves including 3rd party non-RustCrypto implementations (as well as 3rd party ECDSA implementations ala aforementioned hardware tokens).

This allows the ecdsa crate to focus on only the high-level details of the ECDSA algorithm, like RFC 6979 deterministic signatures.

It also allows for wrapping complete ECDSA implementations, including assembly optimized ECDSA primitives or things like hardware accelerators.

@tarcieri tarcieri changed the title ecdsa: add hazmat primitives; remove/reverse curve deps ecdsa: add hazmat primitives; remove/reverse curve dependencies Jul 12, 2020
@tarcieri tarcieri force-pushed the ecdsa/hazmat-primitives branch 2 times, most recently from f8620cd to 3ed7d6d Compare July 12, 2020 02:37
@codecov-commenter
Copy link

codecov-commenter commented Jul 12, 2020

Codecov Report

Merging #96 into master will not change coverage.
The diff coverage is n/a.

Impacted file tree graph

@@          Coverage Diff           @@
##           master     #96   +/-   ##
======================================
  Coverage    0.00%   0.00%           
======================================
  Files           6       4    -2     
  Lines         209     179   -30     
======================================
+ Misses        209     179   -30     
Impacted Files Coverage Δ
ecdsa/src/asn1_signature.rs 0.00% <ø> (ø)
ecdsa/src/convert.rs 0.00% <ø> (ø)
ecdsa/src/fixed_signature.rs 0.00% <ø> (ø)

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 9d8f4b6...9eb75b4. Read the comment docs.

Adds "hazmat" ECDSA signing and verification traits intended to be
implemented by individual elliptic curve implementations:

- `SignPrimitive`: intended to be implemented on `Scalar`
- `VerifyPrimitive`: intended to be implemented on `AffinePoint`

The traits are generic over elliptic curves, allowing one type to
potentially support multiple curves. This is potentially useful for
things like FFI bindings to multi-curve libraries, or host libraries for
hardware devices which support ECDSA signing for multiple elliptic
curves.

These traits must be consumed directly by elliptic curve
implementations, which means we need to reverse the current relationship
where the `ecdsa` crate has optional features for `k256`, `p256`, and
`p384`.

Instead, we can add an `ecdsa` feature to the `k256`, `p256`, and `p384`
crates which optionally pulls this crate in.

With the dependency relationship reversed, we can support an open ended
number of elliptic curves including 3rd party non-RustCrypto
implementations (as well as 3rd party ECDSA implementations ala
afforementioned hardware tokens).

This allows the `ecdsa` crate to focus on only the high-level details of
the ECDSA algorithm, like RFC 6979 deterministic signatures.

It also allows for wrapping complete ECDSA implementations, including
assembly optimized ECDSA primitives or things like hardware
accelerators.
@tarcieri tarcieri force-pushed the ecdsa/hazmat-primitives branch from a3aac91 to 9eb75b4 Compare July 13, 2020 14:05
@tarcieri tarcieri merged commit 30390b3 into master Jul 13, 2020
@tarcieri tarcieri deleted the ecdsa/hazmat-primitives branch July 13, 2020 14:33
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Jul 14, 2020
The equivalents of these types used to live in the `ecdsa` crate, but
were removed in this PR:

RustCrypto/signatures#96

The goal of that PR was to reverse the previous relationship where the
`ecdsa` crate depended on the `k256`/`p256`/`p384` crates, and instead
have the curve implementation crates consume the `ecdsa` crate as an
(optional) dependency.

It makes each curve implementation a one-stop-shop for everything
related to that curve, while allowing the ECDSA crate to provide some
common functionality like ASN.1 (de)serialization, in addition to
allowing it to export "primitive" traits which can be used with the
goal of a reusable high-level ECDSA implementation which is generic over
elliptic curves.

This commit ports over equivalent types that were removed in
`RustCrypto/signatures#96`, but also incorporates these changes:

RustCrypto/signatures#98

Where the `ecdsa` crate previously had `Asn1Signature` and
`FixedSignature` types generic over a curve, the PR above refactored it
to make the "fixed" form the preferred `Signature` type, and refactoring
ASN.1 DER support into an `ecdsa::asn1::Document` type.

The nice advantage of that approach is it means the curve
implementations no longer need to worry about an `Asn1Signature` type
and can focus on `ecdsa::Signature` as the type they need to support.
tarcieri added a commit to RustCrypto/elliptic-curves that referenced this pull request Jul 14, 2020
The equivalents of these types used to live in the `ecdsa` crate, but
were removed in this PR:

RustCrypto/signatures#96

The goal of that PR was to reverse the previous relationship where the
`ecdsa` crate depended on the `k256`/`p256`/`p384` crates, and instead
have the curve implementation crates consume the `ecdsa` crate as an
(optional) dependency.

It makes each curve implementation a one-stop-shop for everything
related to that curve, while allowing the ECDSA crate to provide some
common functionality like ASN.1 (de)serialization, in addition to
allowing it to export "primitive" traits which can be used with the
goal of a reusable high-level ECDSA implementation which is generic over
elliptic curves.

This commit ports over equivalent types that were removed in
`RustCrypto/signatures#96`, but also incorporates these changes:

RustCrypto/signatures#98

Where the `ecdsa` crate previously had `Asn1Signature` and
`FixedSignature` types generic over a curve, the PR above refactored it
to make the "fixed" form the preferred `Signature` type, and refactoring
ASN.1 DER support into an `ecdsa::asn1::Document` type.

The nice advantage of that approach is it means the curve
implementations no longer need to worry about an `Asn1Signature` type
and can focus on `ecdsa::Signature` as the type they need to support.
@tarcieri tarcieri mentioned this pull request Aug 11, 2020
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.

2 participants