Skip to content

Commit 4688e65

Browse files
committed
FIPS key check still needed
1 parent f990089 commit 4688e65

File tree

3 files changed

+20
-8
lines changed

3 files changed

+20
-8
lines changed

aws-lc-rs/src/ec.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ fn verify_ec_key_nid(
287287
}
288288

289289
#[inline]
290+
#[cfg(not(feature = "fips"))]
290291
pub(crate) fn verify_evp_key_nid(
291292
evp_pkey: &ConstPointer<EVP_PKEY>,
292293
expected_curve_nid: i32,
@@ -298,20 +299,20 @@ pub(crate) fn verify_evp_key_nid(
298299
}
299300

300301
#[inline]
301-
unsafe fn validate_evp_key(
302+
fn validate_evp_key(
302303
evp_pkey: &ConstPointer<EVP_PKEY>,
303304
expected_curve_nid: i32,
304305
) -> Result<(), KeyRejected> {
305-
let ec_key = ConstPointer::new(EVP_PKEY_get0_EC_KEY(**evp_pkey))?;
306+
let ec_key = ConstPointer::new(unsafe { EVP_PKEY_get0_EC_KEY(**evp_pkey) })?;
306307
verify_ec_key_nid(&ec_key, expected_curve_nid)?;
307308

308309
#[cfg(not(feature = "fips"))]
309-
if 1 != EC_KEY_check_key(*ec_key) {
310+
if 1 != unsafe { EC_KEY_check_key(*ec_key) } {
310311
return Err(KeyRejected::inconsistent_components());
311312
}
312313

313314
#[cfg(feature = "fips")]
314-
if 1 != indicator_check!(EC_KEY_check_fips(*ec_key)) {
315+
if 1 != indicator_check!(unsafe { EC_KEY_check_fips(*ec_key) }) {
315316
return Err(KeyRejected::inconsistent_components());
316317
}
317318

@@ -342,6 +343,7 @@ pub(crate) unsafe fn unmarshal_der_to_private_key(
342343
nid: i32,
343344
) -> Result<LcPtr<EVP_PKEY>, KeyRejected> {
344345
let mut out = null_mut();
346+
// `d2i_PrivateKey` -> ... -> `EC_KEY_parse_private_key` -> `EC_KEY_check_key`
345347
let evp_pkey = LcPtr::new(aws_lc::d2i_PrivateKey(
346348
EVP_PKEY_EC,
347349
&mut out,
@@ -351,7 +353,10 @@ pub(crate) unsafe fn unmarshal_der_to_private_key(
351353
.try_into()
352354
.map_err(|_| KeyRejected::too_large())?,
353355
))?;
356+
#[cfg(not(feature = "fips"))]
354357
verify_evp_key_nid(&evp_pkey.as_const(), nid)?;
358+
#[cfg(feature = "fips")]
359+
validate_evp_key(&evp_pkey.as_const(), nid)?;
355360

356361
Ok(evp_pkey)
357362
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@ use aws_lc::{EVP_DigestSign, EVP_DigestSignInit, EVP_PKEY_get0_EC_KEY, EVP_PKEY}
1212

1313
use crate::buffer::Buffer;
1414
use crate::digest::digest_ctx::DigestContext;
15-
use crate::ec::{
16-
evp_key_generate, verify_evp_key_nid, EcdsaSignatureFormat, EcdsaSigningAlgorithm, PublicKey,
17-
};
15+
#[cfg(feature = "fips")]
16+
use crate::ec::validate_evp_key;
17+
#[cfg(not(feature = "fips"))]
18+
use crate::ec::verify_evp_key_nid;
19+
use crate::ec::{evp_key_generate, EcdsaSignatureFormat, EcdsaSigningAlgorithm, PublicKey};
20+
1821
use crate::encoding::{AsBigEndian, AsDer, EcPrivateKeyBin, EcPrivateKeyRfc5915Der};
1922
use crate::error::{KeyRejected, Unspecified};
2023
use crate::fips::indicator_check;
@@ -88,9 +91,13 @@ impl EcdsaKeyPair {
8891
alg: &'static EcdsaSigningAlgorithm,
8992
pkcs8: &[u8],
9093
) -> Result<Self, KeyRejected> {
94+
// Includes a call to `EC_KEY_check_key`
9195
let evp_pkey = LcPtr::try_from(pkcs8)?;
9296

97+
#[cfg(not(feature = "fips"))]
9398
verify_evp_key_nid(&evp_pkey.as_const(), alg.id.nid())?;
99+
#[cfg(feature = "fips")]
100+
validate_evp_key(&evp_pkey.as_const(), alg.id.nid())?;
94101

95102
let key_pair = Self::new(alg, evp_pkey)?;
96103

aws-lc-rs/src/evp_pkey.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ impl TryFrom<&[u8]> for LcPtr<EVP_PKEY> {
2121
fn try_from(bytes: &[u8]) -> Result<Self, Self::Error> {
2222
unsafe {
2323
let mut cbs = cbs::build_CBS(bytes);
24-
24+
// `EVP_parse_private_key` -> ... -> `eckey_priv_decode` -> ... -> `EC_KEY_check_key`
2525
LcPtr::new(EVP_parse_private_key(&mut cbs))
2626
.map_err(|()| KeyRejected::invalid_encoding())
2727
}

0 commit comments

Comments
 (0)