diff --git a/src/syndicate/capabilities.nim b/src/syndicate/capabilities.nim index de71b82..1c32892 100644 --- a/src/syndicate/capabilities.nim +++ b/src/syndicate/capabilities.nim @@ -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 diff --git a/src/syndicate/protocols/noise.nim b/src/syndicate/protocols/noise.nim index ee5df75..b220c1f 100644 --- a/src/syndicate/protocols/noise.nim +++ b/src/syndicate/protocols/noise.nim @@ -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] diff --git a/src/syndicate/protocols/sturdy.nim b/src/syndicate/protocols/sturdy.nim index d3a2d07..752e481 100644 --- a/src/syndicate/protocols/sturdy.nim +++ b/src/syndicate/protocols/sturdy.nim @@ -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