scalarmult_curve25519.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 implementation->mult_base(q, n);
  29. }
  30. size_t
  31. crypto_scalarmult_curve25519_bytes(void)
  32. {
  33. return crypto_scalarmult_curve25519_BYTES;
  34. }
  35. size_t
  36. crypto_scalarmult_curve25519_scalarbytes(void)
  37. {
  38. return crypto_scalarmult_curve25519_SCALARBYTES;
  39. }
  40. int
  41. _crypto_scalarmult_curve25519_pick_best_implementation(void)
  42. {
  43. implementation = &crypto_scalarmult_curve25519_ref10_implementation;
  44. #ifdef HAVE_AVX_ASM
  45. if (sodium_runtime_has_avx()) {
  46. implementation = &crypto_scalarmult_curve25519_sandy2x_implementation;
  47. }
  48. #endif
  49. return 0;
  50. }