From 4af7c384fef06c8305d85abde5fb935a9e4f172a Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon Date: Sun, 2 Mar 2025 21:20:49 -0500 Subject: [PATCH 1/8] implement KeyInit for SigningKey --- ed25519-dalek/src/signing.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ed25519-dalek/src/signing.rs b/ed25519-dalek/src/signing.rs index f3c1053b2..3f505c4ab 100644 --- a/ed25519-dalek/src/signing.rs +++ b/ed25519-dalek/src/signing.rs @@ -20,7 +20,7 @@ use rand_core::CryptoRngCore; #[cfg(feature = "serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use sha2::Sha512; +use sha2::{digest::{consts::U32, crypto_common::KeySizeUser, KeyInit}, Sha512}; use subtle::{Choice, ConstantTimeEq}; use curve25519_dalek::{ @@ -536,6 +536,16 @@ impl SigningKey { } } +impl KeySizeUser for SigningKey { + type KeySize = U32; +} + +impl KeyInit for SigningKey { + fn new(key: &sha2::digest::Key) -> Self { + Self::from_bytes(key.as_ref()) + } +} + impl AsRef for SigningKey { fn as_ref(&self) -> &VerifyingKey { &self.verifying_key From 878ade7e2532df75961d6e2a4e69e07bbf5d4e32 Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon Date: Tue, 4 Mar 2025 19:11:05 -0500 Subject: [PATCH 2/8] move behind "digest" feature --- ed25519-dalek/src/signing.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ed25519-dalek/src/signing.rs b/ed25519-dalek/src/signing.rs index 3f505c4ab..c3c2c8b3c 100644 --- a/ed25519-dalek/src/signing.rs +++ b/ed25519-dalek/src/signing.rs @@ -20,11 +20,15 @@ use rand_core::CryptoRngCore; #[cfg(feature = "serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use sha2::{digest::{consts::U32, crypto_common::KeySizeUser, KeyInit}, Sha512}; +use sha2::Sha512; use subtle::{Choice, ConstantTimeEq}; use curve25519_dalek::{ - digest::{generic_array::typenum::U64, Digest}, + digest::{ + crypto_common::KeySizeUser, + generic_array::typenum::{U32, U64}, + Digest, KeyInit, + }, edwards::{CompressedEdwardsY, EdwardsPoint}, scalar::Scalar, }; @@ -536,10 +540,12 @@ impl SigningKey { } } +#[cfg(feature = "digest")] impl KeySizeUser for SigningKey { type KeySize = U32; } +#[cfg(feature = "digest")] impl KeyInit for SigningKey { fn new(key: &sha2::digest::Key) -> Self { Self::from_bytes(key.as_ref()) From 1a6ea176d4e984e23b5989c5cd6d0c254415f1ed Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon Date: Tue, 4 Mar 2025 19:14:23 -0500 Subject: [PATCH 3/8] implement KeySizeUser for VerifyingKey --- ed25519-dalek/src/verifying.rs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ed25519-dalek/src/verifying.rs b/ed25519-dalek/src/verifying.rs index 2bb40ebd7..1ac5d5c77 100644 --- a/ed25519-dalek/src/verifying.rs +++ b/ed25519-dalek/src/verifying.rs @@ -13,7 +13,11 @@ use core::fmt::Debug; use core::hash::{Hash, Hasher}; use curve25519_dalek::{ - digest::{generic_array::typenum::U64, Digest}, + digest::{ + crypto_common::KeySizeUser, + generic_array::typenum::{U32, U64}, + Digest, + }, edwards::{CompressedEdwardsY, EdwardsPoint}, montgomery::MontgomeryPoint, scalar::Scalar, @@ -109,6 +113,11 @@ impl From for VerifyingKey { } } +#[cfg(feature = "digest")] +impl KeySizeUser for VerifyingKey { + type KeySize = U32; +} + impl VerifyingKey { /// Convert this public key to a byte array. #[inline] From 0fcca09c8e6b2675c0ac84b130483b5861f5a4d3 Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon Date: Sat, 8 Mar 2025 21:03:53 -0500 Subject: [PATCH 4/8] move imports behind "digest" feature --- ed25519-dalek/src/signing.rs | 9 ++++----- ed25519-dalek/src/verifying.rs | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/ed25519-dalek/src/signing.rs b/ed25519-dalek/src/signing.rs index c3c2c8b3c..291a706c7 100644 --- a/ed25519-dalek/src/signing.rs +++ b/ed25519-dalek/src/signing.rs @@ -20,15 +20,14 @@ use rand_core::CryptoRngCore; #[cfg(feature = "serde")] use serde::{Deserialize, Deserializer, Serialize, Serializer}; +#[cfg(feature = "digest")] +use curve25519_dalek::digest::{crypto_common::KeySizeUser, typenum::U32, KeyInit}; + use sha2::Sha512; use subtle::{Choice, ConstantTimeEq}; use curve25519_dalek::{ - digest::{ - crypto_common::KeySizeUser, - generic_array::typenum::{U32, U64}, - Digest, KeyInit, - }, + digest::{generic_array::typenum::U64, Digest}, edwards::{CompressedEdwardsY, EdwardsPoint}, scalar::Scalar, }; diff --git a/ed25519-dalek/src/verifying.rs b/ed25519-dalek/src/verifying.rs index 1ac5d5c77..991869ef4 100644 --- a/ed25519-dalek/src/verifying.rs +++ b/ed25519-dalek/src/verifying.rs @@ -9,15 +9,14 @@ //! ed25519 public keys. +#[cfg(feature = "digest")] +use curve25519_dalek::digest::{crypto_common::KeySizeUser, typenum::U32}; + use core::fmt::Debug; use core::hash::{Hash, Hasher}; use curve25519_dalek::{ - digest::{ - crypto_common::KeySizeUser, - generic_array::typenum::{U32, U64}, - Digest, - }, + digest::{generic_array::typenum::U64, Digest}, edwards::{CompressedEdwardsY, EdwardsPoint}, montgomery::MontgomeryPoint, scalar::Scalar, From 8898298b6fd2c5fc6ed980c0bde7dfb759bb1d0a Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon Date: Sat, 8 Mar 2025 21:08:28 -0500 Subject: [PATCH 5/8] update "digest" feature description --- ed25519-dalek/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ed25519-dalek/README.md b/ed25519-dalek/README.md index 364d08538..5381629e3 100644 --- a/ed25519-dalek/README.md +++ b/ed25519-dalek/README.md @@ -22,7 +22,7 @@ This crate is `#[no_std]` compatible with `default-features = false`. | `zeroize` | ✓ | Implements `Zeroize` and `ZeroizeOnDrop` for `SigningKey` | | `rand_core` | | Enables `SigningKey::generate` | | `batch` | | Enables `verify_batch` for verifying many signatures quickly. Also enables `rand_core`. | -| `digest` | | Enables `Context`, `SigningKey::{with_context, sign_prehashed}` and `VerifyingKey::{with_context, verify_prehashed, verify_prehashed_strict}` for Ed25519ph prehashed signatures | +| `digest` | | Enables `Context`, `SigningKey::{with_context, sign_prehashed}` and `VerifyingKey::{with_context, verify_prehashed, verify_prehashed_strict}` for Ed25519ph prehashed signatures. Also implements `KeySizeUser` for `SigningKey` and `VerifyingKey`, and implements `KeyInit` for `SigningKey`. | | `asm` | | Enables assembly optimizations in the SHA-512 compression functions | | `pkcs8` | | Enables [PKCS#8](https://en.wikipedia.org/wiki/PKCS_8) serialization/deserialization for `SigningKey` and `VerifyingKey` | | `pem` | | Enables PEM serialization support for PKCS#8 private keys and SPKI public keys. Also enables `alloc`. | From 3d36f7224199fd4fc973898d74e33ce01e00562b Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon Date: Sun, 23 Mar 2025 21:12:37 -0400 Subject: [PATCH 6/8] fix import statements --- ed25519-dalek/src/signing.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ed25519-dalek/src/signing.rs b/ed25519-dalek/src/signing.rs index 291a706c7..29b53679d 100644 --- a/ed25519-dalek/src/signing.rs +++ b/ed25519-dalek/src/signing.rs @@ -21,7 +21,7 @@ use rand_core::CryptoRngCore; use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[cfg(feature = "digest")] -use curve25519_dalek::digest::{crypto_common::KeySizeUser, typenum::U32, KeyInit}; +use curve25519_dalek::digest::{crypto_common::{KeySizeUser, KeyInit, Key}, typenum::U32}; use sha2::Sha512; use subtle::{Choice, ConstantTimeEq}; @@ -546,7 +546,7 @@ impl KeySizeUser for SigningKey { #[cfg(feature = "digest")] impl KeyInit for SigningKey { - fn new(key: &sha2::digest::Key) -> Self { + fn new(key: &Key) -> Self { Self::from_bytes(key.as_ref()) } } From 85ff36e9155c71fd81388facd9f2e884d80b8657 Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon Date: Mon, 17 Nov 2025 21:02:59 -0500 Subject: [PATCH 7/8] Remove KeyInit impl remove unused imports --- ed25519-dalek/src/signing.rs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/ed25519-dalek/src/signing.rs b/ed25519-dalek/src/signing.rs index 4bfbfc47a..3f7c98e75 100644 --- a/ed25519-dalek/src/signing.rs +++ b/ed25519-dalek/src/signing.rs @@ -21,7 +21,7 @@ use rand_core::CryptoRng; use serde::{Deserialize, Deserializer, Serialize, Serializer}; #[cfg(feature = "digest")] -use curve25519_dalek::digest::{crypto_common::{KeySizeUser, KeyInit, Key}, typenum::U32}; +use curve25519_dalek::digest::{crypto_common::KeySizeUser, typenum::U32}; use sha2::Sha512; use subtle::{Choice, ConstantTimeEq}; @@ -557,13 +557,6 @@ impl KeySizeUser for SigningKey { type KeySize = U32; } -#[cfg(feature = "digest")] -impl KeyInit for SigningKey { - fn new(key: &Key) -> Self { - Self::from_bytes(key.as_ref()) - } -} - impl AsRef for SigningKey { fn as_ref(&self) -> &VerifyingKey { &self.verifying_key From 446c3c0a94420913da01f4f39be3f4e8a7f3a1fc Mon Sep 17 00:00:00 2001 From: Charles Edward Gagnon Date: Mon, 17 Nov 2025 21:16:23 -0500 Subject: [PATCH 8/8] fix README --- ed25519-dalek/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ed25519-dalek/README.md b/ed25519-dalek/README.md index 9aaab1fa8..f22a8d1c6 100644 --- a/ed25519-dalek/README.md +++ b/ed25519-dalek/README.md @@ -21,9 +21,8 @@ This crate is `#[no_std]` compatible with `default-features = false`. | `fast` | ✓ | Enables the use of precomputed tables for curve arithmetic. Makes key generation, signing, and verifying faster. | | `zeroize` | ✓ | Implements `Zeroize` and `ZeroizeOnDrop` for `SigningKey` | | `rand_core` | | Enables `SigningKey::generate` | -| `batch` | | Enables `verify_batch` for verifying many signatures quickly. Also enables `rand_core`. | -| `digest` | | Enables `Context`, `SigningKey::{with_context, sign_prehashed}` and `VerifyingKey::{with_context, verify_prehashed, verify_prehashed_strict}` for Ed25519ph prehashed signatures. Also implements `KeySizeUser` for `SigningKey` and `VerifyingKey`, and implements `KeyInit` for `SigningKey`. | -| `asm` | | Enables assembly optimizations in the SHA-512 compression functions | +| `batch` | | Enables `verify_batch` for verifying many signatures quickly. Also enables `alloc` and `rand_core`. | +| `digest` | | Enables `Context`, `SigningKey::{with_context, sign_prehashed}` and `VerifyingKey::{with_context, verify_prehashed, verify_prehashed_strict}` for Ed25519ph prehashed signatures. Also implements `KeySizeUser` for `SigningKey` and `VerifyingKey`. | | `pkcs8` | | Enables [PKCS#8](https://en.wikipedia.org/wiki/PKCS_8) serialization/deserialization for `SigningKey` and `VerifyingKey` | | `pem` | | Enables PEM serialization support for PKCS#8 private keys and SPKI public keys. Also enables `alloc`. | | `legacy_compatibility` | | **Unsafe:** Disables certain signature checks. See [below](#malleability-and-the-legacy_compatibility-feature) |