Skip to content
Snippets Groups Projects
Unverified Commit f4a4f5d0 authored by Koen Zandberg's avatar Koen Zandberg
Browse files

chacha20poly1305: Provide a test based on the rfc

Add a test case to the crypto tests testing the chacha20poly1305
algorithm with the test vectors from rfc 8439.
parent 1990e162
No related branches found
No related tags found
No related merge requests found
/*
* Copyright (C) 2018 Koen Zandberg
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
#include "embUnit/embUnit.h"
#include "tests-crypto.h"
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "crypto/chacha20poly1305.h"
/* ciphertext buffer */
uint8_t ebuf[1024];
/* Plaintext buffer */
uint8_t pbuf[1024];
static const uint8_t key_1[32] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f
};
static const uint8_t msg_1[] = {
0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x65, 0x6e, 0x74, 0x6c,
0x65, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73,
0x73, 0x20, 0x6f, 0x66, 0x20, 0x27, 0x39, 0x39, 0x3a, 0x20, 0x49, 0x66, 0x20, 0x49, 0x20, 0x63,
0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6f,
0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20,
0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x6e, 0x73,
0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x69,
0x74, 0x2e
};
static const uint8_t aad_1[] = {
0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7
};
static const uint8_t nonce_1[] = {
0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47
};
static const uint8_t ciphertext_1[] = {
0xd3, 0x1a, 0x8d, 0x34, 0x64, 0x8e, 0x60, 0xdb, 0x7b, 0x86, 0xaf, 0xbc,
0x53, 0xef, 0x7e, 0xc2, 0xa4, 0xad, 0xed, 0x51, 0x29, 0x6e, 0x08, 0xfe,
0xa9, 0xe2, 0xb5, 0xa7, 0x36, 0xee, 0x62, 0xd6, 0x3d, 0xbe, 0xa4, 0x5e,
0x8c, 0xa9, 0x67, 0x12, 0x82, 0xfa, 0xfb, 0x69, 0xda, 0x92, 0x72, 0x8b,
0x1a, 0x71, 0xde, 0x0a, 0x9e, 0x06, 0x0b, 0x29, 0x05, 0xd6, 0xa5, 0xb6,
0x7e, 0xcd, 0x3b, 0x36, 0x92, 0xdd, 0xbd, 0x7f, 0x2d, 0x77, 0x8b, 0x8c,
0x98, 0x03, 0xae, 0xe3, 0x28, 0x09, 0x1b, 0x58, 0xfa, 0xb3, 0x24, 0xe4,
0xfa, 0xd6, 0x75, 0x94, 0x55, 0x85, 0x80, 0x8b, 0x48, 0x31, 0xd7, 0xbc,
0x3f, 0xf4, 0xde, 0xf0, 0x8e, 0x4b, 0x7a, 0x9d, 0xe5, 0x76, 0xd2, 0x65,
0x86, 0xce, 0xc6, 0x4b, 0x61, 0x16, 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09,
0xe2, 0x6a, 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91,
};
static void _test_chacha20poly1305(const uint8_t *key, const uint8_t *nonce,
const uint8_t *msg, size_t msglen,
const uint8_t *aad, size_t aadlen)
{
memcpy(ebuf, msg, msglen);
chacha20poly1305_encrypt(ebuf, msg, msglen, aad, aadlen, key, nonce);
TEST_ASSERT_EQUAL_INT(0, memcmp(ebuf, ciphertext_1, msglen + 16));
size_t len;
TEST_ASSERT_EQUAL_INT(1,
chacha20poly1305_decrypt(ebuf, msglen+16, pbuf, &len, aad, aadlen, key, nonce));
TEST_ASSERT_EQUAL_INT(0, memcmp(pbuf, msg_1, msglen));
}
static void test_crypto_chacha20poly1305_1(void)
{
_test_chacha20poly1305(key_1, nonce_1, msg_1, sizeof(msg_1), aad_1, sizeof(aad_1));
}
Test *tests_crypto_chacha20poly1305_tests(void)
{
EMB_UNIT_TESTFIXTURES(fixtures) {
new_TestFixture(test_crypto_chacha20poly1305_1),
};
EMB_UNIT_TESTCALLER(crypto_chacha20poly1305_tests, NULL, NULL, fixtures);
return (Test *) &crypto_chacha20poly1305_tests;
}
......@@ -14,6 +14,7 @@ void tests_crypto(void)
TESTS_RUN(tests_crypto_helper_tests());
TESTS_RUN(tests_crypto_chacha_tests());
TESTS_RUN(tests_crypto_poly1305_tests());
TESTS_RUN(tests_crypto_chacha20poly1305_tests());
TESTS_RUN(tests_crypto_aes_tests());
TESTS_RUN(tests_crypto_cipher_tests());
TESTS_RUN(tests_crypto_modes_ccm_tests());
......
......@@ -48,6 +48,8 @@ Test *tests_crypto_chacha_tests(void);
Test *tests_crypto_poly1305_tests(void);
Test *tests_crypto_chacha20poly1305_tests(void);
static inline int compare(const uint8_t *a, const uint8_t *b, uint8_t len)
{
int result = 1;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment