Skip to content

Commit 35ca99c

Browse files
mkannwischerhanno-becker
authored andcommitted
sign: Use MLD_ALLOC for secret seed/rnd buffers in sign.c
Convert the stack-allocated rnd/seed buffers in the public sign API wrappers to MLD_ALLOC so that consumers using a custom allocator (MLD_CONFIG_CUSTOM_ALLOC_FREE) place RNG-derived secret material through the same allocation path. Signed-off-by: Matthias J. Kannwischer <matthias@zerorisc.com>
1 parent ae85304 commit 35ca99c

3 files changed

Lines changed: 42 additions & 27 deletions

File tree

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
11
# Copyright (c) The mldsa-native project authors
22
# SPDX-License-Identifier: Apache-2.0 OR ISC OR MIT
33
diff --git a/sw/device/lib/crypto/include/mldsa.h b/sw/device/lib/crypto/include/mldsa.h
4-
index be11f20..0000000 100644
4+
index be11f20..9112042 100644
55
--- a/sw/device/lib/crypto/include/mldsa.h
66
+++ b/sw/device/lib/crypto/include/mldsa.h
7-
@@ -41,15 +41,15 @@ enum {
7+
@@ -41,17 +41,17 @@ enum {
88
kOtcryptoMldsa87SeedBytes = 32,
9-
9+
1010
// Work buffer sizes in 32-bit words
1111
- kOtcryptoMldsa44WorkBufferKeypairWords = 32992 / sizeof(uint32_t),
1212
- kOtcryptoMldsa44WorkBufferSignWords = 32448 / sizeof(uint32_t),
1313
- kOtcryptoMldsa44WorkBufferVerifyWords = 22464 / sizeof(uint32_t),
14-
+ kOtcryptoMldsa44WorkBufferKeypairWords = 13600 / sizeof(uint32_t),
14+
+ kOtcryptoMldsa44WorkBufferKeypairWords = 13632 / sizeof(uint32_t),
1515
+ kOtcryptoMldsa44WorkBufferSignWords = 13120 / sizeof(uint32_t),
1616
+ kOtcryptoMldsa44WorkBufferVerifyWords = 13184 / sizeof(uint32_t),
17-
17+
1818
- kOtcryptoMldsa65WorkBufferKeypairWords = 46304 / sizeof(uint32_t),
1919
- kOtcryptoMldsa65WorkBufferSignWords = 44768 / sizeof(uint32_t),
2020
- kOtcryptoMldsa65WorkBufferVerifyWords = 30720 / sizeof(uint32_t),
21-
+ kOtcryptoMldsa65WorkBufferKeypairWords = 19744 / sizeof(uint32_t),
21+
+ kOtcryptoMldsa65WorkBufferKeypairWords = 19776 / sizeof(uint32_t),
2222
+ kOtcryptoMldsa65WorkBufferSignWords = 17248 / sizeof(uint32_t),
2323
+ kOtcryptoMldsa65WorkBufferVerifyWords = 18368 / sizeof(uint32_t),
24-
24+
2525
- kOtcryptoMldsa87WorkBufferKeypairWords = 62688 / sizeof(uint32_t),
2626
- kOtcryptoMldsa87WorkBufferSignWords = 59104 / sizeof(uint32_t),
2727
- kOtcryptoMldsa87WorkBufferVerifyWords = 41216 / sizeof(uint32_t),
28-
+ kOtcryptoMldsa87WorkBufferKeypairWords = 25888 / sizeof(uint32_t),
28+
+ kOtcryptoMldsa87WorkBufferKeypairWords = 25920 / sizeof(uint32_t),
2929
+ kOtcryptoMldsa87WorkBufferSignWords = 21344 / sizeof(uint32_t),
3030
+ kOtcryptoMldsa87WorkBufferVerifyWords = 24768 / sizeof(uint32_t),
3131
};
32-
32+
33+
/**

mldsa/mldsa_native.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -938,34 +938,34 @@ int MLD_API_NAMESPACE(pk_from_sk)(
938938
*/
939939
/* check-magic: off */
940940
#if defined(MLD_API_LEGACY_CONFIG) || !defined(MLD_CONFIG_REDUCE_RAM)
941-
#define MLD_TOTAL_ALLOC_44_KEYPAIR_NO_PCT 28928
942-
#define MLD_TOTAL_ALLOC_44_KEYPAIR_PCT 48448
941+
#define MLD_TOTAL_ALLOC_44_KEYPAIR_NO_PCT 28960
942+
#define MLD_TOTAL_ALLOC_44_KEYPAIR_PCT 48480
943943
#define MLD_TOTAL_ALLOC_44_PK_FROM_SK 37056
944944
#define MLD_TOTAL_ALLOC_44_SIGN 44704
945945
#define MLD_TOTAL_ALLOC_44_VERIFY 25472
946-
#define MLD_TOTAL_ALLOC_65_KEYPAIR_NO_PCT 49408
947-
#define MLD_TOTAL_ALLOC_65_KEYPAIR_PCT 74592
946+
#define MLD_TOTAL_ALLOC_65_KEYPAIR_NO_PCT 49440
947+
#define MLD_TOTAL_ALLOC_65_KEYPAIR_PCT 74624
948948
#define MLD_TOTAL_ALLOC_65_PK_FROM_SK 60608
949949
#define MLD_TOTAL_ALLOC_65_SIGN 69312
950950
#define MLD_TOTAL_ALLOC_65_VERIFY 42944
951-
#define MLD_TOTAL_ALLOC_87_KEYPAIR_NO_PCT 82176
952-
#define MLD_TOTAL_ALLOC_87_KEYPAIR_PCT 115456
951+
#define MLD_TOTAL_ALLOC_87_KEYPAIR_NO_PCT 82208
952+
#define MLD_TOTAL_ALLOC_87_KEYPAIR_PCT 115488
953953
#define MLD_TOTAL_ALLOC_87_PK_FROM_SK 97472
954954
#define MLD_TOTAL_ALLOC_87_SIGN 108224
955955
#define MLD_TOTAL_ALLOC_87_VERIFY 73920
956956
#else /* MLD_API_LEGACY_CONFIG || !MLD_CONFIG_REDUCE_RAM */
957-
#define MLD_TOTAL_ALLOC_44_KEYPAIR_NO_PCT 13600
958-
#define MLD_TOTAL_ALLOC_44_KEYPAIR_PCT 16928
957+
#define MLD_TOTAL_ALLOC_44_KEYPAIR_NO_PCT 13632
958+
#define MLD_TOTAL_ALLOC_44_KEYPAIR_PCT 16960
959959
#define MLD_TOTAL_ALLOC_44_PK_FROM_SK 21728
960960
#define MLD_TOTAL_ALLOC_44_SIGN 13120
961961
#define MLD_TOTAL_ALLOC_44_VERIFY 13184
962-
#define MLD_TOTAL_ALLOC_65_KEYPAIR_NO_PCT 19744
963-
#define MLD_TOTAL_ALLOC_65_KEYPAIR_PCT 23648
962+
#define MLD_TOTAL_ALLOC_65_KEYPAIR_NO_PCT 19776
963+
#define MLD_TOTAL_ALLOC_65_KEYPAIR_PCT 23680
964964
#define MLD_TOTAL_ALLOC_65_PK_FROM_SK 30944
965965
#define MLD_TOTAL_ALLOC_65_SIGN 17248
966966
#define MLD_TOTAL_ALLOC_65_VERIFY 18368
967-
#define MLD_TOTAL_ALLOC_87_KEYPAIR_NO_PCT 25888
968-
#define MLD_TOTAL_ALLOC_87_KEYPAIR_PCT 32000
967+
#define MLD_TOTAL_ALLOC_87_KEYPAIR_NO_PCT 25920
968+
#define MLD_TOTAL_ALLOC_87_KEYPAIR_PCT 32032
969969
#define MLD_TOTAL_ALLOC_87_PK_FROM_SK 41184
970970
#define MLD_TOTAL_ALLOC_87_SIGN 21344
971971
#define MLD_TOTAL_ALLOC_87_VERIFY 24768

mldsa/src/sign.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -364,19 +364,26 @@ int mld_sign_keypair(uint8_t pk[MLDSA_CRYPTO_PUBLICKEYBYTES],
364364
uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES],
365365
MLD_CONFIG_CONTEXT_PARAMETER_TYPE context)
366366
{
367-
MLD_ALIGN uint8_t seed[MLDSA_SEEDBYTES];
368367
int ret;
368+
MLD_ALLOC(seed, uint8_t, MLDSA_SEEDBYTES, context);
369+
370+
if (seed == NULL)
371+
{
372+
ret = MLD_ERR_OUT_OF_MEMORY;
373+
goto cleanup;
374+
}
375+
369376
if (mld_randombytes(seed, MLDSA_SEEDBYTES) != 0)
370377
{
371378
ret = MLD_ERR_RNG_FAIL;
372379
goto cleanup;
373380
}
374-
MLD_CT_TESTING_SECRET(seed, sizeof(seed));
381+
MLD_CT_TESTING_SECRET(seed, MLDSA_SEEDBYTES);
375382
ret = mld_sign_keypair_internal(pk, sk, seed, context);
376383

377384
cleanup:
378385
/* @[FIPS204, Section 3.6.3] Destruction of intermediate values. */
379-
mld_zeroize(seed, sizeof(seed));
386+
MLD_FREE(seed, uint8_t, MLDSA_SEEDBYTES, context);
380387
return ret;
381388
}
382389
#endif /* !MLD_CONFIG_NO_RANDOMIZED_API */
@@ -983,8 +990,15 @@ int mld_sign_signature_extmu(uint8_t sig[MLDSA_CRYPTO_BYTES], size_t *siglen,
983990
const uint8_t sk[MLDSA_CRYPTO_SECRETKEYBYTES],
984991
MLD_CONFIG_CONTEXT_PARAMETER_TYPE context)
985992
{
986-
MLD_ALIGN uint8_t rnd[MLDSA_RNDBYTES];
987993
int ret;
994+
MLD_ALLOC(rnd, uint8_t, MLDSA_RNDBYTES, context);
995+
996+
if (rnd == NULL)
997+
{
998+
*siglen = 0;
999+
ret = MLD_ERR_OUT_OF_MEMORY;
1000+
goto cleanup;
1001+
}
9881002

9891003
/* Randomized variant of ML-DSA. If you need the deterministic variant,
9901004
* call mld_sign_signature_internal directly with all-zero rnd. */
@@ -994,14 +1008,14 @@ int mld_sign_signature_extmu(uint8_t sig[MLDSA_CRYPTO_BYTES], size_t *siglen,
9941008
ret = MLD_ERR_RNG_FAIL;
9951009
goto cleanup;
9961010
}
997-
MLD_CT_TESTING_SECRET(rnd, sizeof(rnd));
1011+
MLD_CT_TESTING_SECRET(rnd, MLDSA_RNDBYTES);
9981012

9991013
ret = mld_sign_signature_internal(sig, siglen, mu, MLDSA_CRHBYTES, NULL, 0,
10001014
rnd, sk, 1, context);
10011015

10021016
cleanup:
10031017
/* @[FIPS204, Section 3.6.3] Destruction of intermediate values. */
1004-
mld_zeroize(rnd, sizeof(rnd));
1018+
MLD_FREE(rnd, uint8_t, MLDSA_RNDBYTES, context);
10051019

10061020
return ret;
10071021
}

0 commit comments

Comments
 (0)