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 expected sha256update. 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