Question

So, I did some searching for why my compiler gives an error saying:

49 ~\C++\SHA-1\main.cpp invalid conversion from `unsigned char*' to `char*' 

And I found out that you cannot convert between unsigned char to char because they are completely different types. So this lead me to the problem of needing a getline function for and unsigned char string in my code.

#include <iostream>
#include <stdint.h>

using namespace std;

uint32_t rotl( uint32_t value, int shift)
{
         if ((shift &= sizeof(value)*8 - 1) == 0) return value;
         return (value << shift) | (value >> (sizeof(value)*8 - shift));
}

uint32_t rotr( uint32_t value, int shift)
{
         if ((shift &= sizeof(value)*8 - 1) == 0) return value;
         return (value >> shift) | (value << (sizeof(value)*8 - shift));
}

int textInput();
int hexInput();
int binInput();

unsigned char message[64];

int SHA_1();

int main()
{
    int selection;
    cout<<"Select Input type:\n\n\t1. Text String\n\t2. Hex String\n\t3. Binary String\n";
    cin>>selection;
    cin.ignore();
    switch(selection)
    {
                     case 1: textInput(); break;
                     case 2: hexInput(); break;
                     case 3: binInput(); break;
    }
    SHA_1();
    cout<<"\ndone";
    cin.get();

    return 0;
}

int textInput()
{
    unsigned char input[63] = {0};
    cout<<"Enter a text string to be hashed\n\n";
    cin.getline(input, 62, '\n');
    cin.ignore();
    for(int x = 0; x <= 63; x++)
            {
                 //cout<<x<<"\n";
                 if (input[x] == 0x00)
                 {
                              message[x] = 0x00000080;
                              message[63] = x; //This might be wrong.
                              //cout<<std::hex<<message;
                              break;
                 }
                 else message[x] = input[x];

            }

    return 0;
}

int hexInput()
{
    return 0;
}

int binInput()
{
    return 0;
}

int SHA_1()
{
    uint32_t h0 = 0x67452301;
    uint32_t h1 = 0xEFCDAB89;
    uint32_t h2 = 0x98BADCFE;
    uint32_t h3 = 0x10325476;
    uint32_t h4 = 0xC3D2E1F0;

    uint32_t a;
    uint32_t b;
    uint32_t c;
    uint32_t d;
    uint32_t e;

    uint32_t f;
    uint32_t k;

    uint32_t temp;

    uint32_t w[80];

    /*for( int m = 0; m <= 63; m++)
    {
         cout<<"message["<<m<<"]="<<std::hex<<int(message[m])<<std::dec<<"\n";
    }*/

    for( int i = 0; i <= 15; i++)
    {
         w[i] = ((message[(i*4)] << 24) | (message[(i*4) + 1] << 16) | (message[(i*4) + 2] << 8) | (message[(i*4) + 3]));
         //cout<<"W["<<i<<"]="<<std::hex<<w[i]<<std::dec<<"\n";
    }

    for( int i = 16; i <= 79; i++)
    {
         w[i] = rotl((w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]), 1);
    }

    a = h0;
    b = h1;
    c = h2;
    d = h3;
    e = h4;

    for(int iteration = 0; iteration <= 79; iteration++)
    {
            if((0 <= iteration) && (iteration <= 19))
            {
                  f = ((b & c) | ((~b) & d));
                  k = 0x5A827999;
            }
            else if((20 <= iteration) && (iteration <= 39))
            {
                  f = (b ^ c ^ d);
                  k = 0x6ED9EBA1;
            }
            else if((40 <= iteration) && (iteration <= 59))
            {
                  f = ((b & c) | (b & d) | (c & d));
                  k = 0x8F1BBCDC;
            }
            else if((60 <= iteration) && (iteration <= 79))
            {
                  f = (b ^ c ^ d);
                  k = 0xCA62C1D6;
            }

            temp = (rotl( a, 5) + f + e + k + w[iteration]);
            e = d;
            d = c;
            c = rotl( b, 30);
            b = a;
            a = temp;
    }

    h0 = h0 + a;
    h1 = h1 + b;
    h2 = h2 + c;
    h3 = h3 + d;
    h4 = h4 + e;

    cout<<hex<<h0<<" "<<h1<<" "<<h2<<" "<<h3<<" "<<h4;


    return 0;
}

If anyone could give me some suggestions that would be helpful.

Thanks

Was it helpful?

Solution

This is related to strict-aliasing constraints: you're not permitted to reference an unsigned char array via a char pointer.

#include <iostream>
using namespace std;

void aliasing_fun(char* arr) {
    arr[0] = 42;
}

int main() {
    unsigned char arr[10] = {0};
    aliasing_fun(arr); // Not allowed

    return 0;
}

http://ideone.com/r4OVZi

You might cast your array to char* in order to do that.

OTHER TIPS

Cast your array to (char *) when calling getline:

getline((char *)input, ...);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top