Add local patches to LibreSSL.
[dragonfly.git] / crypto / libressl / crypto / chacha / chacha-merged.c
blobf72dc966bd2185a3c940111ea6b56768e4e84bf7
1 /* $OpenBSD: chacha-merged.c,v 1.9 2019/01/22 00:59:21 dlg Exp $ */
2 /*
3 chacha-merged.c version 20080118
4 D. J. Bernstein
5 Public domain.
6 */
8 #include <sys/types.h>
10 #include <stdint.h>
12 #if !defined(__OpenBSD__)
13 #define __bounded__(x, y, z)
14 #endif
16 #define CHACHA_MINKEYLEN 16
17 #define CHACHA_NONCELEN 8
18 #define CHACHA_CTRLEN 8
19 #define CHACHA_STATELEN (CHACHA_NONCELEN+CHACHA_CTRLEN)
20 #define CHACHA_BLOCKLEN 64
22 struct chacha_ctx {
23 u_int input[16];
24 uint8_t ks[CHACHA_BLOCKLEN];
25 uint8_t unused;
28 static inline void chacha_keysetup(struct chacha_ctx *x, const u_char *k,
29 u_int kbits)
30 __attribute__((__bounded__(__minbytes__, 2, CHACHA_MINKEYLEN)));
31 static inline void chacha_ivsetup(struct chacha_ctx *x, const u_char *iv,
32 const u_char *ctr)
33 __attribute__((__bounded__(__minbytes__, 2, CHACHA_NONCELEN)))
34 __attribute__((__bounded__(__minbytes__, 3, CHACHA_CTRLEN)));
35 static inline void chacha_encrypt_bytes(struct chacha_ctx *x, const u_char *m,
36 u_char *c, u_int bytes)
37 __attribute__((__bounded__(__buffer__, 2, 4)))
38 __attribute__((__bounded__(__buffer__, 3, 4)));
40 typedef unsigned char u8;
41 typedef unsigned int u32;
43 typedef struct chacha_ctx chacha_ctx;
45 #define U8C(v) (v##U)
46 #define U32C(v) (v##U)
48 #define U8V(v) ((u8)(v) & U8C(0xFF))
49 #define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF))
51 #define ROTL32(v, n) \
52 (U32V((v) << (n)) | ((v) >> (32 - (n))))
54 #define U8TO32_LITTLE(p) \
55 (((u32)((p)[0])) | \
56 ((u32)((p)[1]) << 8) | \
57 ((u32)((p)[2]) << 16) | \
58 ((u32)((p)[3]) << 24))
60 #define U32TO8_LITTLE(p, v) \
61 do { \
62 (p)[0] = U8V((v)); \
63 (p)[1] = U8V((v) >> 8); \
64 (p)[2] = U8V((v) >> 16); \
65 (p)[3] = U8V((v) >> 24); \
66 } while (0)
68 #define ROTATE(v,c) (ROTL32(v,c))
69 #define XOR(v,w) ((v) ^ (w))
70 #define PLUS(v,w) (U32V((v) + (w)))
71 #define PLUSONE(v) (PLUS((v),1))
73 #define QUARTERROUND(a,b,c,d) \
74 a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \
75 c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \
76 a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \
77 c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);
79 /* Initialise with "expand 32-byte k". */
80 static const char sigma[16] = {
81 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x33,
82 0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6b,
85 /* Initialise with "expand 16-byte k". */
86 static const char tau[16] = {
87 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x31,
88 0x36, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6b,
91 static inline void
92 chacha_keysetup(chacha_ctx *x, const u8 *k, u32 kbits)
94 const char *constants;
96 x->input[4] = U8TO32_LITTLE(k + 0);
97 x->input[5] = U8TO32_LITTLE(k + 4);
98 x->input[6] = U8TO32_LITTLE(k + 8);
99 x->input[7] = U8TO32_LITTLE(k + 12);
100 if (kbits == 256) { /* recommended */
101 k += 16;
102 constants = sigma;
103 } else { /* kbits == 128 */
104 constants = tau;
106 x->input[8] = U8TO32_LITTLE(k + 0);
107 x->input[9] = U8TO32_LITTLE(k + 4);
108 x->input[10] = U8TO32_LITTLE(k + 8);
109 x->input[11] = U8TO32_LITTLE(k + 12);
110 x->input[0] = U8TO32_LITTLE(constants + 0);
111 x->input[1] = U8TO32_LITTLE(constants + 4);
112 x->input[2] = U8TO32_LITTLE(constants + 8);
113 x->input[3] = U8TO32_LITTLE(constants + 12);
116 static inline void
117 chacha_ivsetup(chacha_ctx *x, const u8 *iv, const u8 *counter)
119 x->input[12] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 0);
120 x->input[13] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 4);
121 x->input[14] = U8TO32_LITTLE(iv + 0);
122 x->input[15] = U8TO32_LITTLE(iv + 4);
125 static inline void
126 chacha_encrypt_bytes(chacha_ctx *x, const u8 *m, u8 *c, u32 bytes)
128 u32 x0, x1, x2, x3, x4, x5, x6, x7;
129 u32 x8, x9, x10, x11, x12, x13, x14, x15;
130 u32 j0, j1, j2, j3, j4, j5, j6, j7;
131 u32 j8, j9, j10, j11, j12, j13, j14, j15;
132 u8 *ctarget = NULL;
133 u8 tmp[64];
134 u_int i;
136 if (!bytes)
137 return;
139 j0 = x->input[0];
140 j1 = x->input[1];
141 j2 = x->input[2];
142 j3 = x->input[3];
143 j4 = x->input[4];
144 j5 = x->input[5];
145 j6 = x->input[6];
146 j7 = x->input[7];
147 j8 = x->input[8];
148 j9 = x->input[9];
149 j10 = x->input[10];
150 j11 = x->input[11];
151 j12 = x->input[12];
152 j13 = x->input[13];
153 j14 = x->input[14];
154 j15 = x->input[15];
156 for (;;) {
157 if (bytes < 64) {
158 for (i = 0; i < bytes; ++i)
159 tmp[i] = m[i];
160 m = tmp;
161 ctarget = c;
162 c = tmp;
164 x0 = j0;
165 x1 = j1;
166 x2 = j2;
167 x3 = j3;
168 x4 = j4;
169 x5 = j5;
170 x6 = j6;
171 x7 = j7;
172 x8 = j8;
173 x9 = j9;
174 x10 = j10;
175 x11 = j11;
176 x12 = j12;
177 x13 = j13;
178 x14 = j14;
179 x15 = j15;
180 for (i = 20; i > 0; i -= 2) {
181 QUARTERROUND(x0, x4, x8, x12)
182 QUARTERROUND(x1, x5, x9, x13)
183 QUARTERROUND(x2, x6, x10, x14)
184 QUARTERROUND(x3, x7, x11, x15)
185 QUARTERROUND(x0, x5, x10, x15)
186 QUARTERROUND(x1, x6, x11, x12)
187 QUARTERROUND(x2, x7, x8, x13)
188 QUARTERROUND(x3, x4, x9, x14)
190 x0 = PLUS(x0, j0);
191 x1 = PLUS(x1, j1);
192 x2 = PLUS(x2, j2);
193 x3 = PLUS(x3, j3);
194 x4 = PLUS(x4, j4);
195 x5 = PLUS(x5, j5);
196 x6 = PLUS(x6, j6);
197 x7 = PLUS(x7, j7);
198 x8 = PLUS(x8, j8);
199 x9 = PLUS(x9, j9);
200 x10 = PLUS(x10, j10);
201 x11 = PLUS(x11, j11);
202 x12 = PLUS(x12, j12);
203 x13 = PLUS(x13, j13);
204 x14 = PLUS(x14, j14);
205 x15 = PLUS(x15, j15);
207 if (bytes < 64) {
208 U32TO8_LITTLE(x->ks + 0, x0);
209 U32TO8_LITTLE(x->ks + 4, x1);
210 U32TO8_LITTLE(x->ks + 8, x2);
211 U32TO8_LITTLE(x->ks + 12, x3);
212 U32TO8_LITTLE(x->ks + 16, x4);
213 U32TO8_LITTLE(x->ks + 20, x5);
214 U32TO8_LITTLE(x->ks + 24, x6);
215 U32TO8_LITTLE(x->ks + 28, x7);
216 U32TO8_LITTLE(x->ks + 32, x8);
217 U32TO8_LITTLE(x->ks + 36, x9);
218 U32TO8_LITTLE(x->ks + 40, x10);
219 U32TO8_LITTLE(x->ks + 44, x11);
220 U32TO8_LITTLE(x->ks + 48, x12);
221 U32TO8_LITTLE(x->ks + 52, x13);
222 U32TO8_LITTLE(x->ks + 56, x14);
223 U32TO8_LITTLE(x->ks + 60, x15);
226 x0 = XOR(x0, U8TO32_LITTLE(m + 0));
227 x1 = XOR(x1, U8TO32_LITTLE(m + 4));
228 x2 = XOR(x2, U8TO32_LITTLE(m + 8));
229 x3 = XOR(x3, U8TO32_LITTLE(m + 12));
230 x4 = XOR(x4, U8TO32_LITTLE(m + 16));
231 x5 = XOR(x5, U8TO32_LITTLE(m + 20));
232 x6 = XOR(x6, U8TO32_LITTLE(m + 24));
233 x7 = XOR(x7, U8TO32_LITTLE(m + 28));
234 x8 = XOR(x8, U8TO32_LITTLE(m + 32));
235 x9 = XOR(x9, U8TO32_LITTLE(m + 36));
236 x10 = XOR(x10, U8TO32_LITTLE(m + 40));
237 x11 = XOR(x11, U8TO32_LITTLE(m + 44));
238 x12 = XOR(x12, U8TO32_LITTLE(m + 48));
239 x13 = XOR(x13, U8TO32_LITTLE(m + 52));
240 x14 = XOR(x14, U8TO32_LITTLE(m + 56));
241 x15 = XOR(x15, U8TO32_LITTLE(m + 60));
243 j12 = PLUSONE(j12);
244 if (!j12) {
245 j13 = PLUSONE(j13);
247 * Stopping at 2^70 bytes per nonce is the user's
248 * responsibility.
252 U32TO8_LITTLE(c + 0, x0);
253 U32TO8_LITTLE(c + 4, x1);
254 U32TO8_LITTLE(c + 8, x2);
255 U32TO8_LITTLE(c + 12, x3);
256 U32TO8_LITTLE(c + 16, x4);
257 U32TO8_LITTLE(c + 20, x5);
258 U32TO8_LITTLE(c + 24, x6);
259 U32TO8_LITTLE(c + 28, x7);
260 U32TO8_LITTLE(c + 32, x8);
261 U32TO8_LITTLE(c + 36, x9);
262 U32TO8_LITTLE(c + 40, x10);
263 U32TO8_LITTLE(c + 44, x11);
264 U32TO8_LITTLE(c + 48, x12);
265 U32TO8_LITTLE(c + 52, x13);
266 U32TO8_LITTLE(c + 56, x14);
267 U32TO8_LITTLE(c + 60, x15);
269 if (bytes <= 64) {
270 if (bytes < 64) {
271 for (i = 0; i < bytes; ++i)
272 ctarget[i] = c[i];
274 x->input[12] = j12;
275 x->input[13] = j13;
276 x->unused = 64 - bytes;
277 return;
279 bytes -= 64;
280 c += 64;
281 m += 64;
285 void
286 CRYPTO_hchacha_20(unsigned char subkey[32], const unsigned char key[32],
287 const unsigned char nonce[16])
289 uint32_t x[16];
290 int i;
292 x[0] = U8TO32_LITTLE(sigma + 0);
293 x[1] = U8TO32_LITTLE(sigma + 4);
294 x[2] = U8TO32_LITTLE(sigma + 8);
295 x[3] = U8TO32_LITTLE(sigma + 12);
296 x[4] = U8TO32_LITTLE(key + 0);
297 x[5] = U8TO32_LITTLE(key + 4);
298 x[6] = U8TO32_LITTLE(key + 8);
299 x[7] = U8TO32_LITTLE(key + 12);
300 x[8] = U8TO32_LITTLE(key + 16);
301 x[9] = U8TO32_LITTLE(key + 20);
302 x[10] = U8TO32_LITTLE(key + 24);
303 x[11] = U8TO32_LITTLE(key + 28);
304 x[12] = U8TO32_LITTLE(nonce + 0);
305 x[13] = U8TO32_LITTLE(nonce + 4);
306 x[14] = U8TO32_LITTLE(nonce + 8);
307 x[15] = U8TO32_LITTLE(nonce + 12);
309 for (i = 20; i > 0; i -= 2) {
310 QUARTERROUND(x[0], x[4], x[8], x[12])
311 QUARTERROUND(x[1], x[5], x[9], x[13])
312 QUARTERROUND(x[2], x[6], x[10], x[14])
313 QUARTERROUND(x[3], x[7], x[11], x[15])
314 QUARTERROUND(x[0], x[5], x[10], x[15])
315 QUARTERROUND(x[1], x[6], x[11], x[12])
316 QUARTERROUND(x[2], x[7], x[8], x[13])
317 QUARTERROUND(x[3], x[4], x[9], x[14])
320 U32TO8_LITTLE(subkey + 0, x[0]);
321 U32TO8_LITTLE(subkey + 4, x[1]);
322 U32TO8_LITTLE(subkey + 8, x[2]);
323 U32TO8_LITTLE(subkey + 12, x[3]);
325 U32TO8_LITTLE(subkey + 16, x[12]);
326 U32TO8_LITTLE(subkey + 20, x[13]);
327 U32TO8_LITTLE(subkey + 24, x[14]);
328 U32TO8_LITTLE(subkey + 28, x[15]);