Forum: Mikrocontroller und Digitale Elektronik ESP32 führt Programm (auf einmal) nicht zu Ende aus


von Marius S. (fhler)


Lesenswert?

Hallo,
ich habe mit Arduino auf dem ESP32 ein Programm "geschrieben", welches 
eine AES256 Verschlüsselung im CBC Modus durchführt. Es lief auch alles 
soweit nur jetzt auf einmal bleibt der Chip/das Board kurz vorm 
Programmende hängen. Genauer bei:
1
Serial.println("\n Deciphered text: ");
2
  
3
  for (int k = 0; k < output_len; k++) 
4
  {
5
    Serial.print((char)output2[k]);
6
  }

Auf dem SerialMonitor sehe ich nur den Anfang von "Deciphered text: ". 
Wenn ich diesen Abschnitt komplett auskommentiere läuft der Code ohne 
Probleme durch. Auskommentieren von
1
 Serial.println("\n Deciphered text: ");
 reicht nicht.

Hat wer von euch eine Idee woran es liegt/liegen könnte? Die Hardware 
habe ich schon getauscht und löst das Problem nicht. Der Fehler trat 
zudem von jetzt auf gleich auf.

Hier der komplette Code: (Die Codelänge halte ich noch für vertretbar 
damit es kein Anhang sein sollte. Das die Variablennamen nicht optimal 
sind weiß ich.)
1
#include "mbedtls/aes.h"
2
3
void encrypt(char * input, char * key, unsigned char * outputBuffer, int block)
4
{
5
  mbedtls_aes_context aes;
6
7
  unsigned char iv[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} ;
8
  mbedtls_aes_init( &aes );
9
  mbedtls_aes_setkey_enc( &aes, (const unsigned char*) key, strlen(key) * 8 );
10
  mbedtls_aes_crypt_cbc( &aes, MBEDTLS_AES_ENCRYPT, block, iv, (const unsigned char*)input, outputBuffer );
11
  mbedtls_aes_free( &aes );
12
  
13
}
14
15
void decrypt(unsigned char * cipherText, char * key, unsigned char * outputBuffer, int block)
16
{
17
  mbedtls_aes_context aes;
18
19
  unsigned char iv[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} ;
20
  mbedtls_aes_init( &aes );
21
  mbedtls_aes_setkey_dec( &aes, (const unsigned char*) key, strlen(key) * 8 );
22
  mbedtls_aes_crypt_cbc( &aes, MBEDTLS_AES_DECRYPT, block, iv, (const unsigned char*)cipherText, outputBuffer );
23
  mbedtls_aes_free( &aes );
24
  
25
}
26
27
void setup() {
28
  Serial.begin(115200);
29
  
30
  char *key  = "abcdefghijklmnopABCDEFGHIJKLMNOP" ;
31
    
32
  char *input  = "1231234TuuRiii x";
33
34
  unsigned char output[128];
35
  unsigned char output2[128];
36
37
  int input_len = strlen(input);
38
  int output_len = input_len;
39
40
  int teiler, rest, blocklaenge;
41
42
  teiler = input_len / 16;
43
  rest = input_len % 16;
44
45
  if (rest != 0)
46
  {
47
    blocklaenge = (teiler+1)*16;
48
    }
49
50
  if (rest == 0)   
51
  {
52
    blocklaenge = (teiler)*16;
53
  }
54
 
55
  Serial.print("input: ");
56
  Serial.println(input);
57
  Serial.print("Länge des Inputs: ");
58
  Serial.println(input_len);
59
  Serial.print("gesamte blocklänge: ");
60
  Serial.println(blocklaenge);
61
62
  encrypt( input, key, output, blocklaenge);
63
  
64
  Serial.println("\n Ciphered text:");
65
  for (int i = 0; i < blocklaenge; i++) 
66
  {
67
    char str[3];
68
 
69
    sprintf(str, "%02x", (int)output[i]);
70
    Serial.print(str);
71
  }
72
73
  decrypt( output, key, output2, blocklaenge);
74
 
75
 Serial.println("\n Deciphered text: ");
76
  
77
  for (int k = 0; k < output_len; k++) 
78
  {
79
    Serial.print((char)output2[k]);
80
  } 
81
82
  Serial.println("END");
83
}
84
85
void loop() {
86
  // put your main code here, to run repeatedly:
87
88
}

von Ich (Gast)


Lesenswert?

input ist nicht als String abgeschlossen -> strlen gibt dir irgendwas 
verrücktes aus -> output_len > 128 -> Fehler

von John P. (brushlesspower)


Lesenswert?

output_len ist wohl gleich 0

damit ist k nnicht kleiner und damit gehts nicht in die for Schleife.


Du definierts output_len in setup{} rufst es aber in loop{} auf.

von Marius S. (fhler)


Lesenswert?

John P. schrieb:
> output_len ist wohl gleich 0
>
> damit ist k nnicht kleiner und damit gehts nicht in die for Schleife.
>
>
> Du definierts output_len in setup{} rufst es aber in loop{} auf.

Wo rufe ich was in loop{} auf?

von Marius S. (fhler)


Lesenswert?

Ich schrieb:
> input ist nicht als String abgeschlossen -> strlen gibt dir irgendwas
> verrücktes aus -> output_len > 128 -> Fehler

Vielen Dank für deinen Hinweis / Hilfe.

Wenn ich mir den Wert von input_len, den ich mit strlen ermittelt habe, 
zeigt er mir immer den korrekten Wert an.

Zwischenzeitlich hatte ich herausgefunden das wenn ich 4 Zeichen vom 
Input wegnehme er 4 Zeichen länger läuft.

von Ich (Gast)


Lesenswert?

probiere mal im zweiten Block auch

char str[3];

sprintf(str, "%02x", (int)output2[k]);
Serial.print(str);

von Ich (Gast)


Lesenswert?

oder direkt
Serial.println(output2);

von Marius S. (fhler)


Lesenswert?

Das ist alles schon so richtig d.h. das Casting muss schon sein. (Damit 
ich auf dem SerialMonitor was vernünftiges zum Testen angezeigt 
bekomme.) Zudem brauche ich auch definitiv die Länge / Größe der 
Input-Daten. Hat was mit dem AES-Betriebsmodus zu tun: Dieser braucht 
für die Verschlüsselung eine feste Blocklänge von 16 Byte bzw ein 
ganzzahliges Vielfache davon. D.h. wenn ich 17 Byte an Daten habe muss 
man 32 Byte verschlüsseln. Aber die eigentlichen Daten sind dann halt 
nur die ersten 17Byte.

von Ich (Gast)


Lesenswert?

Ich nehme an, dass output2 kürzer ist als output_len und du damit einen 
Zugriff auf "Null" machst. Klassiker, wenn ein Controller einfach 
aufhört zu arbeiten. Mach in die Ausgabe eine überprüfung rein

if(output2[k] == 0) break;

 damit die For-Schleife beendet wird wenn der Wert "falsch" ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.