Software /
code /
prosody
Comparison
util/hmac.lua @ 1456:3135cf40110d
Added HMAC utility module
Produces HMAC codes using all the supported hashes (md5, sha1, sha256)
author | Dwayne Bent <dbb.0@liqd.org> |
---|---|
date | Wed, 01 Jul 2009 20:24:47 -0400 |
child | 1481:6401460891b2 |
comparison
equal
deleted
inserted
replaced
1455:81e01809de54 | 1456:3135cf40110d |
---|---|
1 local hashes = require "util.hashes" | |
2 local xor = require "bit".bxor | |
3 | |
4 module "hmac" | |
5 | |
6 local function arraystr(array) | |
7 t = {} | |
8 for i = 1,table.getn(array) do | |
9 table.insert(t, string.char(array[i])) | |
10 end | |
11 | |
12 return table.concat(t) | |
13 end | |
14 | |
15 --[[ | |
16 key | |
17 the key to use in the hash | |
18 message | |
19 the message to hash | |
20 hash | |
21 the hash function | |
22 blocksize | |
23 the blocksize for the hash function in bytes | |
24 hex | |
25 return raw hash or hexadecimal string | |
26 --]] | |
27 function hmac(key, message, hash, blocksize, hex) | |
28 local opad = {} | |
29 local ipad = {} | |
30 | |
31 for i = 1,blocksize do | |
32 opad[i] = 0x5c | |
33 ipad[i] = 0x36 | |
34 end | |
35 | |
36 if #key > blocksize then | |
37 key = hash(key) | |
38 end | |
39 | |
40 for i = 1,#key do | |
41 ipad[i] = xor(ipad[i],key:sub(i,i):byte()) | |
42 opad[i] = xor(opad[i],key:sub(i,i):byte()) | |
43 end | |
44 | |
45 opad = arraystr(opad) | |
46 ipad = arraystr(ipad) | |
47 | |
48 if hex then | |
49 return hash(opad..hash(ipad..message), true) | |
50 else | |
51 return hash(opad..hash(ipad..message)) | |
52 end | |
53 end | |
54 | |
55 function md5(key, message, hex) | |
56 return hmac(key, message, hashes.md5, 64, hex) | |
57 end | |
58 | |
59 function sha1(key, message, hex) | |
60 return hmac(key, message, hashes.sha1, 64, hex) | |
61 end | |
62 | |
63 function sha256(key, message, hex) | |
64 return hmac(key, message, hashes.sha256, 64, hex) | |
65 end | |
66 | |
67 return _M |