У меня проблема с реализацией HMAC, которую я пытаюсь написать на Lua.Базовая функция, с которой я тестирую, - это SHA2-224.Посмотрите на приведенный ниже код, предполагая правильную реализацию SHA2-224:
local print = print
local byte = string.byte
local char = string.char
local concat = table.concat
local function toBytes(str)
local tmp = {}
for i = 1, string.len(str) do
tmp[i] = byte(str, i)
end
return tmp
end
local function toString(bArray)
local tmp = {}
for i = 1, #bArray do
tmp[i] = char(bArray[i])
end
tmp = concat(tmp)
return tmp
end
-- ignore hFun for now
local hash = function(hFun, key, message)
local hasher = require 'sha224'
local blockSize = hasher.blockSize()
local outputSize = hasher.outputSize()
-- if the length of the key is longer than the block size, we hash it first
-- to shorten it
-- if its too large, we pad it with 0s until its as big as the block size
if #key > blockSize then
key = hasher.hash(key)
elseif #key < blockSize then
key = key .. string.rep("\0", (blockSize - #key))
end
local keyBytes = toBytes(key)
assert(#keyBytes == blockSize)
local opad = {}
local ipad = {}
for i = 1, 64 do
opad[i] = keyBytes[i] ~ 0x5c
ipad[i] = keyBytes[i] ~ 0x36
end
opad = toString(opad)
ipad = toString(ipad)
local inner = hasher.hash(ipad .. message)
return hasher.hash(opad .. inner)
end
return {hash = hash}
end
При тестировании с помощью тестового вектора из NIST этот код выдает следующий вывод (с некоторым отладочным кодом, который не включен выше):
Для ключа: «Джеф», сообщение: «Что ты хочешь даром?»:
OPAD 1: 74 XOR 92 --> 22
IPAD 1: 74 XOR 54 --> 124
OPAD 2: 101 XOR 92 --> 57
IPAD 2: 101 XOR 54 --> 83
OPAD 3: 102 XOR 92 --> 58
IPAD 3: 102 XOR 54 --> 80
OPAD 4: 101 XOR 92 --> 57
IPAD 4: 101 XOR 54 --> 83
OPAD 5: 0 XOR 92 --> 92
IPAD 5: 0 XOR 54 --> 54
OPAD 6: 0 XOR 92 --> 92
IPAD 6: 0 XOR 54 --> 54
OPAD 7: 0 XOR 92 --> 92
IPAD 7: 0 XOR 54 --> 54
OPAD 8: 0 XOR 92 --> 92
IPAD 8: 0 XOR 54 --> 54
OPAD 9: 0 XOR 92 --> 92
IPAD 9: 0 XOR 54 --> 54
OPAD 10: 0 XOR 92 --> 92
IPAD 10: 0 XOR 54 --> 54
OPAD 11: 0 XOR 92 --> 92
IPAD 11: 0 XOR 54 --> 54
OPAD 12: 0 XOR 92 --> 92
IPAD 12: 0 XOR 54 --> 54
OPAD 13: 0 XOR 92 --> 92
IPAD 13: 0 XOR 54 --> 54
OPAD 14: 0 XOR 92 --> 92
IPAD 14: 0 XOR 54 --> 54
OPAD 15: 0 XOR 92 --> 92
IPAD 15: 0 XOR 54 --> 54
OPAD 16: 0 XOR 92 --> 92
IPAD 16: 0 XOR 54 --> 54
OPAD 17: 0 XOR 92 --> 92
IPAD 17: 0 XOR 54 --> 54
OPAD 18: 0 XOR 92 --> 92
IPAD 18: 0 XOR 54 --> 54
OPAD 19: 0 XOR 92 --> 92
IPAD 19: 0 XOR 54 --> 54
OPAD 20: 0 XOR 92 --> 92
IPAD 20: 0 XOR 54 --> 54
OPAD 21: 0 XOR 92 --> 92
IPAD 21: 0 XOR 54 --> 54
OPAD 22: 0 XOR 92 --> 92
IPAD 22: 0 XOR 54 --> 54
OPAD 23: 0 XOR 92 --> 92
IPAD 23: 0 XOR 54 --> 54
OPAD 24: 0 XOR 92 --> 92
IPAD 24: 0 XOR 54 --> 54
OPAD 25: 0 XOR 92 --> 92
IPAD 25: 0 XOR 54 --> 54
OPAD 26: 0 XOR 92 --> 92
IPAD 26: 0 XOR 54 --> 54
OPAD 27: 0 XOR 92 --> 92
IPAD 27: 0 XOR 54 --> 54
OPAD 28: 0 XOR 92 --> 92
IPAD 28: 0 XOR 54 --> 54
OPAD 29: 0 XOR 92 --> 92
IPAD 29: 0 XOR 54 --> 54
OPAD 30: 0 XOR 92 --> 92
IPAD 30: 0 XOR 54 --> 54
OPAD 31: 0 XOR 92 --> 92
IPAD 31: 0 XOR 54 --> 54
OPAD 32: 0 XOR 92 --> 92
IPAD 32: 0 XOR 54 --> 54
OPAD 33: 0 XOR 92 --> 92
IPAD 33: 0 XOR 54 --> 54
OPAD 34: 0 XOR 92 --> 92
IPAD 34: 0 XOR 54 --> 54
OPAD 35: 0 XOR 92 --> 92
IPAD 35: 0 XOR 54 --> 54
OPAD 36: 0 XOR 92 --> 92
IPAD 36: 0 XOR 54 --> 54
OPAD 37: 0 XOR 92 --> 92
IPAD 37: 0 XOR 54 --> 54
OPAD 38: 0 XOR 92 --> 92
IPAD 38: 0 XOR 54 --> 54
OPAD 39: 0 XOR 92 --> 92
IPAD 39: 0 XOR 54 --> 54
OPAD 40: 0 XOR 92 --> 92
IPAD 40: 0 XOR 54 --> 54
OPAD 41: 0 XOR 92 --> 92
IPAD 41: 0 XOR 54 --> 54
OPAD 42: 0 XOR 92 --> 92
IPAD 42: 0 XOR 54 --> 54
OPAD 43: 0 XOR 92 --> 92
IPAD 43: 0 XOR 54 --> 54
OPAD 44: 0 XOR 92 --> 92
IPAD 44: 0 XOR 54 --> 54
OPAD 45: 0 XOR 92 --> 92
IPAD 45: 0 XOR 54 --> 54
OPAD 46: 0 XOR 92 --> 92
IPAD 46: 0 XOR 54 --> 54
OPAD 47: 0 XOR 92 --> 92
IPAD 47: 0 XOR 54 --> 54
OPAD 48: 0 XOR 92 --> 92
IPAD 48: 0 XOR 54 --> 54
OPAD 49: 0 XOR 92 --> 92
IPAD 49: 0 XOR 54 --> 54
OPAD 50: 0 XOR 92 --> 92
IPAD 50: 0 XOR 54 --> 54
OPAD 51: 0 XOR 92 --> 92
IPAD 51: 0 XOR 54 --> 54
OPAD 52: 0 XOR 92 --> 92
IPAD 52: 0 XOR 54 --> 54
OPAD 53: 0 XOR 92 --> 92
IPAD 53: 0 XOR 54 --> 54
OPAD 54: 0 XOR 92 --> 92
IPAD 54: 0 XOR 54 --> 54
OPAD 55: 0 XOR 92 --> 92
IPAD 55: 0 XOR 54 --> 54
OPAD 56: 0 XOR 92 --> 92
IPAD 56: 0 XOR 54 --> 54
OPAD 57: 0 XOR 92 --> 92
IPAD 57: 0 XOR 54 --> 54
OPAD 58: 0 XOR 92 --> 92
IPAD 58: 0 XOR 54 --> 54
OPAD 59: 0 XOR 92 --> 92
IPAD 59: 0 XOR 54 --> 54
OPAD 60: 0 XOR 92 --> 92
IPAD 60: 0 XOR 54 --> 54
OPAD 61: 0 XOR 92 --> 92
IPAD 61: 0 XOR 54 --> 54
OPAD 62: 0 XOR 92 --> 92
IPAD 62: 0 XOR 54 --> 54
OPAD 63: 0 XOR 92 --> 92
IPAD 63: 0 XOR 54 --> 54
OPAD 64: 0 XOR 92 --> 92
IPAD 64: 0 XOR 54 --> 54
OPAD: 9:9\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
IPAD: |SPS666666666666666666666666666666666666666666666666666666666666
INNER HASH: 9:9\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\what do ya want for nothing? ----> 9d7a0c2abbbd5d81645ba9aff01a112bb1d1ec878072e2953110cc71
FINAL HASH INPUT: 9:9\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\9d7a0c2abbbd5d81645ba9aff01a112bb1d1ec878072e2953110cc71
FINAL RESULT: 770df99ad235e32bc5e2aacfbbfdedddeac7628a5882920863e920ee
EXPECTED RESULT: a30e01098bc6dbbf45690f3a7e9e6d0f8bbea2a39e6148008fd05e44
Я почти уверен, что не делаю ничего плохого, когда дело доходит доpadding, а также создание таблиц opad и ipad.Возможно, мои преобразования строки в int отключены.Возможно, это странная причуда с Lua 5.3, о которой я не знаю.Я не знаю, что мне здесь не хватает.Это может быть очень очевидно, но сейчас я этого не вижу.Заранее благодарю за помощь.
Я должен добавить, что эта реализация необходима для песочницы lua, в которой я не могу использовать другие библиотеки.