#include <stdlib.h>
#include "atca_test.h"
#include "basic/atca_basic.h"
#include "host/atca_host.h"
#include "test/atca_tests.h"
#include "atca_execution.h"
const uint8_t message[] =
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
TEST(atca_cmd_unit_test, sboot)
{
ATCA_STATUS status;
ATCAPacket packet;
const uint16_t private_key_id = 2;
uint8_t public_key[72];
uint8_t zone;
uint16_t addr = 0x00;
uint8_t digest[ATCA_KEY_SIZE];
uint8_t signature[ATCA_SIG_SIZE];
ATCACommand ca_cmd = _gDevice->mCommands;
unit_test_assert_data_is_locked();
packet.param1 = GENKEY_MODE_PRIVATE;
packet.param2 = private_key_id;
status = atGenKey(ca_cmd, &packet);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(ATCA_PUB_KEY_SIZE + 3, packet.data[ATCA_COUNT_IDX]);
memcpy(public_key, &packet.data[ATCA_RSP_DATA_IDX], ATCA_PUB_KEY_SIZE);
memmove(&public_key[40], &public_key[32], 32); memset(&public_key[36], 0, 4); memmove(&public_key[4], &public_key[0], 32); memset(&public_key[0], 0, 4);
zone = ATCA_ZONE_DATA | ATCA_ZONE_READWRITE_32;
addr = 0x58;
packet.param1 = zone;
packet.param2 = addr;
memset(packet.data, 0x00, sizeof(packet.data));
memcpy(packet.data, public_key, 32);
status = atWrite(ca_cmd, &packet, false);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(0x00, packet.data[ATCA_RSP_DATA_IDX]);
zone = ATCA_ZONE_DATA | ATCA_ZONE_READWRITE_32;
addr = 0x158;
packet.param1 = zone;
packet.param2 = addr;
memset(packet.data, 0x00, sizeof(packet.data));
memcpy(packet.data, &public_key[32], 32);
status = atWrite(ca_cmd, &packet, false);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(0x00, packet.data[ATCA_RSP_DATA_IDX]);
zone = ATCA_ZONE_DATA;
addr = 0x258;
packet.param1 = zone;
packet.param2 = addr;
memset(packet.data, 0x00, sizeof(packet.data));
memcpy(packet.data, &public_key[64], 4);
status = atWrite(ca_cmd, &packet, false);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(0x00, packet.data[ATCA_RSP_DATA_IDX]);
zone = ATCA_ZONE_DATA;
addr = 0x259;
packet.param1 = zone;
packet.param2 = addr;
memset(packet.data, 0x00, sizeof(packet.data));
memcpy(packet.data, &public_key[68], 4);
status = atWrite(ca_cmd, &packet, false);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(0x00, packet.data[ATCA_RSP_DATA_IDX]);
packet.param1 = SHA_MODE_SHA256_START;
packet.param2 = 0x0000;
status = atSHA(ca_cmd, &packet, 0);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(SHA_RSP_SIZE_SHORT, packet.data[ATCA_COUNT_IDX]);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, packet.data[ATCA_RSP_DATA_IDX]);
packet.param1 = SHA_MODE_SHA256_UPDATE;
packet.param2 = 0x0000;
memcpy(packet.data, message, 64);
status = atSHA(ca_cmd, &packet, 64);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(SHA_RSP_SIZE_SHORT, packet.data[ATCA_COUNT_IDX]);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, packet.data[ATCA_RSP_DATA_IDX]);
packet.param1 = SHA_MODE_SHA256_END;
packet.param2 = 0x0000;
status = atSHA(ca_cmd, &packet, 0);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(SHA_RSP_SIZE_LONG, packet.data[ATCA_COUNT_IDX]);
memcpy(&digest[0], &packet.data[ATCA_RSP_DATA_IDX], SECUREBOOT_DIGEST_SIZE);
packet.param1 = RANDOM_SEED_UPDATE;
packet.param2 = 0x0000;
status = atRandom(ca_cmd, &packet);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(ATCA_RSP_SIZE_32, packet.data[ATCA_COUNT_IDX]);
packet.param1 = NONCE_MODE_PASSTHROUGH;
packet.param2 = 0x0000;
memcpy(packet.data, digest, 32);
status = atNonce(ca_cmd, &packet);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL_INT(NONCE_COUNT_LONG, packet.txsize);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL_INT(NONCE_RSP_SIZE_SHORT, packet.data[ATCA_COUNT_IDX]);
TEST_ASSERT_EQUAL_INT8(ATCA_SUCCESS, packet.data[ATCA_RSP_DATA_IDX]);
packet.param1 = SIGN_MODE_EXTERNAL;
packet.param2 = private_key_id;
status = atSign(ca_cmd, &packet);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
memcpy(signature, &packet.data[ATCA_RSP_DATA_IDX], ATCA_SIG_SIZE);
packet.param1 = SECUREBOOT_MODE_FULL;
packet.param2 = 0;
memcpy(packet.data, digest, SECUREBOOT_DIGEST_SIZE); memcpy(&packet.data[SECUREBOOT_DIGEST_SIZE], signature, ATCA_SIG_SIZE); status = atSecureBoot(ca_cmd, &packet);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
}
TEST(atca_cmd_basic_test, sboot_digest)
{
ATCA_STATUS status;
const uint16_t private_key_id = 2;
const uint16_t public_key_id = 11;
uint8_t digest[ATCA_KEY_SIZE];
uint8_t signature[ATCA_SIG_SIZE];
uint8_t public_key[72];
test_assert_data_is_locked();
status = atcab_genkey(private_key_id, public_key);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
memmove(&public_key[40], &public_key[32], 32); memset(&public_key[36], 0, 4); memmove(&public_key[4], &public_key[0], 32); memset(&public_key[0], 0, 4);
status = atcab_write_bytes_zone(ATCA_ZONE_DATA, public_key_id, 0, public_key, 72);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcac_sw_sha2_256(message, sizeof(message), digest);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_sign(private_key_id, digest, signature);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_secureboot(SECUREBOOT_MODE_FULL, 0, digest, signature, NULL);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_secureboot(SECUREBOOT_MODE_FULL_COPY, 0, digest, signature, NULL);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_secureboot(SECUREBOOT_MODE_FULL_STORE, 0, digest, NULL, NULL);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
}
TEST(atca_cmd_basic_test, sboot_digest_full_encrypted)
{
ATCA_STATUS status;
bool is_verified = false;
const uint16_t private_key_id = 2;
uint8_t randomnum[RANDOM_RSP_SIZE];
uint8_t digest[ATCA_KEY_SIZE];
uint8_t signature[ATCA_SIG_SIZE];
test_assert_data_is_locked();
status = atcac_sw_sha2_256(message, sizeof(message), digest);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_sign(private_key_id, digest, signature);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_random(randomnum);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_secureboot_mac(SECUREBOOT_MODE_FULL, digest, signature, randomnum, g_slot4_key, &is_verified);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(true, is_verified);
}
TEST(atca_cmd_basic_test, sboot_digest_fullstore_encrypted)
{
ATCA_STATUS status;
bool is_verified = false;
const uint16_t private_key_id = 2;
uint8_t randomnum[RANDOM_RSP_SIZE];
uint8_t digest[ATCA_KEY_SIZE];
uint8_t signature[ATCA_SIG_SIZE];
test_assert_data_is_locked();
status = atcac_sw_sha2_256(message, sizeof(message), digest);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_sign(private_key_id, digest, signature);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_random(randomnum);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_secureboot_mac(SECUREBOOT_MODE_FULL_COPY, digest, signature, randomnum, g_slot4_key, &is_verified);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(true, is_verified);
status = atcab_random(randomnum);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_secureboot_mac(SECUREBOOT_MODE_FULL_STORE, digest, signature, randomnum, g_slot4_key, &is_verified);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(true, is_verified);
}
t_test_case_info sboot_basic_test_info[] =
{
{ REGISTER_TEST_CASE(atca_cmd_basic_test, sboot_digest), DEVICE_MASK(ATECC608A) },
{ REGISTER_TEST_CASE(atca_cmd_basic_test, sboot_digest_full_encrypted), DEVICE_MASK(ATECC608A) },
{ REGISTER_TEST_CASE(atca_cmd_basic_test, sboot_digest_fullstore_encrypted), DEVICE_MASK(ATECC608A) },
{ (fp_test_case)NULL, (uint8_t)0 },
};
t_test_case_info sboot_unit_test_info[] =
{
{ REGISTER_TEST_CASE(atca_cmd_unit_test, sboot), DEVICE_MASK(ATECC608A) },
{ (fp_test_case)NULL, (uint8_t)0 },
};