Home | History | Annotate | Line # | Download | only in chacha20
      1 #include "crypto_stream_chacha20.h"
      2 #include "private/common.h"
      3 #include "private/implementations.h"
      4 #include "randombytes.h"
      5 #include "runtime.h"
      6 #include "stream_chacha20.h"
      7 
      8 #include "ref/chacha20_ref.h"
      9 #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_EMMINTRIN_H) && \
     10     defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H)
     11 # include "dolbeau/chacha20_dolbeau-avx2.h"
     12 #endif
     13 #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H)
     14 # include "dolbeau/chacha20_dolbeau-ssse3.h"
     15 #endif
     16 
     17 static const crypto_stream_chacha20_implementation *implementation =
     18     &crypto_stream_chacha20_ref_implementation;
     19 
     20 size_t
     21 crypto_stream_chacha20_keybytes(void) {
     22     return crypto_stream_chacha20_KEYBYTES;
     23 }
     24 
     25 size_t
     26 crypto_stream_chacha20_noncebytes(void) {
     27     return crypto_stream_chacha20_NONCEBYTES;
     28 }
     29 
     30 size_t
     31 crypto_stream_chacha20_messagebytes_max(void)
     32 {
     33     return crypto_stream_chacha20_MESSAGEBYTES_MAX;
     34 }
     35 
     36 size_t
     37 crypto_stream_chacha20_ietf_keybytes(void) {
     38     return crypto_stream_chacha20_ietf_KEYBYTES;
     39 }
     40 
     41 size_t
     42 crypto_stream_chacha20_ietf_noncebytes(void) {
     43     return crypto_stream_chacha20_ietf_NONCEBYTES;
     44 }
     45 
     46 size_t
     47 crypto_stream_chacha20_ietf_messagebytes_max(void)
     48 {
     49     return crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX;
     50 }
     51 
     52 int
     53 crypto_stream_chacha20(unsigned char *c, unsigned long long clen,
     54                        const unsigned char *n, const unsigned char *k)
     55 {
     56     return implementation->stream(c, clen, n, k);
     57 }
     58 
     59 int
     60 crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen,
     61                             const unsigned char *n, const unsigned char *k)
     62 {
     63     return implementation->stream_ietf(c, clen, n, k);
     64 }
     65 
     66 int
     67 crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m,
     68                               unsigned long long mlen,
     69                               const unsigned char *n, uint64_t ic,
     70                               const unsigned char *k)
     71 {
     72     return implementation->stream_xor_ic(c, m, mlen, n, ic, k);
     73 }
     74 
     75 int
     76 crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m,
     77                                    unsigned long long mlen,
     78                                    const unsigned char *n, uint32_t ic,
     79                                    const unsigned char *k)
     80 {
     81     return implementation->stream_ietf_xor_ic(c, m, mlen, n, ic, k);
     82 }
     83 
     84 int
     85 crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m,
     86                            unsigned long long mlen, const unsigned char *n,
     87                            const unsigned char *k)
     88 {
     89     return implementation->stream_xor_ic(c, m, mlen, n, 0U, k);
     90 }
     91 
     92 int
     93 crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m,
     94                                 unsigned long long mlen, const unsigned char *n,
     95                                 const unsigned char *k)
     96 {
     97     return implementation->stream_ietf_xor_ic(c, m, mlen, n, 0U, k);
     98 }
     99 
    100 void
    101 crypto_stream_chacha20_ietf_keygen(unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES])
    102 {
    103     randombytes_buf(k, crypto_stream_chacha20_ietf_KEYBYTES);
    104 }
    105 
    106 void
    107 crypto_stream_chacha20_keygen(unsigned char k[crypto_stream_chacha20_KEYBYTES])
    108 {
    109     randombytes_buf(k, crypto_stream_chacha20_KEYBYTES);
    110 }
    111 
    112 int
    113 _crypto_stream_chacha20_pick_best_implementation(void)
    114 {
    115     implementation = &crypto_stream_chacha20_ref_implementation;
    116 #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_EMMINTRIN_H) && \
    117     defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H)
    118     if (sodium_runtime_has_avx2()) {
    119         implementation = &crypto_stream_chacha20_dolbeau_avx2_implementation;
    120         return 0;
    121     }
    122 #endif
    123 #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H)
    124     if (sodium_runtime_has_ssse3()) {
    125         implementation = &crypto_stream_chacha20_dolbeau_ssse3_implementation;
    126         return 0;
    127     }
    128 #endif
    129     return 0;
    130 }
    131