-rw-r--r-- 1102 libntruprime-20240825/src/core/mult3sntrupP/compact/mult.c raw
// 20240812 djb: more cryptoint usage
#include "crypto_core.h"
#include "params.h"
#include "crypto_int8.h"
#include "crypto_int16.h"
#define int8 crypto_int8
#define int16 crypto_int16
typedef int8 small;
/* works for -16384 <= x < 16384 */
static small F3_freeze(int16 x)
{
return x-3*((10923*x+16384)>>15);
}
void crypto_core(unsigned char *outbytes,const unsigned char *inbytes,const unsigned char *kbytes,const unsigned char *cbytes)
{
small *h = (void *) outbytes;
small f[p];
small g[p];
int16 fg[p+p-1];
int i,j;
for (i = 0;i < p;++i) {
small fi = inbytes[i];
small fi0 = crypto_int8_bottombit_01(fi);
f[i] = fi0-(fi&(fi0<<1));
}
for (i = 0;i < p;++i) {
small gi = kbytes[i];
small gi0 = crypto_int8_bottombit_01(gi);
g[i] = gi0-(gi&(gi0<<1));
}
for (i = 0; i < p + p - 1; ++i) fg[i] = 0;
for (i = 0; i < p; ++i)
for (j = 0; j < p; ++j) fg[i + j] += f[i] * (int16_t)g[j];
for (i = p; i < p + p - 1; ++i) fg[i - p] += fg[i];
for (i = p; i < p + p - 1; ++i) fg[i - p + 1] += fg[i];
for (i = 0; i < p; ++i) h[i] = F3_freeze(fg[i]);
}