Zeroize critical buffers.

Signed-off-by: Pol Henarejos <pol.henarejos@cttc.es>
This commit is contained in:
Pol Henarejos
2026-05-08 19:43:46 +02:00
parent 5838d6f443
commit 525b87cd72
3 changed files with 37 additions and 5 deletions

View File

@@ -45,6 +45,9 @@ int process_apdu(void) {
} }
chain_used = (size_t)(chain_ptr - chain_buf); chain_used = (size_t)(chain_ptr - chain_buf);
if (chain_used + apdu.nc >= sizeof(chain_buf)) { if (chain_used + apdu.nc >= sizeof(chain_buf)) {
memset(chain_buf, 0, sizeof(chain_buf));
chain_ptr = NULL;
is_chaining = false;
return SW_CLA_NOT_SUPPORTED(); return SW_CLA_NOT_SUPPORTED();
} }
memcpy(chain_ptr, apdu.data, apdu.nc); memcpy(chain_ptr, apdu.data, apdu.nc);
@@ -57,6 +60,8 @@ int process_apdu(void) {
memmove(apdu.data + (chain_ptr - chain_buf), apdu.data, apdu.nc); memmove(apdu.data + (chain_ptr - chain_buf), apdu.data, apdu.nc);
memcpy(apdu.data, chain_buf, chain_ptr - chain_buf); memcpy(apdu.data, chain_buf, chain_ptr - chain_buf);
apdu.nc += (uint16_t)(chain_ptr - chain_buf); apdu.nc += (uint16_t)(chain_ptr - chain_buf);
memset(chain_buf, 0, sizeof(chain_buf));
chain_ptr = NULL;
is_chaining = false; is_chaining = false;
} }
} }

View File

@@ -95,6 +95,7 @@ int encrypt_with_aad(const uint8_t key[32], const uint8_t *in_buf, size_t in_len
pin_derive_kenc(key, kenc); pin_derive_kenc(key, kenc);
} }
else { else {
mbedtls_gcm_free(&gcm);
return PICOKEYS_WRONG_DATA; return PICOKEYS_WRONG_DATA;
} }
int rc = mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, kenc, 256); int rc = mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, kenc, 256);
@@ -127,6 +128,7 @@ int decrypt_with_aad(const uint8_t key[32], const uint8_t *in_buf, size_t in_len
pin_derive_kenc(key, kenc); pin_derive_kenc(key, kenc);
} }
else { else {
mbedtls_gcm_free(&gcm);
return PICOKEYS_WRONG_DATA; return PICOKEYS_WRONG_DATA;
} }
int rc = mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, kenc, 256); int rc = mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, kenc, 256);
@@ -196,12 +198,20 @@ int aes_encrypt(const uint8_t *key, const uint8_t *iv, uint16_t key_size, int mo
} }
int r = mbedtls_aes_setkey_enc(&aes, key, key_size); int r = mbedtls_aes_setkey_enc(&aes, key, key_size);
if (r != 0) { if (r != 0) {
mbedtls_aes_free(&aes);
mbedtls_platform_zeroize(tmp_iv, sizeof(tmp_iv));
return PICOKEYS_EXEC_ERROR; return PICOKEYS_EXEC_ERROR;
} }
int rc = 0;
if (mode == PICOKEYS_AES_MODE_CBC) { if (mode == PICOKEYS_AES_MODE_CBC) {
return mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, len, tmp_iv, data, data); rc = mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, len, tmp_iv, data, data);
} }
return mbedtls_aes_crypt_cfb128(&aes, MBEDTLS_AES_ENCRYPT, len, &iv_offset, tmp_iv, data, data); else {
rc = mbedtls_aes_crypt_cfb128(&aes, MBEDTLS_AES_ENCRYPT, len, &iv_offset, tmp_iv, data, data);
}
mbedtls_aes_free(&aes);
mbedtls_platform_zeroize(tmp_iv, sizeof(tmp_iv));
return rc;
} }
int aes_decrypt(const uint8_t *key, const uint8_t *iv, uint16_t key_size, int mode, uint8_t *data, uint16_t len) { int aes_decrypt(const uint8_t *key, const uint8_t *iv, uint16_t key_size, int mode, uint8_t *data, uint16_t len) {
@@ -215,13 +225,26 @@ int aes_decrypt(const uint8_t *key, const uint8_t *iv, uint16_t key_size, int mo
} }
int r = mbedtls_aes_setkey_dec(&aes, key, key_size); int r = mbedtls_aes_setkey_dec(&aes, key, key_size);
if (r != 0) { if (r != 0) {
mbedtls_aes_free(&aes);
mbedtls_platform_zeroize(tmp_iv, sizeof(tmp_iv));
return PICOKEYS_EXEC_ERROR; return PICOKEYS_EXEC_ERROR;
} }
int rc = 0;
if (mode == PICOKEYS_AES_MODE_CBC) { if (mode == PICOKEYS_AES_MODE_CBC) {
return mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_DECRYPT, len, tmp_iv, data, data); rc = mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_DECRYPT, len, tmp_iv, data, data);
} }
r = mbedtls_aes_setkey_enc(&aes, key, key_size); //CFB requires set_enc instead set_dec else {
return mbedtls_aes_crypt_cfb128(&aes, MBEDTLS_AES_DECRYPT, len, &iv_offset, tmp_iv, data, data); r = mbedtls_aes_setkey_enc(&aes, key, key_size); //CFB requires set_enc instead set_dec
if (r != 0) {
mbedtls_aes_free(&aes);
mbedtls_platform_zeroize(tmp_iv, sizeof(tmp_iv));
return PICOKEYS_EXEC_ERROR;
}
rc = mbedtls_aes_crypt_cfb128(&aes, MBEDTLS_AES_DECRYPT, len, &iv_offset, tmp_iv, data, data);
}
mbedtls_aes_free(&aes);
mbedtls_platform_zeroize(tmp_iv, sizeof(tmp_iv));
return rc;
} }
int aes_encrypt_cfb_256(const uint8_t *key, const uint8_t *iv, uint8_t *data, uint16_t len) { int aes_encrypt_cfb_256(const uint8_t *key, const uint8_t *iv, uint8_t *data, uint16_t len) {

View File

@@ -475,6 +475,7 @@ static void otp_invalidate_key(uint16_t row, uint16_t len) {
if (inval) { if (inval) {
memset(inval, 0xFF, len * 2); memset(inval, 0xFF, len * 2);
otp_write_data_raw(row, inval, len * 2); otp_write_data_raw(row, inval, len * 2);
mbedtls_platform_zeroize(inval, len * 2);
free(inval); free(inval);
} }
} }
@@ -489,6 +490,7 @@ static otp_ret_t otp_chaff(uint16_t row, uint16_t len) {
chaff[i] ^= 0xFF; chaff[i] ^= 0xFF;
} }
otp_ret_t ret = otp_write_data_raw(row + 32, chaff, len * 2); otp_ret_t ret = otp_write_data_raw(row + 32, chaff, len * 2);
mbedtls_platform_zeroize(chaff, len * 2);
free(chaff); free(chaff);
return ret; return ret;
} }
@@ -506,6 +508,7 @@ static otp_ret_t otp_migrate_key(uint16_t new_row, uint16_t old_row, uint16_t le
otp_chaff(new_row, len); otp_chaff(new_row, len);
otp_invalidate_key(old_row, 32); otp_invalidate_key(old_row, 32);
} }
mbedtls_platform_zeroize(new_key, len);
free(new_key); free(new_key);
return ret; return ret;
} }
@@ -539,6 +542,7 @@ void otp_init_files(void) {
#ifdef PICO_RP2350 #ifdef PICO_RP2350
otp_chaff(OTP_KEY_1, 32); otp_chaff(OTP_KEY_1, 32);
#endif #endif
mbedtls_platform_zeroize(mkek, sizeof(mkek));
write_otp[0] = OTP_KEY_1; write_otp[0] = OTP_KEY_1;
} }
OTP_READ(OTP_KEY_1, otp_key_1); OTP_READ(OTP_KEY_1, otp_key_1);