3 Commits
master ... 3.3

Author SHA1 Message Date
idk
b9e4186119 not for listeners 2021-03-13 17:49:34 -05:00
idk
3f57ff4eaf add ephemeral keys to helper lib 2021-03-13 17:46:14 -05:00
idk
4c6e2f5d88 fix custom dialer on primarysession 2021-03-12 17:46:15 -05:00
3 changed files with 82 additions and 51 deletions

View File

@ -1,6 +1,7 @@
package sam
import (
"fmt"
"io/ioutil"
"log"
"net"
@ -24,7 +25,7 @@ func I2PListener(name, samaddr, keyspath string) (*sam3.StreamListener, error) {
if keyspath != "" {
err = ioutil.WriteFile(keyspath+".i2p.public.txt", []byte(listener.Keys().Addr().Base32()), 0644)
if err != nil {
log.Fatalf("error storing I2P base32 address in adjacent text file, %s", err)
return nil, fmt.Errorf("error storing I2P base32 address in adjacent text file, %s", err)
}
}
return listener.Listen() //, err
@ -37,32 +38,38 @@ func I2PStreamSession(name, samaddr, keyspath string) (*sam3.StreamSession, erro
log.Printf("Starting and registering I2P session...")
sam, err := sam3.NewSAM(samaddr)
if err != nil {
log.Fatalf("error connecting to SAM to %s: %s", samaddr, err)
return nil, fmt.Errorf("error connecting to SAM to %s: %s", samaddr, err)
}
var keys *i2pkeys.I2PKeys
if keyspath != "" {
if _, err := os.Stat(keyspath + ".i2p.private"); os.IsNotExist(err) {
f, err := os.Create(keyspath + ".i2p.private")
if err != nil {
log.Fatalf("unable to open I2P keyfile for writing: %s", err)
return nil, fmt.Errorf("unable to open I2P keyfile for writing: %s", err)
}
defer f.Close()
tkeys, err := sam.NewKeys()
if err != nil {
log.Fatalf("unable to generate I2P Keys, %s", err)
return nil, fmt.Errorf("unable to generate I2P Keys, %s", err)
}
keys = &tkeys
err = i2pkeys.StoreKeysIncompat(*keys, f)
if err != nil {
log.Fatalf("unable to save newly generated I2P Keys, %s", err)
return nil, fmt.Errorf("unable to save newly generated I2P Keys, %s", err)
}
} else {
tkeys, err := i2pkeys.LoadKeys(keyspath + ".i2p.private")
if err != nil {
log.Fatalf("unable to load I2P Keys: %e", err)
return nil, fmt.Errorf("unable to load I2P Keys: %e", err)
}
keys = &tkeys
}
} else {
tkeys, err := sam.NewKeys()
if err != nil {
return nil, fmt.Errorf("unable to generate I2P Keys, %s", err)
}
keys = &tkeys
}
stream, err := sam.NewStreamSession(name, *keys, sam3.Options_Medium)
return stream, err
@ -74,32 +81,38 @@ func I2PDatagramSession(name, samaddr, keyspath string) (*sam3.DatagramSession,
log.Printf("Starting and registering I2P session...")
sam, err := sam3.NewSAM(samaddr)
if err != nil {
log.Fatalf("error connecting to SAM to %s: %s", samaddr, err)
return nil, fmt.Errorf("error connecting to SAM to %s: %s", samaddr, err)
}
var keys *i2pkeys.I2PKeys
if keyspath != "" {
if _, err := os.Stat(keyspath + ".i2p.private"); os.IsNotExist(err) {
f, err := os.Create(keyspath + ".i2p.private")
if err != nil {
log.Fatalf("unable to open I2P keyfile for writing: %s", err)
return nil, fmt.Errorf("unable to open I2P keyfile for writing: %s", err)
}
defer f.Close()
tkeys, err := sam.NewKeys()
if err != nil {
log.Fatalf("unable to generate I2P Keys, %s", err)
return nil, fmt.Errorf("unable to generate I2P Keys, %s", err)
}
keys = &tkeys
err = i2pkeys.StoreKeysIncompat(*keys, f)
if err != nil {
log.Fatalf("unable to save newly generated I2P Keys, %s", err)
return nil, fmt.Errorf("unable to save newly generated I2P Keys, %s", err)
}
} else {
tkeys, err := i2pkeys.LoadKeys(keyspath + ".i2p.private")
if err != nil {
log.Fatalf("unable to load I2P Keys: %e", err)
return nil, fmt.Errorf("unable to load I2P Keys: %e", err)
}
keys = &tkeys
}
} else {
tkeys, err := sam.NewKeys()
if err != nil {
return nil, fmt.Errorf("unable to generate I2P Keys, %s", err)
}
keys = &tkeys
}
gram, err := sam.NewDatagramSession(name, *keys, sam3.Options_Medium, 0)
return gram, err
@ -111,32 +124,38 @@ func I2PPrimarySession(name, samaddr, keyspath string) (*sam3.PrimarySession, er
log.Printf("Starting and registering I2P session...")
sam, err := sam3.NewSAM(samaddr)
if err != nil {
log.Fatalf("error connecting to SAM to %s: %s", samaddr, err)
return nil, fmt.Errorf("error connecting to SAM to %s: %s", samaddr, err)
}
var keys *i2pkeys.I2PKeys
if keyspath != "" {
if _, err := os.Stat(keyspath + ".i2p.private"); os.IsNotExist(err) {
f, err := os.Create(keyspath + ".i2p.private")
if err != nil {
log.Fatalf("unable to open I2P keyfile for writing: %s", err)
return nil, fmt.Errorf("unable to open I2P keyfile for writing: %s", err)
}
defer f.Close()
tkeys, err := sam.NewKeys()
if err != nil {
log.Fatalf("unable to generate I2P Keys, %s", err)
return nil, fmt.Errorf("unable to generate I2P Keys, %s", err)
}
keys = &tkeys
err = i2pkeys.StoreKeysIncompat(*keys, f)
if err != nil {
log.Fatalf("unable to save newly generated I2P Keys, %s", err)
return nil, fmt.Errorf("unable to save newly generated I2P Keys, %s", err)
}
} else {
tkeys, err := i2pkeys.LoadKeys(keyspath + ".i2p.private")
if err != nil {
log.Fatalf("unable to load I2P Keys: %e", err)
return nil, fmt.Errorf("unable to load I2P Keys: %e", err)
}
keys = &tkeys
}
} else {
tkeys, err := sam.NewKeys()
if err != nil {
return nil, fmt.Errorf("unable to generate I2P Keys, %s", err)
}
keys = &tkeys
}
gram, err := sam.NewPrimarySession(name, *keys, sam3.Options_Medium)
return gram, err

View File

@ -21,6 +21,8 @@ var (
i2pB32enc *base32.Encoding = base32.NewEncoding("abcdefghijklmnopqrstuvwxyz234567")
)
var FakePort = false
// The public and private keys associated with an I2P destination. I2P hides the
// details of exactly what this is, so treat them as blobs, but generally: One
// pair of DSA keys, one pair of ElGamal keys, and sometimes (almost never) also
@ -279,7 +281,14 @@ func (addr I2PAddr) Bytes() []byte {
// performing a Lookup(). Lookup only works if you are using the I2PAddr from
// which the b32 address was generated.
func (addr I2PAddr) Base32() (str string) {
return addr.DestHash().String()
return addr.DestHash().String() + addr.Port()
}
func (addr I2PAddr) Port() (str string) {
if FakePort {
return ":8080"
}
return ""
}
func (addr I2PAddr) DestHash() (h I2PDestHash) {

View File

@ -33,8 +33,8 @@ type PrimarySession struct {
Deadline time.Time
sigType string
Config SAMEmit
stsess map[string]*StreamSession
dgsess map[string]*DatagramSession
stsess *StreamSession
dgsess *DatagramSession
// from string
// to string
}
@ -62,10 +62,12 @@ func (ss *PrimarySession) Close() error {
// Returns the I2P destination (the address) of the stream session
func (ss *PrimarySession) Addr() i2pkeys.I2PAddr {
// fmt.Println("LOCAL ADDR")
return ss.keys.Addr()
}
func (ss *PrimarySession) LocalAddr() net.Addr {
// fmt.Println("LOCAL ADDR")
aa := ss.keys.Addr()
return &aa
}
@ -87,58 +89,58 @@ func (sam *PrimarySession) Dial(network, addr string) (net.Conn, error) {
// DialTCP implements x/dialer
func (sam *PrimarySession) DialTCP(network string, laddr, raddr net.Addr) (net.Conn, error) {
_, ok := sam.stsess[network+raddr.String()[0:4]]
if !ok {
stsess, err := sam.NewUniqueStreamSubSession(network + raddr.String()[0:4])
var err error
if sam.stsess == nil {
sam.stsess, err = sam.NewUniqueStreamSubSession(network + RandString())
if err != nil {
return nil, err
}
sam.stsess[network+raddr.String()[0:4]] = stsess
}
return sam.stsess[network+raddr.String()[0:4]].Dial(network, raddr.String())
return sam.stsess.Dial(network, raddr.String())
}
func (sam *PrimarySession) DialTCPI2P(network string, laddr, raddr string) (net.Conn, error) {
_, ok := sam.stsess[network+raddr[0:4]]
if !ok {
stsess, err := sam.NewUniqueStreamSubSession(network + laddr)
func (sam *PrimarySession) DialTCPI2P(network string, laddr, raddr string) (*SAMConn, error) {
var err error
if sam.stsess == nil {
sam.stsess, err = sam.NewUniqueStreamSubSession(network + RandString())
if err != nil {
return nil, err
}
sam.stsess[network+raddr[0:4]] = stsess
}
return sam.stsess[network+raddr[0:4]].Dial(network, raddr)
c, err := sam.stsess.Dial(network, raddr)
if err != nil {
return nil, err
}
return c.(*SAMConn), nil
}
// DialUDP implements x/dialer
func (sam *PrimarySession) DialUDP(network string, laddr, raddr net.Addr) (net.PacketConn, error) {
_, ok := sam.dgsess[network+raddr.String()[0:4]]
if !ok {
dgsess, err := sam.NewDatagramSubSession(network+raddr.String()[0:4], 0)
var err error
if sam.dgsess == nil {
sam.dgsess, err = sam.NewDatagramSubSession(network+raddr.String()[0:4], 0)
if err != nil {
return nil, err
}
sam.dgsess[network+raddr.String()[0:4]] = dgsess
}
return sam.dgsess[network+raddr.String()[0:4]].Dial(network, raddr.String())
return sam.dgsess.Dial(network, raddr.String())
}
func (sam *PrimarySession) DialUDPI2P(network, laddr, raddr string) (*DatagramSession, error) {
_, ok := sam.dgsess[network+raddr[0:4]]
if !ok {
dgsess, err := sam.NewDatagramSubSession(network+laddr, 0)
var err error
if sam.dgsess == nil {
sam.dgsess, err = sam.NewDatagramSubSession(network+raddr[0:4], 0)
if err != nil {
return nil, err
}
sam.dgsess[network+raddr[0:4]] = dgsess
}
return sam.dgsess[network+raddr[0:4]].Dial(network, raddr)
return sam.dgsess.Dial(network, raddr)
}
func (s *PrimarySession) Lookup(name string) (a net.Addr, err error) {
var sam *SAM
if len(strings.Split(name, ":")) <= 1 {
name += ":0"
name += ":80"
}
sam, err = NewSAM(s.samAddr)
if err == nil {
@ -149,14 +151,17 @@ func (s *PrimarySession) Lookup(name string) (a net.Addr, err error) {
}
func (sam *PrimarySession) Resolve(network, addr string) (net.Addr, error) {
fmt.Println("LOGGING RESOLUTION", network, addr)
return sam.Lookup(addr)
}
func (sam *PrimarySession) ResolveTCPAddr(network, dest string) (net.Addr, error) {
fmt.Println("LOGGING RESOLUTION", network, dest)
return sam.Lookup(dest)
}
func (sam *PrimarySession) ResolveUDPAddr(network, dest string) (net.Addr, error) {
fmt.Println("LOGGING RESOLUTION", network, dest)
return sam.Lookup(dest)
}
@ -167,9 +172,7 @@ func (sam *SAM) NewPrimarySession(id string, keys i2pkeys.I2PKeys, options []str
if err != nil {
return nil, err
}
ssesss := make(map[string]*StreamSession)
dsesss := make(map[string]*DatagramSession)
return &PrimarySession{sam.Config.I2PConfig.Sam(), id, conn, keys, time.Duration(600 * time.Second), time.Now(), Sig_NONE, sam.Config, ssesss, dsesss}, nil
return &PrimarySession{sam.Config.I2PConfig.Sam(), id, conn, keys, time.Duration(600 * time.Second), time.Now(), Sig_NONE, sam.Config, nil, nil}, nil
}
// Creates a new PrimarySession with the I2CP- and PRIMARYinglib options as
@ -179,9 +182,7 @@ func (sam *SAM) NewPrimarySessionWithSignature(id string, keys i2pkeys.I2PKeys,
if err != nil {
return nil, err
}
ssesss := make(map[string]*StreamSession)
dsesss := make(map[string]*DatagramSession)
return &PrimarySession{sam.Config.I2PConfig.Sam(), id, conn, keys, time.Duration(600 * time.Second), time.Now(), sigType, sam.Config, ssesss, dsesss}, nil
return &PrimarySession{sam.Config.I2PConfig.Sam(), id, conn, keys, time.Duration(600 * time.Second), time.Now(), sigType, sam.Config, nil, nil}, nil
}
// Creates a new session with the style of either "STREAM", "DATAGRAM" or "RAW",
@ -260,21 +261,23 @@ func (sam *PrimarySession) newGenericSubSessionWithSignatureAndPorts(style, id,
// Creates a new StreamSession with the I2CP- and streaminglib options as
// specified. See the I2P documentation for a full list of options.
func (sam *PrimarySession) NewStreamSubSession(id string) (*StreamSession, error) {
conn, err := sam.newGenericSubSession("STREAM", id, []string{})
s := RandString()
conn, err := sam.newGenericSubSession("STREAM", id+s, []string{})
if err != nil {
return nil, err
}
return &StreamSession{sam.Config.I2PConfig.Sam(), id, conn, sam.keys, time.Duration(600 * time.Second), time.Now(), Sig_NONE, "0", "0"}, nil
return &StreamSession{sam.Config.I2PConfig.Sam(), id + s, conn, sam.keys, time.Duration(600 * time.Second), time.Now(), Sig_NONE, "0", "0"}, nil
}
// Creates a new StreamSession with the I2CP- and streaminglib options as
// specified. See the I2P documentation for a full list of options.
func (sam *PrimarySession) NewUniqueStreamSubSession(id string) (*StreamSession, error) {
conn, err := sam.newGenericSubSession("STREAM", id, []string{})
s := RandString()
conn, err := sam.newGenericSubSession("STREAM", id+s, []string{})
if err != nil {
return nil, err
}
return &StreamSession{sam.Config.I2PConfig.Sam(), id, conn, sam.keys, time.Duration(600 * time.Second), time.Now(), Sig_NONE, randport(), "0"}, nil
return &StreamSession{sam.Config.I2PConfig.Sam(), id + s, conn, sam.keys, time.Duration(600 * time.Second), time.Now(), Sig_NONE, randport(), "0"}, nil
}
// Creates a new StreamSession with the I2CP- and streaminglib options as