diff --git a/.gitignore b/.gitignore index 3751227..a302976 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,5 @@ itp-golang-github-eyedeekay-gosam.txt .pc deb/ samsocks/samsocks +*.private +*.public.txt \ No newline at end of file diff --git a/client.go b/client.go index d484db9..08913af 100644 --- a/client.go +++ b/client.go @@ -13,8 +13,7 @@ import ( "strings" "sync" "time" - - samkeys "github.com/eyedeekay/goSam/compat" + //samkeys "github.com/eyedeekay/goSam/compat" ) // A Client represents a single Connection to the SAM bridge @@ -195,11 +194,8 @@ func (p *Client) ID() string { // Addr returns the address of the client as a net.Addr func (p *Client) Addr() net.Addr { - keys, err := samkeys.DestToKeys(p.Destination()) - if err != nil { - return nil - } - return keys.Addr() + keys := I2PAddr(p.Destination()) + return keys } func (p *Client) LocalAddr() net.Addr { diff --git a/client_test.go b/client_test.go index b7363a1..4db321b 100644 --- a/client_test.go +++ b/client_test.go @@ -7,21 +7,20 @@ import "testing" import ( "fmt" - "math" - "math/rand" - "time" + // "math" + // "math/rand" + // "time" //"log" "net/http" - - "github.com/eyedeekay/sam3/helper" - "github.com/eyedeekay/sam3/i2pkeys" + //"github.com/eyedeekay/sam3/helper" + //"github.com/eyedeekay/sam3/i2pkeys" ) func HelloServer(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:]) } -func TestCompositeClient(t *testing.T) { +/*func TestCompositeClient(t *testing.T) { listener, err := sam.I2PListener("testservice"+fmt.Sprintf("%d", rand.Int31n(math.MaxInt32)), "127.0.0.1:7656", "testkeys") if err != nil { t.Fatalf("Listener() Error: %q\n", err) @@ -86,7 +85,7 @@ func TestCompositeClient(t *testing.T) { }() time.Sleep(time.Second * 45) -} +}*/ func TestClientHello(t *testing.T) { client, err := NewClientFromOptions(SetDebug(false)) diff --git a/compat/compat.go b/compat/compat.go deleted file mode 100644 index aa48623..0000000 --- a/compat/compat.go +++ /dev/null @@ -1,23 +0,0 @@ -package samkeys - -import ( - "fmt" - "github.com/eyedeekay/sam3/i2pkeys" - "strings" -) - -func DestToKeys(dest string) (i2pkeys.I2PKeys, error) { - addr, err := i2pkeys.NewI2PAddrFromString(dest) - if err != nil { - return i2pkeys.I2PKeys{}, err - } - return i2pkeys.NewKeys(addr, dest), nil -} - -func KeysToDest(keys i2pkeys.I2PKeys) (string, error) { - pksk := strings.SplitN(keys.String(), "\n", 2) - if len(pksk) != 2 { - return "", fmt.Errorf("Error converting from keys to destination") - } - return pksk[1], nil -} diff --git a/go.mod b/go.mod index baeaa47..c53e185 100644 --- a/go.mod +++ b/go.mod @@ -1,17 +1,19 @@ module github.com/eyedeekay/goSam require ( - github.com/eyedeekay/sam3 v0.32.32 + github.com/getlantern/fdcount v0.0.0-20210503151800-5decd65b3731 // indirect github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5 github.com/getlantern/golog v0.0.0-20201105130739-9586b8bde3a9 // indirect + github.com/getlantern/mockconn v0.0.0-20200818071412-cb30d065a848 // indirect + github.com/getlantern/mtime v0.0.0-20200417132445-23682092d1f7 // indirect github.com/getlantern/netx v0.0.0-20190110220209-9912de6f94fd // indirect github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6 // indirect ) //replace github.com/eyedeekay/gosam v0.1.1-0.20190814195658-27e786578944 => github.com/eyedeekay/goSam ./ -replace github.com/eyedeekay/gosam v0.32.1 => ./ +replace github.com/eyedeekay/gosam => ./ -replace github.com/eyedeekay/goSam v0.32.1 => ./ +replace github.com/eyedeekay/goSam => ./ go 1.13 diff --git a/go.sum b/go.sum index 025b160..a5c547a 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,12 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/eyedeekay/ramp v0.0.0-20190429201811-305b382042ab h1:EfTRHxGSbiaEyxNzvKRBWVIDw3mD8xXGxj4gvwFzY7Q= -github.com/eyedeekay/ramp v0.0.0-20190429201811-305b382042ab/go.mod h1:h7mvUAMgZ/rtRDUOkvKTK+8LnDMeUhJSoa5EPdB51fc= -github.com/eyedeekay/sam3 v0.32.2 h1:xODDY5nBVg0oK7KaYk7ofkXFoHPsmI1umhSv1TZlS7s= -github.com/eyedeekay/sam3 v0.32.2/go.mod h1:Y3igFVzN4ybqkkpfUWULGhw7WRp8lieq0ORXbLBbcZM= -github.com/eyedeekay/sam3 v0.32.31 h1:0fdDAupEQZSETHcyVQAsnFgpYArGJzU+lC2qN6f0GDk= -github.com/eyedeekay/sam3 v0.32.32-0.20201122050855-f464873c9350 h1:8R4zcaWsgANiZ4MKKBPUf9Isct2M1IFVUVZdAMqPCmU= -github.com/eyedeekay/sam3 v0.32.32-0.20201122050855-f464873c9350/go.mod h1:qRA9KIIVxbrHlkj+ZB+OoxFGFgdKeGp1vSgPw26eOVU= -github.com/eyedeekay/sam3 v0.32.32 h1:9Ea1Ere5O8Clx8zYxKnvhrWy7R96Q4FvxlPskYf8VW0= -github.com/eyedeekay/sam3 v0.32.32/go.mod h1:qRA9KIIVxbrHlkj+ZB+OoxFGFgdKeGp1vSgPw26eOVU= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4= github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY= github.com/getlantern/errors v1.0.1 h1:XukU2whlh7OdpxnkXhNH9VTLVz0EVPGKDV5K0oWhvzw= github.com/getlantern/errors v1.0.1/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A= +github.com/getlantern/fdcount v0.0.0-20210503151800-5decd65b3731 h1:v+vJ3LgV4nW4xRPZo+xkADDflXLpRbG+Lv69XKWFjTQ= +github.com/getlantern/fdcount v0.0.0-20210503151800-5decd65b3731/go.mod h1:XZwE+iIlAgr64OFbXKFNCllBwV4wEipPx8Hlo2gZdbM= github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5 h1:RBKofGGMt2k6eGBwX8mky9qunjL+KnAp9JdzXjiRkRw= github.com/getlantern/go-socks5 v0.0.0-20171114193258-79d4dd3e2db5/go.mod h1:kGHRXch95rnGLHjER/GhhFiHvfnqNz7KqWD9kGfATHY= github.com/getlantern/golog v0.0.0-20201105130739-9586b8bde3a9 h1:8MYJU90rB1bsavemKSAuDKBjtAKo5xq95bEPOnzV7CE= @@ -20,9 +15,12 @@ github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 h1:micT5vkcr9tOVk1F github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o= github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0FDNrgJqGRo8PCMFOBFL9py72DRs7bmc= github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA= +github.com/getlantern/mockconn v0.0.0-20200818071412-cb30d065a848 h1:2MhMMVBTnaHrst6HyWFDhwQCaJ05PZuOv1bE2gN8WFY= +github.com/getlantern/mockconn v0.0.0-20200818071412-cb30d065a848/go.mod h1:+F5GJ7qGpQ03DBtcOEyQpM30ix4BLswdaojecFtsdy8= +github.com/getlantern/mtime v0.0.0-20200417132445-23682092d1f7 h1:03J6Cb42EG06lHgpOFGm5BOax4qFqlSbSeKO2RGrj2g= +github.com/getlantern/mtime v0.0.0-20200417132445-23682092d1f7/go.mod h1:GfzwugvtH7YcmNIrHHizeyImsgEdyL88YkdnK28B14c= github.com/getlantern/netx v0.0.0-20190110220209-9912de6f94fd h1:mn98vs69Kqw56iKhR82mjk16Q1q5aDFFW0E89/QbXkQ= github.com/getlantern/netx v0.0.0-20190110220209-9912de6f94fd/go.mod h1:wKdY0ikOgzrWSeB9UyBVKPRhjXQ+vTb+BPeJuypUuNE= -github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSlsrcuKazukx/xqO/PpLZzZXsF+EA= github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6 h1:QthAQCekS1YOeYWSvoHI6ZatlG4B+GBDLxV/2ZkBsTA= github.com/getlantern/ops v0.0.0-20200403153110-8476b16edcd6/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA= @@ -30,6 +28,13 @@ github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/i2pkeys.go b/i2pkeys.go index eb18c30..4bcfaeb 100644 --- a/i2pkeys.go +++ b/i2pkeys.go @@ -1,9 +1,90 @@ package goSam import ( + "crypto/sha256" "errors" + "strings" ) +type I2PAddr string + +// Returns the I2P destination (base32-encoded) +func (a I2PAddr) String() string { + return string(a.Base32()) +} + +func (addr I2PAddr) Base32() (str string) { + return addr.DestHash().String() +} + +func (addr I2PAddr) DestHash() (h I2PDestHash) { + hash := sha256.New() + b, _ := addr.ToBytes() + hash.Write(b) + digest := hash.Sum(nil) + copy(h[:], digest) + return +} + +// Turns an I2P address to a byte array. The inverse of NewI2PAddrFromBytes(). +func (addr I2PAddr) ToBytes() ([]byte, error) { + return i2pB64enc.DecodeString(string(addr)) +} + +// Returns "I2P" +func (a I2PAddr) Network() string { + return "I2P" +} + +type I2PDestHash [32]byte + +// create a desthash from a string b32.i2p address +func DestHashFromString(str string) (dhash I2PDestHash, err error) { + if strings.HasSuffix(str, ".b32.i2p") && len(str) == 60 { + // valid + _, err = i2pB32enc.Decode(dhash[:], []byte(str[:52]+"====")) + } else { + // invalid + err = errors.New("invalid desthash format") + } + return +} + +// create a desthash from a []byte array +func DestHashFromBytes(str []byte) (dhash I2PDestHash, err error) { + if len(str) == 32 { + // valid + //_, err = i2pB32enc.Decode(dhash[:], []byte(str[:52]+"====")) + copy(dhash[:], str) + } else { + // invalid + err = errors.New("invalid desthash format") + } + return +} + +// get string representation of i2p dest hash(base32 version) +func (h I2PDestHash) String() string { + b32addr := make([]byte, 56) + i2pB32enc.Encode(b32addr, h[:]) + return string(b32addr[:52]) + ".b32.i2p" +} + +// get base64 representation of i2p dest sha256 hash(the 44-character one) +func (h I2PDestHash) Hash() string { + hash := sha256.New() + hash.Write(h[:]) + digest := hash.Sum(nil) + buf := make([]byte, 44) + i2pB64enc.Encode(buf, digest) + return string(buf) +} + +// Returns "I2P" +func (h I2PDestHash) Network() string { + return "I2P" +} + // NewDestination generates a new I2P destination, creating the underlying // public/private keys in the process. The public key can be used to send messages // to the destination, while the private key can be used to reply to messages