Skip to content

Commit ad169b3

Browse files
authored
Support PKCS8 in agreement::PrivateKey::from_private_key_der (#713)
* Support PKCS8 in agreement::PrivateKey::from_private_key_der * Bump version number
1 parent eba9781 commit ad169b3

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

aws-lc-rs/Cargo.toml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[package]
22
name = "aws-lc-rs"
33
authors = ["AWS-LibCrypto"]
4-
version = "1.12.4"
4+
version = "1.12.5"
55
# this crate re-exports whatever sys crate that was selected
6-
links = "aws_lc_rs_1_12_4_sys"
6+
links = "aws_lc_rs_1_12_5_sys"
77
edition = "2021"
88
rust-version = "1.63.0"
99
keywords = ["crypto", "cryptography", "security"]

aws-lc-rs/src/agreement.rs

+49-5
Original file line numberDiff line numberDiff line change
@@ -55,26 +55,32 @@ use crate::ec::encoding::sec1::{
5555
marshal_sec1_private_key, marshal_sec1_public_point, marshal_sec1_public_point_into_buffer,
5656
parse_sec1_private_bn,
5757
};
58-
use crate::ec::{encoding, evp_key_generate};
58+
use crate::ec::{encoding, evp_key_generate, };
59+
#[cfg(not(feature = "fips"))]
60+
use crate::ec::verify_evp_key_nid;
61+
#[cfg(feature = "fips")]
62+
use crate::ec::validate_evp_key;
5963
use crate::error::{KeyRejected, Unspecified};
6064
use crate::hex;
6165
use crate::ptr::ConstPointer;
6266
pub use ephemeral::{agree_ephemeral, EphemeralPrivateKey};
6367

6468
use crate::aws_lc::{
6569
EVP_PKEY_derive, EVP_PKEY_derive_init, EVP_PKEY_derive_set_peer, EVP_PKEY_get0_EC_KEY,
66-
NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1, EVP_PKEY, EVP_PKEY_X25519, NID_X25519,
70+
NID_X9_62_prime256v1, NID_secp384r1, NID_secp521r1, EVP_PKEY, EVP_PKEY_EC, EVP_PKEY_X25519,
71+
NID_X25519,
6772
};
6873

6974
use crate::buffer::Buffer;
7075
use crate::ec;
7176
use crate::ec::encoding::rfc5915::parse_rfc5915_private_key;
7277
use crate::encoding::{
7378
AsBigEndian, AsDer, Curve25519SeedBin, EcPrivateKeyBin, EcPrivateKeyRfc5915Der,
74-
EcPublicKeyCompressedBin, EcPublicKeyUncompressedBin, PublicKeyX509Der,
79+
EcPublicKeyCompressedBin, EcPublicKeyUncompressedBin, Pkcs8V1Der, PublicKeyX509Der,
7580
};
7681
use crate::evp_pkey::No_EVP_PKEY_CTX_consumer;
7782
use crate::fips::indicator_check;
83+
use crate::pkcs8::Version;
7884
use crate::ptr::LcPtr;
7985
use core::fmt;
8086
use core::fmt::{Debug, Formatter};
@@ -293,7 +299,13 @@ impl PrivateKey {
293299
if AlgorithmID::X25519 == alg.id {
294300
return Err(KeyRejected::invalid_encoding());
295301
}
296-
let evp_pkey = parse_rfc5915_private_key(key_bytes, alg.id.nid())?;
302+
let evp_pkey = LcPtr::<EVP_PKEY>::parse_rfc5208_private_key(key_bytes, EVP_PKEY_EC)
303+
.or(parse_rfc5915_private_key(key_bytes, alg.id.nid()))?;
304+
#[cfg(not(feature = "fips"))]
305+
verify_evp_key_nid(&evp_pkey.as_const(), alg.id.nid())?;
306+
#[cfg(feature = "fips")]
307+
validate_evp_key(&evp_pkey.as_const(), alg.id.nid())?;
308+
297309
Ok(Self::new(alg, evp_pkey))
298310
}
299311

@@ -449,6 +461,26 @@ impl AsDer<EcPrivateKeyRfc5915Der<'static>> for PrivateKey {
449461
}
450462
}
451463

464+
impl AsDer<Pkcs8V1Der<'static>> for PrivateKey {
465+
/// Serializes the key as a PKCS #8 private key structure.
466+
///
467+
/// X25519 is not supported.
468+
///
469+
/// # Errors
470+
/// `error::Unspecified` if serialization failed.
471+
fn as_der(&self) -> Result<Pkcs8V1Der<'static>, Unspecified> {
472+
if AlgorithmID::X25519 == self.inner_key.algorithm().id {
473+
return Err(Unspecified);
474+
}
475+
476+
Ok(Pkcs8V1Der::new(
477+
self.inner_key
478+
.get_evp_pkey()
479+
.marshal_rfc5208_private_key(Version::V1)?,
480+
))
481+
}
482+
}
483+
452484
impl AsBigEndian<EcPrivateKeyBin<'static>> for PrivateKey {
453485
/// Exposes the private key encoded as a big-endian fixed-length integer.
454486
///
@@ -785,7 +817,7 @@ mod tests {
785817
};
786818
use crate::encoding::{
787819
AsBigEndian, AsDer, Curve25519SeedBin, EcPrivateKeyBin, EcPrivateKeyRfc5915Der,
788-
EcPublicKeyCompressedBin, EcPublicKeyUncompressedBin, PublicKeyX509Der,
820+
EcPublicKeyCompressedBin, EcPublicKeyUncompressedBin, Pkcs8V1Der, PublicKeyX509Der,
789821
};
790822
use crate::{rand, test};
791823

@@ -930,6 +962,18 @@ mod tests {
930962
assert_eq!(result, Ok(()));
931963
}
932964

965+
let pkcs8_private_key_buffer: Pkcs8V1Der = my_private.as_der().unwrap();
966+
let pkcs8_private_key =
967+
PrivateKey::from_private_key_der(&ECDH_P256, pkcs8_private_key_buffer.as_ref())
968+
.unwrap();
969+
{
970+
let result = agree(&pkcs8_private_key, &peer_public, (), |key_material| {
971+
assert_eq!(key_material, &output[..]);
972+
Ok(())
973+
});
974+
assert_eq!(result, Ok(()));
975+
}
976+
933977
let computed_public = my_private.compute_public_key().unwrap();
934978
assert_eq!(computed_public.as_ref(), &my_public[..]);
935979

aws-lc-rs/src/key_wrap.rs

-2
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,12 @@ pub struct AesBlockCipher {
7474
impl BlockCipher for AesBlockCipher {
7575
/// Returns the algorithm identifier.
7676
#[inline]
77-
#[must_use]
7877
fn id(&self) -> BlockCipherId {
7978
self.id
8079
}
8180

8281
/// Returns the algorithm key length.
8382
#[inline]
84-
#[must_use]
8583
fn key_len(&self) -> usize {
8684
self.key_len
8785
}

0 commit comments

Comments
 (0)