99#include "fields.h"
1010#include "randomness.h"
1111
12+ // TODO: Make it central somewhere
13+ #define ALLOW_ZERO_SBOX
14+
1215// GF(2^8) with X^8 + X^4 + X^3 + X^1 + 1
1316#define bf8_modulus (UINT8_C((1 << 4) | (1 << 3) | (1 << 1) | 1))
1417// GF(2^64) with X^64 + X^4 + X^3 + X^1 + 1
@@ -127,7 +130,7 @@ bf128_t bf128_byte_combine_sq(const bf128_t* x) {
127130 bf_tmp [6 ] = x [6 ];
128131 bf_tmp [7 ] = x [7 ];
129132
130- // first we square here
133+ // first we square the macs
131134 bf_tmp [0 ] = bf_tmp [0 ] ^ bf_tmp [4 ] ^ bf_tmp [6 ];
132135 bf_tmp [1 ] = bf_tmp [4 ] ^ bf_tmp [6 ] ^ bf_tmp [7 ];
133136 bf_tmp [2 ] = bf_tmp [1 ] ^ bf_tmp [5 ];
@@ -201,7 +204,6 @@ bf128_t bf128_byte_combine_bits_sq(uint8_t x) {
201204 }
202205 return bf_out_sq ;
203206 #endif
204-
205207}
206208#endif
207209
@@ -333,6 +335,39 @@ bf192_t bf192_byte_combine(const bf192_t* x) {
333335 return bf_out ;
334336}
335337
338+ #if defined(ALLOW_ZERO_SBOX )
339+ bf192_t bf192_byte_combine_sq (const bf192_t * x ) {
340+
341+ bf192_t bf_tmp [8 ];
342+ bf_tmp [0 ] = x [0 ];
343+ bf_tmp [1 ] = x [1 ];
344+ bf_tmp [2 ] = x [2 ];
345+ bf_tmp [3 ] = x [3 ];
346+ bf_tmp [4 ] = x [4 ];
347+ bf_tmp [5 ] = x [5 ];
348+ bf_tmp [6 ] = x [6 ];
349+ bf_tmp [7 ] = x [7 ];
350+
351+ // first we squre the macs
352+ bf_tmp [0 ] = bf_tmp [0 ] ^ bf_tmp [4 ] ^ bf_tmp [6 ];
353+ bf_tmp [1 ] = bf_tmp [4 ] ^ bf_tmp [6 ] ^ bf_tmp [7 ];
354+ bf_tmp [2 ] = bf_tmp [1 ] ^ bf_tmp [5 ];
355+ bf_tmp [3 ] = bf_tmp [4 ] ^ bf_tmp [5 ] ^ bf_tmp [6 ] ^ bf_tmp [7 ];
356+ bf_tmp [4 ] = bf_tmp [2 ] ^ bf_tmp [4 ] ^ bf_tmp [7 ];
357+ bf_tmp [5 ] = bf_tmp [5 ] ^ bf_tmp [6 ];
358+ bf_tmp [6 ] = bf_tmp [3 ] ^ bf_tmp [5 ];
359+ bf_tmp [7 ] = bf_tmp [6 ] ^ bf_tmp [7 ];
360+
361+ // now we lift the squared mac values
362+ bf192_t bf_out = bf_tmp [0 ];
363+ for (unsigned int i = 1 ; i < 8 ; ++ i ) {
364+ bf_out = bf192_add (bf_out , bf192_mul (bf_tmp [i ], bf192_alpha [i - 1 ]));
365+ }
366+ return bf_out ;
367+
368+ }
369+ #endif
370+
336371bf192_t bf192_byte_combine_bits (uint8_t x ) {
337372#if defined(HAVE_ATTR_VECTOR_SIZE )
338373 return bf192_from_bit (x & 1 ) ^ bf192_mul_bit (bf192_alpha [1 - 1 ], (x >> 1 ) & 1 ) ^
@@ -351,6 +386,45 @@ bf192_t bf192_byte_combine_bits(uint8_t x) {
351386#endif
352387}
353388
389+ #if defined(ALLOW_ZERO_SBOX )
390+ bf192_t bf192_byte_combine_bits_sq (uint8_t x ) {
391+
392+ // first we do the squaring
393+ uint8_t bits [8 ];
394+ for (unsigned int i = 0 ; i < 8 ; i ++ ) {
395+ bits [i ] = (x >> i ) & 1 ;
396+ }
397+ bits [0 ] = bits [0 ] ^ bits [4 ] ^ bits [6 ];
398+ bits [1 ] = bits [4 ] ^ bits [6 ] ^ bits [7 ];
399+ bits [2 ] = bits [1 ] ^ bits [5 ];
400+ bits [3 ] = bits [4 ] ^ bits [5 ] ^ bits [6 ] ^ bits [7 ];
401+ bits [4 ] = bits [2 ] ^ bits [4 ] ^ bits [7 ];
402+ bits [5 ] = bits [5 ] ^ bits [6 ];
403+ bits [6 ] = bits [3 ] ^ bits [5 ];
404+ bits [7 ] = bits [6 ] ^ bits [7 ];
405+ uint8_t sq_x = 0 ;
406+ for (unsigned int i = 0 ; i < 8 ; i ++ ) {
407+ sq_x ^= (bits [i ] << i );
408+ }
409+
410+ #if defined(HAVE_ATTR_VECTOR_SIZE )
411+ return bf192_from_bit (sq_x & 1 ) ^ bf192_mul_bit (bf192_alpha [1 - 1 ], (sq_x >> 1 ) & 1 ) ^
412+ bf192_mul_bit (bf192_alpha [2 - 1 ], (sq_x >> 2 ) & 1 ) ^
413+ bf192_mul_bit (bf192_alpha [3 - 1 ], (sq_x >> 3 ) & 1 ) ^
414+ bf192_mul_bit (bf192_alpha [4 - 1 ], (sq_x >> 4 ) & 1 ) ^
415+ bf192_mul_bit (bf192_alpha [5 - 1 ], (sq_x >> 5 ) & 1 ) ^
416+ bf192_mul_bit (bf192_alpha [6 - 1 ], (sq_x >> 6 ) & 1 ) ^
417+ bf192_mul_bit (bf192_alpha [7 - 1 ], (sq_x >> 7 ) & 1 );
418+ #else
419+ bf192_t bf_out_sq = bf192_from_bit (sq_x & 1 );
420+ for (unsigned int i = 1 ; i < 8 ; ++ i ) {
421+ bf_out_sq = bf192_add (bf_out_sq , bf192_mul_bit (bf192_alpha [i - 1 ], (sq_x >> i ) & 1 ));
422+ }
423+ return bf_out_sq ;
424+ #endif
425+ }
426+ #endif
427+
354428bf192_t bf192_rand (void ) {
355429 uint8_t buf [BF192_NUM_BYTES ];
356430 rand_bytes (buf , sizeof (buf ));
@@ -492,6 +566,38 @@ bf256_t bf256_byte_combine(const bf256_t* x) {
492566 return bf_out ;
493567}
494568
569+ #if defined(ALLOW_ZERO_SBOX )
570+ bf256_t bf256_byte_combine_sq (const bf256_t * x ) {
571+
572+ bf192_t bf_tmp [8 ];
573+ bf_tmp [0 ] = x [0 ];
574+ bf_tmp [1 ] = x [1 ];
575+ bf_tmp [2 ] = x [2 ];
576+ bf_tmp [3 ] = x [3 ];
577+ bf_tmp [4 ] = x [4 ];
578+ bf_tmp [5 ] = x [5 ];
579+ bf_tmp [6 ] = x [6 ];
580+ bf_tmp [7 ] = x [7 ];
581+
582+ // first we square the macs
583+ bf_tmp [0 ] = bf_tmp [0 ] ^ bf_tmp [4 ] ^ bf_tmp [6 ];
584+ bf_tmp [1 ] = bf_tmp [4 ] ^ bf_tmp [6 ] ^ bf_tmp [7 ];
585+ bf_tmp [2 ] = bf_tmp [1 ] ^ bf_tmp [5 ];
586+ bf_tmp [3 ] = bf_tmp [4 ] ^ bf_tmp [5 ] ^ bf_tmp [6 ] ^ bf_tmp [7 ];
587+ bf_tmp [4 ] = bf_tmp [2 ] ^ bf_tmp [4 ] ^ bf_tmp [7 ];
588+ bf_tmp [5 ] = bf_tmp [5 ] ^ bf_tmp [6 ];
589+ bf_tmp [6 ] = bf_tmp [3 ] ^ bf_tmp [5 ];
590+ bf_tmp [7 ] = bf_tmp [6 ] ^ bf_tmp [7 ];
591+
592+ // now we lift the squared mac values
593+ bf256_t bf_out = bf_tmp [0 ];
594+ for (unsigned int i = 1 ; i < 8 ; ++ i ) {
595+ bf_out = bf256_add (bf_out , bf256_mul (bf_tmp [i ], bf256_alpha [i - 1 ]));
596+ }
597+ return bf_out ;
598+ }
599+ #endif
600+
495601bf256_t bf256_byte_combine_bits (uint8_t x ) {
496602#if defined(HAVE_ATTR_VECTOR_SIZE )
497603 return bf256_from_bit (x & 1 ) ^ bf256_mul_bit (bf256_alpha [1 - 1 ], (x >> 1 ) & 1 ) ^
@@ -510,6 +616,44 @@ bf256_t bf256_byte_combine_bits(uint8_t x) {
510616#endif
511617}
512618
619+ #if defined(ALLOW_ZERO_SBOX )
620+ bf256_t bf256_byte_combine_bits_sq (uint8_t x ) {
621+ // first we do the squaring
622+ uint8_t bits [8 ];
623+ for (unsigned int i = 0 ; i < 8 ; i ++ ) {
624+ bits [i ] = (x >> i ) & 1 ;
625+ }
626+ bits [0 ] = bits [0 ] ^ bits [4 ] ^ bits [6 ];
627+ bits [1 ] = bits [4 ] ^ bits [6 ] ^ bits [7 ];
628+ bits [2 ] = bits [1 ] ^ bits [5 ];
629+ bits [3 ] = bits [4 ] ^ bits [5 ] ^ bits [6 ] ^ bits [7 ];
630+ bits [4 ] = bits [2 ] ^ bits [4 ] ^ bits [7 ];
631+ bits [5 ] = bits [5 ] ^ bits [6 ];
632+ bits [6 ] = bits [3 ] ^ bits [5 ];
633+ bits [7 ] = bits [6 ] ^ bits [7 ];
634+ uint8_t sq_x = 0 ;
635+ for (unsigned int i = 0 ; i < 8 ; i ++ ) {
636+ sq_x ^= (bits [i ] << i );
637+ }
638+ #if defined(HAVE_ATTR_VECTOR_SIZE )
639+ return bf256_from_bit (sq_x & 1 ) ^ bf256_mul_bit (bf256_alpha [1 - 1 ], (sq_x >> 1 ) & 1 ) ^
640+ bf256_mul_bit (bf256_alpha [2 - 1 ], (sq_x >> 2 ) & 1 ) ^
641+ bf256_mul_bit (bf256_alpha [3 - 1 ], (sq_x >> 3 ) & 1 ) ^
642+ bf256_mul_bit (bf256_alpha [4 - 1 ], (sq_x >> 4 ) & 1 ) ^
643+ bf256_mul_bit (bf256_alpha [5 - 1 ], (sq_x >> 5 ) & 1 ) ^
644+ bf256_mul_bit (bf256_alpha [6 - 1 ], (sq_x >> 6 ) & 1 ) ^
645+ bf256_mul_bit (bf256_alpha [7 - 1 ], (sq_x >> 7 ) & 1 );
646+ #else
647+ bf256_t bf_out_sq = bf256_from_bit (sq_x & 1 );
648+ for (unsigned int i = 1 ; i < 8 ; ++ i ) {
649+ bf_out_sq = bf256_add (bf_out_sq , bf256_mul_bit (bf256_alpha [i - 1 ], (sq_x >> i ) & 1 ));
650+ }
651+ return bf_out_sq ;
652+ #endif
653+
654+ }
655+ #endif
656+
513657bf256_t bf256_rand (void ) {
514658 uint8_t buf [BF256_NUM_BYTES ];
515659 rand_bytes (buf , sizeof (buf ));
0 commit comments