esp-open-rtos/extras/cryptoauthlib/cryptoauthlib_init.c
Peter Dunshee e66e87aa8e Add Atmel CryptoAuthLib to extras
This is Atmel/Microchip's official library for interfacing
to the Atmel ATECC508 chip.  The submodule points to their
repository in GitHub.

Additionally, this includes the HAL necessary to use this library
in esp_open_rtos using the i2c library in extras/i2c.  I have also
included a tool I wrote to play with the chip as an example under
examples/atcatool.

The extras module currently overrides atca_iface.h to fix bug in
cryptoauthlib (c11-only feature, which breaks c++ builds that want
to use cryptoauthlib)
2019-05-06 13:59:15 -05:00

83 lines
2.4 KiB
C

#include "cryptoauthlib.h"
#include "lwip/def.h"
#include <stdio.h>
#include <malloc.h>
#define ATEC_DEBUG
#ifdef ATEC_DEBUG
#define DBG(...) printf("%s:%d ",__FILE__,__LINE__); printf(__VA_ARGS__); printf("\r\n");
#define DBGX(...) printf(__VA_ARGS__);
#else
#define DBGV(...) {};
#define DBGVX(...) {};
#endif
void init_cryptoauthlib(uint8_t i2c_addr)
{
uint32_t revision;
uint32_t serial[(ATCA_SERIAL_NUM_SIZE + sizeof(uint32_t) - 1) / sizeof(uint32_t)];
bool config_is_locked, data_is_locked;
ATCA_STATUS status;
const ATCAIfaceCfg *atca_cfg;
/*
* Allow for addresses either in 7-bit format (0-7F) or in Atmel 8-bit shifted-by-one format.
* If user specifies address > 0x80, it must be already shifted since I2C bus addresses > 0x7f are invalid.
*/
if (i2c_addr < 0x7f) i2c_addr <<= 1;
atca_cfg = &cfg_ateccx08a_i2c_default;
if (atca_cfg->atcai2c.slave_address != i2c_addr)
{
ATCAIfaceCfg *cfg = (ATCAIfaceCfg *) calloc(1, sizeof(*cfg));
memcpy(cfg, &cfg_ateccx08a_i2c_default, sizeof(*cfg));
cfg->atcai2c.slave_address = i2c_addr;
atca_cfg = cfg;
}
status = atcab_init(atca_cfg);
if (status != ATCA_SUCCESS)
{
DBG("ATCA: Library init failed");
goto out;
}
status = atcab_info((uint8_t *) &revision);
if (status != ATCA_SUCCESS)
{
DBG("ATCA: Failed to get chip info");
goto out;
}
status = atcab_read_serial_number((uint8_t *) serial);
if (status != ATCA_SUCCESS)
{
DBG("ATCA: Failed to get chip serial number");
goto out;
}
status = atcab_is_locked(LOCK_ZONE_CONFIG, &config_is_locked);
status = atcab_is_locked(LOCK_ZONE_DATA, &data_is_locked);
if (status != ATCA_SUCCESS)
{
DBG("ATCA: Failed to get chip zone lock status");
goto out;
}
DBG("ATECC508 @ 0x%02x: rev 0x%04x S/N 0x%04x%04x%02x, zone "
"lock status: %s, %s",
i2c_addr >> 1, htonl(revision), htonl(serial[0]), htonl(serial[1]),
*((uint8_t *) &serial[2]), (config_is_locked ? "yes" : "no"),
(data_is_locked ? "yes" : "no"));
out:
/*
* We do not free atca_cfg in case of an error even if it was allocated
* because it is referenced by ATCA basic object.
*/
if (status != ATCA_SUCCESS)
{
DBG("ATCA: Chip is not available");
/* In most cases the device can still work, so we continue anyway. */
}
}