Skip to content

Commit 035b345

Browse files
committed
add PQ key integrity tests
1 parent 6f54fba commit 035b345

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
@@ -4018,3 +4018,54 @@ int test_wc_mlkem_decap_fo_reject(void)
40184018
return EXPECT_RESULT();
40194019
} /* END test_wc_mlkem_decap_fo_reject */
40204020

4021+
int test_wc_mlkem_decode_privkey_bad_pubhash(void)
4022+
{
4023+
EXPECT_DECLS;
4024+
#if defined(WOLFSSL_HAVE_MLKEM) && defined(WOLFSSL_WC_MLKEM) && \
4025+
!defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY)
4026+
MlKemKey* key = NULL;
4027+
WC_RNG rng;
4028+
byte priv[WC_ML_KEM_MAX_PRIVATE_KEY_SIZE];
4029+
word32 privLen = 0;
4030+
#ifndef WOLFSSL_NO_ML_KEM_768
4031+
const int mlkemType = WC_ML_KEM_768;
4032+
#elif !defined(WOLFSSL_NO_ML_KEM_512)
4033+
const int mlkemType = WC_ML_KEM_512;
4034+
#else
4035+
const int mlkemType = WC_ML_KEM_1024;
4036+
#endif
4037+
4038+
XMEMSET(&rng, 0, sizeof(rng));
4039+
XMEMSET(priv, 0, sizeof(priv));
4040+
4041+
key = (MlKemKey*)XMALLOC(sizeof(*key), NULL, DYNAMIC_TYPE_TMP_BUFFER);
4042+
ExpectNotNull(key);
4043+
ExpectIntEQ(wc_InitRng(&rng), 0);
4044+
4045+
ExpectIntEQ(wc_MlKemKey_Init(key, mlkemType, NULL, INVALID_DEVID), 0);
4046+
ExpectIntEQ(wc_MlKemKey_MakeKey(key, &rng), 0);
4047+
ExpectIntEQ(wc_MlKemKey_PrivateKeySize(key, &privLen), 0);
4048+
ExpectTrue(privLen > (word32)(2 * WC_ML_KEM_SYM_SZ));
4049+
ExpectIntEQ(wc_MlKemKey_EncodePrivateKey(key, priv, privLen), 0);
4050+
4051+
wc_MlKemKey_Free(key);
4052+
ExpectIntEQ(wc_MlKemKey_Init(key, mlkemType, NULL, INVALID_DEVID), 0);
4053+
ExpectIntEQ(wc_MlKemKey_DecodePrivateKey(key, priv, privLen), 0);
4054+
wc_MlKemKey_Free(key);
4055+
4056+
/* Tamper H(ek) (32 bytes before z). */
4057+
if (privLen > (word32)(2 * WC_ML_KEM_SYM_SZ)) {
4058+
priv[privLen - 2 * WC_ML_KEM_SYM_SZ] ^= 0x01;
4059+
}
4060+
4061+
ExpectIntEQ(wc_MlKemKey_Init(key, mlkemType, NULL, INVALID_DEVID), 0);
4062+
ExpectIntEQ(wc_MlKemKey_DecodePrivateKey(key, priv, privLen),
4063+
WC_NO_ERR_TRACE(MLKEM_PUB_HASH_E));
4064+
wc_MlKemKey_Free(key);
4065+
4066+
DoExpectIntEQ(wc_FreeRng(&rng), 0);
4067+
XFREE(key, NULL, DYNAMIC_TYPE_TMP_BUFFER);
4068+
#endif
4069+
return EXPECT_RESULT();
4070+
} /* END test_wc_mlkem_decode_privkey_bad_pubhash */
4071+

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
@@ -1164,6 +1164,10 @@ int test_wc_slhdsa_check_key(void)
11641164
ExpectIntEQ(wc_SlhDsaKey_ImportPublic(&key, pubKey, pubKeyLen), 0);
11651165
ExpectIntEQ(wc_SlhDsaKey_ImportPrivate(&key, privKey, privKeyLen), 0);
11661166
ExpectIntEQ(wc_SlhDsaKey_CheckKey(&key), 0);
1167+
1168+
key.sk[0] ^= 0x01;
1169+
ExpectIntEQ(wc_SlhDsaKey_CheckKey(&key),
1170+
WC_NO_ERR_TRACE(WC_KEY_MISMATCH_E));
11671171
wc_SlhDsaKey_Free(&key);
11681172

11691173
wc_FreeRng(&rng);

0 commit comments

Comments
 (0)