Update schemas to get optionals

This commit is contained in:
Emery Hemingway 2024-01-06 13:59:38 +02:00
parent e48c62f448
commit df52f72263
3 changed files with 41 additions and 23 deletions

View File

@ -19,31 +19,24 @@ proc hmac(key, data: openarray[byte]): seq[byte] =
count[Hmac[BLAKE2S_256]](key, data).data[0..15].toSeq
proc mint*(key: openarray[byte]; oid: Value): SturdyRef =
SturdyRef(parameters: {
Symbol"oid": oid,
Symbol"sig": hmac(key, encode(oid)).toPreserves,
}.toTable,
)
result.parameters.oid = oid
result.parameters.sig = hmac(key, oid.encode)
proc mint*(): SturdyRef =
var key: array[16, byte]
mint(key, "syndicate".toPreserves)
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)
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)
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)
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)
# mint utility moved to syndicate_utils/src/mintsturdyref.nim

View File

@ -1,6 +1,6 @@
import
preserves, std/tables
preserves, std/options
type
NoiseDescriptionDetail* = NoiseServiceSpec
@ -71,10 +71,28 @@ type
NoisePathStepDetail* = NoiseSpec
`NoiseServiceSpec`* = Table[Symbol, Value]
NoiseServiceSpecKey* = seq[byte]
NoiseServiceSpecPreSharedKeys* = Option[Value]
NoiseServiceSpecProtocol* = Option[Value]
NoiseServiceSpecSecretKey* = Option[Value]
`NoiseServiceSpec`* {.preservesDictionary.} = object
`key`*: seq[byte]
`preSharedKeys`*: Option[Value]
`protocol`*: Option[Value]
`secretKey`*: Option[Value]
`service`*: ServiceSelector
ServiceSelector* = Value
NoiseStepDetail* = ServiceSelector
`NoiseSpec`* = Table[Symbol, Value]
NoiseSpecKey* = seq[byte]
NoiseSpecPreSharedKeys* = Option[Value]
NoiseSpecProtocol* = Option[Value]
`NoiseSpec`* {.preservesDictionary.} = object
`key`*: seq[byte]
`preSharedKeys`*: Option[Value]
`protocol`*: Option[Value]
`service`*: ServiceSelector
PacketKind* {.pure.} = enum
`complete`, `fragmented`
PacketComplete* = seq[byte]

View File

@ -1,6 +1,6 @@
import
preserves, std/tables
preserves, std/tables, std/options
type
PCompoundKind* {.pure.} = enum
@ -64,7 +64,14 @@ type
`pattern`*: Pattern
`template`*: Template
`Parameters`* = Table[Symbol, Value]
ParametersCaveats* = Option[Value]
ParametersOid* = Value
ParametersSig* = seq[byte]
`Parameters`* {.preservesDictionary.} = object
`caveats`*: Option[Value]
`oid`*: Value
`sig`*: seq[byte]
TRef* {.preservesRecord: "ref".} = object
`binding`*: BiggestInt