From 8f248cbd149886d95f08ea6b38cdd989fc5bf39b Mon Sep 17 00:00:00 2001 From: cathugger Date: Sun, 20 Jan 2019 00:52:33 +0200 Subject: [PATCH] add missing files, 2 stage batch pack --- ed25519/amd64-64-24k/fe25519_batchinvert.c | 26 ++++++++++++++++++++++ ed25519/amd64-64-24k/ge25519_batchpack.c | 24 ++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 ed25519/amd64-64-24k/fe25519_batchinvert.c create mode 100644 ed25519/amd64-64-24k/ge25519_batchpack.c diff --git a/ed25519/amd64-64-24k/fe25519_batchinvert.c b/ed25519/amd64-64-24k/fe25519_batchinvert.c new file mode 100644 index 0000000..b29387a --- /dev/null +++ b/ed25519/amd64-64-24k/fe25519_batchinvert.c @@ -0,0 +1,26 @@ +#include "fe25519.h" + +// tmp MUST != out +// in MAY == out +void fe25519_batchinvert(fe25519 *out[],fe25519 tmp[],fe25519 * const in[], size_t num) +{ + fe25519 acc; + fe25519 tmpacc; + size_t i; + + fe25519_setint(&acc,1); + + for (i = 0;i < num;++i) { + tmp[i] = acc; + fe25519_mul(&acc,&acc,in[i]); + } + + fe25519_invert(&acc,&acc); + + i = num; + while (i--) { + fe25519_mul(&tmpacc,&acc,in[i]); + fe25519_mul(out[i],&acc,&tmp[i]); + acc = tmpacc; + } +} diff --git a/ed25519/amd64-64-24k/ge25519_batchpack.c b/ed25519/amd64-64-24k/ge25519_batchpack.c new file mode 100644 index 0000000..d0d8f95 --- /dev/null +++ b/ed25519/amd64-64-24k/ge25519_batchpack.c @@ -0,0 +1,24 @@ +#include "fe25519.h" +#include "ge25519.h" + +// assumes inz[] points to things in in[] +// NOTE: leaves in unfinished state +void ge25519_batchpack_destructive_1(bytes32 out[], ge25519_p3 in[], fe25519 *inz[], fe25519 tmp[], size_t num) +{ + fe25519 ty; + + fe25519_batchinvert(inz, tmp, inz, num); + + for (size_t i = 0; i < num; ++i) { + fe25519_mul(&ty, &in[i].y, &in[i].z); + fe25519_pack(out[i], &ty); + } +} + +void ge25519_batchpack_destructive_finish(bytes32 out, ge25519_p3 *unf) +{ + fe25519 tx; + // z of unfinished is inverted + fe25519_mul(&tx, &unf->x, &unf->z); + out[31] ^= fe25519_getparity(&tx) << 7; +}