Skip to content

Commit

Permalink
p521: add ecdh feature (#954)
Browse files Browse the repository at this point in the history
Adds a feature for performing elliptic curve Diffie-Hellman
  • Loading branch information
tarcieri authored Nov 3, 2023
1 parent 3a19153 commit 8d3b67e
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 0 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions p521/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@ base16ct = "0.2.0"
[dev-dependencies]
hex-literal = "0.4"
primeorder = { version = "0.13.3", features = ["dev"], path = "../primeorder" }
rand_core = { version = "0.6", features = ["getrandom"] }

[features]
default = ["arithmetic", "pem", "std"]
alloc = ["elliptic-curve/alloc"]
std = ["alloc", "elliptic-curve/std"]

arithmetic = ["dep:primeorder"]
ecdh = ["arithmetic", "elliptic-curve/ecdh"]
jwk = ["elliptic-curve/jwk"]
pem = ["elliptic-curve/pem", "pkcs8"]
pkcs8 = ["elliptic-curve/pkcs8"]
Expand Down
47 changes: 47 additions & 0 deletions p521/src/ecdh.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
//! Elliptic Curve Diffie-Hellman (Ephemeral) Support.
//!
//! This module contains a high-level interface for performing ephemeral
//! Diffie-Hellman key exchanges using the secp521r1 elliptic curve.
//!
//! # Usage
//!
//! This usage example is from the perspective of two participants in the
//! exchange, nicknamed "Alice" and "Bob".
//!
//! ```
//! use p521::{EncodedPoint, PublicKey, ecdh::EphemeralSecret};
//! use rand_core::OsRng; // requires 'getrandom' feature
//!
//! // Alice
//! let alice_secret = EphemeralSecret::random(&mut OsRng);
//! let alice_pk_bytes = EncodedPoint::from(alice_secret.public_key());
//!
//! // Bob
//! let bob_secret = EphemeralSecret::random(&mut OsRng);
//! let bob_pk_bytes = EncodedPoint::from(bob_secret.public_key());
//!
//! // Alice decodes Bob's serialized public key and computes a shared secret from it
//! let bob_public = PublicKey::from_sec1_bytes(bob_pk_bytes.as_ref())
//! .expect("bob's public key is invalid!"); // In real usage, don't panic, handle this!
//!
//! let alice_shared = alice_secret.diffie_hellman(&bob_public);
//!
//! // Bob decodes Alice's serialized public key and computes the same shared secret
//! let alice_public = PublicKey::from_sec1_bytes(alice_pk_bytes.as_ref())
//! .expect("alice's public key is invalid!"); // In real usage, don't panic, handle this!
//!
//! let bob_shared = bob_secret.diffie_hellman(&alice_public);
//!
//! // Both participants arrive on the same shared secret
//! assert_eq!(alice_shared.raw_secret_bytes(), bob_shared.raw_secret_bytes());
//! ```

pub use elliptic_curve::ecdh::diffie_hellman;

use crate::NistP521;

/// NIST P-521 Ephemeral Diffie-Hellman Secret.
pub type EphemeralSecret = elliptic_curve::ecdh::EphemeralSecret<NistP521>;

/// Shared secret value computed via ECDH key agreement.
pub type SharedSecret = elliptic_curve::ecdh::SharedSecret<NistP521>;
7 changes: 7 additions & 0 deletions p521/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
#[cfg(feature = "arithmetic")]
pub mod arithmetic;

#[cfg(feature = "ecdh")]
pub mod ecdh;

#[cfg(any(feature = "test-vectors", test))]
pub mod test_vectors;

Expand Down Expand Up @@ -82,6 +85,10 @@ pub type FieldBytes = elliptic_curve::FieldBytes<NistP521>;

impl FieldBytesEncoding<NistP521> for U576 {}

/// NIST P-521 public key.
#[cfg(feature = "arithmetic")]
pub type PublicKey = elliptic_curve::PublicKey<NistP521>;

/// NIST P-521 secret key.
pub type SecretKey = elliptic_curve::SecretKey<NistP521>;

Expand Down

0 comments on commit 8d3b67e

Please sign in to comment.