de0eae9f3f8b26b6a9bf220341aca38dc3e17f32
[trex.git] /
1 /*
2 version 20140420
3 D. J. Bernstein
4 Public domain.
5 */
6
7 #include "api.h"
8 #include "crypto_core_salsa208.h"
9 #include "utils.h"
10
11 typedef unsigned int uint32;
12
13 static const unsigned char sigma[16] = {
14     'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'
15 };
16
17 int crypto_stream_xor(
18         unsigned char *c,
19   const unsigned char *m,unsigned long long mlen,
20   const unsigned char *n,
21   const unsigned char *k
22 )
23 {
24   unsigned char in[16];
25   unsigned char block[64];
26   unsigned char kcopy[32];
27   unsigned int i;
28   unsigned int u;
29
30   if (!mlen) return 0;
31
32   for (i = 0;i < 32;++i) kcopy[i] = k[i];
33   for (i = 0;i < 8;++i) in[i] = n[i];
34   for (i = 8;i < 16;++i) in[i] = 0;
35
36   while (mlen >= 64) {
37     crypto_core_salsa208(block,in,kcopy,sigma);
38     for (i = 0;i < 64;++i) c[i] = m[i] ^ block[i];
39
40     u = 1;
41     for (i = 8;i < 16;++i) {
42       u += (unsigned int) in[i];
43       in[i] = u;
44       u >>= 8;
45     }
46
47     mlen -= 64;
48     c += 64;
49     m += 64;
50   }
51
52   if (mlen) {
53     crypto_core_salsa208(block,in,kcopy,sigma);
54     for (i = 0;i < (unsigned int) mlen;++i) c[i] = m[i] ^ block[i];
55   }
56   sodium_memzero(block, sizeof block);
57   sodium_memzero(kcopy, sizeof kcopy);
58
59   return 0;
60 }