X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=util%2Fhmac.lua;h=ffd69d91e9444625b5919961ad69e6cd7bbe29bb;hb=7cde004ab530110577c5107636bc010576f29df1;hp=053765750f99f44ad4cb1bb46807c7df5d8a94df;hpb=edd33fd5ed8822863b62f1c3fc28159f9272e8ae;p=prosody.git diff --git a/util/hmac.lua b/util/hmac.lua index 05376575..ffd69d91 100644 --- a/util/hmac.lua +++ b/util/hmac.lua @@ -1,67 +1,78 @@ +-- Prosody IM +-- Copyright (C) 2008-2009 Matthew Wild +-- Copyright (C) 2008-2009 Waqas Hussain +-- +-- This project is MIT/X11 licensed. Please see the +-- COPYING file in the source package for more information. +-- + local hashes = require "util.hashes" local xor = require "bit".bxor +local t_insert, t_concat = table.insert, table.concat; +local s_char = string.char; + module "hmac" local function arraystr(array) - local t = {} - for i = 1,table.getn(array) do - table.insert(t, string.char(array[i])) - end + local t = {} + for i = 1,#array do + t_insert(t, s_char(array[i])) + end - return table.concat(t) + return t_concat(t) end --[[ key - the key to use in the hash + the key to use in the hash message - the message to hash + the message to hash hash - the hash function + the hash function blocksize - the blocksize for the hash function in bytes + 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 + local opad = {} + local ipad = {} + + for i = 1,blocksize do + opad[i] = 0x5c + ipad[i] = 0x36 + end - if #key > blocksize then - key = hash(key) - 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 + 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) + opad = arraystr(opad) + ipad = arraystr(ipad) - if hex then - return hash(opad..hash(ipad..message), true) - else - return hash(opad..hash(ipad..message)) - end + 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) + return hmac(key, message, hashes.md5, 64, hex) end function sha1(key, message, hex) - return hmac(key, message, hashes.sha1, 64, hex) + return hmac(key, message, hashes.sha1, 64, hex) end function sha256(key, message, hex) - return hmac(key, message, hashes.sha256, 64, hex) + return hmac(key, message, hashes.sha256, 64, hex) end return _M