1
0
Fork 0
mirror of https://github.com/u-boot/u-boot.git synced 2025-04-23 22:14:54 +00:00
u-boot/test/lib/test_aes.c
Simon Glass b073d48e8d test: Drop the blank line before test macros
Most tests don't have this. It helps to keep the test declaration
clearly associated with the function it relates to, rather than the next
one in the file. Remove the extra blank line and mention this in the
docs.

Signed-off-by: Simon Glass <sjg@chromium.org>
2024-08-26 18:51:49 -06:00

166 lines
4.2 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (c) 2019 Philippe Reynes <philippe.reynes@softathome.com>
*
* Unit tests for aes functions
*/
#include <command.h>
#include <hexdump.h>
#include <rand.h>
#include <uboot_aes.h>
#include <test/lib.h>
#include <test/test.h>
#include <test/ut.h>
#define TEST_AES_ONE_BLOCK 0
#define TEST_AES_CBC_CHAIN 1
struct test_aes_s {
int key_len;
int key_exp_len;
int type;
int num_block;
};
static struct test_aes_s test_aes[] = {
{ AES128_KEY_LENGTH, AES128_EXPAND_KEY_LENGTH, TEST_AES_ONE_BLOCK, 1 },
{ AES128_KEY_LENGTH, AES128_EXPAND_KEY_LENGTH, TEST_AES_CBC_CHAIN, 16 },
{ AES192_KEY_LENGTH, AES192_EXPAND_KEY_LENGTH, TEST_AES_ONE_BLOCK, 1 },
{ AES192_KEY_LENGTH, AES192_EXPAND_KEY_LENGTH, TEST_AES_CBC_CHAIN, 16 },
{ AES256_KEY_LENGTH, AES256_EXPAND_KEY_LENGTH, TEST_AES_ONE_BLOCK, 1 },
{ AES256_KEY_LENGTH, AES256_EXPAND_KEY_LENGTH, TEST_AES_CBC_CHAIN, 16 },
};
static void rand_buf(u8 *buf, int size)
{
int i;
for (i = 0; i < size; i++)
buf[i] = rand() & 0xff;
}
static int lib_test_aes_one_block(struct unit_test_state *uts, int key_len,
u8 *key_exp, u8 *iv, int num_block,
u8 *nocipher, u8 *ciphered, u8 *uncipher)
{
aes_encrypt(key_len, nocipher, key_exp, ciphered);
aes_decrypt(key_len, ciphered, key_exp, uncipher);
ut_asserteq_mem(nocipher, uncipher, AES_BLOCK_LENGTH);
/* corrupt the expanded key */
key_exp[0]++;
aes_decrypt(key_len, ciphered, key_exp, uncipher);
ut_assertf(memcmp(nocipher, uncipher, AES_BLOCK_LENGTH),
"nocipher and uncipher should be different\n");
return 0;
}
static int lib_test_aes_cbc_chain(struct unit_test_state *uts, int key_len,
u8 *key_exp, u8 *iv, int num_block,
u8 *nocipher, u8 *ciphered, u8 *uncipher)
{
aes_cbc_encrypt_blocks(key_len, key_exp, iv,
nocipher, ciphered, num_block);
aes_cbc_decrypt_blocks(key_len, key_exp, iv,
ciphered, uncipher, num_block);
ut_asserteq_mem(nocipher, uncipher, num_block * AES_BLOCK_LENGTH);
/* corrupt the expanded key */
key_exp[0]++;
aes_cbc_decrypt_blocks(key_len, key_exp, iv,
ciphered, uncipher, num_block);
ut_assertf(memcmp(nocipher, uncipher, num_block * AES_BLOCK_LENGTH),
"nocipher and uncipher should be different\n");
return 0;
}
static int _lib_test_aes_run(struct unit_test_state *uts, int key_len,
int key_exp_len, int type, int num_block)
{
u8 *key, *key_exp, *iv;
u8 *nocipher, *ciphered, *uncipher;
int ret;
/* Allocate all the buffer */
key = malloc(key_len);
key_exp = malloc(key_exp_len);
iv = malloc(AES_BLOCK_LENGTH);
nocipher = malloc(num_block * AES_BLOCK_LENGTH);
ciphered = malloc((num_block + 1) * AES_BLOCK_LENGTH);
uncipher = malloc((num_block + 1) * AES_BLOCK_LENGTH);
if (!key || !key_exp || !iv || !nocipher || !ciphered || !uncipher) {
printf("%s: can't allocate memory\n", __func__);
ret = -1;
goto out;
}
/* Initialize all buffer */
rand_buf(key, key_len);
rand_buf(iv, AES_BLOCK_LENGTH);
rand_buf(nocipher, num_block * AES_BLOCK_LENGTH);
memset(ciphered, 0, (num_block + 1) * AES_BLOCK_LENGTH);
memset(uncipher, 0, (num_block + 1) * AES_BLOCK_LENGTH);
/* Expand the key */
aes_expand_key(key, key_len, key_exp);
/* Encrypt and decrypt */
switch (type) {
case TEST_AES_ONE_BLOCK:
ret = lib_test_aes_one_block(uts, key_len, key_exp, iv,
num_block, nocipher,
ciphered, uncipher);
break;
case TEST_AES_CBC_CHAIN:
ret = lib_test_aes_cbc_chain(uts, key_len, key_exp, iv,
num_block, nocipher,
ciphered, uncipher);
break;
default:
printf("%s: unknown type (type=%d)\n", __func__, type);
ret = -1;
};
out:
/* Free all the data */
free(key);
free(key_exp);
free(iv);
free(nocipher);
free(ciphered);
free(uncipher);
return ret;
}
static int lib_test_aes_run(struct unit_test_state *uts,
struct test_aes_s *test)
{
int key_len = test->key_len;
int key_exp_len = test->key_exp_len;
int type = test->type;
int num_block = test->num_block;
return _lib_test_aes_run(uts, key_len, key_exp_len,
type, num_block);
}
static int lib_test_aes(struct unit_test_state *uts)
{
int i, ret = 0;
for (i = 0; i < ARRAY_SIZE(test_aes); i++) {
ret = lib_test_aes_run(uts, &test_aes[i]);
if (ret)
break;
}
return ret;
}
LIB_TEST(lib_test_aes, 0);