syndicate-nim/src/syndicate/capabilities.nim

50 lines
1.5 KiB
Nim
Raw Normal View History

2023-05-03 17:10:33 +00:00
# SPDX-FileCopyrightText: ☭ Emery Hemingway
2021-09-21 14:39:15 +00:00
# SPDX-License-Identifier: Unlicense
2023-05-18 10:20:44 +00:00
runnableExamples:
from std/unittest import check
let sturdy = mint()
check $sturdy == """<ref {oid: "syndicate" sig: #x"69ca300c1dbfa08fba692102dd82311a"}>"""
2024-01-01 18:29:54 +00:00
import std/[options, tables]
2023-05-03 17:10:33 +00:00
from std/sequtils import toSeq
import hashlib/misc/blake2
2021-09-21 14:39:15 +00:00
import preserves
2023-05-03 17:10:33 +00:00
import ./protocols/sturdy
2021-09-07 10:01:42 +00:00
export `$`
2023-05-03 17:10:33 +00:00
proc hmac(key, data: openarray[byte]): seq[byte] =
count[Hmac[BLAKE2S_256]](key, data).data[0..15].toSeq
2023-12-31 17:15:06 +00:00
proc mint*(key: openarray[byte]; oid: Value): SturdyRef =
2024-01-01 18:29:54 +00:00
SturdyRef(parameters: {
Symbol"oid": oid,
Symbol"sig": hmac(key, encode(oid)).toPreserves,
}.toTable,
2023-05-18 10:20:44 +00:00
)
2021-10-27 16:54:20 +00:00
2023-12-31 17:15:06 +00:00
proc mint*(): SturdyRef =
2023-04-10 21:56:51 +00:00
var key: array[16, byte]
2023-12-31 17:15:06 +00:00
mint(key, "syndicate".toPreserves)
2023-04-10 21:56:51 +00:00
2024-01-01 18:29:54 +00:00
proc attenuate*(r: SturdyRef; caveats: seq[Caveat]): SturdyRef =
var sig = hmac(r.parameters[Symbol"sig"].bytes, caveats.toPreserves.encode)
result = SturdyRef(parameters: {
Symbol"oid": r.parameters[Symbol"oid"],
Symbol"caveats": r.parameters[Symbol"caveats"] & caveats.toPreserves,
Symbol"sig": sig.toPreserves,
}.toTable)
proc validate*(key: openarray[byte]; sturdy: SturdyRef): bool =
let oid = sturdy.parameters[Symbol"oid"]
let ctrl = sturdy.parameters[Symbol"sig"]
var sig = hmac(key, oid.encode)
let caveats = sturdy.parameters[Symbol"caveats"]
for cav in caveats.sequence:
sig = hmac(sig, encode cav)
result = (sig == ctrl.bytes)
2023-08-25 17:31:32 +00:00
# mint utility moved to syndicate_utils/src/mintsturdyref.nim