Compare commits
3 Commits
Author | SHA1 | Date |
---|---|---|
Emery Hemingway | c97eeafc42 | |
Emery Hemingway | 65fbc319cb | |
Emery Hemingway | 0a07bcf66a |
|
@ -3,6 +3,7 @@ include ../taps/depends.tup
|
||||||
NIM_FLAGS += --path:$(TUP_CWD)/../nim
|
NIM_FLAGS += --path:$(TUP_CWD)/../nim
|
||||||
NIM_FLAGS += --path:$(TUP_CWD)/../preserves-nim/src
|
NIM_FLAGS += --path:$(TUP_CWD)/../preserves-nim/src
|
||||||
NIM_FLAGS += --path:$(TUP_CWD)/../taps/src
|
NIM_FLAGS += --path:$(TUP_CWD)/../taps/src
|
||||||
|
NIM_FLAGS += --path:$(TUP_CWD)/../hashlib
|
||||||
NIM_FLAGS += --path:%<nimsha2>
|
NIM_FLAGS += --path:%<nimsha2>
|
||||||
NIM_GROUPS += $(TUP_CWD)/../nimble/<nimsha2>
|
NIM_GROUPS += $(TUP_CWD)/../nimble/<nimsha2>
|
||||||
NIM_GROUPS += $(TUP_CWD)/<protocol>
|
NIM_GROUPS += $(TUP_CWD)/<protocol>
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
include_rules
|
include_rules
|
||||||
NIM_FLAGS += --path:$(TUP_CWD)/..
|
NIM_FLAGS += --path:$(TUP_CWD)/..
|
||||||
: foreach *.nim |> !nim_check |>
|
: foreach *.nim |> !nim_check |>
|
||||||
|
: capabilities.nim |> !nim_bin |> $(BIN_DIR)/mint
|
||||||
|
|
|
@ -395,8 +395,7 @@ proc spawn*(name: string; turn: var Turn; bootProc: TurnAction; initialAssertion
|
||||||
var newOutBound: Table[Handle, OutboundAssertion]
|
var newOutBound: Table[Handle, OutboundAssertion]
|
||||||
for key in initialAssertions:
|
for key in initialAssertions:
|
||||||
discard turn.facet.outbound.pop(key, newOutbound[key])
|
discard turn.facet.outbound.pop(key, newOutbound[key])
|
||||||
callSoon do ():
|
discard newActor(name, bootProc, newOutBound)
|
||||||
discard newActor(name, bootProc, newOutBound)
|
|
||||||
|
|
||||||
proc newInertRef*(): Ref =
|
proc newInertRef*(): Ref =
|
||||||
let a = bootActor("inert") do (turn: var Turn): turn.stop()
|
let a = bootActor("inert") do (turn: var Turn): turn.stop()
|
||||||
|
@ -434,22 +433,18 @@ template tryFacet(facet; body: untyped) =
|
||||||
#try: body
|
#try: body
|
||||||
#except: terminate(facet, getCurrentException())
|
#except: terminate(facet, getCurrentException())
|
||||||
|
|
||||||
proc run(queues: Queues) =
|
|
||||||
callSoon do ():
|
|
||||||
for facet, queue in queues:
|
|
||||||
for action in queue: run(facet, action)
|
|
||||||
|
|
||||||
proc run*(facet; action: TurnAction; zombieTurn = false) =
|
proc run*(facet; action: TurnAction; zombieTurn = false) =
|
||||||
if not zombieTurn:
|
if not zombieTurn:
|
||||||
if not facet.actor.exitReason.isNil: return
|
if not facet.actor.exitReason.isNil: return
|
||||||
if not facet.isAlive: return
|
if not facet.isAlive: return
|
||||||
# TODO: not Nim idiom
|
# TODO: not Nim idiom
|
||||||
tryFacet(facet):
|
tryFacet(facet):
|
||||||
var turn = Turn(
|
var queues = newTable[Facet, seq[TurnAction]]()
|
||||||
facet: facet,
|
block:
|
||||||
queues: newTable[Facet, seq[TurnAction]]())
|
var turn = Turn(facet: facet, queues: queues)
|
||||||
action(turn)
|
action(turn)
|
||||||
run(turn.queues)
|
for facet, queue in queues:
|
||||||
|
for action in queue: run(facet, action)
|
||||||
|
|
||||||
proc run*(`ref`: Ref; action: TurnAction) =
|
proc run*(`ref`: Ref; action: TurnAction) =
|
||||||
## Convenience proc to run a `TurnAction` in the scope of a `Ref`.
|
## Convenience proc to run a `TurnAction` in the scope of a `Ref`.
|
||||||
|
|
|
@ -1,18 +1,24 @@
|
||||||
# SPDX-FileCopyrightText: ☭ 2021 Emery Hemingway
|
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
||||||
# SPDX-License-Identifier: Unlicense
|
# SPDX-License-Identifier: Unlicense
|
||||||
|
|
||||||
|
from std/sequtils import toSeq
|
||||||
|
import hashlib/misc/blake2
|
||||||
|
|
||||||
import preserves
|
import preserves
|
||||||
import ./protocols/sturdy, ./private/hmacs
|
import ./protocols/sturdy
|
||||||
from ./actors import Ref
|
from ./actors import Ref
|
||||||
|
|
||||||
export `$`
|
export `$`
|
||||||
|
|
||||||
|
proc hmac(key, data: openarray[byte]): seq[byte] =
|
||||||
|
count[Hmac[BLAKE2S_256]](key, data).data[0..15].toSeq
|
||||||
|
|
||||||
proc mint*[T](key: openarray[byte]; oid: Preserve[T]): SturdyRef[T] =
|
proc mint*[T](key: openarray[byte]; oid: Preserve[T]): SturdyRef[T] =
|
||||||
SturdyRef[T](oid: oid, sig: hmacSha256(key, encode(oid), key.len))
|
SturdyRef[T](oid: oid, sig: hmac(key, encode oid))
|
||||||
|
|
||||||
proc mint*[T](key: openarray[byte]; oid: T; E = void): SturdyRef[E] =
|
proc mint*[T](key: openarray[byte]; oid: T; E = void): SturdyRef[E] =
|
||||||
var oidPr = toPreserve(oid, E)
|
var oidPr = toPreserve(oid, E)
|
||||||
SturdyRef[E](oid: oidPr, sig: hmacSha256(key, encode(oidPr), key.len))
|
SturdyRef[E](oid: oidPr, sig: hmac(key, encode oidPr))
|
||||||
|
|
||||||
proc mint*(): SturdyRef[Ref] =
|
proc mint*(): SturdyRef[Ref] =
|
||||||
var key: array[16, byte]
|
var key: array[16, byte]
|
||||||
|
@ -22,13 +28,13 @@ proc attenuate*[T](r: SturdyRef[T]; caveats: Attenuation): SturdyRef[T] =
|
||||||
result = SturdyRef[T](
|
result = SturdyRef[T](
|
||||||
oid: r.oid,
|
oid: r.oid,
|
||||||
caveatChain: r.caveatChain,
|
caveatChain: r.caveatChain,
|
||||||
sig: hmacSha256(r.sig, caveats.encode))
|
sig: hmac(r.sig, encode caveats))
|
||||||
result.caveatChain.add caveats
|
result.caveatChain.add caveats
|
||||||
|
|
||||||
proc validate*[T](key: openarray[byte]; r: SturdyRef[T]): bool =
|
proc validate*[T](key: openarray[byte]; r: SturdyRef[T]): bool =
|
||||||
var sig = hmacSha256(key, r.oid.encode, key.len)
|
var sig = hmac(key, encode r.oid)
|
||||||
for a in r.caveatChain:
|
for a in r.caveatChain:
|
||||||
sig = hmacSha256(sig, a.encode)
|
sig = hmac(sig, encode a)
|
||||||
r.sig == sig
|
r.sig == sig
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
# SPDX-FileCopyrightText: 2021 ☭ Emery Hemingway
|
|
||||||
# SPDX-License-Identifier: Unlicense
|
|
||||||
|
|
||||||
import nimSHA2
|
|
||||||
|
|
||||||
proc fillPad(pad: var openarray[byte]; key: openarray[byte]; fillByte: byte) =
|
|
||||||
for i in 0..key.high: pad[i] = fillByte xor key[i].uint8
|
|
||||||
for i in key.len..pad.high: pad[i] = fillByte
|
|
||||||
|
|
||||||
proc hmacSha256*[T:char|byte](key: openarray[byte]; msg: openarray[T]; outLength = 32): seq[byte] =
|
|
||||||
const blockSize = 64
|
|
||||||
assert(outLength <= 32)
|
|
||||||
var
|
|
||||||
hash: SHA256
|
|
||||||
pad: array[blockSize, byte]
|
|
||||||
block:
|
|
||||||
const xorByte = 0x36'u8
|
|
||||||
if key.len < blockSize:
|
|
||||||
fillPad(pad, key, xorByte)
|
|
||||||
else:
|
|
||||||
initSHA(hash)
|
|
||||||
update(hash, key)
|
|
||||||
var keyDigest = final(hash)
|
|
||||||
fillPad(pad, keyDigest, xorByte)
|
|
||||||
initSHA(hash)
|
|
||||||
update(hash, pad)
|
|
||||||
update(hash, msg)
|
|
||||||
var digest = final(hash)
|
|
||||||
block:
|
|
||||||
const xorByte = 0x5c'u8
|
|
||||||
if key.len < blockSize:
|
|
||||||
fillPad(pad, key, xorByte)
|
|
||||||
else:
|
|
||||||
initSHA(hash)
|
|
||||||
update(hash, key)
|
|
||||||
var keyDigest = final(hash)
|
|
||||||
fillPad(pad, keyDigest, xorByte)
|
|
||||||
initSHA(hash)
|
|
||||||
update(hash, pad)
|
|
||||||
update(hash, digest)
|
|
||||||
digest = final(hash)
|
|
||||||
result.setLen(outLength)
|
|
||||||
copyMem(result[0].addr, digest[0].addr, result.len)
|
|
|
@ -19,7 +19,7 @@ type
|
||||||
`handle`*: Handle
|
`handle`*: Handle
|
||||||
|
|
||||||
Extension* {.preservesRecord: "label".} = object
|
Extension* {.preservesRecord: "label".} = object
|
||||||
`data`*: seq[Preserve[void]]
|
`field0`*: seq[Preserve[void]]
|
||||||
|
|
||||||
Sync* {.preservesRecord: "sync".} = object
|
Sync* {.preservesRecord: "sync".} = object
|
||||||
`peer`* {.preservesLiteral: "#!<lit #t>".}: bool
|
`peer`* {.preservesLiteral: "#!<lit #t>".}: bool
|
||||||
|
|
|
@ -24,11 +24,11 @@ type
|
||||||
SessionKind* {.pure.} = enum
|
SessionKind* {.pure.} = enum
|
||||||
`observeUsers`, `observeSpeech`, `NickClaim`, `Says`
|
`observeUsers`, `observeSpeech`, `NickClaim`, `Says`
|
||||||
SessionObserveUsers*[Cap] {.preservesRecord: "Observe".} = object
|
SessionObserveUsers*[Cap] {.preservesRecord: "Observe".} = object
|
||||||
`data`* {.preservesLiteral: "user".}: bool
|
`field0`* {.preservesLiteral: "user".}: bool
|
||||||
`observer`*: Cap
|
`observer`*: Cap
|
||||||
|
|
||||||
SessionObserveSpeech*[Cap] {.preservesRecord: "Observe".} = object
|
SessionObserveSpeech*[Cap] {.preservesRecord: "Observe".} = object
|
||||||
`data`* {.preservesLiteral: "says".}: bool
|
`field0`* {.preservesLiteral: "says".}: bool
|
||||||
`observer`*: Cap
|
`observer`*: Cap
|
||||||
|
|
||||||
`Session`*[Cap] {.preservesOr.} = object
|
`Session`*[Cap] {.preservesOr.} = object
|
||||||
|
|
|
@ -112,11 +112,11 @@ type
|
||||||
WireRefKind* {.pure.} = enum
|
WireRefKind* {.pure.} = enum
|
||||||
`mine`, `yours`
|
`mine`, `yours`
|
||||||
WireRefMine* {.preservesTuple.} = object
|
WireRefMine* {.preservesTuple.} = object
|
||||||
`data`* {.preservesLiteral: "0".}: bool
|
`field0`* {.preservesLiteral: "0".}: bool
|
||||||
`oid`*: Oid
|
`oid`*: Oid
|
||||||
|
|
||||||
WireRefYours*[Cap] {.preservesTuple.} = ref object
|
WireRefYours*[Cap] {.preservesTuple.} = ref object
|
||||||
`data`* {.preservesLiteral: "1".}: bool
|
`field0`* {.preservesLiteral: "1".}: bool
|
||||||
`oid`*: Oid
|
`oid`*: Oid
|
||||||
`attenuation`* {.preservesTupleTail.}: seq[Caveat[Cap]]
|
`attenuation`* {.preservesTupleTail.}: seq[Caveat[Cap]]
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Package
|
# Package
|
||||||
|
|
||||||
version = "20230410"
|
version = "20230503"
|
||||||
author = "Emery Hemingway"
|
author = "Emery Hemingway"
|
||||||
description = "Syndicated actors for conversational concurrency"
|
description = "Syndicated actors for conversational concurrency"
|
||||||
license = "Unlicense"
|
license = "Unlicense"
|
||||||
|
|
Loading…
Reference in New Issue