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
crypto_stream_chacha20_keybytes(void)21 crypto_stream_chacha20_keybytes(void) {
22 return crypto_stream_chacha20_KEYBYTES;
23 }
24
25 size_t
crypto_stream_chacha20_noncebytes(void)26 crypto_stream_chacha20_noncebytes(void) {
27 return crypto_stream_chacha20_NONCEBYTES;
28 }
29
30 size_t
crypto_stream_chacha20_messagebytes_max(void)31 crypto_stream_chacha20_messagebytes_max(void)
32 {
33 return crypto_stream_chacha20_MESSAGEBYTES_MAX;
34 }
35
36 size_t
crypto_stream_chacha20_ietf_keybytes(void)37 crypto_stream_chacha20_ietf_keybytes(void) {
38 return crypto_stream_chacha20_ietf_KEYBYTES;
39 }
40
41 size_t
crypto_stream_chacha20_ietf_noncebytes(void)42 crypto_stream_chacha20_ietf_noncebytes(void) {
43 return crypto_stream_chacha20_ietf_NONCEBYTES;
44 }
45
46 size_t
crypto_stream_chacha20_ietf_messagebytes_max(void)47 crypto_stream_chacha20_ietf_messagebytes_max(void)
48 {
49 return crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX;
50 }
51
52 int
crypto_stream_chacha20(unsigned char * c,unsigned long long clen,const unsigned char * n,const unsigned char * k)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
crypto_stream_chacha20_ietf(unsigned char * c,unsigned long long clen,const unsigned char * n,const unsigned char * k)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
crypto_stream_chacha20_xor_ic(unsigned char * c,const unsigned char * m,unsigned long long mlen,const unsigned char * n,uint64_t ic,const unsigned char * k)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
crypto_stream_chacha20_ietf_xor_ic(unsigned char * c,const unsigned char * m,unsigned long long mlen,const unsigned char * n,uint32_t ic,const unsigned char * k)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
crypto_stream_chacha20_xor(unsigned char * c,const unsigned char * m,unsigned long long mlen,const unsigned char * n,const unsigned char * k)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
crypto_stream_chacha20_ietf_xor(unsigned char * c,const unsigned char * m,unsigned long long mlen,const unsigned char * n,const unsigned char * k)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
crypto_stream_chacha20_ietf_keygen(unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES])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
crypto_stream_chacha20_keygen(unsigned char k[crypto_stream_chacha20_KEYBYTES])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
_crypto_stream_chacha20_pick_best_implementation(void)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