'ESP32 Stack canary watchpoint triggered. Why?

I have a program that can encrypt and decrypt a text with Boneh-Franklin encryption. This works great on a PC, but for some reason causes a constant reboot on ESP32 with the following error message:

setup2
setup2.2
setup2.3
Guru Meditation Error: Core  1 panic'ed (Unhandled debug exception)
Debug exception reason: Stack canary watchpoint triggered (loopTask) 
Core 1 register dump:
PC      : 0x40083774  PS      : 0x00060b36  A0      : 0x3ffb0120  A1      : 0x3ffb0060  
A2      : 0x68efa751  A3      : 0x3ffb0938  A4      : 0x3ffb0720  A5      : 0xfb879c5c  
A6      : 0x61b36b71  A7      : 0x0006970f  A8      : 0x01709af4  A9      : 0x01709af4  
A10     : 0xfaa5dfed  A11     : 0x01a3ff3b  A12     : 0x76651dec  A13     : 0x00000001  
A14     : 0x00000000  A15     : 0x04adbe74  SAR     : 0x0000001e  EXCCAUSE: 0x00000001  
EXCVADDR: 0x00000000  LBEG    : 0x400f1cc5  LEND    : 0x400f1cc9  LCOUNT  : 0x00000000  

ELF file SHA256: 0000000000000000

I use an Arduino ESP32 environment, CONFIG_ARDUINO_LOOP_STACK_SIZE is set to 8192 in main.cpp, 8k stack should be enough to run it. It works perfectly on PC, it’s a mystery to me why not on ESP32. Can anyone help? I absolutely ran out of ideas. For the Boneh-Franklin implementation I used this library: https://github.com/miracl/core My own code is ~200 lines, I have uploaded it to Google Drive: https://drive.google.com/file/d/1EY0mGC2UiVNhE68b5Q0VB9JIY2Owbpxg/view?usp=sharing



Solution 1:[1]

Looking at the code, it isn't unreasonable that the stack will require more than 8192 bytes as a lot of big objects are allocated on the stack, both in your code and in the library, e.g.:

loop()

  • csprng RNG – 128 bytes
  • ECP2 pPublic – 264 bytes
  • ECP2 cipherPointU – 264 bytes
  • ECP privateKey – 132 bytes

encrypt(...)

  • ECP pointQId – 132 bytes
  • char[] dst – 256 bytes
  • BIG l – 40 bytes
  • FP12 theta – 532 bytes

PAIR_fexp()

  • FP2 X – 88 bytes
  • BIG x – 40 bytes
  • FP a, b – 2 * 44 = 88 bytes
  • FP12 t0, y0, y1, y2, y3 – 5 * 532 = 2660 bytes

Increase your stack size. It will likely help.

Solution 2:[2]

I got to this page by googling my own troubles so thought I would add my solution here

I experienced this error recently and by using a series of Serial.println's was able to trace to an infinite loop created in the code

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 matt richards