1 #include "crypto_core_hsalsa20.h"
2 #include "crypto_stream_salsa20.h"
3 #include "crypto_stream_xsalsa20.h"
4 #include "randombytes.h"
5 #include "utils.h"
6 
7 int
8 crypto_stream_xsalsa20(unsigned char *c, unsigned long long clen,
9                        const unsigned char *n, const unsigned char *k)
10 {
11     unsigned char subkey[32];
12     int           ret;
13 
14     crypto_core_hsalsa20(subkey, n, k, NULL);
15     ret = crypto_stream_salsa20(c, clen, n + 16, subkey);
16     sodium_memzero(subkey, sizeof subkey);
17 
18     return ret;
19 }
20 
21 int
22 crypto_stream_xsalsa20_xor_ic(unsigned char *c, const unsigned char *m,
23                               unsigned long long mlen, const unsigned char *n,
24                               uint64_t ic, const unsigned char *k)
25 {
26     unsigned char subkey[32];
27     int           ret;
28 
29     crypto_core_hsalsa20(subkey, n, k, NULL);
30     ret = crypto_stream_salsa20_xor_ic(c, m, mlen, n + 16, ic, subkey);
31     sodium_memzero(subkey, sizeof subkey);
32 
33     return ret;
34 }
35 
36 int
37 crypto_stream_xsalsa20_xor(unsigned char *c, const unsigned char *m,
38                            unsigned long long mlen, const unsigned char *n,
39                            const unsigned char *k)
40 {
41     return crypto_stream_xsalsa20_xor_ic(c, m, mlen, n, 0ULL, k);
42 }
43 
44 size_t
45 crypto_stream_xsalsa20_keybytes(void)
46 {
47     return crypto_stream_xsalsa20_KEYBYTES;
48 }
49 
50 size_t
51 crypto_stream_xsalsa20_noncebytes(void)
52 {
53     return crypto_stream_xsalsa20_NONCEBYTES;
54 }
55 
56 size_t
57 crypto_stream_xsalsa20_messagebytes_max(void)
58 {
59     return crypto_stream_xsalsa20_MESSAGEBYTES_MAX;
60 }
61 
62 void
63 crypto_stream_xsalsa20_keygen(unsigned char k[crypto_stream_xsalsa20_KEYBYTES])
64 {
65     randombytes_buf(k, crypto_stream_xsalsa20_KEYBYTES);
66 }
67