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
|
|
|
|
2022-12-08 04:51:26 +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-06 11:59:38 +00:00
|
|
|
result.parameters.oid = oid
|
|
|
|
result.parameters.sig = hmac(key, oid.encode)
|
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 =
|
2024-01-06 11:59:38 +00:00
|
|
|
if r.parameters.caveats.isSome:
|
|
|
|
result.parameters.caveats = some(r.parameters.caveats.get & caveats.toPreserves)
|
|
|
|
result.parameters.oid = r.parameters.oid
|
|
|
|
result.parameters.sig = hmac(r.parameters.sig, caveats.toPreserves.encode)
|
2024-01-01 18:29:54 +00:00
|
|
|
|
|
|
|
proc validate*(key: openarray[byte]; sturdy: SturdyRef): bool =
|
2024-01-06 11:59:38 +00:00
|
|
|
var sig = hmac(key, sturdy.parameters.oid.encode)
|
|
|
|
if sturdy.parameters.caveats.isSome:
|
|
|
|
for cav in sturdy.parameters.caveats.get:
|
|
|
|
sig = hmac(sig, encode cav)
|
|
|
|
result = (sig == sturdy.parameters.sig)
|
2022-12-08 04:51:26 +00:00
|
|
|
|
2023-08-25 17:31:32 +00:00
|
|
|
# mint utility moved to syndicate_utils/src/mintsturdyref.nim
|