8
* License: Public Domain
12
import nazo.mem, std.md5, std.base64, std.string, std.stdio;
14
static ulong[8] k_ipad=toMultiArr_ubyte!(typeof(k_ipad[0]),0x36);
15
static typeof(k_ipad[0])[8] k_opad=toMultiArr_ubyte!(typeof(k_ipad[0]),0x5c);
16
static int before_tmplen=0;
18
///hmacMd5(キーを使ったハッシュ)の取得
19
///マルチスレッドで呼ばないでください><
20
string hmacMd5(string data,string key){
24
key = key ~ \0\0\0\0\0\0\0\0[0..8-key.length%8];
26
assert(key.length%8 == 0);
28
if(key.length>64){//未テスト
29
std.md5.sum(re,cast(void[])key);
33
typeof(k_ipad[0])[] tmp=cast(typeof(k_ipad[0])[])key;
35
for(;i<tmp.length;i++){
36
k_ipad[i]=tmp[i]^toMultiArr_ubyte!(typeof(k_ipad[0]),0x36);
37
k_opad[i]=tmp[i]^toMultiArr_ubyte!(typeof(k_opad[0]),0x5c);
39
for(;i<before_tmplen;i++){
40
k_ipad[i]=toMultiArr_ubyte!(typeof(k_ipad[0]),0x36);
41
k_opad[i]=toMultiArr_ubyte!(typeof(k_opad[0]),0x5c);
46
context.update(k_ipad);
50
context.update(k_opad);
53
before_tmplen=tmp.length;
54
return std.base64.encode(cast(string)re);