-rw-r--r-- 1785 libmceliece-20241009/crypto_kem/348864/vec/benes.c raw
/* This file is for Benes network related functions For the implementation strategy, see https://eprint.iacr.org/2017/793.pdf */ // 20221230 djb: add linker lines // linker define benes #include "util.h" #include "transpose.h" #include "params.h" #include "benes.h" /* one layer of the benes network */ static void layer(uint64_t * data, uint64_t * bits, int lgs) { int i, j, s; uint64_t d; s = 1 << lgs; for (i = 0; i < 64; i += s*2) for (j = i; j < i+s; j++) { d = (data[j+0] ^ data[j+s]); d &= (*bits++); data[j+0] ^= d; data[j+s] ^= d; } } /* input: r, sequence of bits to be permuted */ /* bits, condition bits of the Benes network */ /* rev, 0 for normal application; !0 for inverse */ /* output: r, permuted bits */ void benes(uint64_t * r, const unsigned char * bits, int rev) { int i; const unsigned char *cond_ptr; int inc, low; uint64_t cond[64]; // if (rev == 0) { inc = 256; cond_ptr = bits; } else { inc = -256; cond_ptr = bits + (2*GFBITS-2)*256; } // transpose_64x64(r, r); for (low = 0; low <= 5; low++) { for (i = 0; i < 64; i++) cond[i] = load4(cond_ptr + i*4); transpose_64x64(cond, cond); layer(r, cond, low); cond_ptr += inc; } transpose_64x64(r, r); for (low = 0; low <= 5; low++) { for (i = 0; i < 32; i++) cond[i] = load8(cond_ptr + i*8); layer(r, cond, low); cond_ptr += inc; } for (low = 4; low >= 0; low--) { for (i = 0; i < 32; i++) cond[i] = load8(cond_ptr + i*8); layer(r, cond, low); cond_ptr += inc; } transpose_64x64(r, r); for (low = 5; low >= 0; low--) { for (i = 0; i < 64; i++) cond[i] = load4(cond_ptr + i*4); transpose_64x64(cond, cond); layer(r, cond, low); cond_ptr += inc; } transpose_64x64(r, r); }