diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/libcrypto/chacha/chacha.c | 17 |
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 | |||
22 | ChaCha_set_key(ChaCha_ctx *ctx, const unsigned char *key, uint32_t keybits) | 22 | ChaCha_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 | ||
27 | void | 28 | void |
@@ -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 | ||
34 | void | 36 | void |
35 | ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, size_t len) | 37 | ChaCha(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 | ||