scalarmult_ristretto255_ref10.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <string.h>
  2. #include "crypto_scalarmult_ed25519.h"
  3. #include "crypto_scalarmult_ristretto255.h"
  4. #include "private/ed25519_ref10.h"
  5. #include "utils.h"
  6. int
  7. crypto_scalarmult_ristretto255(unsigned char *q, const unsigned char *n,
  8. const unsigned char *p)
  9. {
  10. unsigned char *t = q;
  11. ge25519_p3 Q;
  12. ge25519_p3 P;
  13. unsigned int i;
  14. if (ristretto255_frombytes(&P, p) != 0) {
  15. return -1;
  16. }
  17. for (i = 0; i < 32; ++i) {
  18. t[i] = n[i];
  19. }
  20. t[31] &= 127;
  21. ge25519_scalarmult(&Q, t, &P);
  22. ristretto255_p3_tobytes(q, &Q);
  23. if (sodium_is_zero(q, 32)) {
  24. return -1;
  25. }
  26. return 0;
  27. }
  28. int
  29. crypto_scalarmult_ristretto255_base(unsigned char *q,
  30. const unsigned char *n)
  31. {
  32. unsigned char *t = q;
  33. ge25519_p3 Q;
  34. unsigned int i;
  35. for (i = 0; i < 32; ++i) {
  36. t[i] = n[i];
  37. }
  38. t[31] &= 127;
  39. ge25519_scalarmult_base(&Q, t);
  40. ristretto255_p3_tobytes(q, &Q);
  41. if (sodium_is_zero(q, 32)) {
  42. return -1;
  43. }
  44. return 0;
  45. }
  46. size_t
  47. crypto_scalarmult_ristretto255_bytes(void)
  48. {
  49. return crypto_scalarmult_ristretto255_BYTES;
  50. }
  51. size_t
  52. crypto_scalarmult_ristretto255_scalarbytes(void)
  53. {
  54. return crypto_scalarmult_ristretto255_SCALARBYTES;
  55. }