Skip to content

Commit 9521ff7

Browse files
committed
ML-KEM: simplify mod Q calculation
Use poly_reduce to perform reduction and modulo Q Signed-off-by: Stephan Mueller <smueller@chronox.de>
1 parent 29004e0 commit 9521ff7

File tree

4 files changed

+11
-27
lines changed

4 files changed

+11
-27
lines changed

ml-kem/src/armv8/kyber_poly_armv8.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,10 @@ static inline void poly_tobytes(uint8_t r[LC_KYBER_POLYBYTES], const poly *a)
182182
*/
183183
static inline void poly_frombytes(poly *r, const uint8_t a[LC_KYBER_POLYBYTES])
184184
{
185-
unsigned int i;
186-
187185
kyber_poly_frombytes_armv8(r, a);
188186

189-
//TODO move it to assembler code?
190-
for (i = 0; i < LC_KYBER_N; i++)
191-
r->coeffs[i] %= LC_KYBER_Q;
187+
/* Reduce to ensure loaded data is within interval [0, q - 1] */
188+
poly_reduce(r);
192189
}
193190

194191
/**

ml-kem/src/armv8/kyber_poly_armv8_asm.S

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,29 +40,13 @@
4040
zip2 v\f\().16b, v\a\().16b, v\b\().16b
4141
zip1 v\e\().16b, v\b\().16b, v\c\().16b // r[2i+1] = c|b
4242
zip2 v\g\().16b, v\b\().16b, v\c\().16b
43-
ushr v\e\().8h, v\e\().8h, #4 // r[2i+1]c|b >> 4
43+
ushr v\e\().8h, v\e\().8h, #4 // r[2i+1]c|b >> 4
4444
ushr v\g\().8h, v\g\().8h, #4
4545

46-
and v\d\().16b, v\d\().16b, v0.16b // & FFF
46+
and v\d\().16b, v\d\().16b, v0.16b // & FFF
4747
and v\e\().16b, v\e\().16b, v0.16b
4848
and v\f\().16b, v\f\().16b, v0.16b
4949
and v\g\().16b, v\g\().16b, v0.16b
50-
51-
//and v\c\().16b, v\d\().16b, v0.16b // & FFF
52-
//udiv v\d\().16b, v\c\().16b, #3329 // division by 3329
53-
//mls v\d\().16b, v\d\().16b, #3329, v\c\().16b // udiv and mls form modulo operation
54-
55-
//and v\c\().16b, v\e\().16b, v0.16b
56-
//udiv v\e\().16b, v\c\().16b, #3329
57-
//mls v\e\().16b, v\e\().16b, #3329, v\c\().16b
58-
59-
//and v\c\().16b, v\f\().16b, v0.16b
60-
//udiv v\f\().16b, v\c\().16b, #3329
61-
//mls v\f\().16b, v\f\().16b, #3329, v\c\().16b
62-
63-
//and v\c\().16b, v\g\().16b, v0.16b
64-
//udiv v\g\().16b, v\c\().16b, #3329
65-
//mls v\g\().16b, v\g\().16b, #3329, v\c\().16b
6650
.endm
6751

6852
SYM_FUNC_START(kyber_poly_tobytes_armv8)

ml-kem/src/common/kyber_poly_frombytes.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,13 @@ static inline void poly_frombytes(poly *r, const uint8_t a[LC_KYBER_POLYBYTES])
3939
r->coeffs[2 * i] =
4040
((a[3 * i + 0] >> 0) | ((uint16_t)a[3 * i + 1] << 8)) &
4141
0xFFF;
42-
r->coeffs[2 * i] %= LC_KYBER_Q;
4342
r->coeffs[2 * i + 1] =
4443
((a[3 * i + 1] >> 4) | ((uint16_t)a[3 * i + 2] << 4)) &
4544
0xFFF;
46-
r->coeffs[2 * i + 1] %= LC_KYBER_Q;
4745
}
46+
47+
/* Reduce to ensure loaded data is within interval [0, q - 1] */
48+
poly_reduce(r);
4849
}
4950

5051
#ifdef __cplusplus

ml-kem/src/riscv64/kyber_poly_rvv.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,16 @@ static inline void poly_frombytes(poly *r, const uint8_t a[LC_KYBER_POLYBYTES])
101101
r->coeffs[2 * i] =
102102
((a[3 * i + 0] >> 0) | ((uint16_t)a[3 * i + 1] << 8)) &
103103
0xFFF;
104-
r->coeffs[2 * i] %= LC_KYBER_Q;
105104
r->coeffs[2 * i + 1] =
106105
((a[3 * i + 1] >> 4) | ((uint16_t)a[3 * i + 2] << 4)) &
107106
0xFFF;
108-
r->coeffs[2 * i + 1] %= LC_KYBER_Q;
109107
}
110108

111109
LC_VECTOR_ENABLE;
110+
111+
/* Reduce to ensure loaded data is within interval [0, q - 1] */
112+
LC_KYBER_RVV_TYPE(kyber_poly_reduce_rvv)(r->coeffs);
113+
112114
LC_KYBER_RVV_TYPE(kyber_normal2ntt_order_rvv)(
113115
r->coeffs, LC_KYBER_RVV_TYPE(kyber_qdata_rvv));
114116
LC_VECTOR_DISABLE;

0 commit comments

Comments
 (0)