diff options
| author | jsing <> | 2022-08-20 18:44:58 +0000 |
|---|---|---|
| committer | jsing <> | 2022-08-20 18:44:58 +0000 |
| commit | c4f5cc12854a0a64258f9452a1d89656f20a1ca8 (patch) | |
| tree | a11d32f1d64962ab4a6131e20dc47622d67c5858 /src | |
| parent | f5720b925d89e12dd347d93f073d631d437b6a8a (diff) | |
| download | openbsd-c4f5cc12854a0a64258f9452a1d89656f20a1ca8.tar.gz openbsd-c4f5cc12854a0a64258f9452a1d89656f20a1ca8.tar.bz2 openbsd-c4f5cc12854a0a64258f9452a1d89656f20a1ca8.zip | |
Remove UINT32_MAX limitation on ChaCha() and CRYPTO_chacha_20().
We can avoid this unnecessary limitation by calling chacha_encrypt_bytes()
multiple times internally. In the case of ChaCha(), the caller still needs
to ensure that the same IV is not used for more than 2^70 bytes.
ok tb@
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/chacha/chacha.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/lib/libcrypto/chacha/chacha.c b/src/lib/libcrypto/chacha/chacha.c index 6a2dddf055..0ce4545186 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.8 2019/01/22 00:59:21 dlg Exp $ */ | 1 | /* $OpenBSD: chacha.c,v 1.9 2022/08/20 18:44:58 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -40,6 +40,7 @@ void | |||
| 40 | ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, size_t len) | 40 | ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, size_t len) |
| 41 | { | 41 | { |
| 42 | unsigned char *k; | 42 | unsigned char *k; |
| 43 | uint64_t n; | ||
| 43 | int i, l; | 44 | int i, l; |
| 44 | 45 | ||
| 45 | /* Consume remaining keystream, if any exists. */ | 46 | /* Consume remaining keystream, if any exists. */ |
| @@ -52,7 +53,16 @@ ChaCha(ChaCha_ctx *ctx, unsigned char *out, const unsigned char *in, size_t len) | |||
| 52 | len -= l; | 53 | len -= l; |
| 53 | } | 54 | } |
| 54 | 55 | ||
| 55 | chacha_encrypt_bytes((chacha_ctx *)ctx, in, out, (uint32_t)len); | 56 | while (len > 0) { |
| 57 | if ((n = len) > UINT32_MAX) | ||
| 58 | n = UINT32_MAX; | ||
| 59 | |||
| 60 | chacha_encrypt_bytes((chacha_ctx *)ctx, in, out, (uint32_t)n); | ||
| 61 | |||
| 62 | in += n; | ||
| 63 | out += n; | ||
| 64 | len -= n; | ||
| 65 | } | ||
| 56 | } | 66 | } |
| 57 | 67 | ||
| 58 | void | 68 | void |
| @@ -60,6 +70,7 @@ CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, | |||
| 60 | const unsigned char key[32], const unsigned char iv[8], uint64_t counter) | 70 | const unsigned char key[32], const unsigned char iv[8], uint64_t counter) |
| 61 | { | 71 | { |
| 62 | struct chacha_ctx ctx; | 72 | struct chacha_ctx ctx; |
| 73 | uint64_t n; | ||
| 63 | 74 | ||
| 64 | /* | 75 | /* |
| 65 | * chacha_ivsetup expects the counter to be in u8. Rather than | 76 | * chacha_ivsetup expects the counter to be in u8. Rather than |
| @@ -73,7 +84,16 @@ CRYPTO_chacha_20(unsigned char *out, const unsigned char *in, size_t len, | |||
| 73 | ctx.input[13] = (uint32_t)(counter >> 32); | 84 | ctx.input[13] = (uint32_t)(counter >> 32); |
| 74 | } | 85 | } |
| 75 | 86 | ||
| 76 | chacha_encrypt_bytes(&ctx, in, out, (uint32_t)len); | 87 | while (len > 0) { |
| 88 | if ((n = len) > UINT32_MAX) | ||
| 89 | n = UINT32_MAX; | ||
| 90 | |||
| 91 | chacha_encrypt_bytes(&ctx, in, out, (uint32_t)n); | ||
| 92 | |||
| 93 | in += n; | ||
| 94 | out += n; | ||
| 95 | len -= n; | ||
| 96 | } | ||
| 77 | } | 97 | } |
| 78 | 98 | ||
| 79 | void | 99 | void |
