Skip to content

Commit 7f61577

Browse files
committed
Fix invalid casts on ML-DSA
1 parent 18c9684 commit 7f61577

1 file changed

Lines changed: 28 additions & 39 deletions

File tree

wolfcrypt/src/wc_mldsa.c

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1400,16 +1400,12 @@ static void mldsa_vec_encode_t0_t1_c(const sword32* t, byte d, byte* t0,
14001400

14011401
/* 13 bits per number.
14021402
* 8 numbers become 13 bytes. (8 * 13 bits = 13 * 8 bits) */
1403-
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT <= 2)
1404-
word32* tp;
1405-
#endif
14061403
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT == 0)
1407-
tp = (word32*)t0;
1408-
writeUnalignedWord32(tp+0, (n0_0 ) | ((word32)n0_1 << 13) |
1404+
writeUnalignedWord32(t0+0, (n0_0 ) | ((word32)n0_1 << 13) |
14091405
((word32)n0_2 << 26));
1410-
writeUnalignedWord32(tp+1, (n0_2 >> 6) | ((word32)n0_3 << 7) |
1406+
writeUnalignedWord32(t0+4, (n0_2 >> 6) | ((word32)n0_3 << 7) |
14111407
((word32)n0_4 << 20));
1412-
writeUnalignedWord32(tp+2, (n0_4 >> 12) | ((word32)n0_5 << 1) |
1408+
writeUnalignedWord32(t0+8, (n0_4 >> 12) | ((word32)n0_5 << 1) |
14131409
((word32)n0_6 << 14) | ((word32)n0_7 << 27));
14141410
#else
14151411
t0[ 0] = (byte)( (n0_0 << 0));
@@ -1430,10 +1426,9 @@ static void mldsa_vec_encode_t0_t1_c(const sword32* t, byte d, byte* t0,
14301426
/* 10 bits per number.
14311427
* 8 bytes become 10 bytes. (8 * 10 bits = 10 * 8 bits) */
14321428
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT <= 2)
1433-
tp = (word32*)t1;
1434-
writeUnalignedWord32(tp+0, (n1_0 ) | ((word32)n1_1 << 10) |
1429+
writeUnalignedWord32(t1+0, (n1_0 ) | ((word32)n1_1 << 10) |
14351430
((word32)n1_2 << 20) | ((word32)n1_3 << 30));
1436-
writeUnalignedWord32(tp+1, (n1_3 >> 2) | ((word32)n1_4 << 8) |
1431+
writeUnalignedWord32(t1+4, (n1_3 >> 2) | ((word32)n1_4 << 8) |
14371432
((word32)n1_5 << 18) | ((word32)n1_6 << 28));
14381433
#else
14391434
t1[0] = (byte)( (n1_0 << 0));
@@ -1632,7 +1627,7 @@ static void mldsa_decode_t1_c(const byte* t1, sword32* t)
16321627
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT == 0)
16331628
#ifdef WC_64BIT_CPU
16341629
word64 t64 = readUnalignedWord64(t1);
1635-
word16 t16 = *(const word16*)(t1 + 8);
1630+
word16 t16 = (word16)((word16)t1[8] | ((word16)t1[9] << 8));
16361631
t[j+0] = (sword32)( ( t64 & 0x03ff) << MLDSA_D);
16371632
t[j+1] = (sword32)( ((t64 >> 10) & 0x03ff) << MLDSA_D);
16381633
t[j+2] = (sword32)( ((t64 >> 20) & 0x03ff) << MLDSA_D);
@@ -1768,13 +1763,11 @@ static void mldsa_encode_gamma1_17_bits_c(const sword32* z, byte* s)
17681763
* 8 numbers become 9 bytes. (8 * 9 bits = 9 * 8 bits) */
17691764
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT == 0)
17701765
#ifdef WC_64BIT_CPU
1771-
word64* s64p = (word64*)s;
1772-
writeUnalignedWord64(s64p, z0 | ((word64)z1 << 18) |
1766+
writeUnalignedWord64(s, z0 | ((word64)z1 << 18) |
17731767
((word64)z2 << 36) | ((word64)z3 << 54));
17741768
#else
1775-
word32* s32p = (word32*)s;
1776-
writeUnalignedWord32(s32p+0, z0 | (z1 << 18) );
1777-
writeUnalignedWord32(s32p+1, (z1 >> 14) | (z2 << 4) | (z3 << 22));
1769+
writeUnalignedWord32(s+0, z0 | (z1 << 18) );
1770+
writeUnalignedWord32(s+4, (z1 >> 14) | (z2 << 4) | (z3 << 22));
17781771
#endif
17791772
#else
17801773
s[0] = (byte)( z0 );
@@ -1836,17 +1829,15 @@ static void mldsa_encode_gamma1_19_bits_c(const sword32* z, byte* s)
18361829
/* 20 bits per number.
18371830
* 4 numbers become 10 bytes. (4 * 20 bits = 10 * 8 bits) */
18381831
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT <= 2)
1839-
word16* s16p = (word16*)s;
18401832
#ifdef WC_64BIT_CPU
1841-
word64* s64p = (word64*)s;
1842-
writeUnalignedWord64(s64p, (word64)z0 | ((word64)z1 << 20) |
1833+
writeUnalignedWord64(s, (word64)z0 | ((word64)z1 << 20) |
18431834
((word64)z2 << 40) | ((word64)z3 << 60));
18441835
#else
1845-
word32* s32p = (word32*)s;
1846-
s32p[0] = (word32)( z0 | (z1 << 20) );
1847-
s32p[1] = (word32)((z1 >> 12) | (z2 << 8) | (z3 << 28));
1836+
writeUnalignedWord32(s+0, (word32)( z0 | (z1 << 20) ));
1837+
writeUnalignedWord32(s+4, (word32)((z1 >> 12) | (z2 << 8) | (z3 << 28)));
18481838
#endif
1849-
s16p[4] = (word16)((z3 >> 4) );
1839+
s[8] = (byte) (z3 >> 4);
1840+
s[9] = (byte) (z3 >> 12);
18501841
#else
18511842
s[0] = (byte) z0 ;
18521843
s[1] = (byte) (z0 >> 8) ;
@@ -2126,8 +2117,8 @@ static void mldsa_decode_gamma1_c(const byte* s, int bits, sword32* z)
21262117
/* 20 bits per number.
21272118
* 8 numbers from 20 bytes. (8 * 20 bits = 20 * 8 bits) */
21282119
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT <= 2)
2129-
word16 s16_0 = ((const word16*)s)[4];
2130-
word16 s16_1 = ((const word16*)s)[9];
2120+
word16 s16_0 = (word16)((word16)s[ 8] | ((word16)s[ 9] << 8));
2121+
word16 s16_1 = (word16)((word16)s[18] | ((word16)s[19] << 8));
21312122
#ifdef WC_64BIT_CPU
21322123
word64 s64_0 = readUnalignedWord64(s+0);
21332124
word64 s64_1 = readUnalignedWord64(s+10);
@@ -2289,25 +2280,24 @@ static void mldsa_encode_w1_88_c(const sword32* w1, byte* w1e)
22892280
/* 6 bits per number.
22902281
* 16 numbers in 12 bytes. (16 * 6 bits = 12 * 8 bits) */
22912282
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT <= 4)
2292-
word32* w1e32 = (word32*)w1e;
2293-
w1e32[0] = (word32)( (word32)w1[j+ 0] |
2283+
writeUnalignedWord32(w1e+0, (word32)( (word32)w1[j+ 0] |
22942284
((word32)w1[j+ 1] << 6) |
22952285
((word32)w1[j+ 2] << 12) |
22962286
((word32)w1[j+ 3] << 18) |
22972287
((word32)w1[j+ 4] << 24) |
2298-
((word32)w1[j+ 5] << 30));
2299-
w1e32[1] = (word32)(((word32)w1[j+ 5] >> 2) |
2288+
((word32)w1[j+ 5] << 30)));
2289+
writeUnalignedWord32(w1e+4, (word32)(((word32)w1[j+ 5] >> 2) |
23002290
((word32)w1[j+ 6] << 4) |
23012291
((word32)w1[j+ 7] << 10) |
23022292
((word32)w1[j+ 8] << 16) |
23032293
((word32)w1[j+ 9] << 22) |
2304-
((word32)w1[j+10] << 28));
2305-
w1e32[2] = (word32)(((word32)w1[j+10] >> 4) |
2294+
((word32)w1[j+10] << 28)));
2295+
writeUnalignedWord32(w1e+8, (word32)(((word32)w1[j+10] >> 4) |
23062296
((word32)w1[j+11] << 2) |
23072297
((word32)w1[j+12] << 8) |
23082298
((word32)w1[j+13] << 14) |
23092299
((word32)w1[j+14] << 20) |
2310-
((word32)w1[j+15] << 26));
2300+
((word32)w1[j+15] << 26)));
23112301
#else
23122302
w1e[ 0] = (byte)( w1[j+ 0] | (w1[j+ 1] << 6));
23132303
w1e[ 1] = (byte)((w1[j+ 1] >> 2) | (w1[j+ 2] << 4));
@@ -2375,23 +2365,22 @@ static void mldsa_encode_w1_32_c(const sword32* w1, byte* w1e)
23752365
/* 4 bits per number.
23762366
* 16 numbers in 8 bytes. (16 * 4 bits = 8 * 8 bits) */
23772367
#if defined(LITTLE_ENDIAN_ORDER) && (WOLFSSL_MLDSA_ALIGNMENT <= 8)
2378-
word32* w1e32 = (word32*)w1e;
2379-
w1e32[0] = (word32)(((word32)w1[j + 0] << 0) |
2368+
writeUnalignedWord32(w1e+0, (word32)(((word32)w1[j + 0] << 0) |
23802369
((word32)w1[j + 1] << 4) |
23812370
((word32)w1[j + 2] << 8) |
23822371
((word32)w1[j + 3] << 12) |
23832372
((word32)w1[j + 4] << 16) |
23842373
((word32)w1[j + 5] << 20) |
23852374
((word32)w1[j + 6] << 24) |
2386-
((word32)w1[j + 7] << 28));
2387-
w1e32[1] = (word32)(((word32)w1[j + 8] << 0) |
2375+
((word32)w1[j + 7] << 28)));
2376+
writeUnalignedWord32(w1e+4, (word32)(((word32)w1[j + 8] << 0) |
23882377
((word32)w1[j + 9] << 4) |
23892378
((word32)w1[j + 10] << 8) |
23902379
((word32)w1[j + 11] << 12) |
23912380
((word32)w1[j + 12] << 16) |
23922381
((word32)w1[j + 13] << 20) |
23932382
((word32)w1[j + 14] << 24) |
2394-
((word32)w1[j + 15] << 28));
2383+
((word32)w1[j + 15] << 28)));
23952384
#else
23962385
w1e[0] = (byte)(w1[j + 0] | (w1[j + 1] << 4));
23972386
w1e[1] = (byte)(w1[j + 2] | (w1[j + 3] << 4));
@@ -2553,7 +2542,7 @@ static int mldsa_rej_ntt_poly_ex(wc_Shake* shake128, byte* seed, sword32* a,
25532542
#if defined(LITTLE_ENDIAN_ORDER) && \
25542543
(WOLFSSL_MLDSA_ALIGNMENT == 0)
25552544
/* Load 32-bit value and mask out 23 bits. */
2556-
sword32 t = *((sword32*)(h + c)) & 0x7fffff;
2545+
sword32 t = (sword32)readUnalignedWord32(h + c) & 0x7fffff;
25572546
#else
25582547
/* Load 24-bit value and mask out 23 bits. */
25592548
sword32 t = (h[c] + ((sword32)h[c+1] << 8) +
@@ -2710,7 +2699,7 @@ static int mldsa_rej_ntt_poly_ex(wc_Shake* shake128, byte* seed, sword32* a,
27102699
#if defined(LITTLE_ENDIAN_ORDER) && \
27112700
(WOLFSSL_MLDSA_ALIGNMENT == 0)
27122701
/* Load 32-bit value and mask out 23 bits. */
2713-
sword32 t = *((sword32*)(h + c)) & 0x7fffff;
2702+
sword32 t = (sword32)readUnalignedWord32(h + c) & 0x7fffff;
27142703
#else
27152704
/* Load 24-bit value and mask out 23 bits. */
27162705
sword32 t = (h[c] + ((sword32)h[c+1] << 8) +

0 commit comments

Comments
 (0)