455 lines
15 KiB
Diff
455 lines
15 KiB
Diff
From: Gabriel Valcazar <gabriel.valcazar@digi.com>
|
|
Date: Fri, 23 Feb 2018 13:50:29 +0100
|
|
Subject: [PATCH 2/2] Remove unnecessary code from cryptochip-cmd-processor
|
|
|
|
Some test commands apply to chips other than the ATECC508A, and can cause
|
|
errors when used incorrectly. Remove all code that doesn't apply to our
|
|
platforms.
|
|
|
|
https://jira.digi.com/browse/DEL-5763
|
|
|
|
Signed-off-by: Gabriel Valcazar <gabriel.valcazar@digi.com>
|
|
---
|
|
test/cmd-processor.c | 348 ++-------------------------------------------------
|
|
1 file changed, 13 insertions(+), 335 deletions(-)
|
|
|
|
diff --git a/test/cmd-processor.c b/test/cmd-processor.c
|
|
index c8c60e0..592157e 100644
|
|
--- a/test/cmd-processor.c
|
|
+++ b/test/cmd-processor.c
|
|
@@ -92,10 +92,6 @@ static void sernum(void);
|
|
static void discover(void);
|
|
static void select_device(ATCADeviceType device_type);
|
|
static int run_test(void* fptest);
|
|
-static void select_204(void);
|
|
-static void select_108(void);
|
|
-static void select_508(void);
|
|
-static void select_608(void);
|
|
static void run_basic_tests(void);
|
|
static void run_unit_tests(void);
|
|
static void run_otpzero_tests(void);
|
|
@@ -103,20 +99,11 @@ static void run_helper_tests(void);
|
|
static void help(void);
|
|
static int parse_cmd(const char *command);
|
|
static void run_all_tests(void);
|
|
-static ATCA_STATUS set_chip_mode(uint8_t i2c_user_extra_add, uint8_t ttl_enable, uint8_t watchdog, uint8_t clock_divider);
|
|
-static void set_clock_divider_m0(void);
|
|
-static void set_clock_divider_m1(void);
|
|
-static void set_clock_divider_m2(void);
|
|
|
|
static const char* argv[] = { "manual", "-v" };
|
|
static t_menu_info mas_menu_info[] =
|
|
{
|
|
{ "help", "Display Menu", help },
|
|
- { "discover", "Discover Buses and Devices", discover },
|
|
- { "204", "Set Target Device to ATECC204A", select_204 },
|
|
- { "108", "Set Target Device to ATECC108A", select_108 },
|
|
- { "508", "Set Target Device to ATECC508A", select_508 },
|
|
- { "608", "Set Target Device to ATECC608A", select_608 },
|
|
{ "info", "Get the Chip Revision", info },
|
|
{ "sernum", "Get the Chip Serial Number", sernum },
|
|
{ "basic", "Run Basic Test on Selected Device", run_basic_tests },
|
|
@@ -135,12 +122,9 @@ static t_menu_info mas_menu_info[] =
|
|
{ "cio", "Run Unit Test on Cert I/O", (fp_menu_handler)certio_unit_tests },
|
|
#endif
|
|
#ifdef TEST_SW_CRYPTO
|
|
- { "crypto", "Run Unit Tests for Software Crypto Functions", atca_crypto_sw_tests },
|
|
+ { "crypto", "Run Unit Tests for Software Crypto Functions", (fp_menu_handler)atca_crypto_sw_tests },
|
|
#endif
|
|
{ "all", "Run all unit tests, locking as needed.", run_all_tests },
|
|
- { "clkdivm0", "Set ATECC608A to ClockDivider M0(0x00)", set_clock_divider_m0},
|
|
- { "clkdivm1", "Set ATECC608A to ClockDivider M1(0x05)", set_clock_divider_m1},
|
|
- { "clkdivm2", "Set ATECC608A to ClockDivider M2(0x0D)", set_clock_divider_m2},
|
|
{ NULL, NULL, NULL },
|
|
};
|
|
|
|
@@ -160,6 +144,8 @@ int main(int argc, char* argv[])
|
|
return 1;
|
|
}
|
|
|
|
+ select_device(ATECC508A);
|
|
+
|
|
while (true)
|
|
{
|
|
printf("$ ");
|
|
@@ -230,96 +216,13 @@ static void help(void)
|
|
}
|
|
}
|
|
|
|
-static void select_204(void)
|
|
-{
|
|
- select_device(ATSHA204A);
|
|
-}
|
|
-static void select_108(void)
|
|
-{
|
|
- select_device(ATECC108A);
|
|
-}
|
|
-static void select_508(void)
|
|
-{
|
|
- select_device(ATECC508A);
|
|
-}
|
|
-static void select_608(void)
|
|
-{
|
|
- select_device(ATECC608A);
|
|
-}
|
|
-
|
|
-static void update_chip_mode(uint8_t* chip_mode, uint8_t i2c_user_extra_add, uint8_t ttl_enable, uint8_t watchdog, uint8_t clock_divider)
|
|
-{
|
|
- if (i2c_user_extra_add != 0xFF)
|
|
- {
|
|
- *chip_mode &= ~ATCA_CHIPMODE_I2C_ADDRESS_FLAG;
|
|
- *chip_mode |= i2c_user_extra_add & ATCA_CHIPMODE_I2C_ADDRESS_FLAG;
|
|
- }
|
|
- if (ttl_enable != 0xFF)
|
|
- {
|
|
- *chip_mode &= ~ATCA_CHIPMODE_TTL_ENABLE_FLAG;
|
|
- *chip_mode |= ttl_enable & ATCA_CHIPMODE_TTL_ENABLE_FLAG;
|
|
- }
|
|
- if (watchdog != 0xFF)
|
|
- {
|
|
- *chip_mode &= ~ATCA_CHIPMODE_WATCHDOG_MASK;
|
|
- *chip_mode |= watchdog & ATCA_CHIPMODE_WATCHDOG_MASK;
|
|
- }
|
|
- if (clock_divider != 0xFF)
|
|
- {
|
|
- *chip_mode &= ~ATCA_CHIPMODE_CLOCK_DIV_MASK;
|
|
- *chip_mode |= clock_divider & ATCA_CHIPMODE_CLOCK_DIV_MASK;
|
|
- }
|
|
-}
|
|
-
|
|
-static ATCA_STATUS check_clock_divider(void)
|
|
-{
|
|
- ATCA_STATUS status;
|
|
- uint8_t chip_mode = 0;
|
|
-
|
|
- if (gCfg->devtype != ATECC608A)
|
|
- {
|
|
- printf("Current device doesn't support clock divider settings (only ATECC608A)\r\n");
|
|
- return ATCA_GEN_FAIL;
|
|
- }
|
|
-
|
|
- // Update the actual ATECC608A chip mode so it takes effect immediately
|
|
- status = atcab_init(gCfg);
|
|
- if (status != ATCA_SUCCESS)
|
|
- {
|
|
- printf("atcab_init() failed with ret=0x%08X\r\n", status);
|
|
- return status;
|
|
- }
|
|
-
|
|
- do
|
|
- {
|
|
- // Read current config values
|
|
- status = atcab_read_bytes_zone(ATCA_ZONE_CONFIG, 0, ATCA_CHIPMODE_OFFSET, &chip_mode, 1);
|
|
- if (status != ATCA_SUCCESS)
|
|
- {
|
|
- printf("atcab_read_bytes_zone() failed with ret=0x%08X\r\n", status);
|
|
- break;
|
|
- }
|
|
-
|
|
- // Update the ATECC608A test config data so all the unit tests will run with the new chip mode
|
|
- update_chip_mode(&test_ecc608_configdata[ATCA_CHIPMODE_OFFSET], 0xFF, 0xFF, chip_mode & ATCA_CHIPMODE_WATCHDOG_MASK, chip_mode & ATCA_CHIPMODE_CLOCK_DIV_MASK);
|
|
-
|
|
- } while (0);
|
|
-
|
|
- atcab_release();
|
|
- return status;
|
|
-}
|
|
-
|
|
static void run_basic_tests(void)
|
|
{
|
|
- if (gCfg->devtype == ATECC608A)
|
|
- check_clock_divider();
|
|
run_test(RunAllBasicTests);
|
|
}
|
|
|
|
static void run_unit_tests(void)
|
|
{
|
|
- if (gCfg->devtype == ATECC608A)
|
|
- check_clock_divider();
|
|
run_test(RunAllFeatureTests);
|
|
}
|
|
static void run_otpzero_tests(void)
|
|
@@ -453,37 +356,6 @@ static ATCA_STATUS do_randoms(void)
|
|
|
|
return status;
|
|
}
|
|
-static void discover(void)
|
|
-{
|
|
- ATCAIfaceCfg ifaceCfgs[10];
|
|
- int i;
|
|
- const char *devname[] = { "ATSHA204A", "ATECC108A", "ATECC508A", "ATECC608A" }; // indexed by ATCADeviceType
|
|
-
|
|
- for (i = 0; i < (int)(sizeof(ifaceCfgs) / sizeof(ATCAIfaceCfg)); i++)
|
|
- {
|
|
- ifaceCfgs[i].devtype = ATCA_DEV_UNKNOWN;
|
|
- ifaceCfgs[i].iface_type = ATCA_UNKNOWN_IFACE;
|
|
- }
|
|
-
|
|
- printf("Searching...");
|
|
- atcab_cfg_discover(ifaceCfgs, sizeof(ifaceCfgs) / sizeof(ATCAIfaceCfg));
|
|
- for (i = 0; i < (int)(sizeof(ifaceCfgs) / sizeof(ATCAIfaceCfg)); i++)
|
|
- {
|
|
- if (ifaceCfgs[i].devtype != ATCA_DEV_UNKNOWN)
|
|
- {
|
|
- printf("Found %s ", devname[ifaceCfgs[i].devtype]);
|
|
- if (ifaceCfgs[i].iface_type == ATCA_I2C_IFACE)
|
|
- {
|
|
- printf("@ bus %d addr %02x", ifaceCfgs[i].atcai2c.bus, ifaceCfgs[i].atcai2c.slave_address);
|
|
- }
|
|
- if (ifaceCfgs[i].iface_type == ATCA_SWI_IFACE)
|
|
- {
|
|
- printf("@ bus %d", ifaceCfgs[i].atcaswi.bus);
|
|
- }
|
|
- printf("\r\n");
|
|
- }
|
|
- }
|
|
-}
|
|
static void info(void)
|
|
{
|
|
ATCA_STATUS status;
|
|
@@ -636,18 +508,7 @@ static ATCA_STATUS get_serial_no(uint8_t *sernum)
|
|
|
|
static void select_device(ATCADeviceType device_type)
|
|
{
|
|
- ATCA_STATUS status;
|
|
-
|
|
- status = set_test_config(device_type);
|
|
-
|
|
- if (status == ATCA_SUCCESS)
|
|
- {
|
|
- printf("Device Selected.\r\n");
|
|
- }
|
|
- else
|
|
- {
|
|
- printf("IFace Cfg are NOT available\r\n");
|
|
- }
|
|
+ set_test_config(device_type);
|
|
}
|
|
|
|
static int run_test(void* fptest)
|
|
@@ -670,9 +531,6 @@ static void run_all_tests(void)
|
|
bool is_data_locked = false;
|
|
int fails = 0;
|
|
|
|
- if (gCfg->devtype == ATECC608A)
|
|
- check_clock_divider();
|
|
-
|
|
status = is_device_locked(LOCK_ZONE_CONFIG, &is_config_locked);
|
|
if (status != ATCA_SUCCESS)
|
|
{
|
|
@@ -814,204 +672,24 @@ static ATCA_STATUS set_test_config(ATCADeviceType deviceType)
|
|
gCfg->devtype = ATCA_DEV_UNKNOWN;
|
|
gCfg->iface_type = ATCA_UNKNOWN_IFACE;
|
|
|
|
- switch (deviceType)
|
|
- {
|
|
- case ATSHA204A:
|
|
-#if defined(ATCA_HAL_I2C)
|
|
- *gCfg = cfg_atsha204a_i2c_default;
|
|
-#elif defined(ATCA_HAL_SWI)
|
|
- *gCfg = cfg_atsha204a_swi_default;
|
|
-#elif defined(ATCA_HAL_KIT_HID)
|
|
- *gCfg = cfg_atsha204a_kithid_default;
|
|
-#elif defined(ATCA_HAL_KIT_CDC)
|
|
- *gCfg = cfg_atsha204a_kitcdc_default;
|
|
-#elif defined(ATCA_HAL_CUSTOM)
|
|
- *gCfg = g_cfg_atsha204a_custom;
|
|
-#else
|
|
-#error "HAL interface is not selected";
|
|
-#endif
|
|
- break;
|
|
-
|
|
- case ATECC108A:
|
|
-#if defined(ATCA_HAL_I2C)
|
|
- *gCfg = cfg_ateccx08a_i2c_default;
|
|
- gCfg->devtype = deviceType;
|
|
-#elif defined(ATCA_HAL_SWI)
|
|
- *gCfg = cfg_ateccx08a_swi_default;
|
|
- gCfg->devtype = deviceType;
|
|
-#elif defined(ATCA_HAL_KIT_HID)
|
|
- *gCfg = cfg_ateccx08a_kithid_default;
|
|
- gCfg->devtype = deviceType;
|
|
-#elif defined(ATCA_HAL_KIT_CDC)
|
|
- *gCfg = cfg_ateccx08a_kitcdc_default;
|
|
- gCfg->devtype = deviceType;
|
|
-#elif defined(ATCA_HAL_CUSTOM)
|
|
- *gCfg = g_cfg_atecc108a_custom;
|
|
-#else
|
|
-#error "HAL interface is not selected";
|
|
-#endif
|
|
- break;
|
|
-
|
|
- case ATECC508A:
|
|
-#if defined(ATCA_HAL_I2C)
|
|
- *gCfg = cfg_ateccx08a_i2c_default;
|
|
- gCfg->devtype = deviceType;
|
|
-#elif defined(ATCA_HAL_SWI)
|
|
- *gCfg = cfg_ateccx08a_swi_default;
|
|
- gCfg->devtype = deviceType;
|
|
-#elif defined(ATCA_HAL_KIT_HID)
|
|
- *gCfg = cfg_ateccx08a_kithid_default;
|
|
- gCfg->devtype = deviceType;
|
|
-#elif defined(ATCA_HAL_KIT_CDC)
|
|
- *gCfg = cfg_ateccx08a_kitcdc_default;
|
|
- gCfg->devtype = deviceType;
|
|
-#elif defined(ATCA_HAL_CUSTOM)
|
|
- *gCfg = g_cfg_atecc508a_custom;
|
|
-#else
|
|
-#error "HAL interface is not selected";
|
|
-#endif
|
|
- break;
|
|
-
|
|
- case ATECC608A:
|
|
#if defined(ATCA_HAL_I2C)
|
|
- *gCfg = cfg_ateccx08a_i2c_default;
|
|
- gCfg->devtype = deviceType;
|
|
+ *gCfg = cfg_ateccx08a_i2c_default;
|
|
+ gCfg->devtype = deviceType;
|
|
#elif defined(ATCA_HAL_SWI)
|
|
- *gCfg = cfg_ateccx08a_swi_default;
|
|
- gCfg->devtype = deviceType;
|
|
+ *gCfg = cfg_ateccx08a_swi_default;
|
|
+ gCfg->devtype = deviceType;
|
|
#elif defined(ATCA_HAL_KIT_HID)
|
|
- *gCfg = cfg_ateccx08a_kithid_default;
|
|
- gCfg->devtype = deviceType;
|
|
+ *gCfg = cfg_ateccx08a_kithid_default;
|
|
+ gCfg->devtype = deviceType;
|
|
#elif defined(ATCA_HAL_KIT_CDC)
|
|
- *gCfg = cfg_ateccx08a_kitcdc_default;
|
|
- gCfg->devtype = deviceType;
|
|
+ *gCfg = cfg_ateccx08a_kitcdc_default;
|
|
+ gCfg->devtype = deviceType;
|
|
#elif defined(ATCA_HAL_CUSTOM)
|
|
- *gCfg = g_cfg_atecc608a_custom;
|
|
+ *gCfg = g_cfg_atecc508a_custom;
|
|
#else
|
|
#error "HAL interface is not selected";
|
|
#endif
|
|
- break;
|
|
-
|
|
- default:
|
|
- //device type wasn't found, return with error
|
|
- return ATCA_GEN_FAIL;
|
|
- }
|
|
-
|
|
- #ifdef ATCA_RASPBERRY_PI_3
|
|
- gCfg->atcai2c.bus = 1;
|
|
- #endif
|
|
|
|
return ATCA_SUCCESS;
|
|
}
|
|
|
|
-static ATCA_STATUS set_chip_mode(uint8_t i2c_user_extra_add, uint8_t ttl_enable, uint8_t watchdog, uint8_t clock_divider)
|
|
-{
|
|
- ATCA_STATUS status;
|
|
- uint8_t config_word[ATCA_WORD_SIZE];
|
|
- bool is_config_locked = false;
|
|
-
|
|
- if (gCfg->devtype != ATECC608A)
|
|
- {
|
|
- printf("Current device doesn't support clock divider settings (only ATECC608A)\r\n");
|
|
- return ATCA_GEN_FAIL;
|
|
- }
|
|
-
|
|
- status = is_device_locked(LOCK_ZONE_CONFIG, &is_config_locked);
|
|
- if (status != ATCA_SUCCESS)
|
|
- {
|
|
- printf("is_device_locked() failed with ret=0x%08X\r\n", status);
|
|
- return status;
|
|
- }
|
|
-
|
|
- if (is_config_locked)
|
|
- {
|
|
- printf("Current device is config locked. Can't change clock divider. ");
|
|
- }
|
|
-
|
|
- // Update the actual ATECC608A chip mode so it takes effect immediately
|
|
- status = atcab_init(gCfg);
|
|
- if (status != ATCA_SUCCESS)
|
|
- {
|
|
- printf("atcab_init() failed with ret=0x%08X\r\n", status);
|
|
- return status;
|
|
- }
|
|
-
|
|
- do
|
|
- {
|
|
- // Read current config values
|
|
- status = atcab_read_bytes_zone(ATCA_ZONE_CONFIG, 0, 16, config_word, 4);
|
|
- if (status != ATCA_SUCCESS)
|
|
- {
|
|
- printf("atcab_read_bytes_zone() failed with ret=0x%08X\r\n", status);
|
|
- break;
|
|
- }
|
|
-
|
|
- if (is_config_locked)
|
|
- {
|
|
- printf("Currently set to 0x%02X.\r\n", (int)(config_word[3] >> 3));
|
|
- status = ATCA_GEN_FAIL;
|
|
- break;
|
|
- }
|
|
-
|
|
- // Update ChipMode
|
|
- update_chip_mode(&config_word[3], i2c_user_extra_add, ttl_enable, watchdog, clock_divider);
|
|
-
|
|
- // Write config values back to chip
|
|
- status = atcab_write_bytes_zone(ATCA_ZONE_CONFIG, 0, 16, config_word, 4);
|
|
- if (status != ATCA_SUCCESS)
|
|
- {
|
|
- printf("atcab_write_bytes_zone() failed with ret=0x%08X\r\n", status);
|
|
- break;
|
|
- }
|
|
-
|
|
- // Put to sleep so new values take effect
|
|
- status = atcab_wakeup();
|
|
- if (status != ATCA_SUCCESS)
|
|
- {
|
|
- printf("atcab_wakeup() failed with ret=0x%08X\r\n", status);
|
|
- break;
|
|
- }
|
|
- status = atcab_sleep();
|
|
- if (status != ATCA_SUCCESS)
|
|
- {
|
|
- printf("atcab_sleep() failed with ret=0x%08X\r\n", status);
|
|
- break;
|
|
- }
|
|
-
|
|
- // Update the ATECC608A test config data so all the unit tests will run with the new chip mode
|
|
- update_chip_mode(&test_ecc608_configdata[ATCA_CHIPMODE_OFFSET], i2c_user_extra_add, ttl_enable, watchdog, clock_divider);
|
|
-
|
|
- } while (0);
|
|
-
|
|
- atcab_release();
|
|
- return status;
|
|
-}
|
|
-
|
|
-static void set_clock_divider_m0(void)
|
|
-{
|
|
- ATCA_STATUS status = set_chip_mode(0xFF, 0xFF, ATCA_CHIPMODE_WATCHDOG_SHORT, ATCA_CHIPMODE_CLOCK_DIV_M0);
|
|
- if (status == ATCA_SUCCESS)
|
|
- {
|
|
- printf("Set device to clock divider M0 (0x%02X) and watchdog to 1.3s nominal.\r\n", ATCA_CHIPMODE_CLOCK_DIV_M0 >> 3);
|
|
- }
|
|
-}
|
|
-
|
|
-static void set_clock_divider_m1(void)
|
|
-{
|
|
- ATCA_STATUS status = set_chip_mode(0xFF, 0xFF, ATCA_CHIPMODE_WATCHDOG_SHORT, ATCA_CHIPMODE_CLOCK_DIV_M1);
|
|
- if (status == ATCA_SUCCESS)
|
|
- {
|
|
- printf("Set device to clock divider M1 (0x%02X) and watchdog to 1.3s nominal.\r\n", ATCA_CHIPMODE_CLOCK_DIV_M1 >> 3);
|
|
- }
|
|
-}
|
|
-
|
|
-static void set_clock_divider_m2(void)
|
|
-{
|
|
- // Additionally set watchdog to long settings (~13s) as some commands
|
|
- // can't complete in time on the faster watchdog setting.
|
|
- ATCA_STATUS status = set_chip_mode(0xFF, 0xFF, ATCA_CHIPMODE_WATCHDOG_LONG, ATCA_CHIPMODE_CLOCK_DIV_M2);
|
|
- if (status == ATCA_SUCCESS)
|
|
- {
|
|
- printf("Set device to clock divider M2 (0x%02X) and watchdog to 13s nominal.\r\n", ATCA_CHIPMODE_CLOCK_DIV_M2 >> 3);
|
|
- }
|
|
-}
|
|
\ No newline at end of file
|