types & SHA256 Hash

Hallo Zusammen,

sorry vorab für meine Unwissenheit zum Thema Datentypen.

Ich möchte einen SHA256 Hash erzeugen aus der MAC des MKR1000 und einem Addword.

Klingt an sich nicht aufregend. Aber ...

Was hab ich:

#include <sha256.h>


    WiFi.macAddress(mac);  // byte array : 6 bytes representing the MAC address
            
    BYTE addword[] = "XXXXXXXXXX";
    BYTE hashtext[] = mac + addword;  ---->  hier stehe ich auf dem Schlauch !! (** FM weiter unten...
    my_hash = get_sha256(hashtext);
    my_hash.toLowerCase();

Aktuell erhalte ich die FM:

invalid operands of types 'byte [ 0 ] {aka unsigned char [ 0 ]}' and 'BYTE [11] {aka unsigned char [11]}' to binary 'operator+'

String get_sha256(BYTE text[]) {

      BYTE hash[SHA256_BLOCK_SIZE];
      char texthash[2 * SHA256_BLOCK_SIZE + 1];


      Sha256* sha256Instance = new Sha256();

      sha256Instance->update(text, strlen((const char*)text));
      sha256Instance->final(hash);

      for (int i = 0; i < SHA256_BLOCK_SIZE; ++i)
        sprintf(texthash + 2 * i, "%02X", hash[i]);

      delete sha256Instance;
      return String(texthash);
    }

Hat jemand einen Tipp für mich um mir auf die Sprünge zu helfen?

Lieben vielen Dank vorab!

Grüße Marco

Schau Dir mal C/C++-Zeichenketten aka char-Arrays an.

Gruß Tommy

Vielen Dank!

Ich habe die Seite von Tommy genau angeschaut jedoch komme ich dennoch nicht auf eine Lösung.
Irgendwie sehe ich hier nichts was mit meinem Beispiel zusammenpasst.

Sorry

Grüße Marco

Was für ein Typ soll BYTE sein? Ich kenne nur byte.

Entweder mac in ein char-Array mit 0-Terminierung umwandeln und dann strcpy und strcat nutzen oder alles byteweise über Schleifen zusammensetzen.

  • ist für Byte/Char-Arrays nicht definiert.

Gruß Tommy

Hi,

wenn ich es in etwas anderes umwandle kommt bei sha256Instance->update... eine Fehlermeldung:

invalid conversion from 'char*' to 'const BYTE* {aka const unsigned char*}' [-fpermissive]

Grüße Marco

Gib uns doch mal einen Link zu Deiner Lib.

Gruß Tommy

Hi,

gerne doch:

Grüße

Warum der das BYTE redefiniert hat, muss man nicht verstehen.

Versuche doch mal einen expliziten Typecast

...update((const BYTE *)text,...);

Gruß Tommy

Ha !!

Super das hat geklappt.

Hier jetzt die Lösung die funktioniert.

#include <sha256.h>

BYTE hash[SHA256_BLOCK_SIZE];
char texthash[2 * SHA256_BLOCK_SIZE + 1];


void setup() {


  Serial.begin(115200);
  delay(2000);
  // fiktiver wert
  String text1 = "MA-CC-AA-DR-EE-SS";

  text1.c_str();
  // fiktiver wert
  text1.concat("ADDWORD");
  int str_len = text1.length() + 1;
  char text2[str_len];
  text1.toCharArray(text2, str_len);
  Serial.println(text2);

  sha(text2);

}

char* sha(char* text) {


  Sha256* sha256Instance = new Sha256();

  sha256Instance->update((const BYTE *)text, strlen((const char*)text));
  sha256Instance->final(hash);

  for (int i = 0; i < SHA256_BLOCK_SIZE; ++i)
    sprintf(texthash + 2 * i, "%02X", hash[i]);
  Serial.println(texthash);

  delete sha256Instance;
};

void loop() {

}

Ich erhalte hiermit einen korrekten Hash aus einem String und einem Addword.

Vielen vielen Dank nochmal !!!

Grüße Marco

Etwas von hinten durch die Brust ins Auge, aber wenn es funktioniert, hast Du Dein Ziel ja erreicht.

Die Sha256-Lib ist in meinen Augen nicht sauber programmiert. Wenn der Autor in seinen Beispielen schon explizite Typecasts machen muss, ist in meinen Augen was faul.

Gruß Tommy