Реализация Lua HMAC-SHA2-224 не дает правильного вывода - PullRequest
0 голосов
/ 24 мая 2018

У меня проблема с реализацией 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, в которой я не могу использовать другие библиотеки.

...