2014-05-15 16:27:15 -04:00
|
|
|
|
|
|
|
#define TEST_NAME "chacha20"
|
|
|
|
#include "cmptest.h"
|
|
|
|
|
2015-02-11 06:34:29 -05:00
|
|
|
static
|
|
|
|
void tv(void)
|
2014-05-15 16:27:15 -04:00
|
|
|
{
|
|
|
|
static struct {
|
|
|
|
const char *key_hex;
|
|
|
|
const char *nonce_hex;
|
2014-09-14 14:32:55 -04:00
|
|
|
} tests[]
|
|
|
|
= { { "0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"0000000000000000" },
|
|
|
|
{ "0000000000000000000000000000000000000000000000000000000000000001",
|
|
|
|
"0000000000000000" },
|
|
|
|
{ "0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"0000000000000001" },
|
|
|
|
{ "0000000000000000000000000000000000000000000000000000000000000000",
|
|
|
|
"0100000000000000" },
|
|
|
|
{ "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
|
|
|
|
"0001020304050607" } };
|
2014-05-15 16:27:15 -04:00
|
|
|
unsigned char key[crypto_stream_chacha20_KEYBYTES];
|
|
|
|
unsigned char nonce[crypto_stream_chacha20_NONCEBYTES];
|
2014-09-19 01:13:00 -04:00
|
|
|
unsigned char out[160];
|
2015-02-11 06:34:29 -05:00
|
|
|
char out_hex[160 * 2 + 1];
|
|
|
|
size_t i = 0U;
|
2014-05-15 16:27:15 -04:00
|
|
|
|
|
|
|
do {
|
2014-09-14 14:32:55 -04:00
|
|
|
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);
|
2014-05-15 16:27:15 -04:00
|
|
|
crypto_stream_chacha20(out, sizeof out, nonce, key);
|
|
|
|
sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);
|
|
|
|
printf("[%s]\n", out_hex);
|
|
|
|
} while (++i < (sizeof tests) / (sizeof tests[0]));
|
2014-09-14 16:09:15 -04:00
|
|
|
|
2015-07-21 07:37:06 -04:00
|
|
|
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);
|
2014-09-16 13:32:04 -04:00
|
|
|
|
2014-09-16 18:25:54 -04:00
|
|
|
assert(crypto_stream_chacha20(out, 0U, nonce, key) == 0);
|
|
|
|
assert(crypto_stream_chacha20_xor(out, out, 0U, nonce, key) == 0);
|
2014-09-16 13:32:04 -04:00
|
|
|
assert(crypto_stream_chacha20_xor(out, out, 0U, nonce, key) == 0);
|
|
|
|
assert(crypto_stream_chacha20_xor_ic(out, out, 0U, nonce, 1U, key) == 0);
|
|
|
|
|
2015-07-21 07:37:06 -04:00
|
|
|
memset(out, 0x42, sizeof out);
|
2014-09-14 16:09:15 -04:00
|
|
|
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);
|
2014-05-15 16:27:15 -04:00
|
|
|
};
|
|
|
|
|
2015-02-11 06:34:29 -05:00
|
|
|
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 }};
|
|
|
|
unsigned char key[crypto_stream_chacha20_KEYBYTES];
|
|
|
|
unsigned char nonce[crypto_stream_chacha20_IETF_NONCEBYTES];
|
|
|
|
unsigned char out[160];
|
|
|
|
char out_hex[160 * 2 + 1];
|
|
|
|
size_t i = 0U;
|
|
|
|
|
|
|
|
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);
|
|
|
|
} while (++i < (sizeof tests) / (sizeof tests[0]));
|
|
|
|
|
2015-07-21 07:37:06 -04:00
|
|
|
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);
|
2015-02-11 06:34:29 -05:00
|
|
|
|
|
|
|
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);
|
|
|
|
|
2015-07-21 07:37:06 -04:00
|
|
|
memset(out, 0x42, sizeof out);
|
2015-02-11 06:34:29 -05:00
|
|
|
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)
|
2014-05-15 16:27:15 -04:00
|
|
|
{
|
|
|
|
tv();
|
2015-02-11 06:34:29 -05:00
|
|
|
tv_ietf();
|
2014-05-15 16:27:15 -04:00
|
|
|
|
2014-09-13 18:12:23 -04:00
|
|
|
assert(crypto_stream_chacha20_keybytes() > 0U);
|
|
|
|
assert(crypto_stream_chacha20_noncebytes() > 0U);
|
2015-02-11 06:34:29 -05:00
|
|
|
assert(crypto_stream_chacha20_ietf_noncebytes() > 0U);
|
2014-09-13 18:12:23 -04:00
|
|
|
|
2014-09-14 13:34:16 -04:00
|
|
|
return 0;
|
2014-05-15 16:27:15 -04:00
|
|
|
}
|