210 unsigned char hram[64];
213 for (i = 0; i < num; i++)
221 r_scalars = &batch.scalars[batchsize + 1];
222 for (i = 0; i < batchsize; i++)
223 expand256_modm(r_scalars[i], batch.r[i], 16);
226 for (i = 0; i < batchsize; i++) {
227 expand256_modm(batch.scalars[i], RS[i] + 32, 32);
228 mul256_modm(batch.scalars[i], batch.scalars[i], r_scalars[i]);
230 for (i = 1; i < batchsize; i++)
231 add256_modm(batch.scalars[0], batch.scalars[0], batch.scalars[i]);
234 for (i = 0; i < batchsize; i++) {
235 ed25519_hram(hram, RS[i], pk[i], m[i], mlen[i]);
236 expand256_modm(batch.scalars[i+1], hram, 64);
237 mul256_modm(batch.scalars[i+1], batch.scalars[i+1], r_scalars[i]);
241 batch.points[0] = ge25519_basepoint;
242 for (i = 0; i < batchsize; i++)
243 if (!ge25519_unpack_negative_vartime(&batch.points[i+1], pk[i]))
245 for (i = 0; i < batchsize; i++)
246 if (!ge25519_unpack_negative_vartime(&batch.points[batchsize+i+1], RS[i]))
249 ge25519_multi_scalarmult_vartime(&p, &batch, (batchsize * 2) + 1);
250 if (!ge25519_is_neutral_vartime(&p)) {
254 for (i = 0; i < batchsize; i++) {
256 ret |= (valid[i] ^ 1);
268 for (i = 0; i < num; i++) {
270 ret |= (valid[i] ^ 1);
for(i=1;i< 1;++i) fe_sq(t0
void ED25519_FN() ed25519_randombytes_unsafe(void *p, size_t len)
bignum256modm_element_t bignum256modm[9]
int ed25519_sign_open(const unsigned char *m, size_t mlen, const ed25519_public_key pk, const ed25519_signature RS)