File

util/hmac.lua @ 1488:0d1aff918303

mod_presence: Fixed: Presence probe replies now get sent to the full JID of the probe sender
author Waqas Hussain <waqas20@gmail.com>
date Mon, 06 Jul 2009 01:37:57 +0500
parent 1456:3135cf40110d
child 1481:6401460891b2
line wrap: on
line source

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