aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/crypto/zinc/selftest/chacha20.h
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-09-25 15:56:36 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-09-25 15:56:36 +0200
commitb9ab0fc01c67f06be1fabd04853e327a35ae2572 (patch)
tree601650b453514be861978da341b6fe04cf835cbc /src/crypto/zinc/selftest/chacha20.h
parentchacha20-mips32r2: reduce stack and branches in loop, refactor jumptable handling (diff)
downloadwireguard-monolithic-historical-b9ab0fc01c67f06be1fabd04853e327a35ae2572.tar.xz
wireguard-monolithic-historical-b9ab0fc01c67f06be1fabd04853e327a35ae2572.zip
chacha20: add bounds checking to selftests
Diffstat (limited to '')
-rw-r--r--src/crypto/zinc/selftest/chacha20.h46
1 files changed, 45 insertions, 1 deletions
diff --git a/src/crypto/zinc/selftest/chacha20.h b/src/crypto/zinc/selftest/chacha20.h
index fefcb75..397a4b9 100644
--- a/src/crypto/zinc/selftest/chacha20.h
+++ b/src/crypto/zinc/selftest/chacha20.h
@@ -2517,7 +2517,7 @@ static const struct hchacha20_testvec hchacha20_testvecs[] __initconst = {{
static bool __init chacha20_selftest(void)
{
enum { MAXIMUM_TEST_BUFFER_LEN = 1UL << 10 };
- size_t i, j;
+ size_t i, j, k;
u32 derived_key[CHACHA20_KEY_WORDS];
u8 *offset_input = NULL, *computed_output = NULL;
u8 offset_key[CHACHA20_KEY_SIZE + 1]
@@ -2548,6 +2548,14 @@ static bool __init chacha20_selftest(void)
pr_info("chacha20 self-test %zu: FAIL\n", i + 1);
success = false;
}
+ for (k = chacha20_testvecs[i].ilen;
+ k < MAXIMUM_TEST_BUFFER_LEN + 1; ++k) {
+ if (computed_output[k]) {
+ pr_info("chacha20 self-test %zu (zero check): FAIL\n",
+ i + 1);
+ success = false;
+ }
+ }
/* Unaligned case */
memset(computed_output, 0, MAXIMUM_TEST_BUFFER_LEN + 1);
@@ -2565,6 +2573,19 @@ static bool __init chacha20_selftest(void)
i + 1);
success = false;
}
+ if (computed_output[0]) {
+ pr_info("chacha20 self-test %zu (unaligned, zero check): FAIL\n",
+ i + 1);
+ success = false;
+ }
+ for (k = chacha20_testvecs[i].ilen + 1;
+ k < MAXIMUM_TEST_BUFFER_LEN + 1; ++k) {
+ if (computed_output[k]) {
+ pr_info("chacha20 self-test %zu (unaligned, zero check): FAIL\n",
+ i + 1);
+ success = false;
+ }
+ }
/* Chunked case */
if (chacha20_testvecs[i].ilen <= CHACHA20_BLOCK_SIZE)
@@ -2585,6 +2606,14 @@ static bool __init chacha20_selftest(void)
i + 1);
success = false;
}
+ for (k = chacha20_testvecs[i].ilen;
+ k < MAXIMUM_TEST_BUFFER_LEN + 1; ++k) {
+ if (computed_output[k]) {
+ pr_info("chacha20 self-test %zu (chunked, zero check): FAIL\n",
+ i + 1);
+ success = false;
+ }
+ }
next_test:
/* Sliding unaligned case */
@@ -2607,6 +2636,21 @@ next_test:
i + 1, j);
success = false;
}
+ for (k = j; k < j; ++k) {
+ if (computed_output[k]) {
+ pr_info("chacha20 self-test %zu (unaligned, slide %zu, zero check): FAIL\n",
+ i + 1, j);
+ success = false;
+ }
+ }
+ for (k = chacha20_testvecs[i].ilen + j;
+ k < MAXIMUM_TEST_BUFFER_LEN + 1; ++k) {
+ if (computed_output[k]) {
+ pr_info("chacha20 self-test %zu (unaligned, slide %zu, zero check): FAIL\n",
+ i + 1, j);
+ success = false;
+ }
+ }
}
}
for (i = 0; i < ARRAY_SIZE(hchacha20_testvecs); ++i) {