summaryrefslogtreecommitdiff
path: root/src/lib/libssl/src/crypto/chacha/chacha-merged.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libssl/src/crypto/chacha/chacha-merged.c32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/lib/libssl/src/crypto/chacha/chacha-merged.c b/src/lib/libssl/src/crypto/chacha/chacha-merged.c
index 25092b16da..a665fb316f 100644
--- a/src/lib/libssl/src/crypto/chacha/chacha-merged.c
+++ b/src/lib/libssl/src/crypto/chacha/chacha-merged.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: chacha-merged.c,v 1.5 2014/06/24 17:48:30 jsing Exp $ */ 1/* $OpenBSD: chacha-merged.c,v 1.6 2014/06/24 18:12:09 jsing Exp $ */
2/* 2/*
3chacha-merged.c version 20080118 3chacha-merged.c version 20080118
4D. J. Bernstein 4D. J. Bernstein
@@ -7,16 +7,18 @@ Public domain.
7 7
8#include <sys/types.h> 8#include <sys/types.h>
9 9
10struct chacha_ctx {
11 u_int input[16];
12};
13
14#define CHACHA_MINKEYLEN 16 10#define CHACHA_MINKEYLEN 16
15#define CHACHA_NONCELEN 8 11#define CHACHA_NONCELEN 8
16#define CHACHA_CTRLEN 8 12#define CHACHA_CTRLEN 8
17#define CHACHA_STATELEN (CHACHA_NONCELEN+CHACHA_CTRLEN) 13#define CHACHA_STATELEN (CHACHA_NONCELEN+CHACHA_CTRLEN)
18#define CHACHA_BLOCKLEN 64 14#define CHACHA_BLOCKLEN 64
19 15
16struct chacha_ctx {
17 u_int input[16];
18 u_int8_t ks[CHACHA_BLOCKLEN];
19 u_int8_t unused;
20};
21
20static inline void chacha_keysetup(struct chacha_ctx *x, const u_char *k, 22static inline void chacha_keysetup(struct chacha_ctx *x, const u_char *k,
21 u_int kbits) 23 u_int kbits)
22 __attribute__((__bounded__(__minbytes__, 2, CHACHA_MINKEYLEN))); 24 __attribute__((__bounded__(__minbytes__, 2, CHACHA_MINKEYLEN)));
@@ -187,6 +189,25 @@ chacha_encrypt_bytes(chacha_ctx *x, const u8 *m, u8 *c, u32 bytes)
187 x14 = PLUS(x14, j14); 189 x14 = PLUS(x14, j14);
188 x15 = PLUS(x15, j15); 190 x15 = PLUS(x15, j15);
189 191
192 if (bytes < 64) {
193 U32TO8_LITTLE(x->ks + 0, x0);
194 U32TO8_LITTLE(x->ks + 4, x1);
195 U32TO8_LITTLE(x->ks + 8, x2);
196 U32TO8_LITTLE(x->ks + 12, x3);
197 U32TO8_LITTLE(x->ks + 16, x4);
198 U32TO8_LITTLE(x->ks + 20, x5);
199 U32TO8_LITTLE(x->ks + 24, x6);
200 U32TO8_LITTLE(x->ks + 28, x7);
201 U32TO8_LITTLE(x->ks + 32, x8);
202 U32TO8_LITTLE(x->ks + 36, x9);
203 U32TO8_LITTLE(x->ks + 40, x10);
204 U32TO8_LITTLE(x->ks + 44, x11);
205 U32TO8_LITTLE(x->ks + 48, x12);
206 U32TO8_LITTLE(x->ks + 52, x13);
207 U32TO8_LITTLE(x->ks + 56, x14);
208 U32TO8_LITTLE(x->ks + 60, x15);
209 }
210
190 x0 = XOR(x0, U8TO32_LITTLE(m + 0)); 211 x0 = XOR(x0, U8TO32_LITTLE(m + 0));
191 x1 = XOR(x1, U8TO32_LITTLE(m + 4)); 212 x1 = XOR(x1, U8TO32_LITTLE(m + 4));
192 x2 = XOR(x2, U8TO32_LITTLE(m + 8)); 213 x2 = XOR(x2, U8TO32_LITTLE(m + 8));
@@ -237,6 +258,7 @@ chacha_encrypt_bytes(chacha_ctx *x, const u8 *m, u8 *c, u32 bytes)
237 } 258 }
238 x->input[12] = j12; 259 x->input[12] = j12;
239 x->input[13] = j13; 260 x->input[13] = j13;
261 x->unused = 64 - bytes;
240 return; 262 return;
241 } 263 }
242 bytes -= 64; 264 bytes -= 64;