2021-04-27T09:47:37+02:00
2021-04-28T20:12:51+02:00
2022-08-12T02:20:30+02:00
Arpsoft
Sziasztok!
Van egy fura problémám. Van egy program, ami a Boneh-Franklin titkosítással tud titkosítani és visszafejteni egy szöveget. Ez remekül működik PC-n, de valamiért ESP32-n folyamatos újraindulást okoz a következő hibaüzenettel:
Az újraindulás az encrypt függvény futása alatt történik. Arduino ESP32 környezetet használok, a main.cpp-ben a CONFIG_ARDUINO_LOOP_STACK_SIZE 8192 van beállítva, 8k stack bőven elég kellene legyen ennek a futtatásához. És mondom, PC-n tökéletesen működik. Rejtély számomra, hogy ESP32-n miért nem. Valaki tudna segíteni?
A teljes kód ~200 sor, azt nem akarom ide bemásolni, csatolom (a szükséges Boneh-Franklin könyvtárakkal együtt).
Van egy fura problémám. Van egy program, ami a Boneh-Franklin titkosítással tud titkosítani és visszafejteni egy szöveget. Ez remekül működik PC-n, de valamiért ESP32-n folyamatos újraindulást okoz a következő hibaüzenettel:
setup2
setup2.2
setup2.3
setup2.4
kkkk
encrypt
Guru Meditation Error: Core 1 panic'ed (Unhandled debug exception)
Debug exception reason: Stack canary watchpoint triggered (loopTask)
Core 1 register dump:
PC : 0x400f1d62 PS : 0x00060936 A0 : 0x800d6930 A1 : 0x3ffafec0
A2 : 0x3ffb0050 A3 : 0x3ffaff60 A4 : 0x3ffaffb0 A5 : 0x00000000
A6 : 0x00000000 A7 : 0x00000006 A8 : 0x00000010 A9 : 0x00000014
A10 : 0x138c0b15 A11 : 0x3ffb0060 A12 : 0x071000c5 A13 : 0x00000000
A14 : 0x00000000 A15 : 0x00000000 SAR : 0x0000001d EXCCAUSE: 0x00000001
EXCVADDR: 0x00000000 LBEG : 0x400f1d56 LEND : 0x400f1d66 LCOUNT : 0x0000000f
ELF file SHA256: 0000000000000000
Backtrace: 0x400f1d62:0x3ffafec0 0x400d692d:0x3ffafee0 0x400d3c08:0x3ffb0110 0x400d3f2d:0x3ffb0400 0x400d918a:0x3ffb1090 0x400d0fd1:0x3ffb1680 0x400d11bb:0x3ffb1b30 0x400da735:0x3ffb1fb0 0x400860ed:0x3ffb1fd0
Rebooting...
A teljes kód ~200 sor, azt nem akarom ide bemásolni, csatolom (a szükséges Boneh-Franklin könyvtárakkal együtt).
Mutasd a teljes hozzászólást!
Csatolt állomány
- code.zip111,8 KB
- Azim04válasza NevemTeve (12:22) részére
- 2021.04.27. 16:14
- permalink
Mutasd a teljes hozzászólást!- NevemTeveválasza Azim04 (16:14) részére
- 2021.04.27. 21:11
- permalink
Természetes a desktop verziót kell valgrind-del futtatni, egyből kiderül, hogy a látszólag helyes lefutás mögött sok-sok apró disznóság van azért.Mutasd a teljes hozzászólást!- Arpsoftválasza NevemTeve (12:22) részére
- 2021.04.28. 13:41
- permalink
Köszönöm a segítséget mindkettőtöknek, megnéztem valgrind-del a PC-s verziót.
Nem használtam soha valgrind-et, szóval nem értem teljesen amit látok, de vannak benne gyanús dolgok.
Egyrészt van egy csomó Conditional jump or move depends on uninitialised value(s), bár azt hiszem ez a kisebb probléma. Viszont vannak olyanok is, hogy Invalid write of size 1, Invalid read of size 1.
32 bytes in 1 blocks are still reachable in loss record 4 of 12, 5,376 bytes in 84 blocks are definitely lost in loss record 12 of 12, stb. Ezek milyen jellegű hibákra utalnak?
Csatolom a teljes PC-s verziót, beleértve a g++-szal lefordított állományt is és a valgrind riportot (a main függvény a code.cpp-ben van). Megköszönném ha valaki tudna segíteni, hogy hol van elszúrva a dolog. Ebből ami saját kód, az csak a code.cpp, az összes többi ebből a library-ből van: miracl/coreMutasd a teljes hozzászólást!Csatolt állomány- espdebug.zip174,9 KB
- VNetválasza Arpsoft (09:47) részére
- 2021.04.28. 13:59
- permalink
Helló!
Próbáltad már ezt a stack trace decoder-t?
me-no-dev/EspExceptionDecoder
+ ha jobban akarod struktúrálni a projektedet (clean code, Object-oriented), akkor érdemesebb a PlatformIO-val fejleszteni a kódot.
Csak egy jótanács, ahhoz vannak még külön extension-ök is, és egész szép, értelmezhető stack trace-t kapsz console-on fájlnévvel, függvény nevével, és a sor számával.
Egy példa, hogy milyen stack trace-t kapsz ha be van állítva rendesen a VSCode és a PlatformIO:
T-Watch-2020 V3 TFT_eSPI fails in initDMA() function · Issue #126 · Xinyuan-LilyGO/TTGO_TWatch_LibraMutasd a teljes hozzászólást!- Azim04válasza Arpsoft (13:41) részére
- 2021.04.28. 14:08
- permalink
nem néztem a kódodat. Csak azt akarom megkérdezni hogy az esp-nek van dedikált titkosító része, nem lenne célravezető azt használni?
function block diagram
pl: Example of using hardware AES 256 Crypto in CBC mode on the ESP32 using ESP-IDFMutasd a teljes hozzászólást!- VNetválasza VNet (13:59) részére
- 2021.04.28. 14:25
- permalink
platformio.ini fájlba ezt kell tenni:
monitor_speed = 115200
monitor_filters =
default
esp32_exception_decoder
... és a monitor console-ban megjelenik, hogy még milyen filtert vehetsz fel:
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
--- More details at http://bit.ly/pio-monitor-filters
Please build project in debug configuration to get more details about an exception.
See Build Configurations — PlatformIO 5.2.0a6 documentationMutasd a teljes hozzászólást!- NevemTeveválasza Arpsoft (13:41) részére
- 2021.04.28. 14:55
- permalink
Kezdetnek a -g opció kellene, meg az include-ok nevét fixálni:
$ diff -U0 utils.~h utils.h --- utils.~h 2021-04-18 15:36:54.000000000 +0200 +++ utils.h 2021-04-28 14:29:21.741200685 +0200 @@ -3 +3 @@ -#include "ECP_BN254.h" +#include "ecp_BN254.h" $ diff -U0 utils.~cpp utils.cpp --- utils.~cpp 2021-04-18 15:36:54.000000000 +0200 +++ utils.cpp 2021-04-28 14:28:35.131662876 +0200 @@ -3 +3 @@ -#include "FP_BN254.h" +#include "fp_BN254.h"
Mutasd a teljes hozzászólást!- **G**válasza Arpsoft (13:41) részére
- 2021.04.28. 17:21
- permalink
Amit küldtél PC program az bugos :(
(gdb) r Starting program: C:\Users\XXX\Downloads\espdebug\bld2\esp.exe [New Thread 4736.0x1d28] [New Thread 4736.0x2d9c] [New Thread 4736.0x2628] Startloop Setup donewarning: HEAP[esp.exe]: warning: Heap block at 0000022097773C90 modified at 0000022097773CA1 past requested size of 1 Thread 1 received signal SIGTRAP, Trace/breakpoint trap. 0x00007ffc7192a183 in ntdll!RtlRegisterSecureMemoryCacheCallback () from C:\Windows\SYSTEM32\ntdll.dll (gdb) bt #0 0x00007ffc7192a183 in ntdll!RtlRegisterSecureMemoryCacheCallback () from C:\Windows\SYSTEM32\ntdll.dll #1 0x00007ffc7192680f in ntdll!RtlZeroHeap () from C:\Windows\SYSTEM32\ntdll.dll #2 0x00007ffc718ecc82 in ntdll!memset () from C:\Windows\SYSTEM32\ntdll.dll #3 0x00007ffc71929031 in ntdll!RtlRegisterSecureMemoryCacheCallback () from C:\Windows\SYSTEM32\ntdll.dll #4 0x00007ffc71855cc1 in ntdll!RtlGetCurrentServiceSessionId () from C:\Windows\SYSTEM32\ntdll.dll #5 0x00007ffc71855b74 in ntdll!RtlGetCurrentServiceSessionId () from C:\Windows\SYSTEM32\ntdll.dll #6 0x00007ffc718547b1 in ntdll!RtlFreeHeap () from C:\Windows\SYSTEM32\ntdll.dll #7 0x00007ffc71089c9c in msvcrt!free () from C:\Windows\System32\msvcrt.dll #8 0x00007ff630f09b2e in loop () at ../code.cpp:193 #9 0x00007ff630f09b56 in main () at ../code.cpp:204
code.cpp:193 -> free(cipherWBytes);
Hol inicializáljuk?
char messageBytes[100]; octet message = {0, sizeof(messageBytes), messageBytes}; char *cipherWBytes = (char *)calloc(message.len, sizeof(char));
ajjaj :O
(gdb) b code.cpp:173 Breakpoint 1 at 0x140009a1d: file ../code.cpp, line 173. (gdb) r Starting program: C:\Users\XXX\Downloads\espdebug\bld2\esp.exe [New Thread 11616.0x19cc] [New Thread 11616.0x353c] [New Thread 11616.0x11ec] Startloop Setup done Thread 1 hit Breakpoint 1, loop () at ../code.cpp:173 173 char *cipherWBytes = (char *)calloc(message.len, sizeof(char)); (gdb) p message $1 = {len = 0, max = 100, val = 0xe3c67ff270 "\001ô\177C\001"}
calloc - ref
If size is zero, the behavior is implementation defined (null pointer may be returned, or some non-null pointer may be returned that may not be used to access storage)Mutasd a teljes hozzászólást!- NevemTeveválasza NevemTeve (14:55) részére
- 2021.04.28. 18:18
- permalink
Itt az ideje, hogy a valgrind-et megszórjuk a --track-origins=yes opcióval, ilyen lesz az első hibaüzenete:
Conditional jump or move depends on uninitialised value(s) at 0x40A1A6: BN254::FP_add(BN254::FP*, BN254::FP*, BN254::FP*) (fp_BN254.cpp:459) by 0x414754: BN254::FP2_neg(BN254::FP2*, BN254::FP2*) (fp2_BN254.cpp:164) by 0x407F30: BN254::ECP2_neg(BN254::ECP2*) (ecp2_BN254.cpp:317) by 0x407547: ECP2_select(BN254::ECP2*, BN254::ECP2*, int) (ecp2_BN254.cpp:86) by 0x409287: BN254::ECP2_mul4(BN254::ECP2*, BN254::ECP2*, int (*) [10]) (ecp2_BN254.cpp:633) by 0x40D8A6: BN254::PAIR_G2mul(BN254::ECP2*, int*) (pair_BN254.cpp:952) by 0x413B25: setup2(core::csprng*, BN254::ECP2*, core::octet*) (code.cpp:45) by 0x4141D7: loop() (code.cpp:161) by 0x414374: main (code.cpp:204) Uninitialised value was created by a stack allocation at 0x408D34: BN254::ECP2_mul4(BN254::ECP2*, BN254::ECP2*, int (*) [10]) (ecp2_BN254.cpp:562)
void BN254::ECP2_mul4(ECP2 *P, ECP2 Q[4], BIG u[4]) { int i, j, k, nb, pb, bt; ECP2 T[8], W; BIG t[4], mt; sign8 w[NLEN_B256_28 * BASEBITS_B256_28 + 1]; sign8 s[NLEN_B256_28 * BASEBITS_B256_28 + 1];
Mutasd a teljes hozzászólást!- NevemTeveválasza NevemTeve (18:18) részére
- 2021.04.28. 19:02
- permalink
Sacc/kb a 'W' okozza a gondot (abból gondolom, hogy ha 'memset'-elem a 'W'-t, akkor nem jön ez az üzenet). Egyébként lehet, hogy azzal kellene kezdeni, hogy innen frissíted a programodat: miracl/coreMutasd a teljes hozzászólást!- Arpsoftválasza **G** (17:21) részére
- 2021.04.28. 20:01
- permalink
If size is zero, the behavior is implementation defined
De a size az jelen esetben sizeof(char), ami nem nulla, szóval ez miért rossz?Mutasd a teljes hozzászólást!- Arpsoftválasza NevemTeve (19:02) részére
- 2021.04.28. 20:09
- permalink
Javítottam az utils.h-t illetve az utils.cpp-t, plusz néhány helyen dinamikos foglalással foglalt memória nem lett felszabadítva, ezeket is megcsináltam. Legalább ez a része rendben van.
==220== HEAP SUMMARY: ==220== in use at exit: 0 bytes in 0 blocks ==220== total heap usage: 100 allocs, 100 frees, 4,032 bytes allocated ==220== ==220== All heap blocks were freed -- no leaks are possible
Mutasd a teljes hozzászólást!- **G**válasza Arpsoft (20:01) részére
- 2021.04.28. 20:10
- permalink
message.len = 0
Az akkor kap értelmes értéket, ha azzal az utána lévő függvénnyel beleolvasod a szövegkonstansod.Mutasd a teljes hozzászólást!- NevemTeveválasza Arpsoft (20:01) részére
- 2021.04.28. 20:12
- permalink
A két szám közül a másik a nulla, a message.len. Talán ez lenne jobb (a sizeof(char) definíció szerint 1):
char *cipherWBytes = (char *)calloc(message.max, 1);
Mutasd a teljes hozzászólást!