Added HMAC utility module
authorDwayne Bent <dbb.0@liqd.org>
Thu, 2 Jul 2009 00:24:47 +0000 (20:24 -0400)
committerDwayne Bent <dbb.0@liqd.org>
Thu, 2 Jul 2009 00:24:47 +0000 (20:24 -0400)
Produces HMAC codes using all the supported hashes (md5, sha1, sha256)

util/hmac.lua [new file with mode: 0644]

diff --git a/util/hmac.lua b/util/hmac.lua
new file mode 100644 (file)
index 0000000..b309838
--- /dev/null
@@ -0,0 +1,67 @@
+local hashes = require "util.hashes"
+local xor = require "bit".bxor
+
+module "hmac"
+
+local function arraystr(array)
+    t = {}
+    for i = 1,table.getn(array) do
+        table.insert(t, string.char(array[i]))
+    end
+
+    return table.concat(t)
+end
+
+--[[
+key
+    the key to use in the hash
+message
+    the message to hash
+hash
+    the hash function
+blocksize
+    the blocksize for the hash function in bytes
+hex
+  return raw hash or hexadecimal string
+--]]
+function hmac(key, message, hash, blocksize, hex)
+    local opad = {}
+    local ipad = {}
+    
+    for i = 1,blocksize do
+        opad[i] = 0x5c
+        ipad[i] = 0x36
+    end
+
+    if #key > blocksize then
+        key = hash(key)
+    end
+
+    for i = 1,#key do
+        ipad[i] = xor(ipad[i],key:sub(i,i):byte())
+        opad[i] = xor(opad[i],key:sub(i,i):byte())
+    end
+
+    opad = arraystr(opad)
+    ipad = arraystr(ipad)
+
+    if hex then
+        return hash(opad..hash(ipad..message), true)
+    else
+        return hash(opad..hash(ipad..message))
+    end
+end
+
+function md5(key, message, hex)
+    return hmac(key, message, hashes.md5, 64, hex)
+end
+
+function sha1(key, message, hex)
+    return hmac(key, message, hashes.sha1, 64, hex)
+end
+
+function sha256(key, message, hex)
+    return hmac(key, message, hashes.sha256, 64, hex)
+end
+
+return _M