ECC allow keyVer of 192-bit (import OK, generate restricted)

This commit is contained in:
kaleb-himes 2024-04-23 13:45:41 -04:00
parent 3a89c452b3
commit 690671d447

@ -1836,15 +1836,6 @@ int wc_ecc_set_curve(ecc_key* key, int keysize, int curve_id)
break;
}
}
/* Since we are allowing a pass-through of ecc_make_key_ex_fips when
* both keysize == 0 and curve_id == 0 ensure we select an appropriate
* keysize here when relying on default selection */
#if FIPS_VERSION3_GE(6,0,0)
if (ecc_sets[x].size < WC_ECC_FIPS_GEN_MIN) {
WOLFSSL_MSG("ECC curve too small for FIPS mode");
return ECC_CURVE_OID_E;
}
#endif
if (ecc_sets[x].size == 0) {
WOLFSSL_MSG("ECC Curve not found");
return ECC_CURVE_OID_E;
@ -5119,11 +5110,34 @@ int wc_ecc_shared_secret_ex(ecc_key* private_key, ecc_point* point,
err = wc_ecc_init_ex(&public_key, private_key->heap, INVALID_DEVID);
if (err == MP_OKAY) {
/* Since we are allowing a pass-through of ecc_make_key_ex_fips when
* both keysize == 0 and curve_id == 0 ensure we select an appropriate
* keysize here when relying on default selection */
#if FIPS_VERSION3_GE(6,0,0)
if (private_key->dp->size < WC_ECC_FIPS_GEN_MIN) {
if (private_key->dp->size == 0 &&
(private_key->dp->id == ECC_SECP256R1 ||
private_key->dp->id == ECC_SECP224R1 ||
private_key->dp->id == ECC_SECP384R1 ||
private_key->dp->id == ECC_SECP521R1)) {
WOLFSSL_MSG("ECC dp->size zero but dp->id sufficient for FIPS");
err = 0;
} else {
WOLFSSL_MSG("ECC curve too small for FIPS mode");
err = ECC_CURVE_OID_E;
}
}
if (err == 0) { /* FIPS specific check */
#endif
err = wc_ecc_set_curve(&public_key, private_key->dp->size,
private_key->dp->id);
if (err == MP_OKAY) {
err = mp_copy(point->x, public_key.pubkey.x);
}
#if FIPS_VERSION3_GE(6,0,0)
} /* end FIPS specific check */
#endif
if (err == MP_OKAY) {
err = mp_copy(point->y, public_key.pubkey.y);
}
@ -5560,11 +5574,32 @@ static int _ecc_make_key_ex(WC_RNG* rng, int keysize, ecc_key* key,
/* make sure required variables are reset */
wc_ecc_reset(key);
/* Since we are allowing a pass-through of ecc_make_key_ex_fips when
* both keysize == 0 and curve_id == 0 ensure we select an appropriate
* keysize here when relying on default selection */
#if FIPS_VERSION3_GE(6,0,0)
if (keysize < WC_ECC_FIPS_GEN_MIN) {
if (keysize == 0 && (curve_id == ECC_SECP256R1 ||
curve_id == ECC_SECP224R1 || curve_id == ECC_SECP384R1 ||
curve_id == ECC_SECP521R1)) {
WOLFSSL_MSG("ECC keysize zero but curve_id sufficient for FIPS");
err = 0;
} else {
WOLFSSL_MSG("ECC curve too small for FIPS mode");
printf("curve_id was %d, expected either %d or %d or %d or %d\n",
curve_id, ECC_SECP256R1, ECC_SECP224R1, ECC_SECP384R1, ECC_SECP521R1);
err = ECC_CURVE_OID_E;
}
}
if (err == 0) { /* FIPS specific check */
#endif
err = wc_ecc_set_curve(key, keysize, curve_id);
if (err != 0) {
return err;
}
#if FIPS_VERSION3_GE(6,0,0)
} /* end FIPS specific check */
#endif
key->flags = (byte)flags;
#ifdef WOLF_CRYPTO_CB
@ -10489,6 +10524,8 @@ int wc_ecc_import_x963_ex(const byte* in, word32 inLen, ecc_key* key,
/* determine key size */
keysize = (int)(inLen>>1);
/* NOTE: FIPS v6.0.0 or greater, no restriction on imported keys, only
* on created keys or signatures */
err = wc_ecc_set_curve(key, keysize, curve_id);
key->type = ECC_PUBLICKEY;
}
@ -10883,6 +10920,8 @@ int wc_ecc_import_private_key_ex(const byte* priv, word32 privSz,
wc_ecc_reset(key);
/* set key size */
/* NOTE: FIPS v6.0.0 or greater, no restriction on imported keys, only
* on created keys or signatures */
ret = wc_ecc_set_curve(key, (int)privSz, curve_id);
key->type = ECC_PRIVATEKEY_ONLY;
}
@ -11189,6 +11228,8 @@ static int wc_ecc_import_raw_private(ecc_key* key, const char* qx,
wc_ecc_reset(key);
/* set curve type and index */
/* NOTE: FIPS v6.0.0 or greater, no restriction on imported keys, only
* on created keys or signatures */
err = wc_ecc_set_curve(key, 0, curve_id);
if (err != 0) {
return err;