obsolete.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <limits.h>
  2. #include <stdint.h>
  3. #include <string.h>
  4. #include "crypto_hash_sha512.h"
  5. #include "crypto_sign_edwards25519sha512batch.h"
  6. #include "crypto_verify_32.h"
  7. #include "private/ed25519_ref10.h"
  8. #include "randombytes.h"
  9. #include "utils.h"
  10. /* LCOV_EXCL_START */
  11. int
  12. crypto_sign_edwards25519sha512batch_keypair(unsigned char *pk,
  13. unsigned char *sk)
  14. {
  15. ge25519_p3 A;
  16. randombytes_buf(sk, 32);
  17. crypto_hash_sha512(sk, sk, 32);
  18. sk[0] &= 248;
  19. sk[31] &= 127;
  20. sk[31] |= 64;
  21. ge25519_scalarmult_base(&A, sk);
  22. ge25519_p3_tobytes(pk, &A);
  23. return 0;
  24. }
  25. int
  26. crypto_sign_edwards25519sha512batch(unsigned char *sm,
  27. unsigned long long *smlen_p,
  28. const unsigned char *m,
  29. unsigned long long mlen,
  30. const unsigned char *sk)
  31. {
  32. crypto_hash_sha512_state hs;
  33. unsigned char nonce[64];
  34. unsigned char hram[64];
  35. unsigned char sig[64];
  36. ge25519_p3 A;
  37. ge25519_p3 R;
  38. crypto_hash_sha512_init(&hs);
  39. crypto_hash_sha512_update(&hs, sk + 32, 32);
  40. crypto_hash_sha512_update(&hs, m, mlen);
  41. crypto_hash_sha512_final(&hs, nonce);
  42. ge25519_scalarmult_base(&A, sk);
  43. ge25519_p3_tobytes(sig + 32, &A);
  44. sc25519_reduce(nonce);
  45. ge25519_scalarmult_base(&R, nonce);
  46. ge25519_p3_tobytes(sig, &R);
  47. crypto_hash_sha512_init(&hs);
  48. crypto_hash_sha512_update(&hs, sig, 32);
  49. crypto_hash_sha512_update(&hs, m, mlen);
  50. crypto_hash_sha512_final(&hs, hram);
  51. sc25519_reduce(hram);
  52. sc25519_muladd(sig + 32, hram, nonce, sk);
  53. sodium_memzero(hram, sizeof hram);
  54. memmove(sm + 32, m, (size_t) mlen);
  55. memcpy(sm, sig, 32);
  56. memcpy(sm + 32 + mlen, sig + 32, 32);
  57. *smlen_p = mlen + 64U;
  58. return 0;
  59. }
  60. int
  61. crypto_sign_edwards25519sha512batch_open(unsigned char *m,
  62. unsigned long long *mlen_p,
  63. const unsigned char *sm,
  64. unsigned long long smlen,
  65. const unsigned char *pk)
  66. {
  67. unsigned char h[64];
  68. unsigned char t1[32], t2[32];
  69. unsigned long long mlen;
  70. ge25519_cached Ai;
  71. ge25519_p1p1 csa;
  72. ge25519_p2 cs;
  73. ge25519_p3 A;
  74. ge25519_p3 R;
  75. ge25519_p3 cs3;
  76. *mlen_p = 0;
  77. if (smlen < 64 || smlen - 64 > crypto_sign_edwards25519sha512batch_MESSAGEBYTES_MAX) {
  78. return -1;
  79. }
  80. mlen = smlen - 64;
  81. if (sm[smlen - 1] & 224) {
  82. return -1;
  83. }
  84. if (ge25519_has_small_order(pk) != 0 ||
  85. ge25519_frombytes_negate_vartime(&A, pk) != 0 ||
  86. ge25519_has_small_order(sm) != 0 ||
  87. ge25519_frombytes_negate_vartime(&R, sm) != 0) {
  88. return -1;
  89. }
  90. ge25519_p3_to_cached(&Ai, &A);
  91. crypto_hash_sha512(h, sm, mlen + 32);
  92. sc25519_reduce(h);
  93. ge25519_scalarmult(&cs3, h, &R);
  94. ge25519_add(&csa, &cs3, &Ai);
  95. ge25519_p1p1_to_p2(&cs, &csa);
  96. ge25519_tobytes(t1, &cs);
  97. t1[31] ^= 1 << 7;
  98. ge25519_scalarmult_base(&R, sm + 32 + mlen);
  99. ge25519_p3_tobytes(t2, &R);
  100. if (crypto_verify_32(t1, t2) != 0) {
  101. return -1;
  102. }
  103. *mlen_p = mlen;
  104. memmove(m, sm + 32, mlen);
  105. return 0;
  106. }
  107. /* LCOV_EXCL_END */