batch.c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "crypto_sign.h"
  2. #include "crypto_verify_32.h"
  3. #include "crypto_hash_sha512.h"
  4. #include "randombytes.h"
  5. #include "ge25519.h"
  6. #include "hram.h"
  7. #define MAXBATCH 64
  8. int crypto_sign_open_batch(
  9. unsigned char* const m[],unsigned long long mlen[],
  10. unsigned char* const sm[],const unsigned long long smlen[],
  11. unsigned char* const pk[],
  12. unsigned long long num
  13. )
  14. {
  15. int ret = 0;
  16. unsigned long long i, j;
  17. shortsc25519 r[MAXBATCH];
  18. sc25519 scalars[2*MAXBATCH+1];
  19. ge25519 points[2*MAXBATCH+1];
  20. unsigned char hram[crypto_hash_sha512_BYTES];
  21. unsigned long long batchsize;
  22. for (i = 0;i < num;++i) mlen[i] = -1;
  23. while (num >= 3) {
  24. batchsize = num;
  25. if (batchsize > MAXBATCH) batchsize = MAXBATCH;
  26. for (i = 0;i < batchsize;++i)
  27. if (smlen[i] < 64) goto fallback;
  28. randombytes((unsigned char*)r,sizeof(shortsc25519) * batchsize);
  29. /* Computing scalars[0] = ((r1s1 + r2s2 + ...)) */
  30. for(i=0;i<batchsize;i++)
  31. {
  32. sc25519_from32bytes(&scalars[i], sm[i]+32);
  33. sc25519_mul_shortsc(&scalars[i], &scalars[i], &r[i]);
  34. }
  35. for(i=1;i<batchsize;i++)
  36. sc25519_add(&scalars[0], &scalars[0], &scalars[i]);
  37. /* Computing scalars[1] ... scalars[batchsize] as r[i]*H(R[i],A[i],m[i]) */
  38. for(i=0;i<batchsize;i++)
  39. {
  40. get_hram(hram, sm[i], pk[i], m[i], smlen[i]);
  41. sc25519_from64bytes(&scalars[i+1],hram);
  42. sc25519_mul_shortsc(&scalars[i+1],&scalars[i+1],&r[i]);
  43. }
  44. /* Setting scalars[batchsize+1] ... scalars[2*batchsize] to r[i] */
  45. for(i=0;i<batchsize;i++)
  46. sc25519_from_shortsc(&scalars[batchsize+i+1],&r[i]);
  47. /* Computing points */
  48. points[0] = ge25519_base;
  49. for(i=0;i<batchsize;i++)
  50. if (ge25519_unpackneg_vartime(&points[i+1], pk[i])) goto fallback;
  51. for(i=0;i<batchsize;i++)
  52. if (ge25519_unpackneg_vartime(&points[batchsize+i+1], sm[i])) goto fallback;
  53. ge25519_multi_scalarmult_vartime(points, points, scalars, 2*batchsize+1);
  54. if (ge25519_isneutral_vartime(points)) {
  55. for(i=0;i<batchsize;i++)
  56. {
  57. for(j=0;j<smlen[i]-64;j++)
  58. m[i][j] = sm[i][j + 64];
  59. mlen[i] = smlen[i]-64;
  60. }
  61. } else {
  62. fallback:
  63. for (i = 0;i < batchsize;++i)
  64. ret |= crypto_sign_open(m[i], &mlen[i], sm[i], smlen[i], pk[i]);
  65. }
  66. m += batchsize;
  67. mlen += batchsize;
  68. sm += batchsize;
  69. smlen += batchsize;
  70. pk += batchsize;
  71. num -= batchsize;
  72. }
  73. for (i = 0;i < num;++i)
  74. ret |= crypto_sign_open(m[i], &mlen[i], sm[i], smlen[i], pk[i]);
  75. return ret;
  76. }