Skip to content

Commit 6cd8ac8

Browse files
authored
Ensure ConstPointers don't outlive parent (#693)
1 parent 25a6040 commit 6cd8ac8

19 files changed

+275
-176
lines changed

aws-lc-rs/src/agreement.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ use crate::ec::verify_evp_key_nid;
6262
use crate::ec::{encoding, evp_key_generate};
6363
use crate::error::{KeyRejected, Unspecified};
6464
use crate::hex;
65-
use crate::ptr::ConstPointer;
6665
pub use ephemeral::{agree_ephemeral, EphemeralPrivateKey};
6766

6867
use crate::aws_lc::{
@@ -416,7 +415,9 @@ impl PrivateKey {
416415
}
417416
KeyInner::X25519(priv_key) => {
418417
let mut buffer = [0u8; MAX_PUBLIC_KEY_LEN];
419-
let out_len = priv_key.marshal_raw_public_to_buffer(&mut buffer)?;
418+
let out_len = priv_key
419+
.as_const()
420+
.marshal_raw_public_to_buffer(&mut buffer)?;
420421
Ok(PublicKey {
421422
inner_key: self.inner_key.clone(),
422423
key_bytes: buffer,
@@ -448,9 +449,11 @@ impl AsDer<EcPrivateKeyRfc5915Der<'static>> for PrivateKey {
448449

449450
let mut outp = null_mut::<u8>();
450451
let ec_key = {
451-
ConstPointer::new(unsafe {
452-
EVP_PKEY_get0_EC_KEY(*self.inner_key.get_evp_pkey().as_const())
453-
})?
452+
self.inner_key
453+
.get_evp_pkey()
454+
.project_const_lifetime(unsafe {
455+
|evp_pkey| EVP_PKEY_get0_EC_KEY(*evp_pkey.as_const())
456+
})?
454457
};
455458
let length = usize::try_from(unsafe { aws_lc::i2d_ECPrivateKey(*ec_key, &mut outp) })
456459
.map_err(|_| Unspecified)?;
@@ -476,6 +479,7 @@ impl AsDer<Pkcs8V1Der<'static>> for PrivateKey {
476479
Ok(Pkcs8V1Der::new(
477480
self.inner_key
478481
.get_evp_pkey()
482+
.as_const()
479483
.marshal_rfc5208_private_key(Version::V1)?,
480484
))
481485
}
@@ -509,7 +513,9 @@ impl AsBigEndian<Curve25519SeedBin<'static>> for PrivateKey {
509513
return Err(Unspecified);
510514
}
511515
let evp_pkey = self.inner_key.get_evp_pkey();
512-
Ok(Curve25519SeedBin::new(evp_pkey.marshal_raw_private_key()?))
516+
Ok(Curve25519SeedBin::new(
517+
evp_pkey.as_const().marshal_raw_private_key()?,
518+
))
513519
}
514520
}
515521

@@ -576,7 +582,7 @@ impl AsDer<PublicKeyX509Der<'static>> for PublicKey {
576582
| KeyInner::ECDH_P384(evp_pkey)
577583
| KeyInner::ECDH_P521(evp_pkey)
578584
| KeyInner::X25519(evp_pkey) => {
579-
let der = evp_pkey.marshal_rfc5280_public_key()?;
585+
let der = evp_pkey.as_const().marshal_rfc5280_public_key()?;
580586
Ok(PublicKeyX509Der::from(Buffer::new(der)))
581587
}
582588
}

aws-lc-rs/src/bn.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ impl TryFrom<u64> for DetachableLcPtr<BIGNUM> {
3535
}
3636
}
3737

38-
impl ConstPointer<BIGNUM> {
38+
impl ConstPointer<'_, BIGNUM> {
3939
pub(crate) fn to_be_bytes(&self) -> Vec<u8> {
4040
unsafe {
4141
let bn_bytes = BN_num_bytes(**self);

aws-lc-rs/src/cipher.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -285,21 +285,23 @@ pub enum OperatingMode {
285285

286286
impl OperatingMode {
287287
fn evp_cipher(&self, algorithm: &Algorithm) -> ConstPointer<EVP_CIPHER> {
288-
ConstPointer::new(match (self, algorithm.id) {
289-
(OperatingMode::CBC, AlgorithmId::Aes128) => unsafe { EVP_aes_128_cbc() },
290-
(OperatingMode::CTR, AlgorithmId::Aes128) => unsafe { EVP_aes_128_ctr() },
291-
(OperatingMode::CFB128, AlgorithmId::Aes128) => unsafe { EVP_aes_128_cfb128() },
292-
(OperatingMode::ECB, AlgorithmId::Aes128) => unsafe { EVP_aes_128_ecb() },
293-
(OperatingMode::CBC, AlgorithmId::Aes192) => unsafe { EVP_aes_192_cbc() },
294-
(OperatingMode::CTR, AlgorithmId::Aes192) => unsafe { EVP_aes_192_ctr() },
295-
(OperatingMode::CFB128, AlgorithmId::Aes192) => unsafe { EVP_aes_192_cfb128() },
296-
(OperatingMode::ECB, AlgorithmId::Aes192) => unsafe { EVP_aes_192_ecb() },
297-
(OperatingMode::CBC, AlgorithmId::Aes256) => unsafe { EVP_aes_256_cbc() },
298-
(OperatingMode::CTR, AlgorithmId::Aes256) => unsafe { EVP_aes_256_ctr() },
299-
(OperatingMode::CFB128, AlgorithmId::Aes256) => unsafe { EVP_aes_256_cfb128() },
300-
(OperatingMode::ECB, AlgorithmId::Aes256) => unsafe { EVP_aes_256_ecb() },
301-
})
302-
.unwrap()
288+
unsafe {
289+
ConstPointer::new_static(match (self, algorithm.id) {
290+
(OperatingMode::CBC, AlgorithmId::Aes128) => EVP_aes_128_cbc(),
291+
(OperatingMode::CTR, AlgorithmId::Aes128) => EVP_aes_128_ctr(),
292+
(OperatingMode::CFB128, AlgorithmId::Aes128) => EVP_aes_128_cfb128(),
293+
(OperatingMode::ECB, AlgorithmId::Aes128) => EVP_aes_128_ecb(),
294+
(OperatingMode::CBC, AlgorithmId::Aes192) => EVP_aes_192_cbc(),
295+
(OperatingMode::CTR, AlgorithmId::Aes192) => EVP_aes_192_ctr(),
296+
(OperatingMode::CFB128, AlgorithmId::Aes192) => EVP_aes_192_cfb128(),
297+
(OperatingMode::ECB, AlgorithmId::Aes192) => EVP_aes_192_ecb(),
298+
(OperatingMode::CBC, AlgorithmId::Aes256) => EVP_aes_256_cbc(),
299+
(OperatingMode::CTR, AlgorithmId::Aes256) => EVP_aes_256_ctr(),
300+
(OperatingMode::CFB128, AlgorithmId::Aes256) => EVP_aes_256_cfb128(),
301+
(OperatingMode::ECB, AlgorithmId::Aes256) => EVP_aes_256_ecb(),
302+
})
303+
.unwrap()
304+
}
303305
}
304306
}
305307

aws-lc-rs/src/digest.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ pub const MAX_CHAINING_LEN: usize = MAX_OUTPUT_LEN;
342342
/// Match digest types for `EVP_MD` functions.
343343
pub(crate) fn match_digest_type(algorithm_id: &AlgorithmID) -> ConstPointer<EVP_MD> {
344344
unsafe {
345-
ConstPointer::new(match algorithm_id {
345+
ConstPointer::new_static(match algorithm_id {
346346
AlgorithmID::SHA1 => EVP_sha1(),
347347
AlgorithmID::SHA224 => EVP_sha224(),
348348
AlgorithmID::SHA256 => EVP_sha256(),

aws-lc-rs/src/ec.rs

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@
33
// Modifications copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
44
// SPDX-License-Identifier: Apache-2.0 OR ISC
55

6-
use crate::ec::signature::AlgorithmID;
7-
// TODO: Uncomment when MSRV >= 1.64
8-
use std::os::raw::c_int;
9-
106
#[cfg(feature = "fips")]
117
use crate::aws_lc::EC_KEY_check_fips;
128
#[cfg(not(feature = "fips"))]
@@ -18,11 +14,16 @@ use crate::aws_lc::{
1814
NID_X9_62_prime256v1, NID_secp224r1, NID_secp256k1, NID_secp384r1, NID_secp521r1, EC_GROUP,
1915
EC_KEY, EVP_PKEY, EVP_PKEY_EC,
2016
};
17+
use crate::ec::signature::AlgorithmID;
2118
use crate::error::{KeyRejected, Unspecified};
2219
#[cfg(feature = "fips")]
2320
use crate::fips::indicator_check;
2421
use crate::ptr::{ConstPointer, LcPtr};
2522
use crate::signature::Signature;
23+
// TODO: Uncomment when MSRV >= 1.64
24+
//use core::ffi::c_int;
25+
use std::os::raw::c_int;
26+
use std::ptr::null;
2627

2728
pub(crate) mod encoding;
2829
pub(crate) mod key_pair;
@@ -38,7 +39,8 @@ fn verify_ec_key_nid(
3839
ec_key: &ConstPointer<EC_KEY>,
3940
expected_curve_nid: i32,
4041
) -> Result<(), KeyRejected> {
41-
let ec_group = ConstPointer::new(unsafe { EC_KEY_get0_group(**ec_key) })?;
42+
let ec_group =
43+
ec_key.project_const_lifetime(unsafe { |ec_key| EC_KEY_get0_group(**ec_key) })?;
4244
let key_nid = unsafe { EC_GROUP_get_curve_name(*ec_group) };
4345

4446
if key_nid != expected_curve_nid {
@@ -53,7 +55,8 @@ pub(crate) fn verify_evp_key_nid(
5355
evp_pkey: &ConstPointer<EVP_PKEY>,
5456
expected_curve_nid: i32,
5557
) -> Result<(), KeyRejected> {
56-
let ec_key = ConstPointer::new(unsafe { EVP_PKEY_get0_EC_KEY(**evp_pkey) })?;
58+
let ec_key =
59+
evp_pkey.project_const_lifetime(unsafe { |evp_pkey| EVP_PKEY_get0_EC_KEY(**evp_pkey) })?;
5760
verify_ec_key_nid(&ec_key, expected_curve_nid)?;
5861

5962
Ok(())
@@ -64,7 +67,8 @@ pub(crate) fn validate_ec_evp_key(
6467
evp_pkey: &ConstPointer<EVP_PKEY>,
6568
expected_curve_nid: i32,
6669
) -> Result<(), KeyRejected> {
67-
let ec_key = ConstPointer::new(unsafe { EVP_PKEY_get0_EC_KEY(**evp_pkey) })?;
70+
let ec_key =
71+
evp_pkey.project_const_lifetime(unsafe { |evp_pkey| EVP_PKEY_get0_EC_KEY(**evp_pkey) })?;
6872
verify_ec_key_nid(&ec_key, expected_curve_nid)?;
6973

7074
#[cfg(not(feature = "fips"))]
@@ -94,18 +98,20 @@ pub(crate) fn evp_key_generate(nid: c_int) -> Result<LcPtr<EVP_PKEY>, Unspecifie
9498

9599
#[inline]
96100
#[allow(non_upper_case_globals)]
97-
pub(crate) fn ec_group_from_nid(nid: i32) -> Result<ConstPointer<EC_GROUP>, Unspecified> {
98-
Ok(ConstPointer::new(match nid {
99-
NID_secp224r1 => Ok(unsafe { EC_group_p224() }),
100-
NID_X9_62_prime256v1 => Ok(unsafe { EC_group_p256() }),
101-
NID_secp384r1 => Ok(unsafe { EC_group_p384() }),
102-
NID_secp521r1 => Ok(unsafe { EC_group_p521() }),
103-
NID_secp256k1 => Ok(unsafe { EC_group_secp256k1() }),
104-
_ => {
105-
// OPENSSL_PUT_ERROR(EC, EC_R_UNKNOWN_GROUP);
106-
Err(Unspecified)
107-
}
108-
}?)?)
101+
pub(crate) fn ec_group_from_nid(nid: i32) -> Result<ConstPointer<'static, EC_GROUP>, Unspecified> {
102+
Ok(unsafe {
103+
ConstPointer::new_static(match nid {
104+
NID_secp224r1 => EC_group_p224(),
105+
NID_X9_62_prime256v1 => EC_group_p256(),
106+
NID_secp384r1 => EC_group_p384(),
107+
NID_secp521r1 => EC_group_p521(),
108+
NID_secp256k1 => EC_group_secp256k1(),
109+
_ => {
110+
// OPENSSL_PUT_ERROR(EC, EC_R_UNKNOWN_GROUP);
111+
null()
112+
}
113+
})?
114+
})
109115
}
110116

111117
#[inline]
@@ -114,10 +120,12 @@ fn ecdsa_asn1_to_fixed(alg_id: &'static AlgorithmID, sig: &[u8]) -> Result<Signa
114120

115121
let ecdsa_sig = LcPtr::new(unsafe { ECDSA_SIG_from_bytes(sig.as_ptr(), sig.len()) })?;
116122

117-
let r_bn = ConstPointer::new(unsafe { ECDSA_SIG_get0_r(*ecdsa_sig.as_const()) })?;
123+
let r_bn = ecdsa_sig
124+
.project_const_lifetime(unsafe { |ecdsa_sig| ECDSA_SIG_get0_r(*ecdsa_sig.as_const()) })?;
118125
let r_buffer = r_bn.to_be_bytes();
119126

120-
let s_bn = ConstPointer::new(unsafe { ECDSA_SIG_get0_s(*ecdsa_sig.as_const()) })?;
127+
let s_bn = ecdsa_sig
128+
.project_const_lifetime(unsafe { |ecdsa_sig| ECDSA_SIG_get0_s(*ecdsa_sig.as_const()) })?;
121129
let s_buffer = s_bn.to_be_bytes();
122130

123131
Ok(Signature::new(|slice| {

aws-lc-rs/src/ec/encoding.rs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,9 @@ pub(crate) mod sec1 {
135135
compressed: bool,
136136
) -> Result<Vec<u8>, Unspecified> {
137137
let pub_key_size = if compressed {
138-
compressed_public_key_size_bytes(evp_pkey.key_size_bits())
138+
compressed_public_key_size_bytes(evp_pkey.as_const().key_size_bits())
139139
} else {
140-
uncompressed_public_key_size_bytes(evp_pkey.key_size_bits())
140+
uncompressed_public_key_size_bytes(evp_pkey.as_const().key_size_bits())
141141
};
142142
let mut cbb = LcCBB::new(pub_key_size);
143143
marshal_sec1_public_point_into_cbb(&mut cbb, evp_pkey, compressed)?;
@@ -159,9 +159,13 @@ pub(crate) mod sec1 {
159159
evp_pkey: &LcPtr<EVP_PKEY>,
160160
compressed: bool,
161161
) -> Result<(), Unspecified> {
162-
let ec_key = ConstPointer::new(unsafe { EVP_PKEY_get0_EC_KEY(*evp_pkey.as_const()) })?;
163-
let ec_group = ConstPointer::new(unsafe { EC_KEY_get0_group(*ec_key) })?;
164-
let ec_point = ConstPointer::new(unsafe { EC_KEY_get0_public_key(*ec_key) })?;
162+
let ec_key = evp_pkey.project_const_lifetime(unsafe {
163+
|evp_pkey| EVP_PKEY_get0_EC_KEY(*evp_pkey.as_const())
164+
})?;
165+
let ec_group =
166+
ec_key.project_const_lifetime(unsafe { |ec_key| EC_KEY_get0_group(**ec_key) })?;
167+
let ec_point =
168+
ec_key.project_const_lifetime(unsafe { |ec_key| EC_KEY_get0_public_key(**ec_key) })?;
165169

166170
let point_conversion_form = if compressed {
167171
point_conversion_form_t::POINT_CONVERSION_COMPRESSED
@@ -186,8 +190,11 @@ pub(crate) mod sec1 {
186190
pub(crate) fn marshal_sec1_private_key(
187191
evp_pkey: &LcPtr<EVP_PKEY>,
188192
) -> Result<Vec<u8>, Unspecified> {
189-
let ec_key = ConstPointer::new(unsafe { EVP_PKEY_get0_EC_KEY(*evp_pkey.as_const()) })?;
190-
let ec_group = ConstPointer::new(unsafe { EC_KEY_get0_group(*ec_key) })?;
193+
let ec_key = evp_pkey.project_const_lifetime(unsafe {
194+
|evp_pkey| EVP_PKEY_get0_EC_KEY(*evp_pkey.as_const())
195+
})?;
196+
let ec_group =
197+
ec_key.project_const_lifetime(unsafe { |ec_key| EC_KEY_get0_group(**ec_key) })?;
191198
let nid = unsafe { EC_GROUP_get_curve_name(*ec_group) };
192199
#[allow(non_upper_case_globals)]
193200
let key_size: usize = match nid {
@@ -196,7 +203,8 @@ pub(crate) mod sec1 {
196203
NID_secp521r1 => Ok(66usize),
197204
_ => Err(Unspecified),
198205
}?;
199-
let private_bn = ConstPointer::new(unsafe { EC_KEY_get0_private_key(*ec_key) })?;
206+
let private_bn =
207+
ec_key.project_const_lifetime(unsafe { |ec_key| EC_KEY_get0_private_key(**ec_key) })?;
200208

201209
let mut cbb = LcCBB::new(key_size);
202210
if 1 != unsafe { BN_bn2cbb_padded(cbb.as_mut_ptr(), key_size, *private_bn) } {
@@ -215,7 +223,7 @@ pub(crate) mod rfc5915 {
215223
use crate::cbs::build_CBS;
216224
use crate::ec::ec_group_from_nid;
217225
use crate::error::{KeyRejected, Unspecified};
218-
use crate::ptr::{ConstPointer, LcPtr};
226+
use crate::ptr::LcPtr;
219227

220228
pub(crate) fn parse_rfc5915_private_key(
221229
key_bytes: &[u8],
@@ -234,8 +242,10 @@ pub(crate) mod rfc5915 {
234242
pub(crate) fn marshal_rfc5915_private_key(
235243
evp_pkey: &LcPtr<EVP_PKEY>,
236244
) -> Result<Vec<u8>, Unspecified> {
237-
let ec_key = ConstPointer::new(unsafe { EVP_PKEY_get0_EC_KEY(*evp_pkey.as_const()) })?;
238-
let mut cbb = LcCBB::new(evp_pkey.key_size_bytes());
245+
let ec_key = evp_pkey.project_const_lifetime(unsafe {
246+
|evp_pkey| EVP_PKEY_get0_EC_KEY(*evp_pkey.as_const())
247+
})?;
248+
let mut cbb = LcCBB::new(evp_pkey.as_const().key_size_bytes());
239249
let enc_flags = unsafe { EC_KEY_get_enc_flags(*ec_key) };
240250
if 1 != unsafe { EC_KEY_marshal_private_key(cbb.as_mut_ptr(), *ec_key, enc_flags) } {
241251
return Err(Unspecified);

aws-lc-rs/src/ec/key_pair.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ impl EcdsaKeyPair {
128128
///
129129
pub fn to_pkcs8v1(&self) -> Result<Document, Unspecified> {
130130
Ok(Document::new(
131-
self.evp_pkey.marshal_rfc5208_private_key(Version::V1)?,
131+
self.evp_pkey
132+
.as_const()
133+
.marshal_rfc5208_private_key(Version::V1)?,
132134
))
133135
}
134136

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ impl AsDer<PublicKeyX509Der<'static>> for PublicKey {
121121
/// # Errors
122122
/// Returns an error if the public key fails to marshal to X.509.
123123
fn as_der(&self) -> Result<PublicKeyX509Der<'static>, Unspecified> {
124-
let der = self.evp_pkey.marshal_rfc5280_public_key()?;
124+
let der = self.evp_pkey.as_const().marshal_rfc5280_public_key()?;
125125
Ok(PublicKeyX509Der::new(der))
126126
}
127127
}

0 commit comments

Comments
 (0)