Created
May 26, 2012 23:14
-
-
Save diorahman/2795582 to your computer and use it in GitHub Desktop.
HMAC-SHA1 Qt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// from http://qt-project.org/wiki/HMAC-SHA1 | |
QString hmacSha1(QByteArray key, QByteArray baseString) | |
{ | |
int blockSize = 64; // HMAC-SHA-1 block size, defined in SHA-1 standard | |
if (key.length() > blockSize) { // if key is longer than block size (64), reduce key length with SHA-1 compression | |
key = QCryptographicHash::hash(key, QCryptographicHash::Sha1); | |
} | |
QByteArray innerPadding(blockSize, char(0x36)); // initialize inner padding with char "6" | |
QByteArray outerPadding(blockSize, char(0x5c)); // initialize outer padding with char "\" | |
// ascii characters 0x36 ("6") and 0x5c ("\") are selected because they have large | |
// Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance) | |
for (int i = 0; i < key.length(); i++) { | |
innerPadding[i] = innerPadding[i] ^ key.at(i); // XOR operation between every byte in key and innerpadding, of key length | |
outerPadding[i] = outerPadding[i] ^ key.at(i); // XOR operation between every byte in key and outerpadding, of key length | |
} | |
// result = hash ( outerPadding CONCAT hash ( innerPadding CONCAT baseString ) ).toBase64 | |
QByteArray total = outerPadding; | |
QByteArray part = innerPadding; | |
part.append(baseString); | |
total.append(QCryptographicHash::hash(part, QCryptographicHash::Sha1)); | |
QByteArray hashed = QCryptographicHash::hash(total, QCryptographicHash::Sha1); | |
return hashed.toBase64(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
dridk, it returning a base64 hash, you need to change the last line to hashed.toHex();