wrote generator to make the type switch in Peel easy to change

This commit is contained in:
херетик
2023-02-20 12:16:20 +00:00
parent 4a09ff6994
commit e1b5985db2
35 changed files with 283 additions and 170 deletions

View File

@@ -3,9 +3,9 @@ package relay
import (
"sync"
"time"
"github.com/cybriq/qu"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
)
@@ -44,7 +44,7 @@ func (p *PendingResponses) GetOldestPending() (pr *PendingResponse) {
func (p *PendingResponses) Add(id nonce.ID, sentSize int, s Sessions,
billable []nonce.ID, ret nonce.ID, port uint16,
callback func(id nonce.ID, b slice.Bytes), postAcct []func()) {
p.Lock()
defer p.Unlock()
log.T.F("adding response hook %s", id)

View File

@@ -1,27 +1,11 @@
package relay
import (
"fmt"
"github.com/davecgh/go-spew/spew"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/ecdh"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/crypto/sha256"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
"git-indra.lan/indra-labs/indra/pkg/onion/delay"
"git-indra.lan/indra-labs/indra/pkg/onion/dxresponse"
"git-indra.lan/indra-labs/indra/pkg/onion/exit"
"git-indra.lan/indra-labs/indra/pkg/onion/forward"
"git-indra.lan/indra-labs/indra/pkg/onion/getbalance"
"git-indra.lan/indra-labs/indra/pkg/onion/magicbytes"
"git-indra.lan/indra-labs/indra/pkg/onion/response"
"git-indra.lan/indra-labs/indra/pkg/onion/reverse"
"git-indra.lan/indra-labs/indra/pkg/onion/session"
"git-indra.lan/indra-labs/indra/pkg/types"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
)
@@ -34,74 +18,6 @@ func Encode(on types.Onion) (b slice.Bytes) {
return
}
func Peel(b slice.Bytes, c *slice.Cursor) (on types.Onion, e error) {
switch b[*c:c.Inc(magicbytes.Len)].String() {
case balance.MagicString:
on = &balance.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case confirm.MagicString:
on = &confirm.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case crypt.MagicString:
var o crypt.Layer
if e = o.Decode(b, c); check(e) {
return
}
on = &o
case delay.MagicString:
on = &delay.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case dxresponse.MagicString:
on = &dxresponse.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case exit.MagicString:
on = &exit.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case forward.MagicString:
on = &forward.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case getbalance.MagicString:
on = &getbalance.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case reverse.MagicString:
on = &reverse.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case response.MagicString:
on = response.New()
if e = on.Decode(b, c); check(e) {
return
}
case session.MagicString:
on = &session.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
default:
e = fmt.Errorf("message magic not found")
log.T.C(func() string {
return fmt.Sprintln(e) + spew.Sdump(b.ToBytes())
})
return
}
return
}
func GenCiphers(prvs [3]*prv.Key, pubs [3]*pub.Key) (ciphers [3]sha256.Hash) {
for i := range prvs {
ciphers[2-i] = ecdh.Compute(prvs[i], pubs[i])

View File

@@ -7,7 +7,7 @@ import (
"reflect"
"testing"
"time"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
@@ -240,7 +240,7 @@ func TestOnionSkins_Layer(t *testing.T) {
}
func TestOnionSkins_Reply(t *testing.T) {
var e error
ipSizes := []int{net.IPv4len, net.IPv6len}
for i := range ipSizes {
@@ -283,7 +283,7 @@ func TestOnionSkins_Reply(t *testing.T) {
}
func TestOnionSkins_Response(t *testing.T) {
var e error
var msg slice.Bytes
var id nonce.ID
@@ -312,7 +312,7 @@ func TestOnionSkins_Response(t *testing.T) {
t.Errorf("exit message did not unwrap correctly")
t.FailNow()
}
}
func GetTwoPrvKeys(t *testing.T) (prv1, prv2 *prv.Key) {

View File

@@ -3,10 +3,10 @@ package relay
import (
"sync"
"time"
"github.com/cybriq/qu"
"go.uber.org/atomic"
"git-indra.lan/indra-labs/indra"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
@@ -37,7 +37,7 @@ type Engine struct {
func NewEngine(tpt types.Transport, hdrPrv *prv.Key, no *Node,
nodes []*Node, nReturnSessions int) (c *Engine, e error) {
no.Transport = tpt
no.IdentityPrv = hdrPrv
no.IdentityPub = pub.Derive(hdrPrv)

View File

@@ -5,10 +5,10 @@ import (
"sync"
"testing"
"time"
"github.com/cybriq/qu"
"go.uber.org/atomic"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/crypto/sha256"
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"

106
pkg/relay/gen/main.go Normal file
View File

@@ -0,0 +1,106 @@
package main
import (
"fmt"
"os"
"os/exec"
"sort"
"text/template"
"git-indra.lan/indra-labs/indra"
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
)
var (
log = log2.GetLogger(indra.PathBase)
check = log.E.Chk
)
func main() {
typesList := []string{"balance", "confirm", "crypt", "delay", "dxresponse",
"exit", "forward", "getbalance", "reverse", "response", "session"}
sort.Strings(typesList)
tpl := `package relay
//go:generate go run ./pkg/relay/gen/main.go
import (
"fmt"
"github.com/davecgh/go-spew/spew"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
"git-indra.lan/indra-labs/indra/pkg/onion/delay"
"git-indra.lan/indra-labs/indra/pkg/onion/dxresponse"
"git-indra.lan/indra-labs/indra/pkg/onion/exit"
"git-indra.lan/indra-labs/indra/pkg/onion/forward"
"git-indra.lan/indra-labs/indra/pkg/onion/getbalance"
"git-indra.lan/indra-labs/indra/pkg/onion/magicbytes"
"git-indra.lan/indra-labs/indra/pkg/onion/response"
"git-indra.lan/indra-labs/indra/pkg/onion/reverse"
"git-indra.lan/indra-labs/indra/pkg/onion/session"
"git-indra.lan/indra-labs/indra/pkg/types"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
)
func Peel(b slice.Bytes, c *slice.Cursor) (on types.Onion, e error) {
switch b[*c:c.Inc(magicbytes.Len)].String() {
{{range .}}case {{.}}.MagicString:
on = &{{.}}.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
{{end}}default:
e = fmt.Errorf("message magic not found")
log.T.C(func() string {
return fmt.Sprintln(e) + spew.Sdump(b.ToBytes())
})
return
}
return
}
`
t, e := template.New("peel").Parse(tpl)
if check(e) {
panic(e)
}
const filename = "pkg/relay/peel.go"
f, err := os.Create(filename)
if check(err) {
panic(err)
}
if e = t.Execute(f, typesList); check(e) {
panic(e)
}
if e = runCmd("go", "fmt", filename); e != nil {
os.Exit(1)
}
}
func errPrintln(a ...interface{}) {
_, _ = fmt.Fprintln(os.Stderr, a...)
}
func runCmd(cmd ...string) (err error) {
c := exec.Command(cmd[0], cmd[1:]...)
var output []byte
output, err = c.CombinedOutput()
if err == nil && string(output) != "" {
errPrintln(string(output))
}
return
}
func runCmdWithOutput(cmd ...string) (out string, err error) {
c := exec.Command(cmd[0], cmd[1:]...)
var output []byte
output, err = c.CombinedOutput()
// if err == nil && string(output) != "" {
// errPrintln(string(output))
// }
out = string(output)
return
}

View File

@@ -2,7 +2,7 @@ package relay
import (
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/types"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
@@ -10,7 +10,7 @@ import (
func (eng *Engine) balance(on *balance.Layer,
b slice.Bytes, c *slice.Cursor, prev types.Onion) {
local := eng.GetLocalNodeAddress()
pending := eng.PendingResponses.Find(on.ID)
if pending != nil {

View File

@@ -8,7 +8,7 @@ import (
func (eng *Engine) confirm(on *confirm.Layer,
b slice.Bytes, c *slice.Cursor, prev types.Onion) {
// When a confirmation arrives check if it is registered for and run the
// hook that was registered with it.
eng.PendingResponses.Delete(on.ID, nil)

View File

@@ -10,7 +10,7 @@ import (
func (eng *Engine) crypt(on *crypt.Layer, b slice.Bytes,
c *slice.Cursor, prev types.Onion) {
// this is probably an encrypted crypt for us.
hdr, _, _, identity := eng.FindCloaked(on.Cloak)
if hdr == nil {

View File

@@ -2,7 +2,7 @@ package relay
import (
"time"
"git-indra.lan/indra-labs/indra/pkg/onion/delay"
"git-indra.lan/indra-labs/indra/pkg/types"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
@@ -10,7 +10,7 @@ import (
func (eng *Engine) delay(on *delay.Layer, b slice.Bytes,
c *slice.Cursor, prev types.Onion) {
// this is a message to hold the message in the buffer until a duration
// elapses. The accounting for the remainder of the message adds a
// factor to the effective byte consumption in accordance with the time

View File

@@ -2,9 +2,9 @@ package relay
import (
"time"
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/sha256"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
"git-indra.lan/indra-labs/indra/pkg/onion/exit"
@@ -15,7 +15,7 @@ import (
func (eng *Engine) exit(ex *exit.Layer, b slice.Bytes,
c *slice.Cursor, prev types.Onion) {
// payload is forwarded to a local port and the result is forwarded
// back with a reverse header.
var e error

View File

@@ -2,7 +2,7 @@ package relay
import (
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
"git-indra.lan/indra-labs/indra/pkg/onion/forward"
"git-indra.lan/indra-labs/indra/pkg/types"
@@ -11,7 +11,7 @@ import (
func (eng *Engine) forward(on *forward.Layer, b slice.Bytes,
c *slice.Cursor, prev types.Onion) {
// forward the whole buffer received onwards. Usually there will be a
// crypt.Layer under this which will be unwrapped by the receiver.
if on.AddrPort.String() == eng.GetLocalNodeAddress().String() {

View File

@@ -2,7 +2,7 @@ package relay
import (
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
"git-indra.lan/indra-labs/indra/pkg/onion/getbalance"
@@ -12,7 +12,7 @@ import (
func (eng *Engine) getBalance(on *getbalance.Layer,
b slice.Bytes, c *slice.Cursor, prev types.Onion) {
log.T.S(on)
var found bool
var bal *balance.Layer

View File

@@ -2,7 +2,7 @@ package relay
import (
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/onion/response"
"git-indra.lan/indra-labs/indra/pkg/types"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
@@ -11,7 +11,7 @@ import (
// response is a payload from an exit message.
func (eng *Engine) response(on *response.Layer, b slice.Bytes,
cur *slice.Cursor, prev types.Onion) {
pending := eng.PendingResponses.Find(on.ID)
log.T.F("searching for pending ID %x", on.ID)
if pending != nil {

View File

@@ -2,7 +2,7 @@ package relay
import (
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/ciph"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
"git-indra.lan/indra-labs/indra/pkg/onion/reverse"
@@ -12,7 +12,7 @@ import (
func (eng *Engine) reverse(on *reverse.Layer, b slice.Bytes,
c *slice.Cursor, prev types.Onion) {
var e error
var on2 types.Onion
if on.AddrPort.String() == eng.GetLocalNodeAddress().String() {
@@ -70,5 +70,5 @@ func (eng *Engine) reverse(on *reverse.Layer, b slice.Bytes,
} else {
log.E.Ln("we do not forward nonsense! scoff! snort!")
}
}

View File

@@ -8,7 +8,7 @@ import (
func (eng *Engine) session(on *session.Layer, b slice.Bytes,
c *slice.Cursor, prev types.Onion) {
log.D.Ln(prev == nil)
log.T.F("incoming session %s", on.ID)
pi := eng.FindPendingPreimage(on.PreimageHash())

View File

@@ -3,7 +3,7 @@ package relay
import (
"fmt"
"reflect"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
@@ -71,7 +71,7 @@ func (eng *Engine) handler() (out bool) {
log.D.Ln("unpausing", eng.GetLocalNodeAddress())
break out
}
}
}
return

View File

@@ -2,9 +2,9 @@ package relay
import (
"fmt"
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/onion/session"
"git-indra.lan/indra-labs/indra/pkg/util/cryptorand"
@@ -16,7 +16,7 @@ import (
// the sessions will be paid the amount specified, not divided up.
func (eng *Engine) BuyNewSessions(amount lnwire.MilliSatoshi,
hook func()) (e error) {
var nodes [5]*Node
nodes = eng.SessionManager.SelectUnusedCircuit()
for i := range nodes {

View File

@@ -10,7 +10,7 @@ import (
// this.
func (eng *Engine) FindCloaked(clk cloak.PubKey) (hdr *prv.Key,
pld *prv.Key, sess *Session, identity bool) {
var b cloak.Blinder
copy(b[:], clk[:cloak.BlindLen])
hash := cloak.Cloak(b, eng.GetLocalNodeIdentityBytes())

View File

@@ -2,7 +2,7 @@ package relay
import (
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"

View File

@@ -3,7 +3,7 @@ package relay
import (
"net/netip"
"runtime"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
)

View File

@@ -2,7 +2,7 @@ package relay
import (
"time"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
)
@@ -10,7 +10,7 @@ import (
func (eng *Engine) SendExit(port uint16, message slice.Bytes, id nonce.ID,
target *Session, hook func(id nonce.ID, b slice.Bytes),
timeout time.Duration) {
hops := []byte{0, 1, 2, 3, 4, 5}
s := make(Sessions, len(hops))
s[2] = target
@@ -26,7 +26,7 @@ func (eng *Engine) SendExit(port uint16, message slice.Bytes, id nonce.ID,
func (eng *Engine) MakeExit(port uint16, message slice.Bytes, id nonce.ID,
target *Session) (c Circuit,
o Skins) {
hops := []byte{0, 1, 2, 3, 4, 5}
s := make(Sessions, len(hops))
s[2] = target
@@ -39,7 +39,7 @@ func (eng *Engine) MakeExit(port uint16, message slice.Bytes, id nonce.ID,
func (eng *Engine) SendExitNew(c Circuit,
o Skins, hook func(id nonce.ID, b slice.Bytes),
timeout time.Duration) {
log.D.Ln("sending out exit onion")
res := eng.PostAcctOnion(o)
eng.SendWithOneHook(c[0].AddrPort, res, hook)

View File

@@ -3,9 +3,9 @@ package relay
import (
"net/netip"
"time"
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"
@@ -19,7 +19,7 @@ import (
func (eng *Engine) SendOnion(ap *netip.AddrPort, o Skins,
responseHook func(id nonce.ID, b slice.Bytes), timeout time.Duration) {
if timeout == 0 {
timeout = DefaultTimeout
}

View File

@@ -4,9 +4,9 @@ import (
"fmt"
"net/netip"
"sync"
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
@@ -48,7 +48,7 @@ const (
func NewNode(addr *netip.AddrPort, idPub *pub.Key, idPrv *prv.Key,
tpt types.Transport, relayRate lnwire.MilliSatoshi,
local bool) (n *Node, id nonce.ID) {
id = nonce.NewID()
n = &Node{
ID: id,

View File

@@ -3,9 +3,9 @@ package relay
import (
"fmt"
"net/netip"
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
@@ -44,7 +44,7 @@ func (sm *SessionManager) SetLocalNodeAddress(addr *netip.AddrPort) {
func (sm *SessionManager) SendFromLocalNode(port uint16,
b slice.Bytes) (e error) {
sm.Lock()
defer sm.Unlock()
return sm.GetLocalNode().SendTo(port, b)

View File

@@ -19,7 +19,7 @@ import (
// have steadily increasing scores from successful pings.
func Ping(id nonce.ID, client *Session, s Circuit,
ks *signer.KeySet) Skins {
n := GenPingNonces()
return Skins{}.
Crypt(s[0].HeaderPub, nil, ks.Next(), n[0], 0).
@@ -50,7 +50,7 @@ func Ping(id nonce.ID, client *Session, s Circuit,
// remainder with noise, so it always looks like the first hop.
func SendExit(port uint16, payload slice.Bytes, id nonce.ID,
client *Session, s Circuit, ks *signer.KeySet) Skins {
var prvs [3]*prv.Key
for i := range prvs {
prvs[i] = ks.Next()
@@ -96,7 +96,7 @@ func SendExit(port uint16, payload slice.Bytes, id nonce.ID,
// the HeaderPub instead. Not allowing free relay at all prevents spam attacks.
func SendKeys(id nonce.ID, s [5]*session.Layer,
client *Session, hop []*Node, ks *signer.KeySet) Skins {
n := GenNonces(6)
sk := Skins{}
for i := range s {
@@ -116,7 +116,7 @@ func SendKeys(id nonce.ID, s [5]*session.Layer,
// being queried can be any of the 5.
func GetBalance(id, confID nonce.ID, client *Session,
s Circuit, ks *signer.KeySet) Skins {
var prvs [3]*prv.Key
for i := range prvs {
prvs[i] = ks.Next()

View File

@@ -2,7 +2,7 @@ package relay
import (
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/crypto/sha256"
"git-indra.lan/indra-labs/indra/pkg/onion/session"
@@ -20,7 +20,7 @@ type PaymentChan chan *Payment
// Send a payment on the PaymentChan.
func (pc PaymentChan) Send(amount lnwire.MilliSatoshi,
s *session.Layer) (confirmChan chan bool) {
confirmChan = make(chan bool)
pc <- &Payment{
ID: s.ID,
@@ -77,7 +77,7 @@ func (p PendingPayments) FindPreimage(pi sha256.Hash) (pp *Payment) {
func (sm *SessionManager) AddPendingPayment(
np *Payment) {
sm.Lock()
defer sm.Unlock()
log.D.F("%s adding pending payment %s for %v",
@@ -87,21 +87,21 @@ func (sm *SessionManager) AddPendingPayment(
}
func (sm *SessionManager) DeletePendingPayment(
preimage sha256.Hash) {
sm.Lock()
defer sm.Unlock()
sm.PendingPayments = sm.PendingPayments.Delete(preimage)
}
func (sm *SessionManager) FindPendingPayment(
id nonce.ID) (pp *Payment) {
sm.Lock()
defer sm.Unlock()
return sm.PendingPayments.Find(id)
}
func (sm *SessionManager) FindPendingPreimage(
pi sha256.Hash) (pp *Payment) {
log.T.F("searching preimage %x", pi)
sm.Lock()
defer sm.Unlock()

91
pkg/relay/peel.go Normal file
View File

@@ -0,0 +1,91 @@
package relay
//go:generate go run ./pkg/relay/gen/main.go
import (
"fmt"
"github.com/davecgh/go-spew/spew"
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
"git-indra.lan/indra-labs/indra/pkg/onion/delay"
"git-indra.lan/indra-labs/indra/pkg/onion/dxresponse"
"git-indra.lan/indra-labs/indra/pkg/onion/exit"
"git-indra.lan/indra-labs/indra/pkg/onion/forward"
"git-indra.lan/indra-labs/indra/pkg/onion/getbalance"
"git-indra.lan/indra-labs/indra/pkg/onion/magicbytes"
"git-indra.lan/indra-labs/indra/pkg/onion/response"
"git-indra.lan/indra-labs/indra/pkg/onion/reverse"
"git-indra.lan/indra-labs/indra/pkg/onion/session"
"git-indra.lan/indra-labs/indra/pkg/types"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
)
func Peel(b slice.Bytes, c *slice.Cursor) (on types.Onion, e error) {
switch b[*c:c.Inc(magicbytes.Len)].String() {
case balance.MagicString:
on = &balance.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case confirm.MagicString:
on = &confirm.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case crypt.MagicString:
on = &crypt.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case delay.MagicString:
on = &delay.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case dxresponse.MagicString:
on = &dxresponse.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case exit.MagicString:
on = &exit.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case forward.MagicString:
on = &forward.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case getbalance.MagicString:
on = &getbalance.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case response.MagicString:
on = &response.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case reverse.MagicString:
on = &reverse.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
case session.MagicString:
on = &session.Layer{}
if e = on.Decode(b, c); check(e) {
return
}
default:
e = fmt.Errorf("message magic not found")
log.T.C(func() string {
return fmt.Sprintln(e) + spew.Sdump(b.ToBytes())
})
return
}
return
}

View File

@@ -6,7 +6,7 @@ import (
func (sm *SessionManager) SelectHops(hops []byte,
alreadyHave Sessions) (so Sessions) {
sm.Lock()
defer sm.Unlock()
ws := make(Sessions, 0)

View File

@@ -2,7 +2,7 @@ package relay
import (
"net/netip"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
"git-indra.lan/indra-labs/indra/pkg/util/slice"
)
@@ -10,8 +10,8 @@ import (
// SendWithOneHook is used for onions with only one confirmation hook. Usually
// as returned from PostAcctOnion this is the last, confirmation or response
// layer in an onion.Skins.
func (eng *Engine) SendWithOneHook(ap *netip.AddrPort, res SendData, responseHook func(id nonce.ID, b slice.Bytes), ) {
func (eng *Engine) SendWithOneHook(ap *netip.AddrPort, res SendData, responseHook func(id nonce.ID, b slice.Bytes)) {
if responseHook == nil {
responseHook = func(_ nonce.ID, _ slice.Bytes) {
log.D.Ln("nil response hook")

View File

@@ -2,9 +2,9 @@ package relay
import (
"encoding/hex"
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
@@ -35,7 +35,7 @@ func NewSession(
pldPrv *prv.Key,
hop byte,
) (s *Session) {
var e error
if hdrPrv == nil || pldPrv == nil {
if hdrPrv, e = prv.GenerateKey(); check(e) {

View File

@@ -2,9 +2,9 @@ package relay
import (
"sync"
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
@@ -52,7 +52,7 @@ func (sm *SessionManager) ClearSessions() {
func (sm *SessionManager) IncSession(id nonce.ID, sats lnwire.MilliSatoshi,
sender bool, typ string) {
sess := sm.FindSession(id)
if sess != nil {
sm.Lock()
@@ -62,7 +62,7 @@ func (sm *SessionManager) IncSession(id nonce.ID, sats lnwire.MilliSatoshi,
}
func (sm *SessionManager) DecSession(id nonce.ID, sats lnwire.MilliSatoshi,
sender bool, typ string) bool {
sess := sm.FindSession(id)
if sess != nil {
sm.Lock()
@@ -74,7 +74,7 @@ func (sm *SessionManager) DecSession(id nonce.ID, sats lnwire.MilliSatoshi,
func (sm *SessionManager) GetNodeCircuit(id nonce.ID) (sce *Circuit,
exists bool) {
sm.Lock()
defer sm.Unlock()
sce, exists = sm.SessionCache[id]
@@ -183,7 +183,7 @@ func (sm *SessionManager) IterateSessions(fn func(s *Session) bool) {
// Do not call SessionManager methods within this function.
func (sm *SessionManager) IterateSessionCache(fn func(n *Node,
c *Circuit) bool) {
sm.Lock()
defer sm.Unlock()
out:

View File

@@ -3,9 +3,9 @@ package relay
import (
"net/netip"
"time"
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
@@ -30,19 +30,19 @@ var nop = &noop.Layer{}
func (o Skins) ForwardCrypt(s *Session, k *prv.Key,
n nonce.IV) Skins {
return o.Forward(s.AddrPort).Crypt(s.HeaderPub, s.PayloadPub, k, n, 0)
}
func (o Skins) ReverseCrypt(s *Session, k *prv.Key, n nonce.IV,
seq int) Skins {
return o.Reverse(s.AddrPort).Crypt(s.HeaderPub, s.PayloadPub, k, n, seq)
}
func (o Skins) ForwardSession(s *Node,
k *prv.Key, n nonce.IV, sess *session.Layer) Skins {
return o.Forward(s.AddrPort).
Crypt(s.IdentityPub, nil, k, n, 0).
Session(sess)
@@ -50,7 +50,7 @@ func (o Skins) ForwardSession(s *Node,
func (o Skins) Balance(id, confID nonce.ID,
amt lnwire.MilliSatoshi) Skins {
return append(o, &balance.Layer{
ID: id,
ConfID: confID,
@@ -68,7 +68,7 @@ func (o Skins) Delay(d time.Duration) Skins {
func (o Skins) Exit(port uint16, prvs [3]*prv.Key, pubs [3]*pub.Key,
nonces [3]nonce.IV, id nonce.ID, payload slice.Bytes) Skins {
return append(o, &exit.Layer{
Port: port,
Ciphers: GenCiphers(prvs, pubs),
@@ -89,7 +89,7 @@ func (o Skins) Forward(addr *netip.AddrPort) Skins {
func (o Skins) GetBalance(id, confID nonce.ID, prvs [3]*prv.Key,
pubs [3]*pub.Key, nonces [3]nonce.IV) Skins {
return append(o, &getbalance.Layer{
ID: id,
ConfID: confID,
@@ -101,7 +101,7 @@ func (o Skins) GetBalance(id, confID nonce.ID, prvs [3]*prv.Key,
func (o Skins) Crypt(toHdr, toPld *pub.Key, from *prv.Key, n nonce.IV,
depth int) Skins {
return append(o, &crypt.Layer{
Depth: depth,
ToHeaderPub: toHdr,

View File

@@ -17,7 +17,7 @@ func BudgeUp(b slice.Bytes, start slice.Cursor) (o slice.Bytes) {
func FormatReply(header, res slice.Bytes, ciphers [3]sha256.Hash,
nonces [3]nonce.IV) (rb slice.Bytes) {
rb = make(slice.Bytes, crypt.ReverseHeaderLen+len(res))
cur := slice.NewCursor()
copy(rb[*cur:cur.Inc(crypt.ReverseHeaderLen)],

View File

@@ -10,7 +10,7 @@ import (
)
func CreateNMockCircuits(inclSessions bool, nCircuits int, nReturnSessions int) (cl []*Engine, e error) {
nTotal := 1 + nCircuits*5
cl = make([]*Engine, nTotal)
nodes := make([]*Node, nTotal)