scalarmult_curve25519.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include "crypto_scalarmult_curve25519.h"
  2. #include "private/implementations.h"
  3. #include "scalarmult_curve25519.h"
  4. #include "runtime.h"
  5. #ifdef HAVE_AVX_ASM
  6. # include "sandy2x/curve25519_sandy2x.h"
  7. #endif
  8. #include "ref10/x25519_ref10.h"
  9. static const crypto_scalarmult_curve25519_implementation *implementation =
  10. &crypto_scalarmult_curve25519_ref10_implementation;
  11. int
  12. crypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n,
  13. const unsigned char *p)
  14. {
  15. size_t i;
  16. volatile unsigned char d = 0;
  17. if (implementation->mult(q, n, p) != 0) {
  18. return -1; /* LCOV_EXCL_LINE */
  19. }
  20. for (i = 0; i < crypto_scalarmult_curve25519_BYTES; i++) {
  21. d |= q[i];
  22. }
  23. return -(1 & ((d - 1) >> 8));
  24. }
  25. int
  26. crypto_scalarmult_curve25519_base(unsigned char *q, const unsigned char *n)
  27. {
  28. return crypto_scalarmult_curve25519_ref10_implementation
  29. .mult_base(q, n);
  30. }
  31. size_t
  32. crypto_scalarmult_curve25519_bytes(void)
  33. {
  34. return crypto_scalarmult_curve25519_BYTES;
  35. }
  36. size_t
  37. crypto_scalarmult_curve25519_scalarbytes(void)
  38. {
  39. return crypto_scalarmult_curve25519_SCALARBYTES;
  40. }
  41. int
  42. _crypto_scalarmult_curve25519_pick_best_implementation(void)
  43. {
  44. implementation = &crypto_scalarmult_curve25519_ref10_implementation;
  45. #ifdef HAVE_AVX_ASM
  46. if (sodium_runtime_has_avx()) {
  47. implementation = &crypto_scalarmult_curve25519_sandy2x_implementation;
  48. }
  49. #endif
  50. return 0;
  51. }