Comparison

util/hmac.lua @ 5537:15464633d8fb

util.hmac, util.hashes: Implement HMAC functions in C, and move to util.hashes
author Florian Zeitz <florob@babelmonkeys.de>
date Sat, 27 Apr 2013 17:01:31 +0200
parent 3540:bc139431830b
child 5776:bd0ff8ae98a8
comparison
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