Let signing backend validate personalization (#873)
For soft signing, let backend handle checksum verification of personalization data. This ensures that the backends sha256 library is used and avoids an unnecessary instanitation of the public library. For atsha204 signing, no checksum verification is made, just chip locking flags. Fixes #872
This commit is contained in:
@@ -90,7 +90,6 @@ extern bool signerAtsha204SignMsg(MyMessage &msg);
|
|||||||
#define signerBackendVerifyMsg signerAtsha204VerifyMsg
|
#define signerBackendVerifyMsg signerAtsha204VerifyMsg
|
||||||
#define signerBackendSignMsg signerAtsha204SignMsg
|
#define signerBackendSignMsg signerAtsha204SignMsg
|
||||||
#endif
|
#endif
|
||||||
static bool signerValidatePersonalization(void);
|
|
||||||
static bool skipSign(MyMessage &msg);
|
static bool skipSign(MyMessage &msg);
|
||||||
#else // not MY_SIGNING_FEATURE
|
#else // not MY_SIGNING_FEATURE
|
||||||
#define signerBackendCheckTimer() true
|
#define signerBackendCheckTimer() true
|
||||||
@@ -103,8 +102,6 @@ static bool signerInternalProcessNonceResponse(MyMessage &msg);
|
|||||||
void signerInit(void)
|
void signerInit(void)
|
||||||
{
|
{
|
||||||
#if defined(MY_SIGNING_FEATURE)
|
#if defined(MY_SIGNING_FEATURE)
|
||||||
(void)signerValidatePersonalization();
|
|
||||||
|
|
||||||
// Read out the signing requirements from EEPROM
|
// Read out the signing requirements from EEPROM
|
||||||
hwReadConfigBlock((void*)_doSign, (void*)EEPROM_SIGNING_REQUIREMENT_TABLE_ADDRESS,
|
hwReadConfigBlock((void*)_doSign, (void*)EEPROM_SIGNING_REQUIREMENT_TABLE_ADDRESS,
|
||||||
sizeof(_doSign));
|
sizeof(_doSign));
|
||||||
@@ -341,33 +338,6 @@ int signerMemcmp(const void* a, const void* b, size_t sz)
|
|||||||
|
|
||||||
#if defined(MY_SIGNING_FEATURE)
|
#if defined(MY_SIGNING_FEATURE)
|
||||||
// Helper function to centralize signing/verification exceptions
|
// Helper function to centralize signing/verification exceptions
|
||||||
static bool signerValidatePersonalization(void)
|
|
||||||
{
|
|
||||||
#ifdef MY_SIGNING_SIMPLE_PASSWD
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
uint8_t buffer[32];
|
|
||||||
uint8_t* hash;
|
|
||||||
uint8_t checksum;
|
|
||||||
signerSha256Init();
|
|
||||||
hwReadConfigBlock((void*)buffer, (void*)EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS, 32);
|
|
||||||
signerSha256Update(buffer, 32);
|
|
||||||
hwReadConfigBlock((void*)buffer, (void*)EEPROM_RF_ENCRYPTION_AES_KEY_ADDRESS, 16);
|
|
||||||
signerSha256Update(buffer, 16);
|
|
||||||
hwReadConfigBlock((void*)buffer, (void*)EEPROM_SIGNING_SOFT_SERIAL_ADDRESS, 9);
|
|
||||||
signerSha256Update(buffer, 9);
|
|
||||||
hash = signerSha256Final();
|
|
||||||
hwReadConfigBlock((void*)&checksum, (void*)EEPROM_PERSONALIZATION_CHECKSUM_ADDRESS, 1);
|
|
||||||
if (checksum != hash[0]) {
|
|
||||||
SIGN_DEBUG(PSTR("!SGN:PER:TAMPERED\n"));
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
SIGN_DEBUG(PSTR("SGN:PER:OK\n"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool skipSign(MyMessage &msg)
|
static bool skipSign(MyMessage &msg)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|||||||
@@ -103,8 +103,37 @@ bool signerAtsha204SoftInit(void)
|
|||||||
_signing_node_serial_info[8] = getNodeId();
|
_signing_node_serial_info[8] = getNodeId();
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
uint8_t buffer[32];
|
||||||
|
uint8_t* hash;
|
||||||
|
uint8_t checksum;
|
||||||
|
|
||||||
|
_signing_sha256.init();
|
||||||
|
hwReadConfigBlock((void*)buffer, (void*)EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS, 32);
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
_signing_sha256.write(buffer[i]);
|
||||||
|
}
|
||||||
|
hwReadConfigBlock((void*)buffer, (void*)EEPROM_RF_ENCRYPTION_AES_KEY_ADDRESS, 16);
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
_signing_sha256.write(buffer[i]);
|
||||||
|
}
|
||||||
|
hwReadConfigBlock((void*)buffer, (void*)EEPROM_SIGNING_SOFT_SERIAL_ADDRESS, 9);
|
||||||
|
for (int i = 0; i < 9; i++) {
|
||||||
|
_signing_sha256.write(buffer[i]);
|
||||||
|
}
|
||||||
|
hash = _signing_sha256.result();
|
||||||
|
hwReadConfigBlock((void*)&checksum, (void*)EEPROM_PERSONALIZATION_CHECKSUM_ADDRESS, 1);
|
||||||
|
if (checksum != hash[0]) {
|
||||||
|
SIGN_DEBUG(PSTR("!SGN:PER:TAMPERED\n"));
|
||||||
|
init_ok = false;
|
||||||
|
} else {
|
||||||
|
SIGN_DEBUG(PSTR("SGN:PER:OK\n"));
|
||||||
|
init_ok = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (init_ok) {
|
||||||
hwReadConfigBlock((void*)_signing_hmac_key, (void*)EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS, 32);
|
hwReadConfigBlock((void*)_signing_hmac_key, (void*)EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS, 32);
|
||||||
hwReadConfigBlock((void*)_signing_node_serial_info, (void*)EEPROM_SIGNING_SOFT_SERIAL_ADDRESS, 9);
|
hwReadConfigBlock((void*)_signing_node_serial_info, (void*)EEPROM_SIGNING_SOFT_SERIAL_ADDRESS, 9);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!memcmp(_signing_node_serial_info, reset_serial, 9)) {
|
if (!memcmp(_signing_node_serial_info, reset_serial, 9)) {
|
||||||
unique_id_t uniqueID;
|
unique_id_t uniqueID;
|
||||||
|
|||||||
Reference in New Issue
Block a user