-rw-r--r-- 1338 saferewrite-20210903/src/core_wforcesntrup761/ref2/wforce.c
#include "crypto_core.h" #include "crypto_int8.h" #include "crypto_int16.h" #include "crypto_uint16.h" #include "crypto_uint32.h" #define int8 crypto_int8 #define int16 crypto_int16 #define uint16 crypto_uint16 #define uint32 crypto_uint32 #include "crypto_decode_int16.h" typedef int8 small; #include "params.h" /* return -1 if x!=0; else return 0 */ static int int16_nonzero_mask(int16 x) { uint16 u = x; /* 0, else 1...65535 */ uint32 v = u; /* 0, else 1...65535 */ v = -v; /* 0, else 2^32-65535...2^32-1 */ v >>= 31; /* 0, else 1 */ return -v; /* 0, else -1 */ } /* 0 if Weightw_is(r), else -1 */ static int Weightw_mask(const unsigned char *r) { int16 weight; int i; crypto_core_weight((unsigned char *) &weight,r,0,0); crypto_decode_int16(&weight,(unsigned char *) &weight); return int16_nonzero_mask(weight-w); } /* out = in if bottom bits of in have weight w */ /* otherwise out = (1,1,...,1,0,0,...,0) */ int crypto_core(unsigned char *outbytes,const unsigned char *inbytes,const unsigned char *kbytes,const unsigned char *cbytes) { small *out = (void *) outbytes; const small *in = (const void *) inbytes; int i,mask; mask = Weightw_mask(inbytes); /* 0 if weight w, else -1 */ for (i = 0;i < w;++i) out[i] = ((in[i]^1)&~mask)^1; for (i = w;i < p;++i) out[i] = in[i]&~mask; return 0; }