diff -up openssl-3.0.1/crypto/dh/dh_key.c.fips3 openssl-3.0.1/crypto/dh/dh_key.c --- openssl-3.0.1/crypto/dh/dh_key.c.fips3 2022-07-18 16:01:41.159543735 +0200 +++ openssl-3.0.1/crypto/dh/dh_key.c 2022-07-18 16:24:30.251388248 +0200 @@ -43,6 +43,9 @@ int ossl_dh_compute_key(unsigned char *k BN_MONT_CTX *mont = NULL; BIGNUM *z = NULL, *pminus1; int ret = -1; +#ifdef FIPS_MODULE + int validate = 0; +#endif if (BN_num_bits(dh->params.p) > OPENSSL_DH_MAX_MODULUS_BITS) { ERR_raise(ERR_LIB_DH, DH_R_MODULUS_TOO_LARGE); @@ -54,6 +57,13 @@ int ossl_dh_compute_key(unsigned char *k return 0; } +#ifdef FIPS_MODULE + if (DH_check_pub_key(dh, pub_key, &validate) <= 0) { + ERR_raise(ERR_LIB_DH, DH_R_CHECK_PUBKEY_INVALID); + return 0; + } +#endif + ctx = BN_CTX_new_ex(dh->libctx); if (ctx == NULL) goto err; @@ -262,6 +272,9 @@ static int generate_key(DH *dh) #endif BN_CTX *ctx = NULL; BIGNUM *pub_key = NULL, *priv_key = NULL; +#ifdef FIPS_MODULE + int validate = 0; +#endif if (BN_num_bits(dh->params.p) > OPENSSL_DH_MAX_MODULUS_BITS) { ERR_raise(ERR_LIB_DH, DH_R_MODULUS_TOO_LARGE); @@ -354,8 +367,23 @@ static int generate_key(DH *dh) if (!ossl_dh_generate_public_key(ctx, dh, priv_key, pub_key)) goto err; +#ifdef FIPS_MODULE + if (DH_check_pub_key(dh, pub_key, &validate) <= 0) { + ERR_raise(ERR_LIB_DH, DH_R_CHECK_PUBKEY_INVALID); + goto err; + } +#endif + dh->pub_key = pub_key; dh->priv_key = priv_key; +#ifdef FIPS_MODULE + if (ossl_dh_check_pairwise(dh) <= 0) { + dh->pub_key = dh->priv_key = NULL; + ERR_raise(ERR_LIB_DH, DH_R_CHECK_PUBKEY_INVALID); + goto err; + } +#endif + dh->dirty_cnt++; ok = 1; err: diff -up openssl-3.0.1/crypto/ec/ec_key.c.fips3 openssl-3.0.1/crypto/ec/ec_key.c diff -up openssl-3.0.1/providers/implementations/exchange/ecdh_exch.c.fips3 openssl-3.0.1/providers/implementations/exchange/ecdh_exch.c --- openssl-3.0.1/providers/implementations/exchange/ecdh_exch.c.fips3 2022-07-25 13:42:46.814952053 +0200 +++ openssl-3.0.1/providers/implementations/exchange/ecdh_exch.c 2022-07-25 13:52:12.292065706 +0200 @@ -488,6 +488,25 @@ int ecdh_plain_derive(void *vpecdhctx, u } ppubkey = EC_KEY_get0_public_key(pecdhctx->peerk); +#ifdef FIPS_MODULE + { + BN_CTX *bn_ctx = BN_CTX_new_ex(ossl_ec_key_get_libctx(privk)); + int check = 0; + + if (bn_ctx == NULL) { + ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE); + goto end; + } + + check = ossl_ec_key_public_check(pecdhctx->peerk, bn_ctx); + BN_CTX_free(bn_ctx); + + if (check <= 0) { + ERR_raise(ERR_LIB_PROV, EC_R_INVALID_PEER_KEY); + goto end; + } + } +#endif retlen = ECDH_compute_key(secret, size, ppubkey, privk, NULL); diff -up openssl-3.0.1/crypto/ec/ec_key.c.fips3 openssl-3.0.1/crypto/ec/ec_key.c --- openssl-3.0.1/crypto/ec/ec_key.c.fips3 2022-07-25 14:03:34.420222507 +0200 +++ openssl-3.0.1/crypto/ec/ec_key.c 2022-07-25 14:09:00.728164294 +0200 @@ -336,6 +336,11 @@ static int ec_generate_key(EC_KEY *eckey OSSL_SELF_TEST_get_callback(eckey->libctx, &cb, &cbarg); ok = ecdsa_keygen_pairwise_test(eckey, cb, cbarg); + +#ifdef FIPS_MODULE + ok &= ossl_ec_key_public_check(eckey, ctx); + ok &= ossl_ec_key_pairwise_check(eckey, ctx); +#endif /* FIPS_MODULE */ } err: /* Step (9): If there is an error return an invalid keypair. */