Changed: Merge changes from next patch
This commit is contained in:
parent
c1691be14b
commit
6f78067a8d
2 changed files with 74 additions and 0 deletions
|
@ -105,4 +105,7 @@ CHashKey getSHA1(const std::string &filename, bool forcePath = false);
|
||||||
// This function get a buffer with size and returns his SHA hash key
|
// This function get a buffer with size and returns his SHA hash key
|
||||||
CHashKey getSHA1(const uint8 *buffer, uint32 size);
|
CHashKey getSHA1(const uint8 *buffer, uint32 size);
|
||||||
|
|
||||||
|
// This function get a buffer and key with size and returns his HMAC-SHA1 hash key
|
||||||
|
CHashKey getHMacSHA1(const uint8 *text, uint32 text_len, const uint8 *key, uint32 key_len);
|
||||||
|
|
||||||
#endif // NL_SHA1_H
|
#endif // NL_SHA1_H
|
||||||
|
|
|
@ -187,6 +187,77 @@ CHashKey getSHA1(const string &filename, bool forcePath)
|
||||||
return hk;
|
return hk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* HMAC = hash( (Key ^ 0x5c) .. hash( (Key ^0x36) .. Message ) )
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
CHashKey getHMacSHA1(const uint8 *text, uint32 text_len, const uint8 *key, uint32 key_len)
|
||||||
|
{
|
||||||
|
SHA1Context sha;
|
||||||
|
|
||||||
|
uint8_t SHA1_Key[64];
|
||||||
|
uint8_t SHA1_Key1[20];
|
||||||
|
uint8_t SHA1_Key2[20];
|
||||||
|
|
||||||
|
string buffer1;
|
||||||
|
string buffer2;
|
||||||
|
|
||||||
|
// Init some vars
|
||||||
|
for (uint i = 0; i < 64; i++)
|
||||||
|
SHA1_Key[i] = 0;
|
||||||
|
|
||||||
|
// If lenght of key > 64 use sha1 hash
|
||||||
|
if (key_len > 64) {
|
||||||
|
uint8_t SHA1_Key0[20];
|
||||||
|
SHA1Reset(&sha);
|
||||||
|
SHA1Input(&sha, (const uint8_t*)key, key_len);
|
||||||
|
SHA1Result(&sha, SHA1_Key0);
|
||||||
|
CHashKey hk0 (SHA1_Key0);
|
||||||
|
for (uint i = 0; i < 20; i++)
|
||||||
|
SHA1_Key[i] = hk0.HashKeyString[i];
|
||||||
|
} else {
|
||||||
|
for (uint i = 0; i < key_len; i++)
|
||||||
|
SHA1_Key[i] = key[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do 0x36 XOR Key
|
||||||
|
for (uint i = 0; i < 64; i++)
|
||||||
|
buffer1 += 0x36 ^ SHA1_Key[i];
|
||||||
|
|
||||||
|
// Append text
|
||||||
|
for (uint i = 0; i < text_len; i++)
|
||||||
|
buffer1 += text[i];
|
||||||
|
|
||||||
|
// Get hash
|
||||||
|
SHA1Reset(&sha);
|
||||||
|
SHA1Input(&sha, (const uint8_t*)buffer1.c_str(), buffer1.size());
|
||||||
|
SHA1Result(&sha, SHA1_Key1);
|
||||||
|
CHashKey hk1 (SHA1_Key1);
|
||||||
|
|
||||||
|
// Do 0x5c XOR Key
|
||||||
|
for (uint i = 0; i < 64; i++)
|
||||||
|
buffer2 += 0x5c ^ SHA1_Key[i];
|
||||||
|
|
||||||
|
// Append previous hash
|
||||||
|
for (uint i = 0; i < 20; i++)
|
||||||
|
buffer2 += hk1.HashKeyString[i];
|
||||||
|
|
||||||
|
// Get new hash
|
||||||
|
SHA1Reset(&sha);
|
||||||
|
SHA1Input(&sha, (const uint8_t*)buffer2.c_str(), buffer2.size());
|
||||||
|
SHA1Result(&sha, SHA1_Key2);
|
||||||
|
CHashKey hk (SHA1_Key2);
|
||||||
|
|
||||||
|
return hk;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _MFC_VER
|
||||||
|
#pragma runtime_checks( "", off )
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Define the SHA1 circular left shift macro
|
* Define the SHA1 circular left shift macro
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue