Funnily enough after a few reboots, the app does start working and operating as expected, though this obviously is not a solution.
This was tested on a blank ESP32-PICO dev kit and the ESP32-Etherkit. Erase flash contents, then program the device.
Error 1.
Code: Select all
Success, Key pair created.
Test read 255
CORRUPT HEAP: multi_heap.c:172 detected at 0x3ffb5734
abort() was called at PC 0x4008790f on core 0
ELF file SHA256: c190fbb902ee15f9
Backtrace: 0x40083fed:0x3ffb72b0 0x400843f9:0x3ffb72d0 0x4008790f:0x3ffb72f0 0x40087be1:0x3ffb7310 0x40081eea:0x3ffb7330 0x40088175:0x3ffb7350 0x400859a4:0x3ffb7370 0x400865a2:0x3ffb7390 0x400865b7:0x3ffb73b0 0x40084ae5:0x3ffb73d0
{1B}[0;32mI (10930) esp_core_dump_uart: Press Enter to print core dump to UART...{1B}[0m
{1B}[0;32mI (10937) esp_core_dump_uart: Print core dump to uart...{1B}[0m
{1B}[0;32mI (10943) esp_core_dump_elf: Found tasks: 7{1B}[0m
================= CORE DUMP START =================
/CoAAAABAAAHAAAAdAEAAAAAAAA=
f0VMRgEBAQAAAAAAAAAAAAQAXgABAAAAAAAAADQAAAAAAAAAAAAAADQAIAAQACgA
...
etc...
...
AAAAALYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAA==
dUttHA==
Code: Select all
Success, Key pair created.
Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x40087487 PS : 0x00060433 A0 : 0x80086acc A1 : 0x3ffb6ca0
A2 : 0x3f9d3c70 A3 : 0x3ffb55dc A4 : 0x00000000 A5 : 0x00000001
A6 : 0x00060420 A7 : 0x00000000 A8 : 0xffffffff A9 : 0x00000000
A10 : 0x3ffb5194 A11 : 0x00000000 A12 : 0x00000000 A13 : 0x00000001
A14 : 0x00060423 A15 : 0x3ffb92fc SAR : 0x00000018 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000007 LBEG : 0x4000c46c LEND : 0x4000c477 LCOUNT : 0x00000000
ELF file SHA256: f0f4e1950e01d82f
Backtrace: 0x40087484:0x3ffb6ca0 0x40086ac9:0x3ffb6cc0 0x40085289:0x3ffb6ce0 0x400d25b4:0x3ffb6d20 0x400d266e:0x3ffb6d40 0x40082a8d:0x3ffb6d60 0x40083411:0x3ffb6d80 0x40083dc5:0x3ffb6da0 0x40083353:0x3ffb6dc0 0x400d473a:0x3ffb6df0 0x400d449f:0x3ffb6e10 0x400d12a2:0x3ffb6e30 0x40084ae5:0x3ffb6e50
{1B}[0;32mI (3023) esp_core_dump_uart: Press Enter to print core dump to UART...{1B}[0m
{1B}[0;32mI (3030) esp_core_dump_uart: Print core dump to uart...{1B}[0m
Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled.
Core 0 register dump:
PC : 0x40085810 PS : 0x00060533 A0 : 0x80086e18 A1 : 0x3ffb6a60
A2 : 0x3ffb49d8 A3 : 0x3ffb6a90 A4 : 0x00000040 A5 : 0x3ffb32a4
A6 : 0x00000000 A7 : 0x3ffb32ac A8 : 0x3ffafda8 A9 : 0x3ffb6a40
A10 : 0x3ffb49d8 A11 : 0x3ffb6a90 A12 : 0x00000000 A13 : 0x40082168
A14 : 0x3ffb5194 A15 : 0x00000000 SAR : 0x00000004 EXCCAUSE: 0x0000001c
EXCVADDR: 0x0000000c LBEG : 0x4000c2e0 LEND : 0x4000c2f6 LCOUNT : 0x00000000
ELF file SHA256: f0f4e1950e01d82f
Backtrace: 0x4008580d:0x3ffb6a60 0x40086e15:0x3ffb6a90 0x400d59d1:0x3ffb6ac0 0x400d67e7:0x3ffb6af0 0x400d56fa:0x3ffb6b30 0x400d5dd0:0x3ffb6b50 0x4008434d:0x3ffb6ba0 0x400846dd:0x3ffb6bc0 0x400821b2:0x3ffb6be0 0x40087484:0x3ffb6ca0 0x40086ac9:0x3ffb6cc0 0x40085289:0x3ffb6ce0 0x400d25b4:0x3ffb6d20 0x400d266e:0x3ffb6d40 0x40082a8d:0x3ffb6d60 0x40083411:0x3ffb6d80 0x40083dc5:0x3ffb6da0 0x40083353:0x3ffb6dc0 0x400d473a:0x3ffb6df0 0x400d449f:0x3ffb6e10 0x400d12a2:0x3ffb6e30 0x40084ae5:0x3ffb6e50
Re-entered core dump! Exception happened during core dump!
Rebooting...
Code: Select all
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"
#include <esp_system.h>
#include <nvs_flash.h>
#include <sys/param.h>
#include "esp_err.h"
#include "nvs_flash.h"
//app driver includes
#include <mbedtls/pk.h>
#include <mbedtls/error.h>
#include <mbedtls/entropy.h>
#include <mbedtls/ctr_drbg.h>
#include "mbedtls/bignum.h"
#include "mbedtls/x509.h"
#include "mbedtls/rsa.h"
#include "mbedtls/config.h"
#include "mbedtls/platform.h"
#include "mbedtls/base64.h"
#include "esp_partition.h"
static unsigned char privKeyPem[2000];
static unsigned char pubKeyPem[1000];
uint32_t privKeyOffset = 0 * CONFIG_WL_SECTOR_SIZE;
uint32_t pubKeyOffset = 1 * CONFIG_WL_SECTOR_SIZE;
uint32_t tamperDataOffset = 2 * CONFIG_WL_SECTOR_SIZE;
esp_partition_t *partStorage = NULL;
mbedtls_pk_context pk;
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctrDrbg;
const char personalizationString[11] = "rsa_genkey"; //requires static size allocation in classes
#define KEY_SIZE 2048
#define EXPONENT 65537
bool Crypto_Verify(bool initisalised);
bool Crypto_LoadKeys();
bool Crypto_GenerateKeyPair(void);
//uint8_t test[4];
extern "C" void app_main() {
//Assign partition regions
partStorage = (esp_partition_t *)esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, "storage");
if (partStorage != NULL) {
if (!Crypto_LoadKeys()) {
if (!Crypto_GenerateKeyPair()) {
puts("!ERROR! Unable to create key pair!");
}
}
//allocate inside function
uint8_t test[4];
//test bad alignment...maybe?
for (int i = 0; i < sizeof(test); i++) {
esp_partition_read(partStorage, tamperDataOffset, &test[i], 1);
}
printf("Test read %d\n", test[0]);
}
else {
puts("Couldn't find partition");
}
}
bool Crypto_LoadKeys() {
bool ret = true;
esp_err_t resp = esp_partition_read(partStorage, privKeyOffset, privKeyPem, sizeof(privKeyPem) - 1);
if (ESP_OK != resp) {
puts("Err: Couldn't load priv key from partition");
return false;
}
resp = esp_partition_read(partStorage, pubKeyOffset, pubKeyPem, sizeof(pubKeyPem) - 1);
if (ESP_OK != resp) {
puts("Err: Couldn't load pub key from partition");
ret = false;
}
else if (NULL == strstr((const char *)privKeyPem, "-----BEGIN RSA PRIVATE KEY-----") || NULL == strstr((const char *)privKeyPem, "-----END RSA PRIVATE KEY-----")) {
puts("Err: Priv key couldn't be loaded");
ret = false;
}
else if (NULL == strstr((const char *)pubKeyPem, "-----BEGIN PUBLIC KEY-----") || NULL == strstr((const char *)pubKeyPem, "-----END PUBLIC KEY-----")) {
puts("Err: Pub key couldn't be loaded");
ret = false;
}
/* pk struct not currently initialised */
if (!Crypto_Verify(false)) {
puts("Err: Private key couldn't verified");
ret = false;
}
//null terminate safety
privKeyPem[sizeof(privKeyPem) - 1] = 0;
pubKeyPem[sizeof(pubKeyPem) - 1] = 0;
return ret;
}
bool Crypto_Verify(bool initisalised) {
int ret = 0;
/* Key has no password - parse in NULL size 0 */
if (!initisalised) {
mbedtls_pk_init(&pk);
if ((ret = mbedtls_pk_parse_key(&pk, privKeyPem, strlen((const char *)privKeyPem) + 1, NULL, 0)) != 0) {
printf("Unable to parse %d\n", ret);
goto exit;
}
}
/* Asumme keys are already loaded into internal variables */
if ((ret = mbedtls_rsa_check_privkey(mbedtls_pk_rsa(pk))) != 0) {
puts("Err: RSA context does not contain an rsa private key");
goto exit;
}
if ((ret = mbedtls_rsa_check_pubkey(mbedtls_pk_rsa(pk))) != 0) {
puts("Err: RSA context does not contain an rsa public key");
goto exit;
}
puts("RSA keys confirmed");
exit:
if (!initisalised) {
mbedtls_pk_free(&pk);
}
return !ret;
}
bool Crypto_GenerateKeyPair(void) {
bool ret = false; //== ESP_OK
/* Initialise variables */
mbedtls_entropy_init(&entropy);
mbedtls_ctr_drbg_init(&ctrDrbg);
mbedtls_pk_init(&pk);
puts("Seeding the random number generator...");
if ((ret = mbedtls_ctr_drbg_seed(&ctrDrbg, mbedtls_entropy_func, &entropy, (const unsigned char *)personalizationString, strlen(personalizationString))) != 0) {
printf("Failed to seed rng\nmbedtls_ctr_drbg_seed returned %d\n", ret);
goto cleanup;
}
if ((ret = mbedtls_pk_setup(&pk, mbedtls_pk_info_from_type(MBEDTLS_PK_RSA))) != 0) {
printf("pk_setup failed: %i\n", ret);
}
printf(" ok\n . Generating the RSA key [ %d-bit ]...", KEY_SIZE);
/* force task yield before generate a key that could take several seconds to do */
taskYIELD();
puts("Generating a key pair takes up to 20s and will likely trigger task watchdog during this process");
if ((ret = mbedtls_rsa_gen_key(mbedtls_pk_rsa(pk), mbedtls_ctr_drbg_random, &ctrDrbg, KEY_SIZE, EXPONENT)) != 0) {
printf(" failed\n ! mbedtls_rsa_gen_key returned %d\n\n", ret);
goto cleanup;
}
/* pk struct already intitialised */
if (!Crypto_Verify(true)) {
goto cleanup;
}
puts("Writing public key to string(PEM format)....");
//unsigned char pubKeyPem[1000];
memset(pubKeyPem, 0, sizeof(pubKeyPem));
if (mbedtls_pk_write_pubkey_pem(&pk, pubKeyPem, sizeof(pubKeyPem)) != 0) {
puts("Err: Write public key to string failed");
goto cleanup;
}
puts("Writing private key to string(PEM format)....");
memset(privKeyPem, 0, sizeof(privKeyPem));
ret = mbedtls_pk_write_key_pem(&pk, privKeyPem, sizeof(privKeyPem));
if (ret != 0) {
printf("write private key to string failed with code %04x\n", ret);
}
puts(" ok\n .");
puts("Success, Key pair created.");
cleanup:
mbedtls_pk_free(&pk);
mbedtls_ctr_drbg_free(&ctrDrbg);
mbedtls_entropy_free(&entropy);
return !ret;
}
Code: Select all
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
ota_0, app, ota_0, 0x10000, 0x190000,
ota_1, app, ota_1, , 0x190000,
storage, data, 0x40, , 0xD0000,
Code: Select all
==================== CURRENT THREAD STACK =====================
#0 0x40083ff0 in invoke_abort () at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/panic.c:159
#1 0x400843fc in abort () at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/panic.c:174
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
======================== THREADS INFO =========================
Id Target Id Frame
* 1 process 1073443936 0x40083ff0 in invoke_abort () at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/panic.c:159
2 process 1073445340 0x400f56e2 in esp_pm_impl_waiti () at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/pm_esp32.c:484
3 process 1073448012 0x4008130c in esp_crosscore_int_send_yield (core_id=0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
4 process 1073442532 0x4008130c in esp_crosscore_int_send_yield (core_id=0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
5 process 1073412788 0x4008130c in esp_crosscore_int_send_yield (core_id=0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
6 process 1073436096 0x4008130c in esp_crosscore_int_send_yield (core_id=1) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
7 process 1073413544 0x4008130c in esp_crosscore_int_send_yield (core_id=0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
==================== THREAD 2 (TCB: 0x3ffb79dc, name: 'IDLE1') =====================
#0 0x400f56e2 in esp_pm_impl_waiti () at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/pm_esp32.c:484
#1 0x400d2472 in esp_vApplicationIdleHook () at C:/msys32/home/4Volts/esp/esp-idf/components/esp_common/src/freertos_hooks.c:63
#2 0x400865bd in prvIdleTask (pvParameters=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/tasks.c:3383
#3 0x40084ae8 in vPortTaskWrapper (pxCode=0x400865b4 <prvIdleTask>, pvParameters=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/port.c:143
==================== THREAD 3 (TCB: 0x3ffb844c, name: 'Tmr Svc') =====================
#0 0x4008130c in esp_crosscore_int_send_yield (core_id=0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
#1 0x400870de in prvProcessTimerOrBlockTask (xNextExpireTime=<optimized out>, xListWasEmpty=<optimized out>) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/include/freertos/portable.h:214
#2 0x400871cb in prvTimerTask (pvParameters=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/timers.c:544
#3 0x40084ae8 in vPortTaskWrapper (pxCode=0x400871bc <prvTimerTask>, pvParameters=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/port.c:143
==================== THREAD 4 (TCB: 0x3ffb6ee4, name: '') =====================
#0 0x4008130c in esp_crosscore_int_send_yield (core_id=0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
#1 0x4008630b in vTaskDelete (xTaskToDelete=<optimized out>) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/include/freertos/portable.h:214
#2 0x400d12a6 in main_task (args=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/cpu_start.c:589
#3 0x40084ae8 in vPortTaskWrapper (pxCode=0x400d123c <main_task>, pvParameters=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/port.c:143
==================== THREAD 5 (TCB: 0x3ffafab4, name: 'esp_timer') =====================
#0 0x4008130c in esp_crosscore_int_send_yield (core_id=0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
#1 0x40085654 in xQueueGenericReceive (xQueue=0x3ffaea5c, pvBuffer=0x0, xTicksToWait=<optimized out>, xJustPeeking=0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/include/freertos/portable.h:214
#2 0x400d23a7 in timer_task (arg=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp_common/src/esp_timer.c:325
#3 0x40084ae8 in vPortTaskWrapper (pxCode=0x400d2394 <timer_task>, pvParameters=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/port.c:143
==================== THREAD 6 (TCB: 0x3ffb55c0, name: 'ipc1') =====================
#0 0x4008130c in esp_crosscore_int_send_yield (core_id=1) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
#1 0x40085654 in xQueueGenericReceive (xQueue=0x3ffb5168, pvBuffer=0x0, xTicksToWait=<optimized out>, xJustPeeking=0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/include/freertos/portable.h:214
#2 0x40081b9f in ipc_task (arg=0x1) at C:/msys32/home/4Volts/esp/esp-idf/components/esp_common/src/ipc.c:51
#3 0x40084ae8 in vPortTaskWrapper (pxCode=0x40081b6c <ipc_task>, pvParameters=0x1) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/port.c:143
==================== THREAD 7 (TCB: 0x3ffafda8, name: 'ipc0') =====================
#0 0x4008130c in esp_crosscore_int_send_yield (core_id=0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp32/crosscore_int.c:111
#1 0x40085654 in xQueueGenericReceive (xQueue=0x3ffafd54, pvBuffer=0x0, xTicksToWait=<optimized out>, xJustPeeking=0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/include/freertos/portable.h:214
#2 0x40081b9f in ipc_task (arg=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/esp_common/src/ipc.c:51
#3 0x40084ae8 in vPortTaskWrapper (pxCode=0x40081b6c <ipc_task>, pvParameters=0x0) at C:/msys32/home/4Volts/esp/esp-idf/components/freertos/port.c:143