util/hmac.lua
changeset 5537 15464633d8fb
parent 3540 bc139431830b
child 5776 bd0ff8ae98a8
equal deleted inserted replaced
5531:483f795f6f99 5537:15464633d8fb
     4 -- 
     4 -- 
     5 -- This project is MIT/X11 licensed. Please see the
     5 -- This project is MIT/X11 licensed. Please see the
     6 -- COPYING file in the source package for more information.
     6 -- COPYING file in the source package for more information.
     7 --
     7 --
     8 
     8 
       
     9 -- COMPAT: Only for external pre-0.9 modules
       
    10 
     9 local hashes = require "util.hashes"
    11 local hashes = require "util.hashes"
    10 
    12 
    11 local s_char = string.char;
    13 return { md5 = hashes.hmac_md5,
    12 local s_gsub = string.gsub;
    14 	 sha1 = hashes.hmac_sha1,
    13 local s_rep = string.rep;
    15 	 sha256 = hashes.hmac_sha256 };
    14 
       
    15 module "hmac"
       
    16 
       
    17 local xor_map = {0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;1;0;3;2;5;4;7;6;9;8;11;10;13;12;15;14;2;3;0;1;6;7;4;5;10;11;8;9;14;15;12;13;3;2;1;0;7;6;5;4;11;10;9;8;15;14;13;12;4;5;6;7;0;1;2;3;12;13;14;15;8;9;10;11;5;4;7;6;1;0;3;2;13;12;15;14;9;8;11;10;6;7;4;5;2;3;0;1;14;15;12;13;10;11;8;9;7;6;5;4;3;2;1;0;15;14;13;12;11;10;9;8;8;9;10;11;12;13;14;15;0;1;2;3;4;5;6;7;9;8;11;10;13;12;15;14;1;0;3;2;5;4;7;6;10;11;8;9;14;15;12;13;2;3;0;1;6;7;4;5;11;10;9;8;15;14;13;12;3;2;1;0;7;6;5;4;12;13;14;15;8;9;10;11;4;5;6;7;0;1;2;3;13;12;15;14;9;8;11;10;5;4;7;6;1;0;3;2;14;15;12;13;10;11;8;9;6;7;4;5;2;3;0;1;15;14;13;12;11;10;9;8;7;6;5;4;3;2;1;0;};
       
    18 local function xor(x, y)
       
    19 	local lowx, lowy = x % 16, y % 16;
       
    20 	local hix, hiy = (x - lowx) / 16, (y - lowy) / 16;
       
    21 	local lowr, hir = xor_map[lowx * 16 + lowy + 1], xor_map[hix * 16 + hiy + 1];
       
    22 	local r = hir * 16 + lowr;
       
    23 	return r;
       
    24 end
       
    25 local opadc, ipadc = s_char(0x5c), s_char(0x36);
       
    26 local ipad_map = {};
       
    27 local opad_map = {};
       
    28 for i=0,255 do
       
    29 	ipad_map[s_char(i)] = s_char(xor(0x36, i));
       
    30 	opad_map[s_char(i)] = s_char(xor(0x5c, i));
       
    31 end
       
    32 
       
    33 --[[
       
    34 key
       
    35 	the key to use in the hash
       
    36 message
       
    37 	the message to hash
       
    38 hash
       
    39 	the hash function
       
    40 blocksize
       
    41 	the blocksize for the hash function in bytes
       
    42 hex
       
    43 	return raw hash or hexadecimal string
       
    44 --]]
       
    45 function hmac(key, message, hash, blocksize, hex)
       
    46 	if #key > blocksize then
       
    47 		key = hash(key)
       
    48 	end
       
    49 
       
    50 	local padding = blocksize - #key;
       
    51 	local ipad = s_gsub(key, ".", ipad_map)..s_rep(ipadc, padding);
       
    52 	local opad = s_gsub(key, ".", opad_map)..s_rep(opadc, padding);
       
    53 
       
    54 	return hash(opad..hash(ipad..message), hex)
       
    55 end
       
    56 
       
    57 function md5(key, message, hex)
       
    58 	return hmac(key, message, hashes.md5, 64, hex)
       
    59 end
       
    60 
       
    61 function sha1(key, message, hex)
       
    62 	return hmac(key, message, hashes.sha1, 64, hex)
       
    63 end
       
    64 
       
    65 function sha256(key, message, hex)
       
    66 	return hmac(key, message, hashes.sha256, 64, hex)
       
    67 end
       
    68 
       
    69 return _M