intro, service and peer messages defined, start of data store
This commit is contained in:
4
go.mod
4
go.mod
@@ -14,6 +14,7 @@ require (
|
||||
github.com/gookit/color v1.5.2
|
||||
github.com/ipfs/go-datastore v0.6.0
|
||||
github.com/ipfs/go-ds-badger v0.3.0
|
||||
github.com/ipfs/go-ds-badger2 v0.1.3
|
||||
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0
|
||||
github.com/libp2p/go-libp2p v0.24.2
|
||||
github.com/libp2p/go-libp2p-kad-dht v0.20.0
|
||||
@@ -39,6 +40,7 @@ require (
|
||||
require (
|
||||
github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect
|
||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
|
||||
github.com/DataDog/zstd v1.4.1 // indirect
|
||||
github.com/Microsoft/go-winio v0.6.0 // indirect
|
||||
github.com/Microsoft/hcsshim v0.9.6 // indirect
|
||||
github.com/aead/siphash v1.0.1 // indirect
|
||||
@@ -68,7 +70,9 @@ require (
|
||||
github.com/decred/dcrd/crypto/blake256 v1.0.0 // indirect
|
||||
github.com/decred/dcrd/lru v1.0.0 // indirect
|
||||
github.com/dgraph-io/badger v1.6.2 // indirect
|
||||
github.com/dgraph-io/badger/v2 v2.2007.3 // indirect
|
||||
github.com/dgraph-io/ristretto v0.1.1 // indirect
|
||||
github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect
|
||||
github.com/docker/distribution v2.8.1+incompatible // indirect
|
||||
github.com/docker/docker-credential-helpers v0.7.0 // indirect
|
||||
github.com/docker/go-connections v0.4.0 // indirect
|
||||
|
||||
10
go.sum
10
go.sum
@@ -67,6 +67,8 @@ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBp
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM=
|
||||
github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
|
||||
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
|
||||
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
|
||||
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||
@@ -387,9 +389,12 @@ github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0
|
||||
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
|
||||
github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8=
|
||||
github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE=
|
||||
github.com/dgraph-io/badger/v2 v2.2007.3 h1:Sl9tQWz92WCbVSe8pj04Tkqlm2boW+KAxd+XSs58SQI=
|
||||
github.com/dgraph-io/badger/v2 v2.2007.3/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE=
|
||||
github.com/dgraph-io/badger/v3 v3.2103.5 h1:ylPa6qzbjYRQMU6jokoj4wzcaweHylt//CH0AKt0akg=
|
||||
github.com/dgraph-io/badger/v3 v3.2103.5/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw=
|
||||
github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
|
||||
github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E=
|
||||
github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8=
|
||||
github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA=
|
||||
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
@@ -572,6 +577,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
|
||||
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
|
||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
|
||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
@@ -708,12 +714,15 @@ github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj
|
||||
github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc=
|
||||
github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw=
|
||||
github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk=
|
||||
github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk=
|
||||
github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk=
|
||||
github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8=
|
||||
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
|
||||
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
|
||||
github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro=
|
||||
github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek=
|
||||
github.com/ipfs/go-ds-badger2 v0.1.3 h1:Zo9JicXJ1DmXTN4KOw7oPXkspZ0AWHcAFCP1tQKnegg=
|
||||
github.com/ipfs/go-ds-badger2 v0.1.3/go.mod h1:TPhhljfrgewjbtuL/tczP8dNrBYwwk+SdPYbms/NO9w=
|
||||
github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo=
|
||||
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
|
||||
github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8=
|
||||
@@ -724,6 +733,7 @@ github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8=
|
||||
github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo=
|
||||
github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw=
|
||||
github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g=
|
||||
github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
|
||||
github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY=
|
||||
github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI=
|
||||
github.com/ipld/go-ipld-prime v0.9.0 h1:N2OjJMb+fhyFPwPnVvJcWU/NsumP8etal+d2v3G4eww=
|
||||
|
||||
26
pkg/engine/db/database.go
Normal file
26
pkg/engine/db/database.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
badger "github.com/ipfs/go-ds-badger2"
|
||||
|
||||
"git-indra.lan/indra-labs/indra"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
)
|
||||
|
||||
var (
|
||||
log = log2.GetLogger(indra.PathBase)
|
||||
fails = log.E.Chk
|
||||
)
|
||||
|
||||
type Database struct {
|
||||
*badger.Datastore
|
||||
}
|
||||
|
||||
func New(path string) (db *Database, e error) {
|
||||
var ds *badger.Datastore
|
||||
ds, e = badger.NewDatastore(path, nil)
|
||||
if fails(e) {
|
||||
return
|
||||
}
|
||||
return &Database{ds}, nil
|
||||
}
|
||||
1
pkg/engine/db/database_test.go
Normal file
1
pkg/engine/db/database_test.go
Normal file
@@ -0,0 +1 @@
|
||||
package db
|
||||
@@ -1,183 +0,0 @@
|
||||
package onions
|
||||
|
||||
import (
|
||||
"net/netip"
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
"github.com/gookit/color"
|
||||
|
||||
"git-indra.lan/indra-labs/indra/pkg/crypto"
|
||||
"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/engine/coding"
|
||||
"git-indra.lan/indra-labs/indra/pkg/engine/magic"
|
||||
"git-indra.lan/indra-labs/indra/pkg/engine/node"
|
||||
"git-indra.lan/indra-labs/indra/pkg/engine/sess"
|
||||
"git-indra.lan/indra-labs/indra/pkg/engine/sessions"
|
||||
"git-indra.lan/indra-labs/indra/pkg/util/qu"
|
||||
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
||||
"git-indra.lan/indra-labs/indra/pkg/util/splice"
|
||||
)
|
||||
|
||||
const (
|
||||
AddrMagic = "addr"
|
||||
AddrLen = magic.Len +
|
||||
nonce.IDLen +
|
||||
crypto.PubKeyLen + 1 +
|
||||
splice.AddrLen +
|
||||
slice.Uint64Len +
|
||||
crypto.SigLen
|
||||
)
|
||||
|
||||
type Addr struct {
|
||||
ID nonce.ID // This ensures never a repeated signed message.
|
||||
Key *crypto.Pub // Identity key.
|
||||
AddrPort *netip.AddrPort // Introducer address.
|
||||
Expiry time.Time
|
||||
Sig crypto.SigBytes
|
||||
}
|
||||
|
||||
func addrGen() coding.Codec { return &Addr{} }
|
||||
func init() { Register(AddrMagic, addrGen) }
|
||||
func (x *Addr) Magic() string { return AddrMagic }
|
||||
func (x *Addr) Len() int { return AddrLen }
|
||||
func (x *Addr) Wrap(inner Onion) {}
|
||||
func (x *Addr) GetOnion() interface{} { return x }
|
||||
|
||||
func NewAddr(id nonce.ID, key *crypto.Prv, addr *netip.AddrPort,
|
||||
expires time.Time) (in *Addr) {
|
||||
|
||||
pk := crypto.DerivePub(key)
|
||||
s := splice.New(AddrLen - magic.Len)
|
||||
s.ID(id).
|
||||
Pubkey(pk).
|
||||
AddrPort(addr).
|
||||
Uint64(uint64(expires.UnixNano()))
|
||||
hash := sha256.Single(s.GetUntil(s.GetCursor()))
|
||||
var e error
|
||||
var sign crypto.SigBytes
|
||||
if sign, e = crypto.Sign(key, hash); fails(e) {
|
||||
return nil
|
||||
}
|
||||
in = &Addr{
|
||||
ID: id,
|
||||
Key: pk,
|
||||
AddrPort: addr,
|
||||
Expiry: expires,
|
||||
Sig: sign,
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (x *Addr) Validate() bool {
|
||||
s := splice.New(AddrLen - magic.Len)
|
||||
s.ID(x.ID).
|
||||
Pubkey(x.Key).
|
||||
AddrPort(x.AddrPort).
|
||||
Uint64(uint64(x.Expiry.UnixNano()))
|
||||
hash := sha256.Single(s.GetUntil(s.GetCursor()))
|
||||
key, e := x.Sig.Recover(hash)
|
||||
if fails(e) {
|
||||
return false
|
||||
}
|
||||
if key.Equals(x.Key) && x.Expiry.After(time.Now()) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *Addr) Splice(s *splice.Splice) {
|
||||
s.ID(x.ID).
|
||||
Pubkey(x.Key).
|
||||
AddrPort(x.AddrPort).
|
||||
Uint64(uint64(x.Expiry.UnixNano())).
|
||||
Signature(x.Sig)
|
||||
}
|
||||
|
||||
func (x *Addr) Encode(s *splice.Splice) (e error) {
|
||||
log.T.S("encoding", reflect.TypeOf(x),
|
||||
x.ID, x.Expiry, x.Sig,
|
||||
)
|
||||
x.Splice(s.Magic(AddrMagic))
|
||||
return
|
||||
}
|
||||
|
||||
func (x *Addr) Decode(s *splice.Splice) (e error) {
|
||||
if e = magic.TooShort(s.Remaining(), AddrLen-magic.Len,
|
||||
AddrMagic); fails(e) {
|
||||
|
||||
return
|
||||
}
|
||||
s.ReadID(&x.ID).
|
||||
ReadPubkey(&x.Key).
|
||||
ReadAddrPort(&x.AddrPort).
|
||||
ReadTime(&x.Expiry).
|
||||
ReadSignature(&x.Sig)
|
||||
return
|
||||
}
|
||||
|
||||
func (x *Addr) Handle(s *splice.Splice, p Onion, ng Ngin) (e error) {
|
||||
ng.GetHidden().Lock()
|
||||
valid := x.Validate()
|
||||
if valid {
|
||||
log.T.Ln(ng.Mgr().GetLocalNodeAddressString(), "validated intro", x.ID)
|
||||
kb := x.Key.ToBytes()
|
||||
if _, ok := ng.GetHidden().KnownIntros[x.Key.ToBytes()]; ok {
|
||||
log.D.Ln(ng.Mgr().GetLocalNodeAddressString(), "already have intro")
|
||||
ng.Pending().ProcessAndDelete(x.ID, &kb, s.GetAll())
|
||||
ng.GetHidden().Unlock()
|
||||
return
|
||||
}
|
||||
log.D.F("%s storing intro for %s %s",
|
||||
ng.Mgr().GetLocalNodeAddressString(), x.Key.ToBase32Abbreviated(),
|
||||
x.ID)
|
||||
// ng.GetHidden().KnownIntros[x.Key.ToBytes()] = x
|
||||
var ok bool
|
||||
if ok, e = ng.Pending().ProcessAndDelete(x.ID, &kb,
|
||||
s.GetAll()); ok || fails(e) {
|
||||
|
||||
ng.GetHidden().Unlock()
|
||||
log.D.Ln("deleted pending response", x.ID)
|
||||
return
|
||||
}
|
||||
log.D.F("%s sending out intro to %s to all known peers",
|
||||
ng.Mgr().GetLocalNodeAddressString(), x.Key.ToBase32Abbreviated())
|
||||
sender := ng.Mgr().FindNodeByIdentity(x.Key)
|
||||
nn := make(map[nonce.ID]*node.Node)
|
||||
ng.Mgr().ForEachNode(func(n *node.Node) bool {
|
||||
if n.ID != sender.ID {
|
||||
nn[n.ID] = n
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
counter := 0
|
||||
for i := range nn {
|
||||
log.T.F("sending intro to %s", color.Yellow.Sprint(nn[i].AddrPort.
|
||||
String()))
|
||||
nn[i].Transport.Send(s.GetAll())
|
||||
counter++
|
||||
if counter < 2 {
|
||||
continue
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
ng.GetHidden().Unlock()
|
||||
return
|
||||
}
|
||||
|
||||
func (x *Addr) Account(res *sess.Data, sm *sess.Manager,
|
||||
s *sessions.Data, last bool) (skip bool, sd *sessions.Data) {
|
||||
|
||||
res.ID = x.ID
|
||||
return
|
||||
}
|
||||
|
||||
func (x *Addr) Gossip(sm *sess.Manager, c qu.C) {
|
||||
log.D.F("propagating peer info for %s",
|
||||
x.Key.ToBase32Abbreviated())
|
||||
Gossip(x, sm, c)
|
||||
log.T.Ln("finished broadcasting peer info")
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
package onions
|
||||
|
||||
import (
|
||||
"net/netip"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git-indra.lan/indra-labs/indra/pkg/crypto"
|
||||
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
|
||||
"git-indra.lan/indra-labs/indra/pkg/engine/coding"
|
||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||
)
|
||||
|
||||
func TestOnionSkins_Addr(t *testing.T) {
|
||||
log2.SetLogLevel(log2.Debug)
|
||||
var e error
|
||||
pr, ks, _ := crypto.NewSigner()
|
||||
id := nonce.NewID()
|
||||
// in := NewAddr(id, pr, time.Now().Add(time.Hour))
|
||||
var prvs crypto.Privs
|
||||
for i := range prvs {
|
||||
prvs[i] = ks.Next()
|
||||
}
|
||||
var pubs crypto.Pubs
|
||||
for i := range pubs {
|
||||
pubs[i] = crypto.DerivePub(prvs[i])
|
||||
}
|
||||
var ap netip.AddrPort
|
||||
ap, e = netip.ParseAddrPort("127.0.0.1:1025")
|
||||
on1 := Skins{}.
|
||||
Addr(id, pr, time.Now().Add(time.Hour), &ap)
|
||||
on1 = append(on1, &End{})
|
||||
on := on1.Assemble()
|
||||
s := Encode(on)
|
||||
log.D.S(s.GetAll().ToBytes())
|
||||
s.SetCursor(0)
|
||||
var onc coding.Codec
|
||||
if onc = Recognise(s); onc == nil {
|
||||
t.Error("did not unwrap")
|
||||
t.FailNow()
|
||||
}
|
||||
if e = onc.Decode(s); fails(e) {
|
||||
t.Error("did not decode")
|
||||
t.FailNow()
|
||||
}
|
||||
log.D.S(onc)
|
||||
var peer *Addr
|
||||
var ok bool
|
||||
if peer, ok = onc.(*Addr); !ok {
|
||||
t.Error("did not unwrap expected type")
|
||||
t.FailNow()
|
||||
}
|
||||
if !peer.Validate() {
|
||||
t.Errorf("received Addr did not validate")
|
||||
t.FailNow()
|
||||
}
|
||||
}
|
||||
@@ -36,8 +36,8 @@ type Intro struct {
|
||||
ID nonce.ID // Ensures never a repeated signature.
|
||||
Key *crypto.Pub // Hidden service address.
|
||||
AddrPort *netip.AddrPort // Introducer address.
|
||||
Port uint16 // Well known port of protocol available.
|
||||
RelayRate uint32 // mSat/Mb
|
||||
Port uint16
|
||||
Expiry time.Time
|
||||
Sig crypto.SigBytes
|
||||
}
|
||||
@@ -54,8 +54,12 @@ func NewIntro(id nonce.ID, key *crypto.Prv, ap *netip.AddrPort,
|
||||
|
||||
pk := crypto.DerivePub(key)
|
||||
s := splice.New(IntroLen - magic.Len)
|
||||
s.ID(id).Pubkey(pk).AddrPort(ap).Uint64(uint64(expires.
|
||||
UnixNano()))
|
||||
s.ID(id).
|
||||
Pubkey(pk).
|
||||
AddrPort(ap).
|
||||
Uint32(relayRate).
|
||||
Uint16(port).
|
||||
Uint64(uint64(expires.UnixNano()))
|
||||
hash := sha256.Single(s.GetUntil(s.GetCursor()))
|
||||
var e error
|
||||
var sign crypto.SigBytes
|
||||
@@ -76,8 +80,12 @@ func NewIntro(id nonce.ID, key *crypto.Prv, ap *netip.AddrPort,
|
||||
|
||||
func (x *Intro) Validate() bool {
|
||||
s := splice.New(IntroLen - magic.Len)
|
||||
s.ID(x.ID).Pubkey(x.Key).AddrPort(x.AddrPort).Uint64(uint64(x.Expiry.
|
||||
UnixNano()))
|
||||
s.ID(x.ID).
|
||||
Pubkey(x.Key).
|
||||
AddrPort(x.AddrPort).
|
||||
Uint32(x.RelayRate).
|
||||
Uint16(x.Port).
|
||||
Uint64(uint64(x.Expiry.UnixNano()))
|
||||
hash := sha256.Single(s.GetUntil(s.GetCursor()))
|
||||
key, e := x.Sig.Recover(hash)
|
||||
if fails(e) {
|
||||
|
||||
@@ -215,20 +215,13 @@ func (o Skins) Message(msg *Message, ks *crypto.KeySet) Skins {
|
||||
msg)
|
||||
}
|
||||
|
||||
func (o Skins) Peer(id nonce.ID, key *crypto.Prv,
|
||||
expires time.Time) (sk Skins) {
|
||||
return append(o, NewPeer(id, key, expires))
|
||||
}
|
||||
|
||||
func (o Skins) Addr(id nonce.ID, key *crypto.Prv, expires time.Time,
|
||||
addr *netip.AddrPort) (sk Skins) {
|
||||
|
||||
return append(o, NewAddr(id, key, addr, expires))
|
||||
func (o Skins) Peer(id nonce.ID, key *crypto.Prv, relayRate uint32, expires time.Time) (sk Skins) {
|
||||
return append(o, NewPeer(id, key, expires, relayRate))
|
||||
}
|
||||
|
||||
func (o Skins) Service(id nonce.ID, key *crypto.Prv,
|
||||
expires time.Time) (sk Skins) {
|
||||
return append(o, NewService(id, key, expires))
|
||||
return append(o, NewService(id, key, 0, 0, expires))
|
||||
}
|
||||
|
||||
func (o Skins) Ready(id nonce.ID, addr *crypto.Pub, fwHeader,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package onions
|
||||
|
||||
import (
|
||||
"net/netip"
|
||||
"reflect"
|
||||
"time"
|
||||
|
||||
@@ -25,6 +26,7 @@ const (
|
||||
nonce.IDLen +
|
||||
crypto.PubKeyLen + 1 +
|
||||
splice.AddrLen +
|
||||
slice.Uint32Len +
|
||||
slice.Uint64Len +
|
||||
crypto.SigLen
|
||||
)
|
||||
@@ -32,7 +34,8 @@ const (
|
||||
type Peer struct {
|
||||
ID nonce.ID // This ensures never a repeated signed message.
|
||||
Key *crypto.Pub // Identity key.
|
||||
RelayRate uint64
|
||||
AddrPort *netip.AddrPort
|
||||
RelayRate uint32
|
||||
Expiry time.Time
|
||||
Sig crypto.SigBytes
|
||||
}
|
||||
@@ -44,13 +47,15 @@ func (x *Peer) Len() int { return PeerLen }
|
||||
func (x *Peer) Wrap(inner Onion) {}
|
||||
func (x *Peer) GetOnion() interface{} { return x }
|
||||
|
||||
func NewPeer(id nonce.ID, key *crypto.Prv,
|
||||
expires time.Time) (in *Peer) {
|
||||
func NewPeer(id nonce.ID, key *crypto.Prv, expires time.Time,
|
||||
relayRate uint32) (in *Peer) {
|
||||
|
||||
pk := crypto.DerivePub(key)
|
||||
s := splice.New(IntroLen - magic.Len)
|
||||
s.ID(id).Pubkey(pk).Uint64(uint64(expires.
|
||||
UnixNano()))
|
||||
s.ID(id).
|
||||
Pubkey(pk).
|
||||
Uint32(relayRate).
|
||||
Uint64(uint64(expires.UnixNano()))
|
||||
hash := sha256.Single(s.GetUntil(s.GetCursor()))
|
||||
var e error
|
||||
var sign crypto.SigBytes
|
||||
@@ -58,18 +63,21 @@ func NewPeer(id nonce.ID, key *crypto.Prv,
|
||||
return nil
|
||||
}
|
||||
in = &Peer{
|
||||
ID: id,
|
||||
Key: pk,
|
||||
Expiry: expires,
|
||||
Sig: sign,
|
||||
ID: id,
|
||||
Key: pk,
|
||||
RelayRate: relayRate,
|
||||
Expiry: expires,
|
||||
Sig: sign,
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (x *Peer) Validate() bool {
|
||||
s := splice.New(PeerLen - magic.Len)
|
||||
s.ID(x.ID).Pubkey(x.Key).Uint64(uint64(x.Expiry.
|
||||
UnixNano()))
|
||||
s.ID(x.ID).
|
||||
Pubkey(x.Key).
|
||||
Uint32(x.RelayRate).
|
||||
Uint64(uint64(x.Expiry.UnixNano()))
|
||||
hash := sha256.Single(s.GetUntil(s.GetCursor()))
|
||||
key, e := x.Sig.Recover(hash)
|
||||
if fails(e) {
|
||||
@@ -84,6 +92,7 @@ func (x *Peer) Validate() bool {
|
||||
func (x *Peer) Splice(s *splice.Splice) {
|
||||
s.ID(x.ID).
|
||||
Pubkey(x.Key).
|
||||
Uint32(x.RelayRate).
|
||||
Uint64(uint64(x.Expiry.UnixNano())).
|
||||
Signature(x.Sig)
|
||||
}
|
||||
@@ -104,6 +113,7 @@ func (x *Peer) Decode(s *splice.Splice) (e error) {
|
||||
}
|
||||
s.ReadID(&x.ID).
|
||||
ReadPubkey(&x.Key).
|
||||
ReadUint32(&x.RelayRate).
|
||||
ReadTime(&x.Expiry).
|
||||
ReadSignature(&x.Sig)
|
||||
return
|
||||
|
||||
@@ -25,7 +25,7 @@ func TestOnionSkins_Peer(t *testing.T) {
|
||||
pubs[i] = crypto.DerivePub(prvs[i])
|
||||
}
|
||||
on1 := Skins{}.
|
||||
Peer(id, pr, time.Now().Add(time.Hour))
|
||||
Peer(id, pr, 20000, time.Now().Add(time.Hour))
|
||||
on1 = append(on1, &End{})
|
||||
on := on1.Assemble()
|
||||
s := Encode(on)
|
||||
|
||||
@@ -33,8 +33,8 @@ const (
|
||||
type Service struct {
|
||||
ID nonce.ID // This ensures never a repeated signed message.
|
||||
Key *crypto.Pub // Identity key.
|
||||
Port uint16
|
||||
RelayRate uint64
|
||||
Port uint16 // Well known port designating service protocol.
|
||||
RelayRate uint32 // Fee rate in mSat/Mb
|
||||
Expiry time.Time
|
||||
Sig crypto.SigBytes
|
||||
}
|
||||
@@ -46,13 +46,16 @@ func (x *Service) Len() int { return ServiceLen }
|
||||
func (x *Service) Wrap(inner Onion) {}
|
||||
func (x *Service) GetOnion() interface{} { return x }
|
||||
|
||||
func NewService(id nonce.ID, key *crypto.Prv,
|
||||
expires time.Time) (in *Service) {
|
||||
func NewService(id nonce.ID, key *crypto.Prv, port uint16, relayRate uint32,
|
||||
expiry time.Time) (in *Service) {
|
||||
|
||||
pk := crypto.DerivePub(key)
|
||||
s := splice.New(ServiceLen - magic.Len)
|
||||
s.ID(id).Pubkey(pk).Uint64(uint64(expires.
|
||||
UnixNano()))
|
||||
s.ID(id).
|
||||
Pubkey(pk).
|
||||
Uint16(port).
|
||||
Uint32(relayRate).
|
||||
Uint64(uint64(expiry.UnixNano()))
|
||||
hash := sha256.Single(s.GetUntil(s.GetCursor()))
|
||||
var e error
|
||||
var sign crypto.SigBytes
|
||||
@@ -60,18 +63,23 @@ func NewService(id nonce.ID, key *crypto.Prv,
|
||||
return nil
|
||||
}
|
||||
in = &Service{
|
||||
ID: id,
|
||||
Key: pk,
|
||||
Expiry: expires,
|
||||
Sig: sign,
|
||||
ID: id,
|
||||
Key: pk,
|
||||
Port: port,
|
||||
RelayRate: relayRate,
|
||||
Expiry: expiry,
|
||||
Sig: sign,
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (x *Service) Validate() bool {
|
||||
s := splice.New(ServiceLen - magic.Len)
|
||||
s.ID(x.ID).Pubkey(x.Key).Uint64(uint64(x.Expiry.
|
||||
UnixNano()))
|
||||
s.ID(x.ID).
|
||||
Pubkey(x.Key).
|
||||
Uint16(x.Port).
|
||||
Uint32(x.RelayRate).
|
||||
Uint64(uint64(x.Expiry.UnixNano()))
|
||||
hash := sha256.Single(s.GetUntil(s.GetCursor()))
|
||||
key, e := x.Sig.Recover(hash)
|
||||
if fails(e) {
|
||||
@@ -86,6 +94,8 @@ func (x *Service) Validate() bool {
|
||||
func (x *Service) Splice(s *splice.Splice) {
|
||||
s.ID(x.ID).
|
||||
Pubkey(x.Key).
|
||||
Uint16(x.Port).
|
||||
Uint32(x.RelayRate).
|
||||
Uint64(uint64(x.Expiry.UnixNano())).
|
||||
Signature(x.Sig)
|
||||
}
|
||||
@@ -106,6 +116,8 @@ func (x *Service) Decode(s *splice.Splice) (e error) {
|
||||
}
|
||||
s.ReadID(&x.ID).
|
||||
ReadPubkey(&x.Key).
|
||||
ReadUint16(&x.Port).
|
||||
ReadUint32(&x.RelayRate).
|
||||
ReadTime(&x.Expiry).
|
||||
ReadSignature(&x.Sig)
|
||||
return
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package onions
|
||||
|
||||
import (
|
||||
"net/netip"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -25,10 +24,8 @@ func TestOnionSkins_Service(t *testing.T) {
|
||||
for i := range pubs {
|
||||
pubs[i] = crypto.DerivePub(prvs[i])
|
||||
}
|
||||
var ap netip.AddrPort
|
||||
ap, e = netip.ParseAddrPort("127.0.0.1:1025")
|
||||
on1 := Skins{}.
|
||||
Addr(id, pr, time.Now().Add(time.Hour), &ap)
|
||||
Service(id, pr, time.Now().Add(time.Hour))
|
||||
on1 = append(on1, &End{})
|
||||
on := on1.Assemble()
|
||||
s := Encode(on)
|
||||
@@ -44,13 +41,13 @@ func TestOnionSkins_Service(t *testing.T) {
|
||||
t.FailNow()
|
||||
}
|
||||
log.D.S(onc)
|
||||
var peer *Addr
|
||||
var svc *Service
|
||||
var ok bool
|
||||
if peer, ok = onc.(*Addr); !ok {
|
||||
if svc, ok = onc.(*Service); !ok {
|
||||
t.Error("did not unwrap expected type")
|
||||
t.FailNow()
|
||||
}
|
||||
if !peer.Validate() {
|
||||
if !svc.Validate() {
|
||||
t.Errorf("received Addr did not validate")
|
||||
t.FailNow()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user