|
| 1 | +--- a/crypto/ml_kem/ml_kem.c |
| 2 | ++++ b/crypto/ml_kem/ml_kem.c |
| 3 | +@@ -1309,6 +1309,7 @@ static __owur int matrix_expand(EVP_MD_CTX *mdctx, ML_KEM_KEY *key) |
| 4 | + uint8_t input[ML_KEM_RANDOM_BYTES + 2]; |
| 5 | + int rank = key->vinfo->rank; |
| 6 | + int i, j; |
| 7 | ++ int ret = 0; |
| 8 | + |
| 9 | + memcpy(input, key->rho, ML_KEM_RANDOM_BYTES); |
| 10 | + for (i = 0; i < rank; i++) { |
| 11 | +@@ -1318,10 +1319,13 @@ static __owur int matrix_expand(EVP_MD_CTX *mdctx, ML_KEM_KEY *key) |
| 12 | + if (!EVP_DigestInit_ex(mdctx, key->shake128_md, NULL) |
| 13 | + || !EVP_DigestUpdate(mdctx, input, sizeof(input)) |
| 14 | + || !sample_scalar(out++, mdctx)) |
| 15 | +- return 0; |
| 16 | ++ goto end; |
| 17 | + } |
| 18 | + } |
| 19 | +- return 1; |
| 20 | ++ ret = 1; |
| 21 | ++end: |
| 22 | ++ OPENSSL_cleanse(input, sizeof(input)); |
| 23 | ++ return ret; |
| 24 | + } |
| 25 | + |
| 26 | + /* |
| 27 | +@@ -1739,6 +1743,7 @@ static __owur int genkey(const uint8_t seed[ML_KEM_SEED_BYTES], |
| 28 | + end: |
| 29 | + OPENSSL_cleanse((void *)augmented_seed, ML_KEM_RANDOM_BYTES); |
| 30 | + OPENSSL_cleanse((void *)sigma, ML_KEM_RANDOM_BYTES); |
| 31 | ++ OPENSSL_cleanse((void *)hashed, ML_KEM_RANDOM_BYTES); |
| 32 | + if (ret == 0) { |
| 33 | + ERR_raise_data(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR, |
| 34 | + "internal error while generating %s private key", |
| 35 | +@@ -2323,6 +2328,7 @@ int ossl_ml_kem_decap(uint8_t *shared_secret, size_t slen, |
| 36 | + */ |
| 37 | + if (!hash_h_pubkey(expected_pkhash, mdctx, (ML_KEM_KEY *)key)) { |
| 38 | + EVP_MD_CTX_free(mdctx); |
| 39 | ++ OPENSSL_cleanse((void *)expected_pkhash, ML_KEM_PKHASH_BYTES); |
| 40 | + return 0; |
| 41 | + } |
| 42 | + if (memcmp(expected_pkhash, key->pkhash, ML_KEM_PKHASH_BYTES) != 0) { |
| 43 | +@@ -2330,8 +2336,10 @@ int ossl_ml_kem_decap(uint8_t *shared_secret, size_t slen, |
| 44 | + ERR_raise_data(ERR_LIB_CRYPTO, ERR_R_PASSED_INVALID_ARGUMENT, |
| 45 | + "%s decapsulation key hash mismatch", |
| 46 | + vinfo->algorithm_name); |
| 47 | ++ OPENSSL_cleanse((void *)expected_pkhash, ML_KEM_PKHASH_BYTES); |
| 48 | + return 0; |
| 49 | + } |
| 50 | ++ OPENSSL_cleanse((void *)expected_pkhash, ML_KEM_PKHASH_BYTES); |
| 51 | + #if defined(OPENSSL_CONSTANT_TIME_VALIDATION) |
| 52 | + /* |
| 53 | + * Data derived from |s| and |z| defaults secret, and to avoid side-channel |
0 commit comments