Skip to content

Commit 4f45d3d

Browse files
authored
impl AsDer<PublicKeyX509Der<'static>> for ParsedPublicKey (#885)
1 parent 4895a79 commit 4f45d3d

File tree

7 files changed

+47
-4
lines changed

7 files changed

+47
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@ deps/aws-lc-sys/src/bindings.rs
2020
/Cargo.lock
2121

2222
lcov.info
23+
/.zed/

aws-lc-rs/src/rsa/signature.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::aws_lc::{
1212
use crate::digest::{self, match_digest_type, Digest};
1313
use crate::error::Unspecified;
1414
use crate::ptr::LcPtr;
15+
use crate::rsa::key::parse_rsa_public_key;
1516
use crate::sealed::Sealed;
1617
use crate::signature::{ParsedPublicKey, ParsedVerificationAlgorithm, VerificationAlgorithm};
1718

@@ -108,7 +109,7 @@ impl VerificationAlgorithm for RsaParameters {
108109
msg: &[u8],
109110
signature: &[u8],
110111
) -> Result<(), Unspecified> {
111-
let evp_pkey = encoding::rfc8017::decode_public_key_der(public_key)?;
112+
let evp_pkey = parse_rsa_public_key(public_key)?;
112113
verify_rsa_signature(
113114
self.digest_algorithm(),
114115
self.padding(),
@@ -128,7 +129,7 @@ impl VerificationAlgorithm for RsaParameters {
128129
if self.digest_algorithm() != digest.algorithm() {
129130
return Err(Unspecified);
130131
}
131-
let evp_pkey = encoding::rfc8017::decode_public_key_der(public_key)?;
132+
let evp_pkey = parse_rsa_public_key(public_key)?;
132133
verify_rsa_digest_signature(
133134
self.padding(),
134135
&evp_pkey,

aws-lc-rs/src/signature.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,8 @@ pub use crate::ed25519::{
260260
use crate::digest::Digest;
261261
use crate::ec::encoding::parse_ec_public_key;
262262
use crate::ed25519::parse_ed25519_public_key;
263-
use crate::error::KeyRejected;
263+
use crate::encoding::{AsDer, PublicKeyX509Der};
264+
use crate::error::{KeyRejected, Unspecified};
264265
#[cfg(all(feature = "unstable", not(feature = "fips")))]
265266
use crate::pqdsa::{parse_pqdsa_public_key, signature::PqdsaVerificationAlgorithm};
266267
use crate::ptr::LcPtr;
@@ -509,6 +510,14 @@ impl ParsedPublicKey {
509510
}
510511
}
511512

513+
impl AsDer<PublicKeyX509Der<'static>> for ParsedPublicKey {
514+
fn as_der(&self) -> Result<PublicKeyX509Der<'static>, Unspecified> {
515+
Ok(PublicKeyX509Der::new(
516+
self.key.as_const().marshal_rfc5280_public_key()?,
517+
))
518+
}
519+
}
520+
512521
/// Provides the original bytes from which this key was parsed
513522
impl AsRef<[u8]> for ParsedPublicKey {
514523
fn as_ref(&self) -> &[u8] {

aws-lc-rs/tests/ecdsa_tests.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use aws_lc_rs::encoding::{AsBigEndian, AsDer, EcPrivateKeyRfc5915Der};
1010
use aws_lc_rs::rand::SystemRandom;
1111
use aws_lc_rs::signature::{
1212
self, EcdsaKeyPair, KeyPair, ParsedPublicKey, Signature, UnparsedPublicKey,
13+
VerificationAlgorithm,
1314
};
1415
use aws_lc_rs::{digest, test, test_file};
1516

@@ -209,6 +210,10 @@ fn test_signature_ecdsa_verify_asn1(data_file: test::File) {
209210
let digest = digest::digest(digest_alg, &msg);
210211
let actual_digest_result = ppk.verify_digest_sig(&digest, &sig);
211212
assert_eq!(actual_digest_result.is_ok(), is_valid);
213+
214+
let x509_bytes = ppk.as_der().unwrap();
215+
let actual_x509_result = alg.verify_sig(x509_bytes.as_ref(), &msg, &sig);
216+
assert_eq!(actual_x509_result.is_ok(), is_valid);
212217
}
213218

214219
Ok(())

aws-lc-rs/tests/ed25519_tests.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,18 +214,28 @@ fn ed25519_test_public_key_coverage() {
214214

215215
let public_key = key_pair.public_key();
216216
let public_key_raw_bytes = public_key.as_ref();
217+
let parsed_public_key: ParsedPublicKey =
218+
ParsedPublicKey::new(&ED25519, public_key_raw_bytes).unwrap();
219+
let parsed_public_key_raw_bytes = parsed_public_key.as_ref();
217220
let public_key_x509 = public_key.as_der().unwrap();
221+
let parsed_public_key_x509 = parsed_public_key.as_der().unwrap();
218222
let public_key_x509_bytes = public_key_x509.as_ref();
223+
let parsed_public_key_x509_bytes = parsed_public_key_x509.as_ref();
219224

220225
// Test `AsRef<[u8]>`
221226
assert_eq!(public_key_raw_bytes, PUBLIC_KEY);
227+
assert_eq!(parsed_public_key_raw_bytes, PUBLIC_KEY);
228+
assert_eq!(public_key_x509_bytes, parsed_public_key_x509_bytes);
222229

223230
assert!(ED25519
224231
.verify_sig(public_key_raw_bytes, message, sig.as_ref())
225232
.is_ok());
226233
assert!(ED25519
227234
.verify_sig(public_key_x509_bytes, message, sig.as_ref())
228235
.is_ok());
236+
assert!(ED25519
237+
.verify_sig(parsed_public_key_x509_bytes, message, sig.as_ref())
238+
.is_ok());
229239

230240
// Test `Clone`.
231241
#[allow(clippy::clone_on_copy)]

aws-lc-rs/tests/pqdsa_test.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0 OR ISC
33
#![cfg(all(not(feature = "fips"), feature = "unstable"))]
44

5+
use aws_lc_rs::encoding::AsDer;
56
use aws_lc_rs::signature::{KeyPair, ParsedPublicKey, VerificationAlgorithm};
67
use aws_lc_rs::unstable::signature::{
78
PqdsaKeyPair, ML_DSA_44, ML_DSA_44_SIGNING, ML_DSA_65, ML_DSA_65_SIGNING, ML_DSA_87,
@@ -51,6 +52,14 @@ macro_rules! mldsa_sigver_test {
5152
} else {
5253
assert!(result.is_err());
5354
}
55+
let x509_bytes = ppk.as_der().unwrap();
56+
let result =
57+
$verification.verify_sig(x509_bytes.as_ref(), message.as_ref(), signature.as_ref());
58+
if expected_result {
59+
assert!(result.is_ok());
60+
} else {
61+
assert!(result.is_err());
62+
}
5463
Ok(())
5564
});
5665
};

aws-lc-rs/tests/rsa_test.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use aws_lc_rs::rsa::{
1313
};
1414
use aws_lc_rs::signature::{
1515
KeyPair, ParsedPublicKey, RsaKeyPair, RsaParameters, RsaPublicKeyComponents,
16-
RsaSubjectPublicKey, UnparsedPublicKey,
16+
RsaSubjectPublicKey, UnparsedPublicKey, VerificationAlgorithm,
1717
};
1818
use aws_lc_rs::test::to_hex_upper;
1919
use aws_lc_rs::{digest, rand, signature, test, test_file};
@@ -129,6 +129,14 @@ fn test_signature_rsa_pkcs1_sign() {
129129
let digest = Digest::import_less_safe(og_digest.as_ref(), digest_alg).unwrap();
130130
key_pair.sign_digest(alg, &digest, actual.as_mut_slice())?;
131131
assert!(ppk.verify_digest_sig(&digest, actual.as_slice()).is_ok());
132+
133+
let x509_bytes = ppk.as_der().unwrap();
134+
let actual_x509_result = verification_alg.verify_digest_sig(
135+
x509_bytes.as_ref(),
136+
&digest,
137+
actual.as_slice(),
138+
);
139+
assert!(actual_x509_result.is_ok());
132140
}
133141

134142
Ok(())

0 commit comments

Comments
 (0)