3939#include "reduce.h"
4040#include "cbd.h"
4141#include "symmetric.h"
42+ #include "verify.h"
4243
4344/*************************************************
4445* Name: poly_compress
5152**************************************************/
5253void poly_compress (uint8_t r [KYBER_POLYCOMPRESSEDBYTES ], const int16_t a [KYBER_N ]) {
5354 unsigned int i , j ;
54- int16_t u ;
55+ int32_t u ;
56+ uint32_t d0 ;
5557 uint8_t t [8 ];
5658
59+
5760 for (i = 0 ; i < KYBER_N / 8 ; i ++ ) {
5861 for (j = 0 ; j < 8 ; j ++ ) {
5962 // map to positive standard representatives
6063 u = a [8 * i + j ];
6164 u += (u >> 15 ) & KYBER_Q ;
62- t [j ] = ((((uint32_t )u << 5 ) + KYBER_Q / 2 ) / KYBER_Q ) & 31 ;
65+ /* t[j] = ((((uint16_t)u << 4) + KYBER_Q/2)/KYBER_Q) & 15; */
66+ d0 = u << 4 ;
67+ d0 += 1665 ;
68+ d0 *= 80635 ;
69+ d0 >>= 28 ;
70+ t [j ] = d0 & 0xf ;
6371 }
6472
65- r [0 ] = (t [0 ] >> 0 ) | (t [1 ] << 5 );
66- r [1 ] = (t [1 ] >> 3 ) | (t [2 ] << 2 ) | (t [3 ] << 7 );
67- r [2 ] = (t [3 ] >> 1 ) | (t [4 ] << 4 );
68- r [3 ] = (t [4 ] >> 4 ) | (t [5 ] << 1 ) | (t [6 ] << 6 );
69- r [4 ] = (t [6 ] >> 2 ) | (t [7 ] << 3 );
70- r += 5 ;
73+ r [0 ] = t [0 ] | (t [1 ] << 4 );
74+ r [1 ] = t [2 ] | (t [3 ] << 4 );
75+ r [2 ] = t [4 ] | (t [5 ] << 4 );
76+ r [3 ] = t [6 ] | (t [7 ] << 4 );
77+ r += 4 ;
7178 }
7279}
7380
@@ -182,14 +189,13 @@ void poly_frombytes(int16_t r[KYBER_N], const uint8_t a[KYBER_POLYBYTES]) {
182189* Arguments: - poly *r: pointer to output polynomial
183190* - const uint8_t *msg: pointer to input message
184191**************************************************/
185- void poly_frommsg (int16_t r [KYBER_N ], const uint8_t msg [KYBER_INDCPA_MSGBYTES ]) {
186- unsigned int i , j ;
187- int16_t mask ;
192+ void poly_frommsg (int16_t r [KYBER_N ], const uint8_t msg [KYBER_INDCPA_MSGBYTES ]) {
193+ size_t i , j ;
188194
189195 for (i = 0 ; i < KYBER_N / 8 ; i ++ ) {
190196 for (j = 0 ; j < 8 ; j ++ ) {
191- mask = - ( int16_t )(( msg [ i ] >> j ) & 1 ) ;
192- r [ 8 * i + j ] = mask & ((KYBER_Q + 1 ) / 2 );
197+ r [ 8 * i + j ] = 0 ;
198+ cmov_int16 ( r + 8 * i + j , ((KYBER_Q + 1 ) / 2 ), ( msg [ i ] >> j ) & 1 );
193199 }
194200 }
195201}
@@ -204,14 +210,19 @@ void poly_frommsg(int16_t r[KYBER_N], const uint8_t msg[KYBER_INDCPA_MSGBYTES])
204210**************************************************/
205211void poly_tomsg (uint8_t msg [KYBER_INDCPA_MSGBYTES ], const int16_t a [KYBER_N ]) {
206212 unsigned int i , j ;
207- uint16_t t ;
213+ uint32_t t ;
208214
209215 for (i = 0 ; i < KYBER_N / 8 ; i ++ ) {
210216 msg [i ] = 0 ;
211217 for (j = 0 ; j < 8 ; j ++ ) {
212218 t = a [8 * i + j ];
213- t += ((int16_t )t >> 15 ) & KYBER_Q ;
214- t = (((t << 1 ) + KYBER_Q / 2 ) / KYBER_Q ) & 1 ;
219+ // t += ((int16_t)t >> 15) & KYBER_Q;
220+ // t = (((t << 1) + KYBER_Q/2)/KYBER_Q) & 1;
221+ t <<= 1 ;
222+ t += 1665 ;
223+ t *= 80635 ;
224+ t >>= 28 ;
225+ t &= 1 ;
215226 msg [i ] |= t << j ;
216227 }
217228 }
0 commit comments