util.pluginloader: Return full file path from internal file loader on success, not...
[prosody.git] / util / hmac.lua
1 -- Prosody IM
2 -- Copyright (C) 2008-2010 Matthew Wild
3 -- Copyright (C) 2008-2010 Waqas Hussain
4 -- 
5 -- This project is MIT/X11 licensed. Please see the
6 -- COPYING file in the source package for more information.
7 --
8
9 local hashes = require "util.hashes"
10
11 local s_char = string.char;
12 local s_gsub = string.gsub;
13 local s_rep = string.rep;
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