Skip to content

Commit 1900da0

Browse files
committed
ML-KEM/ML-DSA: unaligned reads
Use readUnaligned32/64 to ensure no unaligned read faults. Updated implementations of read/write unaligned 32/64 to not worry about alignment on CPUs that are known to not care.
1 parent c685293 commit 1900da0

3 files changed

Lines changed: 66 additions & 7 deletions

File tree

wolfcrypt/src/misc.c

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,100 +231,159 @@ WC_MISC_STATIC WC_INLINE void ByteReverseWords(word32* out, const word32* in,
231231
#endif
232232
}
233233

234+
#if ((defined(WOLFSSL_AARCH64_BUILD) || defined(__aarch64__)) && \
235+
defined(__APPLE__)) || \
236+
defined(WOLFSSL_X86_64_BUILD) || defined(WOLFSSL_X86_BUILD)
237+
#ifndef WOLFSSL_RW_UNALIGNED_32
238+
#define WOLFSSL_RW_UNALIGNED_32
239+
#endif
240+
#endif
234241
WC_MISC_STATIC WC_INLINE word32 readUnalignedWord32(const byte *in)
235242
{
243+
#ifndef WOLFSSL_RW_UNALIGNED_32
236244
if (((wc_ptr_t)in & (wc_ptr_t)(sizeof(word32) - 1U)) == (wc_ptr_t)0)
245+
#endif
246+
{
237247
return *(const word32 *)in;
248+
}
249+
#ifndef WOLFSSL_RW_UNALIGNED_32
238250
else {
239251
word32 out = 0; /* else CONFIG_FORTIFY_SOURCE -Wmaybe-uninitialized */
240252
XMEMCPY(&out, in, sizeof(out));
241253
return out;
242254
}
255+
#endif
243256
}
244257

245258
WC_MISC_STATIC WC_INLINE word32 writeUnalignedWord32(void *out, word32 in)
246259
{
260+
#ifndef WOLFSSL_RW_UNALIGNED_32
247261
if (((wc_ptr_t)out & (wc_ptr_t)(sizeof(word32) - 1U)) == (wc_ptr_t)0)
262+
#endif
263+
{
248264
*(word32 *)out = in;
265+
}
266+
#ifndef WOLFSSL_RW_UNALIGNED_32
249267
else {
250268
XMEMCPY(out, &in, sizeof(in));
251269
}
270+
#endif
252271
return in;
253272
}
254273

255274
WC_MISC_STATIC WC_INLINE void readUnalignedWords32(word32 *out, const byte *in,
256275
size_t count)
257276
{
258-
if (((wc_ptr_t)in & (wc_ptr_t)(sizeof(word32) - 1U)) == (wc_ptr_t)0) {
277+
#ifndef WOLFSSL_RW_UNALIGNED_32
278+
if (((wc_ptr_t)in & (wc_ptr_t)(sizeof(word32) - 1U)) == (wc_ptr_t)0)
279+
#endif
280+
{
259281
const word32 *in_word32 = (const word32 *)in;
260282
while (count-- > 0)
261283
*out++ = *in_word32++;
262284
}
285+
#ifndef WOLFSSL_RW_UNALIGNED_32
263286
else {
264287
XMEMCPY(out, in, count * sizeof(*out));
265288
}
289+
#endif
266290
}
267291

268292
WC_MISC_STATIC WC_INLINE void writeUnalignedWords32(byte *out, const word32 *in,
269293
size_t count)
270294
{
271-
if (((wc_ptr_t)out & (wc_ptr_t)(sizeof(word32) - 1U)) == (wc_ptr_t)0) {
295+
#ifndef WOLFSSL_RW_UNALIGNED_32
296+
if (((wc_ptr_t)out & (wc_ptr_t)(sizeof(word32) - 1U)) == (wc_ptr_t)0)
297+
#endif
298+
{
272299
word32 *out_word32 = (word32 *)out;
273300
while (count-- > 0)
274301
*out_word32++ = *in++;
275302
}
303+
#ifndef WOLFSSL_RW_UNALIGNED_32
276304
else {
277305
XMEMCPY(out, in, count * sizeof(*in));
278306
}
307+
#endif
279308
}
280309

281310
#if defined(WORD64_AVAILABLE) && !defined(WOLFSSL_NO_WORD64_OPS)
282311

312+
#if ((defined(WOLFSSL_AARCH64_BUILD) || defined(__aarch64__)) && \
313+
defined(__APPLE__)) || \
314+
defined(WOLFSSL_X86_64_BUILD) || defined(WOLFSSL_X86_BUILD)
315+
#ifndef WOLFSSL_RW_UNALIGNED_64
316+
#define WOLFSSL_RW_UNALIGNED_64
317+
#endif
318+
#endif
319+
283320
WC_MISC_STATIC WC_INLINE word64 readUnalignedWord64(const byte *in)
284321
{
322+
#ifndef WOLFSSL_RW_UNALIGNED_64
285323
if (((wc_ptr_t)in & (wc_ptr_t)(sizeof(word64) - 1U)) == (wc_ptr_t)0)
324+
#endif
325+
{
286326
return *(const word64 *)in;
327+
}
328+
#ifndef WOLFSSL_RW_UNALIGNED_64
287329
else {
288330
word64 out = 0; /* else CONFIG_FORTIFY_SOURCE -Wmaybe-uninitialized */
289331
XMEMCPY(&out, in, sizeof(out));
290332
return out;
291333
}
334+
#endif
292335
}
293336

294337
WC_MISC_STATIC WC_INLINE word64 writeUnalignedWord64(void *out, word64 in)
295338
{
339+
#ifndef WOLFSSL_RW_UNALIGNED_64
296340
if (((wc_ptr_t)out & (wc_ptr_t)(sizeof(word64) - 1U)) == (wc_ptr_t)0)
341+
#endif
342+
{
297343
*(word64 *)out = in;
344+
}
345+
#ifndef WOLFSSL_RW_UNALIGNED_64
298346
else {
299347
XMEMCPY(out, &in, sizeof(in));
300348
}
349+
#endif
301350
return in;
302351
}
303352

304353
WC_MISC_STATIC WC_INLINE void readUnalignedWords64(word64 *out, const byte *in,
305354
size_t count)
306355
{
307-
if (((wc_ptr_t)in & (wc_ptr_t)(sizeof(word64) - 1U)) == (wc_ptr_t)0) {
356+
#ifndef WOLFSSL_RW_UNALIGNED_64
357+
if (((wc_ptr_t)in & (wc_ptr_t)(sizeof(word64) - 1U)) == (wc_ptr_t)0)
358+
#endif
359+
{
308360
const word64 *in_word64 = (const word64 *)in;
309361
while (count-- > 0)
310362
*out++ = *in_word64++;
311363
}
364+
#ifndef WOLFSSL_RW_UNALIGNED_64
312365
else {
313366
XMEMCPY(out, in, count * sizeof(*out));
314367
}
368+
#endif
315369
}
316370

317371
WC_MISC_STATIC WC_INLINE void writeUnalignedWords64(byte *out, const word64 *in,
318372
size_t count)
319373
{
320-
if (((wc_ptr_t)out & (wc_ptr_t)(sizeof(word64) - 1U)) == (wc_ptr_t)0) {
374+
#ifndef WOLFSSL_RW_UNALIGNED_64
375+
if (((wc_ptr_t)out & (wc_ptr_t)(sizeof(word64) - 1U)) == (wc_ptr_t)0)
376+
#endif
377+
{
321378
word64 *out_word64 = (word64 *)out;
322379
while (count-- > 0)
323380
*out_word64++ = *in++;
324381
}
382+
#ifndef WOLFSSL_RW_UNALIGNED_64
325383
else {
326384
XMEMCPY(out, in, count * sizeof(*in));
327385
}
386+
#endif
328387
}
329388

330389
WC_MISC_STATIC WC_INLINE word64 rotlFixed64(word64 x, word64 y)

wolfcrypt/src/wc_mldsa.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4661,7 +4661,7 @@ static int mldsa_sample_in_ball_ex(int level, wc_Shake* shake256,
46614661
if (ret == 0) {
46624662
/* Step 1: Initialize sign bit index. */
46634663
/* Copy first 8 bytes of first hash block as random sign bits. */
4664-
signs = *(word64*)block;
4664+
signs = readUnalignedWord64(block);
46654665

46664666
/* Step 3: Put in TAU +/- 1s. */
46674667
for (i = (unsigned int)MLDSA_N - tau; i < MLDSA_N; i++) {

wolfcrypt/src/wc_mlkem_poly.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3759,9 +3759,9 @@ static void mlkem_cbd_eta2(sword16* p, const byte* r)
37593759
#endif
37603760
/* Take the next 4 bytes, little endian, as a 32 bit value. */
37613761
#ifdef BIG_ENDIAN_ORDER
3762-
word32 t = ByteReverseWord32(*(word32*)r);
3762+
word32 t = ByteReverseWord32(readUnalignedWord32(r));
37633763
#else
3764-
word32 t = *(word32*)r;
3764+
word32 t = readUnalignedWord32(r);
37653765
#endif
37663766
word32 d;
37673767
/* Add second bits to first. */

0 commit comments

Comments
 (0)