wrote generator to make the type switch in Peel easy to change
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
106
pkg/relay/gen/main.go
Normal 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
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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!")
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -3,7 +3,7 @@ package relay
|
||||
import (
|
||||
"net/netip"
|
||||
"runtime"
|
||||
|
||||
|
||||
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
91
pkg/relay/peel.go
Normal 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
|
||||
}
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
|
||||
func (sm *SessionManager) SelectHops(hops []byte,
|
||||
alreadyHave Sessions) (so Sessions) {
|
||||
|
||||
|
||||
sm.Lock()
|
||||
defer sm.Unlock()
|
||||
ws := make(Sessions, 0)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)],
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user