Skip to content

Commit e823e4e

Browse files
committed
Add missing MLD_ALIGN to buffers in sign.c
Buffers in sign.c are not currently forced to be aligned. This may harm performance and it may also lead to problems if a FIPS202 backend is used that requires alignment (e.g., in OpenTitan). This commit adds alignment. Signed-off-by: Matthias J. Kannwischer <matthias@kannwischer.eu>
1 parent 8e74a84 commit e823e4e

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed

mldsa/src/sign.c

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ __contract__(
7676
static int mld_check_pct(uint8_t const pk[CRYPTO_PUBLICKEYBYTES],
7777
uint8_t const sk[CRYPTO_SECRETKEYBYTES])
7878
{
79-
uint8_t message[1] = {0};
80-
uint8_t signature[CRYPTO_BYTES];
81-
uint8_t pk_test[CRYPTO_PUBLICKEYBYTES];
79+
MLD_ALIGN uint8_t message[1] = {0};
80+
MLD_ALIGN uint8_t signature[CRYPTO_BYTES];
81+
MLD_ALIGN uint8_t pk_test[CRYPTO_PUBLICKEYBYTES];
8282
size_t siglen;
8383
int ret;
8484

@@ -179,9 +179,9 @@ int crypto_sign_keypair_internal(uint8_t pk[CRYPTO_PUBLICKEYBYTES],
179179
uint8_t sk[CRYPTO_SECRETKEYBYTES],
180180
const uint8_t seed[MLDSA_SEEDBYTES])
181181
{
182-
uint8_t seedbuf[2 * MLDSA_SEEDBYTES + MLDSA_CRHBYTES];
183-
uint8_t inbuf[MLDSA_SEEDBYTES + 2];
184-
uint8_t tr[MLDSA_TRBYTES];
182+
MLD_ALIGN uint8_t seedbuf[2 * MLDSA_SEEDBYTES + MLDSA_CRHBYTES];
183+
MLD_ALIGN uint8_t inbuf[MLDSA_SEEDBYTES + 2];
184+
MLD_ALIGN uint8_t tr[MLDSA_TRBYTES];
185185
const uint8_t *rho, *rhoprime, *key;
186186
mld_polyvecl mat[MLDSA_K];
187187
mld_polyvecl s1, s1hat;
@@ -263,7 +263,7 @@ MLD_EXTERNAL_API
263263
int crypto_sign_keypair(uint8_t pk[CRYPTO_PUBLICKEYBYTES],
264264
uint8_t sk[CRYPTO_SECRETKEYBYTES])
265265
{
266-
uint8_t seed[MLDSA_SEEDBYTES];
266+
MLD_ALIGN uint8_t seed[MLDSA_SEEDBYTES];
267267
int result;
268268
mld_randombytes(seed, MLDSA_SEEDBYTES);
269269
MLD_CT_TESTING_SECRET(seed, sizeof(seed));
@@ -388,7 +388,7 @@ __contract__(
388388
ensures(return_value == 0 || return_value == -1)
389389
)
390390
{
391-
uint8_t challenge_bytes[MLDSA_CTILDEBYTES];
391+
MLD_ALIGN uint8_t challenge_bytes[MLDSA_CTILDEBYTES];
392392
unsigned int n;
393393
mld_polyvecl y, z;
394394
mld_polyveck w, w1, w0, h;
@@ -525,7 +525,8 @@ int crypto_sign_signature_internal(uint8_t sig[CRYPTO_BYTES], size_t *siglen,
525525
const uint8_t sk[CRYPTO_SECRETKEYBYTES],
526526
int externalmu)
527527
{
528-
uint8_t seedbuf[2 * MLDSA_SEEDBYTES + MLDSA_TRBYTES + 2 * MLDSA_CRHBYTES];
528+
MLD_ALIGN uint8_t
529+
seedbuf[2 * MLDSA_SEEDBYTES + MLDSA_TRBYTES + 2 * MLDSA_CRHBYTES];
529530
uint8_t *rho, *tr, *key, *mu, *rhoprime;
530531
mld_polyvecl mat[MLDSA_K], s1;
531532
mld_polyveck t0, s2;
@@ -620,8 +621,8 @@ int crypto_sign_signature(uint8_t sig[CRYPTO_BYTES], size_t *siglen,
620621
size_t ctxlen,
621622
const uint8_t sk[CRYPTO_SECRETKEYBYTES])
622623
{
623-
uint8_t pre[257];
624-
uint8_t rnd[MLDSA_RNDBYTES];
624+
MLD_ALIGN uint8_t pre[257];
625+
MLD_ALIGN uint8_t rnd[MLDSA_RNDBYTES];
625626
int result;
626627

627628
if (ctxlen > 255)
@@ -664,7 +665,7 @@ int crypto_sign_signature_extmu(uint8_t sig[CRYPTO_BYTES], size_t *siglen,
664665
const uint8_t mu[MLDSA_CRHBYTES],
665666
const uint8_t sk[CRYPTO_SECRETKEYBYTES])
666667
{
667-
uint8_t rnd[MLDSA_RNDBYTES];
668+
MLD_ALIGN uint8_t rnd[MLDSA_RNDBYTES];
668669
int result;
669670

670671
/* Randomized variant of ML-DSA. If you need the deterministic variant,
@@ -716,11 +717,11 @@ int crypto_sign_verify_internal(const uint8_t *sig, size_t siglen,
716717
int externalmu)
717718
{
718719
unsigned int i;
719-
uint8_t buf[MLDSA_K * MLDSA_POLYW1_PACKEDBYTES];
720-
uint8_t rho[MLDSA_SEEDBYTES];
721-
uint8_t mu[MLDSA_CRHBYTES];
722-
uint8_t c[MLDSA_CTILDEBYTES];
723-
uint8_t c2[MLDSA_CTILDEBYTES];
720+
MLD_ALIGN uint8_t buf[MLDSA_K * MLDSA_POLYW1_PACKEDBYTES];
721+
MLD_ALIGN uint8_t rho[MLDSA_SEEDBYTES];
722+
MLD_ALIGN uint8_t mu[MLDSA_CRHBYTES];
723+
MLD_ALIGN uint8_t c[MLDSA_CTILDEBYTES];
724+
MLD_ALIGN uint8_t c2[MLDSA_CTILDEBYTES];
724725
mld_poly cp;
725726
mld_polyvecl mat[MLDSA_K], z;
726727
mld_polyveck t1, w1, tmp, h;
@@ -743,7 +744,7 @@ int crypto_sign_verify_internal(const uint8_t *sig, size_t siglen,
743744
if (!externalmu)
744745
{
745746
/* Compute CRH(H(rho, t1), pre, msg) */
746-
uint8_t hpk[MLDSA_CRHBYTES];
747+
MLD_ALIGN uint8_t hpk[MLDSA_CRHBYTES];
747748
mld_H(hpk, MLDSA_TRBYTES, pk, CRYPTO_PUBLICKEYBYTES, NULL, 0, NULL, 0);
748749
mld_H(mu, MLDSA_CRHBYTES, hpk, MLDSA_TRBYTES, pre, prelen, m, mlen);
749750

@@ -823,7 +824,7 @@ int crypto_sign_verify(const uint8_t *sig, size_t siglen, const uint8_t *m,
823824
size_t mlen, const uint8_t *ctx, size_t ctxlen,
824825
const uint8_t pk[CRYPTO_PUBLICKEYBYTES])
825826
{
826-
uint8_t pre[257];
827+
MLD_ALIGN uint8_t pre[257];
827828
int result;
828829

829830
if (ctxlen > 255)

0 commit comments

Comments
 (0)