Add private HMAC-SHA256 implementation

This commit is contained in:
Emery Hemingway 2021-09-06 21:54:07 +02:00
parent a23935b3c5
commit cd309ceb7d
2 changed files with 41 additions and 1 deletions

View File

@ -0,0 +1,40 @@
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import nimSHA2
proc hmacSha256*(key: openarray[byte]; msg: seq[byte]|string): seq[byte] =
const blockSize = 64
assert(key.len <= blockSize)
var
inner, outer: SHA256
pad: array[blockSize, byte]
block:
const xorByte = 0x36'u8
for i in 0..key.high: pad[i] = xorByte xor key[i]
for i in key.len..pad.high: pad[i] = xorByte
initSHA(inner)
update(inner, pad)
update(inner, msg)
block:
const xorByte = 0x5c'u8
for i in 0..key.high: pad[i] = xorByte xor key[i]
for i in key.len..pad.high: pad[i] = xorByte
initSHA(outer)
update(outer, pad)
update(outer, final(inner))
var digest = final(outer)
result.setLen(digest.len)
copyMem(result[0].addr, digest[0].addr, result.len)
when isMainModule:
import strutils, unittest
suite "HMAC-SHA-256":
test "1":
var key: array[20,byte]
for b in key.mitems: b = 0x0b'u8
var data = "Hi There"
check(data.toHex == "4869205468657265")
let hmac = cast[string](hmacSha256(key, data)).toHex.toLowerAscii
let control = "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
check(hmac == control)

View File

@ -9,4 +9,4 @@ srcDir = "src"
# Dependencies
requires "nim >= 1.4.8", "preserves >= 1.0.0"
requires "nim >= 1.4.8", "nimSHA2 >= 0.1.1", "preserves >= 1.0.0"