44 lines
1.2 KiB
Nim
44 lines
1.2 KiB
Nim
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
|
|
# SPDX-License-Identifier: Unlicense
|
|
|
|
import nimSHA2
|
|
|
|
proc fillPad(pad: var openarray[byte]; key: openarray[byte]; fillByte: byte) =
|
|
for i in 0..key.high: pad[i] = fillByte xor key[i].uint8
|
|
for i in key.len..pad.high: pad[i] = fillByte
|
|
|
|
proc hmacSha256*[T:char|byte](key: openarray[byte]; msg: openarray[T]; outLength = 32): seq[byte] =
|
|
const blockSize = 64
|
|
assert(outLength <= 32)
|
|
var
|
|
hash: SHA256
|
|
pad: array[blockSize, byte]
|
|
block:
|
|
const xorByte = 0x36'u8
|
|
if key.len < blockSize:
|
|
fillPad(pad, key, xorByte)
|
|
else:
|
|
initSHA(hash)
|
|
update(hash, key)
|
|
var keyDigest = final(hash)
|
|
fillPad(pad, keyDigest, xorByte)
|
|
initSHA(hash)
|
|
update(hash, pad)
|
|
update(hash, msg)
|
|
var digest = final(hash)
|
|
block:
|
|
const xorByte = 0x5c'u8
|
|
if key.len < blockSize:
|
|
fillPad(pad, key, xorByte)
|
|
else:
|
|
initSHA(hash)
|
|
update(hash, key)
|
|
var keyDigest = final(hash)
|
|
fillPad(pad, keyDigest, xorByte)
|
|
initSHA(hash)
|
|
update(hash, pad)
|
|
update(hash, digest)
|
|
digest = final(hash)
|
|
result.setLen(outLength)
|
|
copyMem(result[0].addr, digest[0].addr, result.len)
|