2017-02-28 52 views
0

我想在英特尔新加坡交易所飞地内用SHA512计算HMAC。 我得到的代码工作,但收到错误的结果。我有一个使用静态预定义密钥和从中计算HMAC的nonce的例子,但是在验证接收结果时,它与正确的结果不匹配。新加坡交易所计算HMAC内飞地

Apparantely有两种不同的变体来计算HMAC(根据该enter link description here,我都试过

下面是从飞地功能:

int calculateHMAC(uint8_t *key, uint8_t *nonce, uint8_t *res_hmac) { 
    IppsHMACState *ctx; 
    IppStatus status; 
    int psize = 0; 

    //VARIANT 1 
    status = ippsHMAC_GetSize(&psize); 

    if (status == ippStsNullPtrErr) 
     return 1; 

    ctx = (IppsHMACState*) malloc(psize); 
    status = ippsHMAC_Init(key, 16, ctx, ippHashAlg_SHA512); 

    if (status != ippStsNoErr) 
     return 1; 

    status = ippsHMAC_Update(nonce, 16, ctx); 

    if (status != ippStsNoErr) 
     return 1; 

    uint8_t hmac[64]; 
    memset(hmac, '\0', 64); 
    status = ippsHMAC_Final(hmac, 64, ctx); 

    if (status != ippStsNoErr) 
     return 1; 

    memcpy(res_hmac, hmac, 64); 

    //VARIANT 2 
// uint8_t test_hmac[HMAC_LENGTH]; 
// status = ippsHMAC_Message(nonce, 16, key, 16, test_hmac, 64, ippHashAlg_SHA512); 

// if (status != ippStsNoErr) 
//  return 1; 

// memcpy(res_hmac, test_hmac, 64); 

    return 0; 

} 

这里是更新的呼叫:

uint8_t ba_nonce[16] = { 
    0x7d, 0x93, 0x09, 0x9f, 0x7f, 0xed, 0x16, 0x21, 
    0x58, 0x36, 0xf7, 0xba, 0xd4, 0xdb, 0x0e, 0x48 
}; 

uint8_t ba_key[16] = { 
    0xa5, 0xb1, 0x15, 0x53, 0x6d, 0x5b, 0xf3, 0x50, 
    0xc5, 0xb0, 0xfa, 0x6f, 0x69, 0x24, 0x2f, 0x18 
}; 

uint8_t t_hmac[64]; 
memset(t_hmac, '\0', 64); 

int error = calculateHMAC(ba_key, ba_nonce, t_hmac); 

我不知道我做错了什么!?

这将导致 7d2f2e3d57c84a58945b9016fb37e2df03afdde313c9d79c31ec1e6612d6d6b20456a8fcf799ef74d16f60c7f283e621400004422885f33fb3d2bb7ae7a1daa3

按照这个计算器here

回答

1

你的问题是strtol()这是不对的。它期望一个字符串。在C中,字符串是以NULL字节结尾的任意字符序列。但是,它提供了一个指向大小为2的数组的指针,其中最后一个条目不是NULL。因此,strtol()还会分析tmp阵列后面的字节。

因为,tmp存储在堆栈中,所以我们不能假定随后的字节对于不同的调用总是相同的。因此,你会得到随机结果。

解决方案:要么,你增加的tmp的大小,并在最后一个地方或添加NULL字节 - 这可能是更好的解决方案 - 直接初始化noncekey与你所需要的(见this交):

uint8_t ba_nonce[16] = { 
    0x7d, 0x93, 0x09, 0x9f, 0x7f, 0xed, 0x16, 0x21, 
    0x58, 0x36, 0xf7, 0xba, 0xd4, 0xdb, 0x0e, 0x48 
}; 

uint8_t ba_key[16] = { 
    0xa5, 0xb1, 0x15, 0x53, 0x6d, 0x5b, 0xf3, 0x50, 
    0xc5, 0xb0, 0xfa, 0x6f, 0x69, 0x24, 0x2f, 0x18 
}; 
+0

我已经用你的建议尝试过了,现在每次迭代都会得到相同的结果,但结果仍然是错误的!? – wasp256

+0

更新后的代码给出的结果是正确的。在线检查器将输入解释为字符串。因此,你会得到不同的散列。我重现了两个输出,正确的更新后的代码给出以及在线检查器生成的一个,用Python:https://gist.github.com/fzgregor/db6b25ff9cb712a3c93face3b10672cd – fzgregor

+0

我现在重新验证它,这是错误,谢谢您的帮助! – wasp256