Add private HMAC-SHA256 implementation
This commit is contained in:
parent
a23935b3c5
commit
cd309ceb7d
|
@ -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)
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue