Skip to content

Commit d961f5b

Browse files
Add support for Ed448 signature verification and update dependencies
1 parent 4aafdf7 commit d961f5b

File tree

6 files changed

+144
-5
lines changed

6 files changed

+144
-5
lines changed

Cargo.lock

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ signature = { version = "3.0.0-rc.3", default-features = false, optional = true
4444
typenum = { version = "1.18.0", features = ["no_std", "const-generics"] }
4545
x25519-dalek = { version = "3.0.0-pre.1", default-features = false, optional = true }
4646
x448 = { version = "0.14.0-pre.0", default-features = false, optional = true }
47+
ed448-goldilocks = { version = "0.14.0-pre.3", default-features = false, optional = true }
4748

4849
# External groups
4950
pki-types = { package = "rustls-pki-types", version = "1.12.0", default-features = false }
@@ -84,9 +85,10 @@ tls12 = ["rustls/tls12"]
8485

8586
# RustCrypto is preparing to migrate to core::error::Error
8687
# and in before most of the use case for std is just std::error::Error
87-
std = ["alloc", "rustls/std"]
88+
std = ["alloc", "rustls/std", "ed448-goldilocks?/std"]
8889
alloc = [
8990
"ecdsa?/alloc",
91+
"ed448-goldilocks?/alloc",
9092
"elliptic-curve?/alloc",
9193
"pkcs8?/alloc",
9294
"sec1?/alloc",
@@ -113,6 +115,7 @@ p256 = ["dep:p256", "nist", "p256/pkcs8"]
113115
p384 = ["dep:p384", "nist", "p384/pkcs8"]
114116
p521 = ["dep:p521", "nist"]
115117
ed25519 = ["dep:ed25519-dalek"]
118+
ed448 = ["dep:ed448-goldilocks"]
116119

117120
ecdsa = ["dep:ecdsa", "verify", "signature", "rand", "der", "elliptic-curve"]
118121
ecdsa-p256 = ["ecdsa", "p256", "p256/ecdsa"]
@@ -122,7 +125,8 @@ ecdsa-full = ["ecdsa-p256", "ecdsa-p384", "ecdsa-p521"]
122125

123126
eddsa = ["verify", "signature", "elliptic-curve"]
124127
eddsa-ed25519 = ["eddsa", "ed25519"]
125-
eddsa-full = ["eddsa-ed25519"]
128+
eddsa-ed448 = ["eddsa", "ed448"]
129+
eddsa-full = ["eddsa-ed25519", "eddsa-ed448"]
126130

127131
kx = ["rand", "elliptic-curve"]
128132
kx-x448 = ["kx", "x448"]
@@ -150,6 +154,7 @@ sign-ecdsa-p384 = ["sign-ecdsa-nist", "ecdsa-p384"]
150154
sign-ecdsa-p521 = ["sign-ecdsa-nist", "ecdsa-p521"]
151155
sign-eddsa = ["sign"]
152156
sign-eddsa-ed25519 = ["sign-eddsa", "eddsa-ed25519"]
157+
sign-eddsa-ed448 = ["sign-eddsa", "eddsa-ed448", "ed448-goldilocks?/signing"]
153158
sign-rsa = ["sign", "rsa"]
154159
sign-rsa-pkcs1 = ["sign-rsa", "rsa-pkcs1"]
155160
sign-rsa-pss = ["sign-rsa", "rsa-pss"]
@@ -158,6 +163,7 @@ sign-full = [
158163
"sign-ecdsa-p384",
159164
"sign-ecdsa-p521",
160165
"sign-eddsa-ed25519",
166+
"sign-eddsa-ed448",
161167
"sign-rsa-pkcs1",
162168
"sign-rsa-pss",
163169
]
@@ -178,6 +184,7 @@ verify-ecdsa-p521-sha384 = ["verify-ecdsa-p521", "hash-sha384"]
178184
verify-ecdsa-p521-sha512 = ["verify-ecdsa-p521", "hash-sha512"]
179185
verify-eddsa = ["verify"]
180186
verify-eddsa-ed25519 = ["verify-eddsa", "eddsa-ed25519"]
187+
verify-eddsa-ed448 = ["verify-eddsa", "eddsa-ed448"]
181188
verify-rsa = ["verify"]
182189
verify-rsa-pkcs1 = ["verify-rsa", "rsa-pkcs1"]
183190
verify-rsa-pkcs1-sha256 = ["verify-rsa-pkcs1", "hash-sha256"]
@@ -198,6 +205,7 @@ verify-full = [
198205
"verify-ecdsa-p521-sha384",
199206
"verify-ecdsa-p521-sha512",
200207
"verify-eddsa-ed25519",
208+
"verify-eddsa-ed448",
201209
"verify-rsa-pkcs1-sha256",
202210
"verify-rsa-pkcs1-sha384",
203211
"verify-rsa-pkcs1-sha512",
@@ -216,12 +224,13 @@ hash-full = ["hash-sha224", "hash-sha256", "hash-sha384", "hash-sha512"]
216224
# Formats
217225
der = ["dep:der", "sec1?/der"]
218226
sec1 = ["dep:sec1", "elliptic-curve?/sec1"]
219-
pem = ["elliptic-curve?/pem", "ecdsa?/pem"]
227+
pem = ["elliptic-curve?/pem", "ecdsa?/pem", "ed25519-dalek?/pem"]
220228
pkcs1 = ["dep:pkcs1", "rsa?/encoding"]
221229
pkcs8 = [
222230
"dep:pkcs8",
223231
"ecdsa?/pkcs8",
224232
"ed25519-dalek?/pkcs8",
233+
"ed448-goldilocks?/pkcs8",
225234
"elliptic-curve?/pkcs8",
226235
"p256?/pkcs8",
227236
"p384?/pkcs8",

src/verify.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,8 @@ pub const ALGORITHMS: WebPkiSupportedAlgorithms = WebPkiSupportedAlgorithms {
211211
&[
212212
#[cfg(feature = "eddsa-ed25519")]
213213
eddsa::ed25519::ED25519,
214+
// #[cfg(feature = "eddsa-ed448")]
215+
// eddsa::ed448::ED448,
214216
]
215217
}
216218

src/verify/eddsa.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
#[cfg(feature = "verify-eddsa-ed25519")]
2-
pub mod ed25519;
1+
#[cfg(feature = "verify-eddsa-ed25519")]
2+
pub mod ed25519;
3+
4+
#[cfg(feature = "verify-eddsa-ed448")]
5+
pub mod ed448;

src/verify/eddsa/ed448.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use ed448_goldilocks::{Signature, VerifyingKey};
2+
use pki_types::{AlgorithmIdentifier, InvalidSignature, SignatureVerificationAlgorithm};
3+
use signature::Verifier;
4+
5+
#[derive(Debug)]
6+
pub struct Ed448Verify;
7+
8+
impl Ed448Verify {
9+
fn verify_inner(
10+
public_key: &[u8],
11+
message: &[u8],
12+
signature: &[u8],
13+
) -> Result<(), crate::verify::Error> {
14+
let public_key = public_key.try_into()?;
15+
let signature = Signature::from_slice(signature)?;
16+
let verifying_key = VerifyingKey::from_bytes(public_key)?;
17+
verifying_key.verify(message, &signature)?;
18+
Ok(())
19+
}
20+
}
21+
22+
impl SignatureVerificationAlgorithm for Ed448Verify {
23+
fn public_key_alg_id(&self) -> AlgorithmIdentifier {
24+
todo!()
25+
}
26+
27+
fn signature_alg_id(&self) -> AlgorithmIdentifier {
28+
todo!()
29+
}
30+
31+
fn verify_signature(
32+
&self,
33+
public_key: &[u8],
34+
message: &[u8],
35+
signature: &[u8],
36+
) -> Result<(), InvalidSignature> {
37+
Self::verify_inner(public_key, message, signature).map_err(|_| InvalidSignature)
38+
}
39+
}
40+
41+
pub const ED448: &dyn SignatureVerificationAlgorithm = &Ed448Verify;

validation/rustls-real-socket-test/Cargo.lock

Lines changed: 68 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)