Forum: Mikrocontroller und Digitale Elektronik Hash wert vom Array Problem


von Frank (Gast)


Lesenswert?

Guten morgen,
ich möchte gerne von einem Bereich im Flash den HASH-Wert (SHA1) 
berechnen.
Dazu habe ich bei Github https://github.com/clibs/sha1 gefunden.
Am wichtigsten sind ja nur die Funktionen
1
  SHA1Init(&ctx);
2
  for (ii=0; ii<len; ii+=1)
3
      SHA1Update(&ctx, (const unsigned char*)string + ii, 1);
4
  SHA1Final((unsigned char *)result, &ctx);
5
  result[20] = '\0';

Jetzt habe ich im Flash aber keine String-werte stehen, sondern normale 
uint8.
Im Beispiel ist der string mit
1
char const string[] = "abc";
angegeben.
Ich weiß aber leider nicht, wie ich das jetzt umschreiben muss, um einen 
normalen array zu benutzen.

hatte
1
const uint8_t values[] = {0x01, 0x02, 0x03, 0x00}
 bekomme ich die Meldung
Error message from debugger back end:
Cannot access memory at address 0x1

Das ganze mache ich in C in Eclipse.

Hat jemand einen rat, was ich anders machen muss? Wenn das Funktioniert, 
wäre mein nächster Schritt den array values wegzu machen und direkt 
werte vom FLASH zu lesen.

von Frank (Gast)


Lesenswert?

Frank schrieb:
> SHA1Update(&ctx, (const unsigned char*)string + ii, 1);

Diesen habe ich geändert in
SHA1Update(&ctx, (const unsigned char*)values[ii], 1);

von fop (Gast)


Lesenswert?

Was meist funktioniert, ist die Adresse des Flashs (als Integerwert) auf 
einen Zeiger zu casten :
1
(const unsigned char*)42

von Dr. Sommer (Gast)


Lesenswert?

Frank schrieb:
> SHA1Update(&ctx, (const unsigned char*)values[ii], 1);

Das ist falsch.

Was für ein Controller ist das denn?

Frank schrieb:
> Error message from debugger back end:
> Cannot access memory at address 0x1

Das hat vermutlich nichts mit deinem Problem zu tun.

von c0s (Gast)


Lesenswert?

Frank schrieb:
> SHA1Update(&ctx, (const unsigned char*)values[ii], 1);

Versuchs mal mit
SHA1Update(&ctx, (const unsigned char*)&(values[ii]), 1);

Ansonsten behandelt du den Zahlenwert des Arrayeintrags als Adresse.

von Dr. Sommer (Gast)


Lesenswert?

c0s schrieb:
> Versuchs mal mit
> SHA1Update(&ctx, (const unsigned char*)&(values[ii]), 1);

Ist identisch zum Originalen

Frank schrieb:
> SHA1Update(&ctx, (const unsigned char*)string + ii, 1);

Wobei ich letzteres schöner finde. Warum eigentlich nicht einfach
1
SHA1Update(&ctx, string, len);

uint8_t ist doch wahrscheinlich eh identisch zu unsigned char.

von c0s (Gast)


Lesenswert?

Dr. Sommer schrieb:
> c0s schrieb:
>> Versuchs mal mit
>> SHA1Update(&ctx, (const unsigned char*)&(values[ii]), 1);
>
> Ist identisch zum Originalen

Natürlich ist es das. Die Frage war ja wie man das auf uint8_t 
umschreibt, damit es noch das gleiche tut. Sein erster Ansatz dazu war 
ja nur fast richtig, daher die korrigierte Version von mir.

von Dr. Sommer (Gast)


Lesenswert?

c0s schrieb:
> Sein erster Ansatz dazu war
> ja nur fast richtig

Was ist daran falsch? Ich denke er ist korrekt, aber umständlich.

von neuer PIC Freund (Gast)


Lesenswert?

SHA1Update arbeitet mit Blöcken. Also Zeiger auf Block + Länge eingeben. 
Keine Einzelwerte. Warum nicht einfach dem Beispiel auf github folgen?

von c0s (Gast)


Lesenswert?

Frank schrieb:
> const uint8_t values[] = {0x01, 0x02, 0x03, 0x00}

Frank schrieb:
> Diesen habe ich geändert in
> SHA1Update(&ctx, (const unsigned char*)values[ii], 1);

Frank schrieb:
> Error message from debugger back end:
> Cannot access memory at address 0x1

Falsch daran war, das er versucht hat den Eintrag an ii-ter Stelle aus 
dem values Array als Pointer an die Funktion übergeben hat.
(const unsigned char*)values[ii] entspricht (const unsigned 
char*)(values[ii]), weshalb erst der Eintrag an ii-ter Stelle 
dereferenziert wird und das Ergebnis gecastet. Nimmt man als Beispiel 
mal an das ii = 0 ist, steht bei der Ausführung sozusagen im Code
SHA1Update(&ctx, (const unsigned char*)0x01, 1);
Was dann zur geposteten Fehlermeldung führt.

PS.: Ich gehe davon aus das die SHA1Update Funktion versucht auf den 
übergebenen Speicher zuzugreifen und damit das zweite Argument zu 
dereferenzieren.

von Dr. Sommer (Gast)


Lesenswert?

c0s schrieb:
> Falsch daran war, das er versucht hat den Eintrag an ii-ter Stelle aus
> dem values Array als Pointer an die Funktion übergeben hat.

Ja, aber nicht im Original! Erst seine "Korrektur" hat es 
verschlimmbessert. Das Original ist korrekt.

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.