Skip to content

Commit 8a48fa2

Browse files
committed
add PQ key integrity tests
1 parent 0ceb9b4 commit 8a48fa2

3 files changed

Lines changed: 58 additions & 1 deletion

File tree

tests/api/test_mlkem.c

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4034,3 +4034,54 @@ int test_wc_mlkem_decap_fo_reject(void)
40344034
return EXPECT_RESULT();
40354035
} /* END test_wc_mlkem_decap_fo_reject */
40364036

4037+
int test_wc_mlkem_decode_privkey_bad_pubhash(void)
4038+
{
4039+
EXPECT_DECLS;
4040+
#if defined(WOLFSSL_HAVE_MLKEM) && \
4041+
!defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
4042+
MlKemKey* key = NULL;
4043+
WC_RNG rng;
4044+
byte priv[WC_ML_KEM_MAX_PRIVATE_KEY_SIZE];
4045+
word32 privLen = 0;
4046+
#ifndef WOLFSSL_NO_ML_KEM_768
4047+
const int mlkemType = WC_ML_KEM_768;
4048+
#elif !defined(WOLFSSL_NO_ML_KEM_512)
4049+
const int mlkemType = WC_ML_KEM_512;
4050+
#else
4051+
const int mlkemType = WC_ML_KEM_1024;
4052+
#endif
4053+
4054+
XMEMSET(&rng, 0, sizeof(rng));
4055+
XMEMSET(priv, 0, sizeof(priv));
4056+
4057+
key = (MlKemKey*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER);
4058+
ExpectNotNull(key);
4059+
ExpectIntEQ(wc_InitRng(&rng), 0);
4060+
4061+
ExpectIntEQ(wc_MlKemKey_Init(key, mlkemType, NULL, INVALID_DEVID), 0);
4062+
ExpectIntEQ(wc_MlKemKey_MakeKey(key, &rng), 0);
4063+
ExpectIntEQ(wc_MlKemKey_PrivateKeySize(key, &privLen), 0);
4064+
ExpectTrue(privLen > (word32)(2 * WC_ML_KEM_SYM_SZ));
4065+
ExpectIntEQ(wc_MlKemKey_EncodePrivateKey(key, priv, privLen), 0);
4066+
4067+
wc_MlKemKey_Free(key);
4068+
ExpectIntEQ(wc_MlKemKey_Init(key, mlkemType, NULL, INVALID_DEVID), 0);
4069+
ExpectIntEQ(wc_MlKemKey_DecodePrivateKey(key, priv, privLen), 0);
4070+
wc_MlKemKey_Free(key);
4071+
4072+
/* Tamper H(ek) (32 bytes before z). */
4073+
if (privLen > (word32)(2 * WC_ML_KEM_SYM_SZ)) {
4074+
priv[privLen - 2 * WC_ML_KEM_SYM_SZ] ^= 0x01;
4075+
}
4076+
4077+
ExpectIntEQ(wc_MlKemKey_Init(key, mlkemType, NULL, INVALID_DEVID), 0);
4078+
ExpectIntEQ(wc_MlKemKey_DecodePrivateKey(key, priv, privLen),
4079+
WC_NO_ERR_TRACE(MLKEM_PUB_HASH_E));
4080+
wc_MlKemKey_Free(key);
4081+
4082+
DoExpectIntEQ(wc_FreeRng(&rng), 0);
4083+
XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
4084+
#endif
4085+
return EXPECT_RESULT();
4086+
} /* END test_wc_mlkem_decode_privkey_bad_pubhash */
4087+

tests/api/test_mlkem.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ int test_wc_mlkem_encapsulate_kats(void);
2929
int test_wc_mlkem_decapsulate_kats(void);
3030
int test_wc_mlkem_decapsulate_pubonly_fails(void);
3131
int test_wc_mlkem_decap_fo_reject(void);
32+
int test_wc_mlkem_decode_privkey_bad_pubhash(void);
3233

3334
#define TEST_MLKEM_DECLS \
3435
TEST_DECL_GROUP("mlkem", test_wc_mlkem_make_key_kats), \
3536
TEST_DECL_GROUP("mlkem", test_wc_mlkem_encapsulate_kats), \
3637
TEST_DECL_GROUP("mlkem", test_wc_mlkem_decapsulate_kats), \
3738
TEST_DECL_GROUP("mlkem", test_wc_mlkem_decapsulate_pubonly_fails), \
38-
TEST_DECL_GROUP("mlkem", test_wc_mlkem_decap_fo_reject)
39+
TEST_DECL_GROUP("mlkem", test_wc_mlkem_decap_fo_reject), \
40+
TEST_DECL_GROUP("mlkem", test_wc_mlkem_decode_privkey_bad_pubhash)
3941

4042
#endif /* WOLFCRYPT_TEST_MLKEM_H */

tests/api/test_slhdsa.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,6 +1315,10 @@ int test_wc_slhdsa_check_key(void)
13151315
ExpectIntEQ(wc_SlhDsaKey_ImportPublic(&key, pubKey, pubKeyLen), 0);
13161316
ExpectIntEQ(wc_SlhDsaKey_ImportPrivate(&key, privKey, privKeyLen), 0);
13171317
ExpectIntEQ(wc_SlhDsaKey_CheckKey(&key), 0);
1318+
1319+
key.sk[0] ^= 0x01;
1320+
ExpectIntEQ(wc_SlhDsaKey_CheckKey(&key),
1321+
WC_NO_ERR_TRACE(WC_KEY_MISMATCH_E));
13181322
wc_SlhDsaKey_Free(&key);
13191323

13201324
/* Regression: Private-then-Public order. ImportPrivate sets

0 commit comments

Comments
 (0)