diff --git a/ed25519/ed25519-donna/ed25519-donna-impl-base.h b/ed25519/ed25519-donna/ed25519-donna-impl-base.h index 48913ed..18736cf 100644 --- a/ed25519/ed25519-donna/ed25519-donna-impl-base.h +++ b/ed25519/ed25519-donna/ed25519-donna-impl-base.h @@ -188,6 +188,31 @@ ge25519_pack(unsigned char r[32], const ge25519 *p) { r[31] ^= ((parity[0] & 1) << 7); } +// assumes inz[] points to things in in[] +// NOTE: leaves in unfinished state +static void +ge25519_batchpack_destructive_1(bytes32 out[], ge25519 in[], bignum25519 *inz[], bignum25519 tmp[], size_t num) { + bignum25519 ty; + + curve25519_batchrecip(inz, tmp, inz, num); + + for (size_t i = 0; i < num; ++i) { + curve25519_mul(ty, in[i].y, in[i].z); + curve25519_contract(out[i], ty); + } +} + +static void +ge25519_batchpack_destructive_finish(bytes32 out, ge25519 *unf) { + bignum25519 tx; + unsigned char parity[32]; + // z of unfinished is inverted + curve25519_mul(tx, unf->x, unf->z); + curve25519_contract(parity, tx); + out[31] ^= ((parity[0] & 1) << 7); +} + + static int ge25519_unpack_negative_vartime(ge25519 *r, const unsigned char p[32]) { static const unsigned char zero[32] = {0}; diff --git a/ed25519/ed25519-donna/ed25519-donna-impl-sse2.h b/ed25519/ed25519-donna/ed25519-donna-impl-sse2.h index 5fe3416..2401099 100644 --- a/ed25519/ed25519-donna/ed25519-donna-impl-sse2.h +++ b/ed25519/ed25519-donna/ed25519-donna-impl-sse2.h @@ -217,6 +217,30 @@ ge25519_pack(unsigned char r[32], const ge25519 *p) { r[31] ^= ((parity[0] & 1) << 7); } +// assumes inz[] points to things in in[] +// NOTE: leaves in unfinished state +static void +ge25519_batchpack_destructive_1(bytes32 out[], ge25519 in[], bignum25519 *inz[], bignum25519 tmp[], size_t num) { + bignum25519 ALIGN(16) ty; + + curve25519_batchrecip(inz, tmp, inz, num); + + for (size_t i = 0; i < num; ++i) { + curve25519_mul(ty, in[i].y, in[i].z); + curve25519_contract(out[i], ty); + } +} + +static void +ge25519_batchpack_destructive_finish(bytes32 out, ge25519 *unf) { + bignum25519 ALIGN(16) tx; + unsigned char parity[32]; + // z of unfinished is inverted + curve25519_mul(tx, unf->x, unf->z); + curve25519_contract(parity, tx); + out[31] ^= ((parity[0] & 1) << 7); +} + static int ge25519_unpack_negative_vartime(ge25519 *r, const unsigned char p[32]) { diff --git a/ed25519/ed25519-donna/ed25519-donna.h b/ed25519/ed25519-donna/ed25519-donna.h index de1120f..1e1dc34 100644 --- a/ed25519/ed25519-donna/ed25519-donna.h +++ b/ed25519/ed25519-donna/ed25519-donna.h @@ -94,6 +94,8 @@ typedef struct ge25519_pniels_t { bignum25519 ysubx, xaddy, z, t2d; } ge25519_pniels; +typedef unsigned char bytes32[32]; + #include "ed25519-donna-basepoint-table.h" #if defined(ED25519_64BIT)