/* Copyright (c) 2014 Cryptography Research, Inc. * Released under the MIT License. See LICENSE.txt for license information. */ #ifndef __P448_H__ #define __P448_H__ 1 #include "word.h" #include #include typedef struct gf_448_s { uint32_t limb[16]; } __attribute__((aligned(32))) gf_448_s, gf_448_t[1]; #define LIMBPERM(x) (((x)<<1 | (x)>>3) & 15) #define USE_NEON_PERM 1 #define LBITS 28 #define LIMBHI(x) ((x##ull)>>LBITS) #define LIMBLO(x) ((x##ull)&((1ull<limb[0]); i++) { out->limb[i] = a->limb[i] - b->limb[i]; } */ } void p448_copy ( gf_448_t out, const gf_448_t a ) { *out = *a; } void p448_bias ( gf_448_t a, int amt ) { uint32_t co1 = ((1ull<<28)-1)*amt, co2 = co1-amt; uint32x4_t lo = {co1,co2,co1,co1}, hi = {co1,co1,co1,co1}; uint32x4_t *aa = (uint32x4_t*) a; aa[0] += lo; aa[1] += hi; aa[2] += hi; aa[3] += hi; } void p448_weak_reduce ( gf_448_t a ) { uint32x2_t *aa = (uint32x2_t*) a, vmask = {(1ull<<28)-1, (1ull<<28)-1}, vm2 = {0,-1}, tmp = vshr_n_u32(aa[7],28); int i; for (i=7; i>=1; i--) { aa[i] = vsra_n_u32(aa[i] & vmask, aa[i-1], 28); } aa[0] = (aa[0] & vmask) + vrev64_u32(tmp) + (tmp&vm2); } #ifdef __cplusplus }; /* extern "C" */ #endif #endif /* __P448_H__ */