mirror of https://github.com/adamdruppe/arsd.git
40 lines
1.0 KiB
D
40 lines
1.0 KiB
D
/// Implementation of the HMAC algorithm. Do not use on new things because [std.digest.hmac] now exists in Phobos.
|
|
module arsd.hmac;
|
|
|
|
// FIXME: the blocksize is correct for MD5, SHA1, and SHA256 but not generally
|
|
// it should really be gotten from the hash
|
|
///
|
|
auto hmac(alias hash, size_t blocksize = 64)(in void[] keyv, in void[] messagev) {
|
|
|
|
const(ubyte)[] key = cast(const(ubyte)[]) keyv;
|
|
const(ubyte)[] message = cast(const(ubyte)[]) messagev;
|
|
|
|
if(key.length > blocksize)
|
|
key = hash(key);
|
|
while(key.length < blocksize)
|
|
key ~= 0;
|
|
|
|
ubyte[blocksize] o_key_pad;
|
|
ubyte[blocksize] i_key_pad;
|
|
|
|
foreach(i; 0 .. blocksize) {
|
|
o_key_pad[i] = 0x5c ^ key[i];
|
|
i_key_pad[i] = 0x36 ^ key[i];
|
|
}
|
|
|
|
return hash(o_key_pad ~ hash(i_key_pad ~ message));
|
|
}
|
|
|
|
/*
|
|
unittest {
|
|
import arsd.sha;
|
|
import std.digest.md;
|
|
import std.stdio;
|
|
writeln(hashToString(hmac!md5Of("", ""))); // 0x74e6f7298a9c2d168935f58c001bad88
|
|
|
|
|
|
writeln(hashToString(hmac!md5Of("key", "The quick brown fox jumps over the lazy dog"))); // 0x80070713463e7749b90c2dc24911e275
|
|
}
|
|
void main(){}
|
|
*/
|