2023-05-09 13:22:34 +00:00
|
|
|
# Nim-WebRTC
|
|
|
|
# Copyright (c) 2023 Status Research & Development GmbH
|
|
|
|
# Licensed under either of
|
|
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
|
|
# at your option.
|
|
|
|
# This file may not be copied, modified, or distributed except according to
|
|
|
|
# those terms.
|
|
|
|
|
|
|
|
import std/sha1, sequtils, typetraits, std/md5
|
2023-04-21 10:01:14 +00:00
|
|
|
|
|
|
|
proc createCrc32Table(): array[0..255, uint32] =
|
|
|
|
for i in 0..255:
|
|
|
|
var rem = i.uint32
|
|
|
|
for j in 0..7:
|
|
|
|
if (rem and 1) > 0: rem = (rem shr 1) xor 0xedb88320'u32
|
|
|
|
else: rem = rem shr 1
|
|
|
|
result[i] = rem
|
|
|
|
|
|
|
|
proc crc32*(s: seq[byte]): uint32 =
|
|
|
|
const crc32table = createCrc32Table()
|
|
|
|
result = 0xffffffff'u32
|
|
|
|
for c in s:
|
|
|
|
result = (result shr 8) xor crc32table[(result and 0xff) xor c]
|
|
|
|
result = not result
|
2023-05-09 13:22:34 +00:00
|
|
|
|
|
|
|
proc hmacSha1*(key: seq[byte], msg: seq[byte]): seq[byte] =
|
|
|
|
let
|
|
|
|
keyPadded =
|
|
|
|
if len(key) > 64:
|
|
|
|
@(secureHash(key.mapIt(it.chr)).distinctBase)
|
|
|
|
elif key.len() < 64:
|
|
|
|
key.concat(newSeq[byte](64 - key.len()))
|
|
|
|
else:
|
|
|
|
key
|
|
|
|
innerHash = keyPadded.
|
|
|
|
mapIt(it xor 0x36'u8).
|
|
|
|
concat(msg).
|
|
|
|
mapIt(it.chr).
|
|
|
|
secureHash()
|
|
|
|
outerHash = keyPadded.
|
|
|
|
mapIt(it xor 0x5c'u8).
|
|
|
|
concat(@(innerHash.distinctBase)).
|
|
|
|
mapIt(it.chr).
|
|
|
|
secureHash()
|
|
|
|
return @(outerHash.distinctBase)
|