How to resolve this: invalid conversion from 'const char*' to 'const uint8_t*

user2192774 picture user2192774 · Jan 16, 2016 · Viewed 25.7k times · Source

I installed this SHA library: https://github.com/Cathedrow/Cryptosuite. I want to implement HMAC256 using Arduino IDE 1.6.7 installed on Win. 10 and the controller is ATMEGA328.

I copied the example given in their webpage. I am still new and want to test and try. I wrote this code in Arduino IDE.

#include "sha256.h"

void setup() {
    // put your setup code here, to run once:
    uint8_t *hash;
    //static const char hash[450]={};
    //const char *hash; hash={};
    Sha256.initHmac("hash key",8); // key, and length of key in bytes
    Sha256.print("This is a message to hash");
    hash = Sha256.resultHmac();
    //Serial.print(hash,HEX);
}

void loop() {
    // put your main code here, to run repeatedly:
}

I got this error:

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

I do not know why this happens. The example is primitive taken as is from the library site. Can you help?

EDIT: I tried to change the line from:

Sha256.initHmac((const uint8_t*)"hash key",8);

to:

Sha256.initHmac((const uint8_t*)"hash key",8);

But again, the compilation fails. It says:

Arduino: 1.6.7 (Windows 10), Board: "Arduino/Genuino Uno"

In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/arduino.h:28:0,

             from C:\Users\e\Documents\Arduino\libraries\Sha\sha1_config.h:13,

             from C:\Users\e\Documents\Arduino\libraries\Sha\sha1.h:4,

             from C:\Users\e\Documents\Arduino\libraries\Sha\sha1.cpp:1:

C:\Users\e\Documents\Arduino\libraries\Sha\sha1.cpp:8:25: error: variable 'sha1InitState' must be const in order to be put into read-only section by means of 'attribute((progmem))'

uint8_t sha1InitState[] PROGMEM = {

                     ^

exit status 1 Error compiling.

This report would have more information with "Show verbose output during compilation" enabled in File > Preferences.

Answer

jyvet picture jyvet · Jan 16, 2016

The initHmac function signature is:

void initHmac(const uint8_t* secret, int secretLength);

But you use const char* for secret.

Solution

Try to cast the secret variable to const uint8_t* (or const unsigned char*):

Sha256.initHmac((const uint8_t*)"hash key",8);

UPDATE

To solve your new compilation error, just add const in front of all declarations containing PROGMEM in the library sources. For insance:

In Sha/sha1.cpp (line 11)

const uint8_t sha1InitState[] PROGMEM = {

In Sha/sha256.cpp (line 6)

const uint32_t sha256K[] PROGMEM = {

In Sha/sha256.cpp (line 11):

const uint8_t sha256InitState[] PROGMEM = {