@@ -91,6 +91,55 @@ int crypto_sign_keypair(uint8_t *pk, uint8_t *sk)
91
91
return crypto_sign_keypair_internal (pk , sk , seed );
92
92
}
93
93
94
+ /*************************************************
95
+ * Name: mld_H
96
+ *
97
+ * Description: Abstracts application of SHAKE256 to
98
+ * one, two or three blocks of data,
99
+ * yielding a user-requested size of
100
+ * output.
101
+ *
102
+ * Arguments: - uint8_t *out: pointer to output
103
+ * - size_t outlen: requested output length in bytes
104
+ * - const uint8_t *in1: pointer to input block 1
105
+ * Must NOT be NULL
106
+ * - size_t in1len: length of input in1 bytes
107
+ * - const uint8_t *in2: pointer to input block 2
108
+ * May be NULL, in which case
109
+ * this block is ignored
110
+ * - size_t in2len: length of input in2 bytes
111
+ * - const uint8_t *in3: pointer to input block 3
112
+ * May be NULL, in which case
113
+ * this block is ignored
114
+ * - size_t in3len: length of input in3 bytes
115
+ **************************************************/
116
+ static void mld_H (uint8_t * out , size_t outlen , const uint8_t * in1 ,
117
+ size_t in1len , const uint8_t * in2 , size_t in2len ,
118
+ const uint8_t * in3 , size_t in3len )
119
+ __contract__ (
120
+ requires (outlen <= 8 * SHAKE256_RATE /* somewhat arbitrary bound */ )
121
+ requires (memory_no_alias (in1 , in1len ))
122
+ requires (in2 == NULL || memory_no_alias (in2 , in2len ))
123
+ requires (in3 == NULL || memory_no_alias (in3 , in3len ))
124
+ requires (memory_no_alias (out , outlen ))
125
+ assigns (memory_slice (out , outlen ))
126
+ )
127
+ {
128
+ keccak_state state ;
129
+ shake256_init (& state );
130
+ shake256_absorb (& state , in1 , in1len );
131
+ if (in2 != NULL )
132
+ {
133
+ shake256_absorb (& state , in2 , in2len );
134
+ }
135
+ if (in3 != NULL )
136
+ {
137
+ shake256_absorb (& state , in3 , in3len );
138
+ }
139
+ shake256_finalize (& state );
140
+ shake256_squeeze (out , outlen , & state );
141
+ }
142
+
94
143
int crypto_sign_signature_internal (uint8_t * sig , size_t * siglen ,
95
144
const uint8_t * m , size_t mlen ,
96
145
const uint8_t * pre , size_t prelen ,
@@ -104,7 +153,6 @@ int crypto_sign_signature_internal(uint8_t *sig, size_t *siglen,
104
153
polyvecl mat [MLDSA_K ], s1 , y , z ;
105
154
polyveck t0 , s2 , w1 , w0 , h ;
106
155
poly cp ;
107
- keccak_state state ;
108
156
109
157
rho = seedbuf ;
110
158
tr = rho + MLDSA_SEEDBYTES ;
@@ -116,12 +164,7 @@ int crypto_sign_signature_internal(uint8_t *sig, size_t *siglen,
116
164
if (!externalmu )
117
165
{
118
166
/* Compute mu = CRH(tr, pre, msg) */
119
- shake256_init (& state );
120
- shake256_absorb (& state , tr , MLDSA_TRBYTES );
121
- shake256_absorb (& state , pre , prelen );
122
- shake256_absorb (& state , m , mlen );
123
- shake256_finalize (& state );
124
- shake256_squeeze (mu , MLDSA_CRHBYTES , & state );
167
+ mld_H (mu , MLDSA_CRHBYTES , tr , MLDSA_TRBYTES , pre , prelen , m , mlen );
125
168
}
126
169
else
127
170
{
@@ -130,12 +173,8 @@ int crypto_sign_signature_internal(uint8_t *sig, size_t *siglen,
130
173
}
131
174
132
175
/* Compute rhoprime = CRH(key, rnd, mu) */
133
- shake256_init (& state );
134
- shake256_absorb (& state , key , MLDSA_SEEDBYTES );
135
- shake256_absorb (& state , rnd , MLDSA_RNDBYTES );
136
- shake256_absorb (& state , mu , MLDSA_CRHBYTES );
137
- shake256_finalize (& state );
138
- shake256_squeeze (rhoprime , MLDSA_CRHBYTES , & state );
176
+ mld_H (rhoprime , MLDSA_CRHBYTES , key , MLDSA_SEEDBYTES , rnd , MLDSA_RNDBYTES , mu ,
177
+ MLDSA_CRHBYTES );
139
178
140
179
/* Expand matrix and transform vectors */
141
180
polyvec_matrix_expand (mat , rho );
@@ -150,7 +189,7 @@ int crypto_sign_signature_internal(uint8_t *sig, size_t *siglen,
150
189
/* place loop invariants for CBMC. */
151
190
while (1 )
152
191
__loop__ (
153
- invariant (true); /* TODO */
192
+ invariant (1 ) /* TODO */
154
193
)
155
194
{
156
195
/* Sample intermediate vector y */
@@ -168,11 +207,8 @@ int crypto_sign_signature_internal(uint8_t *sig, size_t *siglen,
168
207
polyveck_decompose (& w1 , & w0 , & w1 );
169
208
polyveck_pack_w1 (sig , & w1 );
170
209
171
- shake256_init (& state );
172
- shake256_absorb (& state , mu , MLDSA_CRHBYTES );
173
- shake256_absorb (& state , sig , MLDSA_K * MLDSA_POLYW1_PACKEDBYTES );
174
- shake256_finalize (& state );
175
- shake256_squeeze (sig , MLDSA_CTILDEBYTES , & state );
210
+ mld_H (sig , MLDSA_CTILDEBYTES , mu , MLDSA_CRHBYTES , sig ,
211
+ MLDSA_K * MLDSA_POLYW1_PACKEDBYTES , NULL , 0 );
176
212
poly_challenge (& cp , sig );
177
213
poly_ntt (& cp );
178
214
@@ -309,7 +345,6 @@ int crypto_sign_verify_internal(const uint8_t *sig, size_t siglen,
309
345
poly cp ;
310
346
polyvecl mat [MLDSA_K ], z ;
311
347
polyveck t1 , w1 , h ;
312
- keccak_state state ;
313
348
314
349
if (siglen != CRYPTO_BYTES )
315
350
{
@@ -329,13 +364,8 @@ int crypto_sign_verify_internal(const uint8_t *sig, size_t siglen,
329
364
if (!externalmu )
330
365
{
331
366
/* Compute CRH(H(rho, t1), pre, msg) */
332
- shake256 (mu , MLDSA_TRBYTES , pk , CRYPTO_PUBLICKEYBYTES );
333
- shake256_init (& state );
334
- shake256_absorb (& state , mu , MLDSA_TRBYTES );
335
- shake256_absorb (& state , pre , prelen );
336
- shake256_absorb (& state , m , mlen );
337
- shake256_finalize (& state );
338
- shake256_squeeze (mu , MLDSA_CRHBYTES , & state );
367
+ mld_H (mu , MLDSA_TRBYTES , pk , CRYPTO_PUBLICKEYBYTES , NULL , 0 , NULL , 0 );
368
+ mld_H (mu , MLDSA_CRHBYTES , mu , MLDSA_TRBYTES , pre , prelen , m , mlen );
339
369
}
340
370
else
341
371
{
@@ -365,11 +395,8 @@ int crypto_sign_verify_internal(const uint8_t *sig, size_t siglen,
365
395
polyveck_pack_w1 (buf , & w1 );
366
396
367
397
/* Call random oracle and verify challenge */
368
- shake256_init (& state );
369
- shake256_absorb (& state , mu , MLDSA_CRHBYTES );
370
- shake256_absorb (& state , buf , MLDSA_K * MLDSA_POLYW1_PACKEDBYTES );
371
- shake256_finalize (& state );
372
- shake256_squeeze (c2 , MLDSA_CTILDEBYTES , & state );
398
+ mld_H (c2 , MLDSA_CTILDEBYTES , mu , MLDSA_CRHBYTES , buf ,
399
+ MLDSA_K * MLDSA_POLYW1_PACKEDBYTES , NULL , 0 );
373
400
for (i = 0 ; i < MLDSA_CTILDEBYTES ; ++ i )
374
401
{
375
402
if (c [i ] != c2 [i ])
0 commit comments