Skip to content

Commit 9e08601

Browse files
added lambda byte/bit combine sq for 192 and 256 fields
1 parent 9f6365d commit 9e08601

File tree

5 files changed

+165
-5
lines changed

5 files changed

+165
-5
lines changed

aes.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
#include "compat.h"
1313
#include "utils.h"
1414

15+
// TODO: Make it central somewhere
16+
#define ALLOW_ZERO_SBOX
17+
1518
#if defined(HAVE_OPENSSL)
1619
#include <openssl/evp.h>
1720
#endif

faest.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
#include "vole.h"
1616
#include "universal_hashing.h"
1717

18-
#define NOT_ALLOW_ZERO_SBOX
19-
2018
#include <string.h>
2119

2220
// helpers to compute position in signature (sign)

faest_aes.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
#include <string.h>
1818
#include <stdlib.h>
1919

20+
// TODO: Make it central somewhere
21+
#define ALLOW_ZERO_SBOX
22+
2023
static_assert(FAEST_128F_ELL == FAEST_128S_ELL, "Invalid parameters");
2124
static_assert(FAEST_128F_LAMBDA == FAEST_128S_LAMBDA, "Invalid parameters");
2225
static_assert(FAEST_128F_Lke == FAEST_128S_Lke, "Invalid parameters");

fields.c

Lines changed: 146 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
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+
336371
bf192_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+
354428
bf192_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+
495601
bf256_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+
513657
bf256_t bf256_rand(void) {
514658
uint8_t buf[BF256_NUM_BYTES];
515659
rand_bytes(buf, sizeof(buf));

fields.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
#include <stdint.h>
1212
#include <string.h>
1313

14+
// TODO: Make it central somewhere
15+
#define ALLOW_ZERO_SBOX
16+
1417
FAEST_BEGIN_C_DECL
1518

1619
typedef uint8_t bf8_t;
@@ -193,9 +196,10 @@ ATTR_CONST ATTR_ALWAYS_INLINE static inline bf128_t bf128_one(void) {
193196

194197
ATTR_PURE bf128_t bf128_byte_combine(const bf128_t* x);
195198
ATTR_PURE bf128_t bf128_byte_combine_bits(uint8_t x);
199+
#if defined(ALLOW_ZERO_SBOX)
196200
ATTR_PURE bf128_t bf128_byte_combine_sq(const bf128_t* x);
197201
ATTR_PURE bf128_t bf128_byte_combine_bits_sq(uint8_t x);
198-
202+
#endif
199203
bf128_t bf128_rand(void);
200204

201205
#if defined(HAVE_ATTR_VECTOR_SIZE)
@@ -275,6 +279,10 @@ ATTR_CONST ATTR_ALWAYS_INLINE static inline bf192_t bf192_one(void) {
275279

276280
ATTR_PURE bf192_t bf192_byte_combine(const bf192_t* x);
277281
ATTR_PURE bf192_t bf192_byte_combine_bits(uint8_t x);
282+
#if defined(ALLOW_ZERO_SBOX)
283+
ATTR_PURE bf192_t bf192_byte_combine_sq(const bf192_t* x);
284+
ATTR_PURE bf192_t bf192_byte_combine_bits_sq(uint8_t x);
285+
#endif
278286
bf192_t bf192_rand(void);
279287

280288
#if defined(HAVE_ATTR_VECTOR_SIZE)
@@ -351,6 +359,10 @@ ATTR_CONST ATTR_ALWAYS_INLINE static inline bf256_t bf256_one(void) {
351359

352360
ATTR_PURE bf256_t bf256_byte_combine(const bf256_t* x);
353361
ATTR_PURE bf256_t bf256_byte_combine_bits(uint8_t x);
362+
#if defined(ALLOW_ZERO_SBOX)
363+
ATTR_PURE bf256_t bf256_byte_combine_sq(const bf256_t* x);
364+
ATTR_PURE bf256_t bf256_byte_combine_bits_sq(uint8_t x);
365+
#endif
354366
bf256_t bf256_rand(void);
355367

356368
#if defined(HAVE_ATTR_VECTOR_SIZE)

0 commit comments

Comments
 (0)