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