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