Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a13b920f05 | ||
![]() |
e5d5a0360b | ||
![]() |
460bd1b8f4 | ||
![]() |
7d820eeaaa | ||
![]() |
ac54a46ded | ||
![]() |
22a3e9f3a7 | ||
![]() |
b7ce5c1061 | ||
![]() |
7729762ce9 | ||
![]() |
13bf63f35a | ||
![]() |
91fc13b151 | ||
![]() |
7cf9e8b61e | ||
![]() |
c7d6848930 | ||
![]() |
eabd2d94f6 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -22,3 +22,4 @@ _testmain.go
|
||||
*.exe
|
||||
itp-golang-github-eyedeekay-gosam.txt
|
||||
.pc
|
||||
deb/
|
||||
|
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
|
||||
USER_GH=eyedeekay
|
||||
VERSION=0.32.22
|
||||
VERSION=0.32.26
|
||||
packagename=gosam
|
||||
|
||||
echo:
|
||||
|
@@ -24,19 +24,19 @@ func (c *Client) Listen() (net.Listener, error) {
|
||||
// with Accept
|
||||
func (c *Client) ListenI2P(dest string) (net.Listener, error) {
|
||||
var err error
|
||||
var id int32
|
||||
c.id = c.NewID()
|
||||
c.destination, err = c.CreateStreamSession(id, dest)
|
||||
c.destination, err = c.CreateStreamSession(c.id, dest)
|
||||
d := c.destination
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
fmt.Println("destination:", c.destination)
|
||||
fmt.Println("Listening on destination:", c.Base32()+".b32.i2p")
|
||||
|
||||
c, err = c.NewClient()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
c.destination = d
|
||||
|
||||
if c.debug {
|
||||
c.SamConn = WrapConn(c.SamConn)
|
||||
|
15
client.go
15
client.go
@@ -11,6 +11,7 @@ import (
|
||||
"math/rand"
|
||||
"net"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// A Client represents a single Connection to the SAM bridge
|
||||
@@ -38,6 +39,7 @@ type Client struct {
|
||||
|
||||
dontPublishLease bool
|
||||
encryptLease bool
|
||||
leaseSetEncType string
|
||||
|
||||
reduceIdle bool
|
||||
reduceIdleTime uint
|
||||
@@ -52,6 +54,7 @@ type Client struct {
|
||||
//NEVER, EVER modify lastaddr or id yourself. They are used internally only.
|
||||
lastaddr string
|
||||
id int32
|
||||
ml sync.Mutex
|
||||
}
|
||||
|
||||
var SAMsigTypes = []string{
|
||||
@@ -89,16 +92,21 @@ func (c *Client) Destination() string {
|
||||
|
||||
// Base32 returns the base32 of the local tunnel
|
||||
func (c *Client) Base32() string {
|
||||
hash := sha256.New()
|
||||
// hash := sha256.New()
|
||||
b64, err := i2pB64enc.DecodeString(c.Base64())
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
hash.Write([]byte(b64))
|
||||
return strings.ToLower(strings.Replace(i2pB32enc.EncodeToString(hash.Sum(nil)), "=", "", -1))
|
||||
//hash.Write([]byte(b64))
|
||||
var s []byte
|
||||
for _, e := range sha256.Sum256(b64) {
|
||||
s = append(s, e)
|
||||
}
|
||||
return strings.ToLower(strings.Replace(i2pB32enc.EncodeToString(s), "=", "", -1))
|
||||
}
|
||||
|
||||
func (c *Client) base64() []byte {
|
||||
fmt.Println("\n\nDESTINATION", c.destination, "\n\n.")
|
||||
if c.destination != "" {
|
||||
s, _ := i2pB64enc.DecodeString(c.destination)
|
||||
alen := binary.BigEndian.Uint16(s[385:387])
|
||||
@@ -137,6 +145,7 @@ func NewClientFromOptions(opts ...func(*Client) error) (*Client, error) {
|
||||
c.id = 0
|
||||
c.lastaddr = "invalid"
|
||||
c.destination = ""
|
||||
c.leaseSetEncType = "4,0"
|
||||
for _, o := range opts {
|
||||
if err := o(&c); err != nil {
|
||||
return nil, err
|
||||
|
@@ -27,3 +27,12 @@ func TestClientHello(t *testing.T) {
|
||||
t.Log(client.Base32())
|
||||
teardown(t)
|
||||
}
|
||||
|
||||
func TestNewDestination(t *testing.T) {
|
||||
setup(t)
|
||||
t.Log(client.Base32())
|
||||
if _, err := client.NewDestination(SAMsigTypes[3]); err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
teardown(t)
|
||||
}
|
||||
|
24
debian/changelog
vendored
24
debian/changelog
vendored
@@ -1,3 +1,27 @@
|
||||
golang-github-eyedeekay-gosam (0.32.26) UNRELEASED; urgency=medium
|
||||
|
||||
* Fix mistaken-identity issue with listeners
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 03 Sept 2020 08:17:40 -0500
|
||||
|
||||
golang-github-eyedeekay-gosam (0.32.25) UNRELEASED; urgency=medium
|
||||
|
||||
* Support dual-keys by default in all future versions
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Thu, 03 Sept 2020 04:25:04 -0500
|
||||
|
||||
golang-github-eyedeekay-gosam (0.32.24) UNRELEASED; urgency=medium
|
||||
|
||||
* Improve the mutex thingy
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Tue, 25 Aug 2020 04:52:11 -0500
|
||||
|
||||
golang-github-eyedeekay-gosam (0.32.23) UNRELEASED; urgency=medium
|
||||
|
||||
* Protect Dial with a mutex to fix a lookup bug
|
||||
|
||||
-- idk <hankhill19580@gmail.com> Tue, 25 Aug 2020 10:29:26 -0500
|
||||
|
||||
golang-github-eyedeekay-gosam (0.3.2.1) bionic; urgency=medium
|
||||
|
||||
* Get rid of the debug directory, just move it into the source
|
||||
|
1
debian/files
vendored
1
debian/files
vendored
@@ -1 +0,0 @@
|
||||
golang-github-eyedeekay-gosam_0.3.2.1_source.buildinfo devel optional
|
4
dial.go
4
dial.go
@@ -30,7 +30,7 @@ func (c *Client) DialContext(ctx context.Context, network, addr string) (net.Con
|
||||
}
|
||||
}
|
||||
|
||||
func (c Client) dialCheck(addr string) (int32, bool) {
|
||||
func (c *Client) dialCheck(addr string) (int32, bool) {
|
||||
if c.lastaddr == "invalid" {
|
||||
fmt.Println("Preparing to dial new address.")
|
||||
return c.NewID(), true
|
||||
@@ -43,6 +43,8 @@ func (c Client) dialCheck(addr string) (int32, bool) {
|
||||
|
||||
// Dial implements the net.Dial function and can be used for http.Transport
|
||||
func (c *Client) Dial(network, addr string) (net.Conn, error) {
|
||||
c.ml.Lock()
|
||||
defer c.ml.Unlock()
|
||||
portIdx := strings.Index(addr, ":")
|
||||
if portIdx >= 0 {
|
||||
addr = addr[:portIdx]
|
||||
|
35
i2pkeys.go
Normal file
35
i2pkeys.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package goSam
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/eyedeekay/sam3/i2pkeys"
|
||||
)
|
||||
|
||||
// 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
|
||||
func (c *Client) NewDestination(sigType ...string) (i2pkeys.I2PKeys, error) {
|
||||
var (
|
||||
sigtmp string
|
||||
keys i2pkeys.I2PKeys
|
||||
)
|
||||
if len(sigType) > 0 {
|
||||
sigtmp = sigType[0]
|
||||
}
|
||||
r, err := c.sendCmd(
|
||||
"DEST GENERATE %s\n",
|
||||
sigtmp,
|
||||
)
|
||||
if err != nil {
|
||||
return keys, err
|
||||
}
|
||||
var pub, priv string
|
||||
if priv = r.Pairs["PRIV"]; priv == "" {
|
||||
return keys, errors.New("failed to generate private destination key")
|
||||
}
|
||||
if pub = r.Pairs["PUB"]; pub == "" {
|
||||
return keys, errors.New("failed to generate public destination key")
|
||||
}
|
||||
return i2pkeys.NewKeys(i2pkeys.I2PAddr(pub), priv), nil
|
||||
}
|
@@ -22,8 +22,8 @@ func TestClientLookupInvalid(t *testing.T) {
|
||||
if !ok {
|
||||
t.Fatalf("client.Lookup() should return a ReplyError")
|
||||
}
|
||||
if repErr.Result != ResultInvalidKey {
|
||||
t.Errorf("client.Lookup() should throw an ResultKeyNotFound error.\nGot:%+v\n", repErr)
|
||||
if repErr.Result != ResultKeyNotFound {
|
||||
t.Errorf("client.Lookup() should throw an ResultKeyNotFound error.\nGot:%+v%s%s\n", repErr, "!=", ResultKeyNotFound)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,5 +46,5 @@ func ExampleClient_Lookup() {
|
||||
|
||||
// Output:
|
||||
//Address of zzz.i2p:
|
||||
//GKapJ8koUcBj~jmQzHsTYxDg2tpfWj0xjQTzd8BhfC9c3OS5fwPBNajgF-eOD6eCjFTqTlorlh7Hnd8kXj1qblUGXT-tDoR9~YV8dmXl51cJn9MVTRrEqRWSJVXbUUz9t5Po6Xa247Vr0sJn27R4KoKP8QVj1GuH6dB3b6wTPbOamC3dkO18vkQkfZWUdRMDXk0d8AdjB0E0864nOT~J9Fpnd2pQE5uoFT6P0DqtQR2jsFvf9ME61aqLvKPPWpkgdn4z6Zkm-NJOcDz2Nv8Si7hli94E9SghMYRsdjU-knObKvxiagn84FIwcOpepxuG~kFXdD5NfsH0v6Uri3usE3uSzpWS0EHmrlfoLr5uGGd9ZHwwCIcgfOATaPRMUEQxiK9q48PS0V3EXXO4-YLT0vIfk4xO~XqZpn8~PW1kFe2mQMHd7oO89yCk-3yizRG3UyFtI7-mO~eCI6-m1spYoigStgoupnC3G85gJkqEjMm49gUjbhfWKWI-6NwTj0ZnAAAA
|
||||
//GKapJ8koUcBj~jmQzHsTYxDg2tpfWj0xjQTzd8BhfC9c3OS5fwPBNajgF-eOD6eCjFTqTlorlh7Hnd8kXj1qblUGXT-tDoR9~YV8dmXl51cJn9MVTRrEqRWSJVXbUUz9t5Po6Xa247Vr0sJn27R4KoKP8QVj1GuH6dB3b6wTPbOamC3dkO18vkQkfZWUdRMDXk0d8AdjB0E0864nOT~J9Fpnd2pQE5uoFT6P0DqtQR2jsFvf9ME61aqLvKPPWpkgdn4z6Zkm-NJOcDz2Nv8Si7hli94E9SghMYRsdjU-knObKvxiagn84FIwcOpepxuG~kFXdD5NfsH0v6Uri3usE3XWD7Pw6P8qVYF39jUIq4OiNMwPnNYzy2N4mDMQdsdHO3LUVh~DEppOy9AAmEoHDjjJxt2BFBbGxfdpZCpENkwvmZeYUyNCCzASqTOOlNzdpne8cuesn3NDXIpNnqEE6Oe5Qm5YOJykrX~Vx~cFFT3QzDGkIjjxlFBsjUJyYkFjBQAEAAcAAA==
|
||||
}
|
||||
|
18
options.go
18
options.go
@@ -275,6 +275,15 @@ func SetEncrypt(b bool) func(*Client) error {
|
||||
}
|
||||
}
|
||||
|
||||
//SetLeaseSetEncType tells the router to use an encrypted leaseset of a specific type.
|
||||
//defaults to 4,0
|
||||
func SetLeaseSetEncType(b string) func(*Client) error {
|
||||
return func(c *Client) error {
|
||||
c.leaseSetEncType = b
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
//SetReduceIdle sets the created tunnels to be reduced during extended idle time to avoid excessive resource usage
|
||||
func SetReduceIdle(b bool) func(*Client) error {
|
||||
return func(c *Client) error {
|
||||
@@ -426,6 +435,13 @@ func (c *Client) encryptlease() string {
|
||||
return " i2cp.encryptLeaseSet=false "
|
||||
}
|
||||
|
||||
func (c *Client) leasesetenctype() string {
|
||||
if c.encryptLease {
|
||||
return fmt.Sprintf(" i2cp.leaseSetEncType=%s ", c.leaseSetEncType)
|
||||
}
|
||||
return " i2cp.leaseSetEncType=4,0 "
|
||||
}
|
||||
|
||||
func (c *Client) dontpublishlease() string {
|
||||
if c.dontPublishLease {
|
||||
return " i2cp.dontPublishLeaseSet=true "
|
||||
@@ -478,6 +494,7 @@ func (c *Client) allOptions() string {
|
||||
c.outbackups() +
|
||||
c.dontpublishlease() +
|
||||
c.encryptlease() +
|
||||
c.leasesetenctype() +
|
||||
c.reduceonidle() +
|
||||
c.reduceidletime() +
|
||||
c.reduceidlecount() +
|
||||
@@ -498,6 +515,7 @@ func (c *Client) Print() string {
|
||||
c.outbackups() +
|
||||
c.dontpublishlease() +
|
||||
c.encryptlease() +
|
||||
c.leasesetenctype() +
|
||||
c.reduceonidle() +
|
||||
c.reduceidletime() +
|
||||
c.reduceidlecount() +
|
||||
|
Reference in New Issue
Block a user