#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"
TEST(atca_cmd_unit_test, counter)
{
ATCA_STATUS status;
ATCAPacket packet;
uint8_t increased_bin_val[4] = { 0x00 };
uint32_t test;
ATCACommand ca_cmd = _gDevice->mCommands;
packet.param1 = COUNTER_MODE_INCREMENT;
packet.param2 = 0x0000;
status = atCounter(ca_cmd, &packet);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(COUNTER_RSP_SIZE, packet.data[ATCA_COUNT_IDX]);
memcpy(increased_bin_val, &packet.data[ATCA_RSP_DATA_IDX], sizeof(increased_bin_val));
packet.param1 = COUNTER_MODE_READ;
packet.param2 = 0x0000;
status = atCounter(ca_cmd, &packet);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atca_execute_command(&packet, _gDevice);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL_MEMORY(increased_bin_val, &packet.data[ATCA_RSP_DATA_IDX], 4);
memcpy(&test, &packet.data[ATCA_RSP_DATA_IDX], 4);
}
TEST(atca_cmd_basic_test, counter_test)
{
ATCA_STATUS status = ATCA_SUCCESS;
uint32_t counter_value1;
uint32_t counter_value2;
test_assert_config_is_locked();
status = atcab_counter_read(1, &counter_value1);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_counter_increment(1, &counter_value2);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(counter_value1 + 1, counter_value2);
status = atcab_counter_increment(1, NULL);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_counter_read(1, &counter_value1);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(counter_value2 + 1, counter_value1);
status = atcab_counter_increment(3, NULL);
TEST_ASSERT_EQUAL(ATCA_BAD_PARAM, status);
}
TEST(atca_cmd_basic_test, counter_match)
{
ATCA_STATUS status = ATCA_SUCCESS;
uint8_t msg[ATCA_SHA_DIGEST_SIZE];
uint8_t public_key[ATCA_PUB_KEY_SIZE];
uint8_t signature[ATCA_SIG_SIZE];
uint16_t private_key_id = 0;
bool is_verified = false;
uint8_t counter_match_slot_data[32];
uint32_t counter_match;
uint32_t counter0_value;
test_assert_config_is_locked();
test_assert_data_is_locked();
status = atcab_counter_read(0, &counter0_value);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
printf("Starting counter 0: %u\r\n", (unsigned int)counter0_value);
while ((uint8_t)(counter0_value % 32) < (32 - 1))
{
status = atcab_counter_increment(0, &counter0_value);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
}
printf("Incrementing counter 0 to 32-byte boundary: %u\r\n", (unsigned int)counter0_value);
counter_match = counter0_value + 1; status = atcah_encode_counter_match(counter_match, counter_match_slot_data);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_write_bytes_zone(ATCA_ZONE_DATA, 10, 0, counter_match_slot_data, sizeof(counter_match_slot_data));
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
printf("Setting counter match to: %u\r\n", (unsigned int)counter_match);
status = atcab_random(msg);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_genkey(private_key_id, public_key);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_sign(private_key_id, msg, signature);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_counter_read(0, &counter0_value);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
printf("Counter 0 after successful sign: %u\r\n", (unsigned int)counter0_value);
TEST_ASSERT_EQUAL(counter_match, counter0_value);
status = atcab_verify_extern(msg, signature, public_key, &is_verified);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
TEST_ASSERT_EQUAL(true, is_verified);
status = atcab_sign(private_key_id, msg, signature);
TEST_ASSERT_EQUAL(ATCA_EXECUTION_ERROR, status);
status = atcab_counter_read(0, &counter0_value);
TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
printf("Counter 0 after failed sign: %u\r\n", (unsigned int)counter0_value);
TEST_ASSERT_EQUAL(counter_match, counter0_value);
status = atcah_encode_counter_match((COUNTER_MAX_VALUE - 31), counter_match_slot_data); TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_write_bytes_zone(ATCA_ZONE_DATA, 10, 0, counter_match_slot_data, sizeof(counter_match_slot_data)); TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
}
TEST(atca_cmd_basic_test, counter_write_test)
{
ATCA_STATUS status = ATCA_SUCCESS;
uint16_t counter_id = 1;
uint32_t counter_value_low = 0;
uint32_t counter_value_mid = COUNTER_MAX_VALUE / 2;
uint32_t counter_value_max = COUNTER_MAX_VALUE;
uint32_t counter_read_value;
test_assert_config_is_unlocked();
status = atcab_write_config_counter(counter_id, counter_value_low); TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_counter_read(counter_id, &counter_read_value); TEST_ASSERT_EQUAL_MEMORY(&counter_value_low, &counter_read_value, 4);
status = atcab_write_config_counter(counter_id, counter_value_mid); TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_counter_read(counter_id, &counter_read_value); TEST_ASSERT_EQUAL_MEMORY(&counter_value_mid, &counter_read_value, 4);
status = atcab_write_config_counter(counter_id, counter_value_max); TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
status = atcab_counter_read(counter_id, &counter_read_value); TEST_ASSERT_EQUAL_MEMORY(&counter_value_max, &counter_read_value, 4);
status = atcab_write_config_counter(counter_id, counter_value_low); TEST_ASSERT_EQUAL(ATCA_SUCCESS, status);
}
t_test_case_info counter_basic_test_info[] =
{
{ REGISTER_TEST_CASE(atca_cmd_basic_test, counter_write_test), DEVICE_MASK(ATECC508A) | DEVICE_MASK(ATECC608A) },
{ REGISTER_TEST_CASE(atca_cmd_basic_test, counter_test), DEVICE_MASK(ATECC508A) | DEVICE_MASK(ATECC608A) },
{ REGISTER_TEST_CASE(atca_cmd_basic_test, counter_match), DEVICE_MASK(ATECC608A) },
{ (fp_test_case)NULL, (uint8_t)0 },
};
t_test_case_info counter_unit_test_info[] =
{
{ REGISTER_TEST_CASE(atca_cmd_unit_test, counter), DEVICE_MASK(ATECC508A) | DEVICE_MASK(ATECC608A) },
{ (fp_test_case)NULL, (uint8_t)0 },
};