nim-bearssl/bearssl/abi/bearssl_hmac.nim
Jacek Sieka c4aec8b664
split decls into separate modules in bearssl/abi (#27)
* split `decls.nim` into smaller modules - allows using parts of the ABI
without compiling all of `bearssl`
* deprecate functions with `Br` prefix - there are duplicate exports
both with and without `Br` for the same function and we use both in
consumers like `chronos` and `libp2p`
* fix several cases of incorrectly mapped types
* use `var` for certain arguments that can't be `nil`
* add script to regenerate ABI with `c2nim`
* consistently use `uint` for length (`int` was sometimes used)

The Split likely needs more cleanup work - this is a first cut to get
the idea in place.

In the new layout, `bearssl/abi/` contains "raw" nim mappings while
hand-written helpers are in `bearssl/`.
2022-06-14 19:33:00 +02:00

57 lines
1.8 KiB
Nim

import
"."/[bearssl_hash, csources, inner]
{.pragma: importcFunc, cdecl, gcsafe, noSideEffect, raises: [].}
{.used.}
const
bearMacPath = bearSrcPath / "mac"
{.compile: bearMacPath / "hmac.c".}
{.compile: bearMacPath / "hmac_ct.c".}
type
HmacKeyContext* {.importc: "br_hmac_key_context", header: "bearssl_hmac.h", bycopy.} = object
digVtable* {.importc: "dig_vtable".}: ptr HashClass
ksi* {.importc: "ksi".}: array[64, byte]
kso* {.importc: "kso".}: array[64, byte]
proc hmacKeyInit*(kc: var HmacKeyContext; digestVtable: ptr HashClass; key: pointer;
keyLen: uint) {.importcFunc, importc: "br_hmac_key_init",
header: "bearssl_hmac.h".}
proc hmacKeyGetDigest*(kc: var HmacKeyContext): ptr HashClass {.inline.} =
return kc.digVtable
type
HmacContext* {.importc: "br_hmac_context", header: "bearssl_hmac.h", bycopy.} = object
dig* {.importc: "dig".}: HashCompatContext
kso* {.importc: "kso".}: array[64, byte]
outLen* {.importc: "out_len".}: uint
proc hmacInit*(ctx: var HmacContext; kc: var HmacKeyContext; outLen: uint) {.importcFunc,
importc: "br_hmac_init", header: "bearssl_hmac.h".}
proc hmacSize*(ctx: var HmacContext): uint {.inline, importcFunc, importc: "br_hmac_size".} =
return ctx.outLen
proc hmacGetDigest*(hc: var HmacContext): ptr HashClass {.inline.} =
return hc.dig.vtable
proc hmacUpdate*(ctx: var HmacContext; data: pointer; len: uint) {.importcFunc,
importc: "br_hmac_update", header: "bearssl_hmac.h".}
proc hmacOut*(ctx: var HmacContext; `out`: pointer): uint {.importcFunc,
importc: "br_hmac_out", header: "bearssl_hmac.h".}
proc hmacOutCT*(ctx: var HmacContext; data: pointer; len: uint; minLen: uint;
maxLen: uint; `out`: pointer): uint {.importcFunc,
importc: "br_hmac_outCT", header: "bearssl_hmac.h".}