Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
2 years, 9 months ago.
mbedTLS Mutex Parameter Error
I'm making a custom firmware update process on the Nordic nRF52832 using mbed-os and mbed-tls. I have build tools that put RSA-encrypted signature information in the application binary and the public key is stored elsewhere in flash.
I have it set up so far to transfer the binary over UART and save it into flash with the Nordic fstorage library (which requires the BLE stack/softdevice to be active and running). The binary is transferred properly and without error and in the past I was able to get the RSA signature verification to pass using mbed-tls libraries included with mbed-os.
After I realized a conflict with my structure and Nordic's requirements, I moved the signature data elsewhere in the binary. Everything transfers correctly again. The new transfer process uses slightly larger buffers (512 bytes as opposed to 80 bytes). Now when I execute the mbed-tls library function "mbedtls_rsa_pkcs1_verify" my program ends with an mbed_die and I get the following error message over the UART:
"Mutex 0x0 error -4: Parameter error"
Any clues as to what I should look for? I have started using the memory status library to track stack sizes and heap usage. Right before executing the verify function the memory status output looks like this:
"stack ( start: 200053D0 end: 200063D0 size: 00001000 used: 000004D8 ) thread ( id: 20005380 entry: 0003075D name: main_thread ) stack ( start: 20004058 end: 20004458 size: 00000400 used: 00000040 ) thread ( id: 20003FC8 entry: 00030865 name: unknown ) stack ( start: 20004458 end: 20004758 size: 00000300 used: 00000098 ) thread ( id: 20004010 entry: 00035D99 name: unknown ) stack ( start: 20006A38 end: 20007A38 size: 00001000 used: 000001D8 ) thread ( id: 200069E4 entry: 000360E5 name: application_unnamed_thread )"
It appears to be happening during an SVC call...
I found that if I moved BLE event processing to the main thread and used the spawned thread to run the encryption algorithms then I wouldn't encounter the crash/errors I was seeing before. I also reduced the stack size of the spawned thread until the encryption algorithm failed (it came back with a non-zero error) but even then mbed didn't crash.
Why would the specific thread I'm using for encryption algorithms have any effect on whether my program runs without crashing or not?