Home | History | Annotate | Line # | Download | only in salsa20
      1 #include "crypto_stream_salsa20.h"
      2 #include "private/common.h"
      3 #include "private/implementations.h"
      4 #include "randombytes.h"
      5 #include "runtime.h"
      6 #include "stream_salsa20.h"
      7 
      8 #ifdef HAVE_AMD64_ASM
      9 # include "xmm6/salsa20_xmm6.h"
     10 #else
     11 # include "ref/salsa20_ref.h"
     12 #endif
     13 #if !defined(HAVE_AMD64_ASM) && defined(HAVE_EMMINTRIN_H)
     14 # include "xmm6int/salsa20_xmm6int-sse2.h"
     15 #endif
     16 #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_EMMINTRIN_H) && \
     17     defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H)
     18 # include "xmm6int/salsa20_xmm6int-avx2.h"
     19 #endif
     20 
     21 #if HAVE_AMD64_ASM
     22 static const crypto_stream_salsa20_implementation *implementation =
     23     &crypto_stream_salsa20_xmm6_implementation;
     24 #else
     25 static const crypto_stream_salsa20_implementation *implementation =
     26     &crypto_stream_salsa20_ref_implementation;
     27 #endif
     28 
     29 size_t
     30 crypto_stream_salsa20_keybytes(void)
     31 {
     32     return crypto_stream_salsa20_KEYBYTES;
     33 }
     34 
     35 size_t
     36 crypto_stream_salsa20_noncebytes(void)
     37 {
     38     return crypto_stream_salsa20_NONCEBYTES;
     39 }
     40 
     41 size_t
     42 crypto_stream_salsa20_messagebytes_max(void)
     43 {
     44     return crypto_stream_salsa20_MESSAGEBYTES_MAX;
     45 }
     46 
     47 int
     48 crypto_stream_salsa20(unsigned char *c, unsigned long long clen,
     49                       const unsigned char *n, const unsigned char *k)
     50 {
     51     return implementation->stream(c, clen, n, k);
     52 }
     53 
     54 int
     55 crypto_stream_salsa20_xor_ic(unsigned char *c, const unsigned char *m,
     56                              unsigned long long mlen,
     57                              const unsigned char *n, uint64_t ic,
     58                              const unsigned char *k)
     59 {
     60     return implementation->stream_xor_ic(c, m, mlen, n, ic, k);
     61 }
     62 
     63 int
     64 crypto_stream_salsa20_xor(unsigned char *c, const unsigned char *m,
     65                           unsigned long long mlen, const unsigned char *n,
     66                           const unsigned char *k)
     67 {
     68     return implementation->stream_xor_ic(c, m, mlen, n, 0U, k);
     69 }
     70 
     71 void
     72 crypto_stream_salsa20_keygen(unsigned char k[crypto_stream_salsa20_KEYBYTES])
     73 {
     74     randombytes_buf(k, crypto_stream_salsa20_KEYBYTES);
     75 }
     76 
     77 int
     78 _crypto_stream_salsa20_pick_best_implementation(void)
     79 {
     80 #ifdef HAVE_AMD64_ASM
     81     implementation = &crypto_stream_salsa20_xmm6_implementation;
     82 #else
     83     implementation = &crypto_stream_salsa20_ref_implementation;
     84 #endif
     85 
     86 #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_EMMINTRIN_H) && \
     87     defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H)
     88     if (sodium_runtime_has_avx2()) {
     89         implementation = &crypto_stream_salsa20_xmm6int_avx2_implementation;
     90         return 0;
     91     }
     92 #endif
     93 #if !defined(HAVE_AMD64_ASM) && defined(HAVE_EMMINTRIN_H)
     94     if (sodium_runtime_has_sse2()) {
     95         implementation = &crypto_stream_salsa20_xmm6int_sse2_implementation;
     96         return 0;
     97     }
     98 #endif
     99     return 0; /* LCOV_EXCL_LINE */
    100 }
    101