util/hmac.lua

changeset 2314
c2e1bde4d84d
parent 2288
ef7027a0f0c9
child 2925
692b3c6c5bd2
equal deleted inserted replaced
2312:5ddbb9c89ffe 2314:c2e1bde4d84d
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 local hashes = require "util.hashes" 9 local hashes = require "util.hashes"
10 local xor = require "bit".bxor
11 10
12 local t_insert, t_concat = table.insert, table.concat;
13 local s_char = string.char; 11 local s_char = string.char;
12 local s_gsub = string.gsub;
13 local s_rep = string.rep;
14 14
15 module "hmac" 15 module "hmac"
16 16
17 local function arraystr(array) 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 t = {} 18 local function xor(x, y)
19 for i = 1,#array do 19 local lowx, lowy = x % 16, y % 16;
20 t_insert(t, s_char(array[i])) 20 local hix, hiy = (x - lowx) / 16, (y - lowy) / 16;
21 end 21 local lowr, hir = xor_map[lowx * 16 + lowy + 1], xor_map[hix * 16 + hiy + 1];
22 22 local r = hir * 16 + lowr;
23 return t_concat(t) 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));
24 end 31 end
25 32
26 --[[ 33 --[[
27 key 34 key
28 the key to use in the hash 35 the key to use in the hash
34 the blocksize for the hash function in bytes 41 the blocksize for the hash function in bytes
35 hex 42 hex
36 return raw hash or hexadecimal string 43 return raw hash or hexadecimal string
37 --]] 44 --]]
38 function hmac(key, message, hash, blocksize, hex) 45 function hmac(key, message, hash, blocksize, hex)
39 local opad = {}
40 local ipad = {}
41
42 for i = 1,blocksize do
43 opad[i] = 0x5c
44 ipad[i] = 0x36
45 end
46
47 if #key > blocksize then 46 if #key > blocksize then
48 key = hash(key) 47 key = hash(key)
49 end 48 end
50 49
51 for i = 1,#key do 50 local padding = blocksize - #key;
52 ipad[i] = xor(ipad[i],key:sub(i,i):byte()) 51 local ipad = s_gsub(key, ".", ipad_map)..s_rep(ipadc, padding);
53 opad[i] = xor(opad[i],key:sub(i,i):byte()) 52 local opad = s_gsub(key, ".", opad_map)..s_rep(opadc, padding);
54 end
55 53
56 opad = arraystr(opad) 54 return hash(opad..hash(ipad..message), hex)
57 ipad = arraystr(ipad)
58
59 if hex then
60 return hash(opad..hash(ipad..message), true)
61 else
62 return hash(opad..hash(ipad..message))
63 end
64 end 55 end
65 56
66 function md5(key, message, hex) 57 function md5(key, message, hex)
67 return hmac(key, message, hashes.md5, 64, hex) 58 return hmac(key, message, hashes.md5, 64, hex)
68 end 59 end

mercurial