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