How to correctly convert TAG value to the right format so that to Verify HMAC?

帅比萌擦擦* 提交于 2019-12-14 03:26:01

问题


I'm working on HMAC generation and verifying to check data integrity. I can correctly generate the MAC value but when sending it through socket to another program for verification, I faced with formatting mismatch. I appreciate your support. Thanks.

unsigned char* MAC(unsigned char* key,unsigned char* message)  
{
    unsigned char* result;
    unsigned int result_len = 32;  
    int i;

    result = (unsigned char*) malloc(sizeof(char) * result_len);
    result = HMAC(EVP_sha256 (), key , strlen (key), message , strlen(message) , NULL, NULL);

return result;
} 

int verifyMAC(unsigned char* key,unsigned char* message, unsigned char* receivedTag)
{
printf("\n\n ==================== MAC Verification ==================\n\n");
    unsigned char* newHash; // newly generated hash value
    unsigned int newHash_len = 32;  
    int  i,flag=0;

    newHash = (unsigned char*) malloc(sizeof(char) * newHash_len);
newHash = HMAC(EVP_sha256 (), key , strlen (key), message , strlen(message) , NULL, NULL);

for (i=0; i!=newHash_len; i++)
    {
            if (receivedTag[i]!=newHash[i])
            {
                    printf("DATA MISMATCH: Found %02X instead of %02X at index %d!\n", newHash[i], receivedTag[i], i);
                    break;
            }
    }
    if (i==newHash_len)
    {
            printf("MAC verified!\n");
    flag = 1;
    } 

return flag;
}

int main(int argc, char *argv[])
{

unsigned char* key = "1234567890";
unsigned char* message = (unsigned char*) "hello world";
  ....
}

Console result:
Hashed data: E4 5F 60 72 61 7C CE 5E 06 A9 5B E4 81 C4 33 51 02 3D 99 23 35 99 EA C9 FD AF FC 95 81 42 62 9A

==================== MAC Verification ==================

DATA MISMATCH: Found E4 instead of 65 at index 0! ERROR: data is modified


回答1:


I thought this problem was somewhat interesting so I went through the trouble to recreate the scenario. Maybe this is not even right. But a simple case of what I thought the problem is:

void main(int argc, char *argv[])
{
    //the original hash
    unsigned char newHash[] = {0xE4, 0x5F, 0x60, 0x72, 0x61, 0x7C, 0xCE, 0x5E, 0x06, 0xA9, 0x5B, 0xE4, 0x81, 0xC4, 0x33, 0x51, 
        0x02, 0x3D, 0x99, 0x23, 0x35, 0x99, 0xEA, 0xC9, 0xFD, 0xAF, 0xFC, 0x95, 0x81, 0x42, 0x62, 0x9A};
    //what I think is recieved from the socket
    unsigned char* receivedTag = "e45f6072617cce5e06a95be481c43351023d99233599eac9fdaffc958142629a";

    for (int i=0; i!=32; i++)
    {
            if (receivedTag[i]!=newHash[i])
            {
                    printf("DATA MISMATCH: Found %02X instead of %02X at index %d!\n", newHash[i], receivedTag[i], i);
                    break;
            }
    }
    return;
}

and the output was

DATA MISMATCH: Found E4 instead of 65 at index 0!

So, I thought the solution would be to just convert the Hex array to string just like it was received from the socket.

Maybe this is not the most elegant of ways to do things. But a solution None the less.

char* hexStringToCharString(unsigned char hash[], int length);
void main(int argc, char *argv[])
{
    //the original hash
    unsigned char newHash[] = {0xE4, 0x5F, 0x60, 0x72, 0x61, 0x7C, 0xCE, 0x5E, 0x06, 0xA9, 0x5B, 0xE4, 0x81, 0xC4, 0x33, 0x51, 
        0x02, 0x3D, 0x99, 0x23, 0x35, 0x99, 0xEA, 0xC9, 0xFD, 0xAF, 0xFC, 0x95, 0x81, 0x42, 0x62, 0x9A};
    //what I think is recieved from the socket
    unsigned char* receivedTag = "e45f6072617cce5e06a95be481c43351023d99233599eac9fdaffc958142629a";

    char *newString = hexStringToCharString(newHash, 32);

    for (int i=0; i!=strlen(newString); i++)
    {
            if (receivedTag[i]!=newString[i])
            {
                    printf("DATA MISMATCH: Found %02X instead of %02X at index %d!\n", newHash[i], receivedTag[i], i);
                    break;
            }
    }
    free(newString);

    printf("Yay\n");
    return;
}

char* hexStringToCharString(unsigned char hash[], int length){

    char temp[3];
    //need length*2 characters which is 64 plus one for null!
    char *theString = (char *)malloc(sizeof(char)*((length*2)+1));
    strcpy(theString, "");
    for(int i=0;i<length;i++){
        sprintf(temp, "%02x", hash[i]);
        strcat(theString, temp);
    }
    return theString;

}

The output in this case

Yay

So, Maybe this is entirely wrong. But if you find this solution needs editing then comment below.



来源:https://stackoverflow.com/questions/31760965/how-to-correctly-convert-tag-value-to-the-right-format-so-that-to-verify-hmac

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!