Here is an example, of how to use hashing in BearSSL:
import bearssl/hash
import stew/byteutils
let data = "0123456789abcdef".toBytes
let buff = newSeq[byte](sha256SIZE)
var sha256HashCtx = Sha256Context()
sha256Init(sha256HashCtx)
sha224Update(sha256HashCtx, addr data[0], data.len.uint)
sha256Out(sha256HashCtx, addr buff[0])
echo "Hash out: ", buff.toHex
Note
notice that above we use
sha224Update
and not the expectedsha256update
. This is because of a bug, which is addressed here: https://github.com/status-im/nim-bearssl/pull/68
BearSSL also simulates an OOP interface, which can be used to create a generic hash
function which can then be reused for various hashing algorithms:
import bearssl/hash
proc hash*(hashClass: ptr HashClass, data: openArray[byte]): seq[byte] =
var compatCtx = HashCompatContext()
let buffSize = (hashClass[].desc shr HASHDESC_OUT_OFF) and HASHDESC_OUT_MASK
result = newSeq[byte](buffSize)
let hashClassPtrPtr: ConstPtrPtrHashClass = addr(compatCtx.vtable)
hashClass[].init(hashClassPtrPtr)
hashClass[].update(hashClassPtrPtr, addr data[0], data.len.uint)
hashClass[].`out`(hashClassPtrPtr, addr result[0])
Then such a hash function can be conveniently reused for various hashing functions:
import bearssl/hash
import stew/byteutils
import ./hash
let data = "0123456789abcdef".toBytes
var sha256HashCtx = Sha256Context()
sha256Init(sha256HashCtx)
echo "Hash out[sha256]: ", hash(sha256HashCtx.vtable, data).toHex
var sha1HashCtx = Sha1Context()
sha1Init(sha1HashCtx)
echo "Hash out[sha1]: ", hash(sha1HashCtx.vtable, data).toHex
var md5Ctx = Md5Context()
md5Init(md5Ctx)
echo "Hash out[md5]: ", hash(md5Ctx.vtable, data).toHex
This last snippet can be further simplified by using a globally defined vtable variables from nim-bearssl
:
import bearssl/hash
import stew/byteutils
import ./hash
let data = "0123456789abcdef".toBytes
var sha256HashCtx = Sha256Context()
let buff = newSeq[byte](sha256SIZE) # 32 bytes for SHA-256
sha256Init(sha256HashCtx)
sha224Update(sha256HashCtx, addr data[0], data.len.uint)
sha256Out(sha256HashCtx, addr buff[0])
echo "Hash out[sha256]: ", buff.toHex
echo "Hash out[sha256]: ", hash(addr sha256Vtable, data).toHex
echo "Hash out[sha1]: ", hash(addr sha1Vtable, data).toHex
echo "Hash out[md5]: ", hash(addr md5Vtable, data).toHex