stream_chacha20.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #include "crypto_stream_chacha20.h"
  2. #include "core.h"
  3. #include "private/chacha20_ietf_ext.h"
  4. #include "private/common.h"
  5. #include "private/implementations.h"
  6. #include "randombytes.h"
  7. #include "runtime.h"
  8. #include "stream_chacha20.h"
  9. #include "ref/chacha20_ref.h"
  10. #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_EMMINTRIN_H) && \
  11. defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H)
  12. # include "dolbeau/chacha20_dolbeau-avx2.h"
  13. #endif
  14. #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H)
  15. # include "dolbeau/chacha20_dolbeau-ssse3.h"
  16. #endif
  17. static const crypto_stream_chacha20_implementation *implementation =
  18. &crypto_stream_chacha20_ref_implementation;
  19. size_t
  20. crypto_stream_chacha20_keybytes(void) {
  21. return crypto_stream_chacha20_KEYBYTES;
  22. }
  23. size_t
  24. crypto_stream_chacha20_noncebytes(void) {
  25. return crypto_stream_chacha20_NONCEBYTES;
  26. }
  27. size_t
  28. crypto_stream_chacha20_messagebytes_max(void)
  29. {
  30. return crypto_stream_chacha20_MESSAGEBYTES_MAX;
  31. }
  32. size_t
  33. crypto_stream_chacha20_ietf_keybytes(void) {
  34. return crypto_stream_chacha20_ietf_KEYBYTES;
  35. }
  36. size_t
  37. crypto_stream_chacha20_ietf_noncebytes(void) {
  38. return crypto_stream_chacha20_ietf_NONCEBYTES;
  39. }
  40. size_t
  41. crypto_stream_chacha20_ietf_messagebytes_max(void)
  42. {
  43. return crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX;
  44. }
  45. int
  46. crypto_stream_chacha20(unsigned char *c, unsigned long long clen,
  47. const unsigned char *n, const unsigned char *k)
  48. {
  49. if (clen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
  50. sodium_misuse();
  51. }
  52. return implementation->stream(c, clen, n, k);
  53. }
  54. int
  55. crypto_stream_chacha20_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. if (mlen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
  61. sodium_misuse();
  62. }
  63. return implementation->stream_xor_ic(c, m, mlen, n, ic, k);
  64. }
  65. int
  66. crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m,
  67. unsigned long long mlen, const unsigned char *n,
  68. const unsigned char *k)
  69. {
  70. if (mlen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
  71. sodium_misuse();
  72. }
  73. return implementation->stream_xor_ic(c, m, mlen, n, 0U, k);
  74. }
  75. int
  76. crypto_stream_chacha20_ietf_ext(unsigned char *c, unsigned long long clen,
  77. const unsigned char *n, const unsigned char *k)
  78. {
  79. if (clen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
  80. sodium_misuse();
  81. }
  82. return implementation->stream_ietf_ext(c, clen, n, k);
  83. }
  84. int
  85. crypto_stream_chacha20_ietf_ext_xor_ic(unsigned char *c, const unsigned char *m,
  86. unsigned long long mlen,
  87. const unsigned char *n, uint32_t ic,
  88. const unsigned char *k)
  89. {
  90. if (mlen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
  91. sodium_misuse();
  92. }
  93. return implementation->stream_ietf_ext_xor_ic(c, m, mlen, n, ic, k);
  94. }
  95. static int
  96. crypto_stream_chacha20_ietf_ext_xor(unsigned char *c, const unsigned char *m,
  97. unsigned long long mlen, const unsigned char *n,
  98. const unsigned char *k)
  99. {
  100. if (mlen > crypto_stream_chacha20_MESSAGEBYTES_MAX) {
  101. sodium_misuse();
  102. }
  103. return implementation->stream_ietf_ext_xor_ic(c, m, mlen, n, 0U, k);
  104. }
  105. int
  106. crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen,
  107. const unsigned char *n, const unsigned char *k)
  108. {
  109. if (clen > crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX) {
  110. sodium_misuse();
  111. }
  112. return crypto_stream_chacha20_ietf_ext(c, clen, n, k);
  113. }
  114. int
  115. crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m,
  116. unsigned long long mlen,
  117. const unsigned char *n, uint32_t ic,
  118. const unsigned char *k)
  119. {
  120. if ((unsigned long long) ic >
  121. (64ULL * (1ULL << 32)) / 64ULL - (mlen + 63ULL) / 64ULL) {
  122. sodium_misuse();
  123. }
  124. return crypto_stream_chacha20_ietf_ext_xor_ic(c, m, mlen, n, ic, k);
  125. }
  126. int
  127. crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m,
  128. unsigned long long mlen, const unsigned char *n,
  129. const unsigned char *k)
  130. {
  131. if (mlen > crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX) {
  132. sodium_misuse();
  133. }
  134. return crypto_stream_chacha20_ietf_ext_xor(c, m, mlen, n, k);
  135. }
  136. void
  137. crypto_stream_chacha20_ietf_keygen(unsigned char k[crypto_stream_chacha20_ietf_KEYBYTES])
  138. {
  139. randombytes_buf(k, crypto_stream_chacha20_ietf_KEYBYTES);
  140. }
  141. void
  142. crypto_stream_chacha20_keygen(unsigned char k[crypto_stream_chacha20_KEYBYTES])
  143. {
  144. randombytes_buf(k, crypto_stream_chacha20_KEYBYTES);
  145. }
  146. int
  147. _crypto_stream_chacha20_pick_best_implementation(void)
  148. {
  149. implementation = &crypto_stream_chacha20_ref_implementation;
  150. #if defined(HAVE_AVX2INTRIN_H) && defined(HAVE_EMMINTRIN_H) && \
  151. defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H)
  152. if (sodium_runtime_has_avx2()) {
  153. implementation = &crypto_stream_chacha20_dolbeau_avx2_implementation;
  154. return 0;
  155. }
  156. #endif
  157. #if defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H)
  158. if (sodium_runtime_has_ssse3()) {
  159. implementation = &crypto_stream_chacha20_dolbeau_ssse3_implementation;
  160. return 0;
  161. }
  162. #endif
  163. return 0;
  164. }