summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/chacha/chacha.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/chacha/chacha.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/lib/libcrypto/chacha/chacha.c b/src/lib/libcrypto/chacha/chacha.c
index a12c824fe6..141b3e99f6 100644
--- a/src/lib/libcrypto/chacha/chacha.c
+++ b/src/lib/libcrypto/chacha/chacha.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: chacha.c,v 1.4 2014/06/12 15:49:28 deraadt Exp $ */ 1/* $OpenBSD: chacha.c,v 1.5 2014/06/24 18:12:09 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -22,6 +22,7 @@ void
22ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, uint32_t keybits) 22ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, uint32_t keybits)
23{ 23{
24 chacha_keysetup((chacha_ctx *)ctx, key, keybits); 24 chacha_keysetup((chacha_ctx *)ctx, key, keybits);
25 ctx->unused = 0;
25} 26}
26 27
27void 28void
@@ -29,11 +30,25 @@ ChaCha_set_iv(ChaCha_ctx *ctx, const unsigned char *iv,
29 const unsigned char *counter) 30 const unsigned char *counter)
30{ 31{
31 chacha_ivsetup((chacha_ctx *)ctx, iv, counter); 32 chacha_ivsetup((chacha_ctx *)ctx, iv, counter);
33 ctx->unused = 0;
32} 34}
33 35
34void 36void
35ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, size_t len) 37ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, size_t len)
36{ 38{
39 unsigned char *k;
40 int i, l;
41
42 /* Consume remaining keystream, if any exists. */
43 if (ctx->unused > 0) {
44 k = ctx->ks + 64 - ctx->unused;
45 l = (len > ctx->unused) ? ctx->unused : len;
46 for (i = 0; i < l; i++)
47 *(out++) = *(in++) ^ *(k++);
48 ctx->unused -= l;
49 len -= l;
50 }
51
37 chacha_encrypt_bytes((chacha_ctx *)ctx, in, out, (uint32_t)len); 52 chacha_encrypt_bytes((chacha_ctx *)ctx, in, out, (uint32_t)len);
38} 53}
39 54