1 2 #include <stdlib.h> 3 4 #include "crypto_core_hchacha20.h" 5 #include "crypto_stream_chacha20.h" 6 #include "crypto_stream_xchacha20.h" 7 #include "private/common.h" 8 #include "randombytes.h" 9 10 size_t 11 crypto_stream_xchacha20_keybytes(void) 12 { 13 return crypto_stream_xchacha20_KEYBYTES; 14 } 15 16 size_t 17 crypto_stream_xchacha20_noncebytes(void) 18 { 19 return crypto_stream_xchacha20_NONCEBYTES; 20 } 21 22 size_t 23 crypto_stream_xchacha20_messagebytes_max(void) 24 { 25 return crypto_stream_xchacha20_MESSAGEBYTES_MAX; 26 } 27 28 int 29 crypto_stream_xchacha20(unsigned char *c, unsigned long long clen, 30 const unsigned char *n, const unsigned char *k) 31 { 32 unsigned char k2[crypto_core_hchacha20_OUTPUTBYTES]; 33 34 crypto_core_hchacha20(k2, n, k, NULL); 35 COMPILER_ASSERT(crypto_stream_chacha20_KEYBYTES <= sizeof k2); 36 COMPILER_ASSERT(crypto_stream_chacha20_NONCEBYTES == 37 crypto_stream_xchacha20_NONCEBYTES - 38 crypto_core_hchacha20_INPUTBYTES); 39 40 return crypto_stream_chacha20(c, clen, n + crypto_core_hchacha20_INPUTBYTES, 41 k2); 42 } 43 44 int 45 crypto_stream_xchacha20_xor_ic(unsigned char *c, const unsigned char *m, 46 unsigned long long mlen, const unsigned char *n, 47 uint64_t ic, const unsigned char *k) 48 { 49 unsigned char k2[crypto_core_hchacha20_OUTPUTBYTES]; 50 51 crypto_core_hchacha20(k2, n, k, NULL); 52 return crypto_stream_chacha20_xor_ic( 53 c, m, mlen, n + crypto_core_hchacha20_INPUTBYTES, ic, k2); 54 } 55 56 int 57 crypto_stream_xchacha20_xor(unsigned char *c, const unsigned char *m, 58 unsigned long long mlen, const unsigned char *n, 59 const unsigned char *k) 60 { 61 return crypto_stream_xchacha20_xor_ic(c, m, mlen, n, 0U, k); 62 } 63 64 void 65 crypto_stream_xchacha20_keygen( 66 unsigned char k[crypto_stream_xchacha20_KEYBYTES]) 67 { 68 randombytes_buf(k, crypto_stream_xchacha20_KEYBYTES); 69 } 70