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