-rw-r--r-- 1401 libmceliece-20240812/crypto_kem/348864/avx/gf.c raw
/*
This file is for functions for field arithmetic
*/
// 20240810 djb: even more cryptoint usage
// 20240809 djb: restructuring
// 20240805 djb: more cryptoint usage
// 20221231 djb: const for GF_mul
// 20221230 djb: add linker line
// linker define gf_iszero gf_inv
// linker use gf_mul
#include "gf.h"
#include "crypto_int32.h"
/* check if a == 0 */
gf gf_iszero(gf a)
{
return crypto_int32_zero_mask(a) & GFMASK;
}
/* input: field element in */
/* return: in^2 */
static gf gf_sq(gf in)
{
const uint32_t B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF};
uint32_t x = in;
uint32_t t;
x = (x | crypto_int32_shlmod(x,8)) & B[3];
x = (x | crypto_int32_shlmod(x,4)) & B[2];
x = (x | crypto_int32_shlmod(x,2)) & B[1];
x = (x | crypto_int32_shlmod(x,1)) & B[0];
t = x & 0x7FC000;
x ^= t >> 9;
x ^= t >> 12;
t = x & 0x3000;
x ^= t >> 9;
x ^= t >> 12;
return x & GFMASK;
}
gf gf_inv(gf in)
{
gf tmp_11;
gf tmp_1111;
gf out = in;
out = gf_sq(out);
tmp_11 = gf_mul(out, in); // 11
out = gf_sq(tmp_11);
out = gf_sq(out);
tmp_1111 = gf_mul(out, tmp_11); // 1111
out = gf_sq(tmp_1111);
out = gf_sq(out);
out = gf_sq(out);
out = gf_sq(out);
out = gf_mul(out, tmp_1111); // 11111111
out = gf_sq(out);
out = gf_sq(out);
out = gf_mul(out, tmp_11); // 1111111111
out = gf_sq(out);
out = gf_mul(out, in); // 11111111111
return gf_sq(out); // 111111111110
}