aboutsummaryrefslogtreecommitdiff
path: root/sys/contrib/libsodium/test/default/chacha20.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib/libsodium/test/default/chacha20.c')
-rw-r--r--sys/contrib/libsodium/test/default/chacha20.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/sys/contrib/libsodium/test/default/chacha20.c b/sys/contrib/libsodium/test/default/chacha20.c
new file mode 100644
index 000000000000..0abe8d34100a
--- /dev/null
+++ b/sys/contrib/libsodium/test/default/chacha20.c
@@ -0,0 +1,186 @@
+
+#define TEST_NAME "chacha20"
+#include "cmptest.h"
+
+static
+void tv(void)
+{
+ static struct {
+ const char *key_hex;
+ const char *nonce_hex;
+ } tests[]
+ = { { "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000000" },
+ { "0000000000000000000000000000000000000000000000000000000000000001",
+ "0000000000000000" },
+ { "0000000000000000000000000000000000000000000000000000000000000000",
+ "0000000000000001" },
+ { "0000000000000000000000000000000000000000000000000000000000000000",
+ "0100000000000000" },
+ { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+ "0001020304050607" } };
+ unsigned char key[crypto_stream_chacha20_KEYBYTES];
+ unsigned char nonce[crypto_stream_chacha20_NONCEBYTES];
+ unsigned char *part;
+ unsigned char out[160];
+ unsigned char zero[160];
+ char out_hex[160 * 2 + 1];
+ size_t i = 0U;
+ size_t plen;
+
+ memset(zero, 0, sizeof zero);
+ do {
+ sodium_hex2bin((unsigned char *)key, sizeof key, tests[i].key_hex,
+ strlen(tests[i].key_hex), NULL, NULL, NULL);
+ sodium_hex2bin(nonce, sizeof nonce, tests[i].nonce_hex,
+ strlen(tests[i].nonce_hex), NULL, NULL, NULL);
+ crypto_stream_chacha20(out, sizeof out, nonce, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+ for (plen = 1U; plen < sizeof out; plen++) {
+ part = (unsigned char *) sodium_malloc(plen);
+ crypto_stream_chacha20_xor(part, out, plen, nonce, key);
+ if (memcmp(part, zero, plen) != 0) {
+ printf("Failed with length %lu\n", (unsigned long) plen);
+ }
+ sodium_free(part);
+ }
+ } while (++i < (sizeof tests) / (sizeof tests[0]));
+ assert(66 <= sizeof out);
+ for (plen = 1U; plen < 66; plen += 3) {
+ memset(out, (int) (plen & 0xff), sizeof out);
+ crypto_stream_chacha20(out, plen, nonce, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+ }
+ randombytes_buf(out, sizeof out);
+ crypto_stream_chacha20(out, sizeof out, nonce, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+
+ assert(crypto_stream_chacha20(out, 0U, nonce, key) == 0);
+ assert(crypto_stream_chacha20_xor(out, out, 0U, nonce, key) == 0);
+ assert(crypto_stream_chacha20_xor(out, out, 0U, nonce, key) == 0);
+ assert(crypto_stream_chacha20_xor_ic(out, out, 0U, nonce, 1U, key) == 0);
+
+ memset(out, 0x42, sizeof out);
+ crypto_stream_chacha20_xor(out, out, sizeof out, nonce, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+
+ crypto_stream_chacha20_xor_ic(out, out, sizeof out, nonce, 0U, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+
+ crypto_stream_chacha20_xor_ic(out, out, sizeof out, nonce, 1U, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+}
+
+static
+void tv_ietf(void)
+{
+ static struct {
+ const char *key_hex;
+ const char *nonce_hex;
+ uint32_t ic;
+ } tests[]
+ = { { "0000000000000000000000000000000000000000000000000000000000000000",
+ "000000000000000000000000",
+ 0U },
+ { "0000000000000000000000000000000000000000000000000000000000000000",
+ "000000000000000000000000",
+ 1U },
+ { "0000000000000000000000000000000000000000000000000000000000000001",
+ "000000000000000000000000",
+ 1U },
+ { "00ff000000000000000000000000000000000000000000000000000000000000",
+ "000000000000000000000000",
+ 2U },
+ { "0000000000000000000000000000000000000000000000000000000000000000",
+ "000000000000000000000002",
+ 0U },
+ { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+ "000000090000004a00000000",
+ 1U },
+ { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
+ "000000090000004a00000000",
+ 0xffffffff }};
+ unsigned char key[crypto_stream_chacha20_KEYBYTES];
+ unsigned char nonce[crypto_stream_chacha20_IETF_NONCEBYTES];
+ unsigned char *part;
+ unsigned char out[160];
+ unsigned char zero[160];
+ char out_hex[160 * 2 + 1];
+ size_t i = 0U;
+ size_t plen;
+
+ memset(zero, 0, sizeof zero);
+ do {
+ sodium_hex2bin((unsigned char *)key, sizeof key, tests[i].key_hex,
+ strlen(tests[i].key_hex), ": ", NULL, NULL);
+ sodium_hex2bin(nonce, sizeof nonce, tests[i].nonce_hex,
+ strlen(tests[i].nonce_hex), ": ", NULL, NULL);
+ memset(out, 0, sizeof out);
+ crypto_stream_chacha20_ietf_xor_ic(out, out, sizeof out, nonce, tests[i].ic, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+ for (plen = 1U; plen < sizeof out; plen++) {
+ part = (unsigned char *) sodium_malloc(plen);
+ crypto_stream_chacha20_ietf_xor_ic(part, out, plen, nonce, tests[i].ic, key);
+ if (memcmp(part, zero, plen) != 0) {
+ printf("Failed with length %lu\n", (unsigned long) plen);
+ }
+ sodium_free(part);
+ }
+ } while (++i < (sizeof tests) / (sizeof tests[0]));
+ assert(66 <= sizeof out);
+ for (plen = 1U; plen < 66; plen += 3) {
+ memset(out, (int) (plen & 0xff), sizeof out);
+ crypto_stream_chacha20(out, plen, nonce, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+ }
+ randombytes_buf(out, sizeof out);
+ crypto_stream_chacha20_ietf(out, sizeof out, nonce, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+
+ assert(crypto_stream_chacha20_ietf(out, 0U, nonce, key) == 0);
+ assert(crypto_stream_chacha20_ietf_xor(out, out, 0U, nonce, key) == 0);
+ assert(crypto_stream_chacha20_ietf_xor(out, out, 0U, nonce, key) == 0);
+ assert(crypto_stream_chacha20_ietf_xor_ic(out, out, 0U, nonce, 1U, key) == 0);
+
+ memset(out, 0x42, sizeof out);
+ crypto_stream_chacha20_ietf_xor(out, out, sizeof out, nonce, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+
+ crypto_stream_chacha20_ietf_xor_ic(out, out, sizeof out, nonce, 0U, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+
+ crypto_stream_chacha20_ietf_xor_ic(out, out, sizeof out, nonce, 1U, key);
+ sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
+ printf("[%s]\n", out_hex);
+}
+
+int
+main(void)
+{
+ tv();
+ tv_ietf();
+
+ assert(crypto_stream_chacha20_keybytes() > 0U);
+ assert(crypto_stream_chacha20_keybytes() == crypto_stream_chacha20_KEYBYTES);
+ assert(crypto_stream_chacha20_noncebytes() > 0U);
+ assert(crypto_stream_chacha20_noncebytes() == crypto_stream_chacha20_NONCEBYTES);
+ assert(crypto_stream_chacha20_messagebytes_max() == crypto_stream_chacha20_MESSAGEBYTES_MAX);
+ assert(crypto_stream_chacha20_ietf_keybytes() > 0U);
+ assert(crypto_stream_chacha20_ietf_keybytes() == crypto_stream_chacha20_ietf_KEYBYTES);
+ assert(crypto_stream_chacha20_ietf_noncebytes() > 0U);
+ assert(crypto_stream_chacha20_ietf_noncebytes() == crypto_stream_chacha20_ietf_NONCEBYTES);
+ assert(crypto_stream_chacha20_ietf_messagebytes_max() == crypto_stream_chacha20_ietf_MESSAGEBYTES_MAX);
+
+ return 0;
+}