2017-02-28 47 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