Documentation
¶
Overview ¶
Library for I2Ps SAMv3 bridge (https://geti2p.com)
Index ¶
- Constants
- Variables
- func ExtractDest(input string) string
- func ExtractPairInt(input, value string) int
- func ExtractPairString(input, value string) string
- func GenerateOptionString(opts []string) string
- func GetSAM3Logger() *logrus.Logger
- func IgnorePortError(err error) error
- func InitializeSAM3Logger()
- func PrimarySessionString() string
- func RandString() string
- func SAMDefaultAddr(fallforward string) string
- func SetAccessList(s []string) func(*SAMEmit) error
- func SetAccessListType(s string) func(*SAMEmit) error
- func SetAllowZeroIn(b bool) func(*SAMEmit) error
- func SetAllowZeroOut(b bool) func(*SAMEmit) error
- func SetCloseIdle(b bool) func(*SAMEmit) error
- func SetCloseIdleTime(u int) func(*SAMEmit) error
- func SetCloseIdleTimeMs(u int) func(*SAMEmit) error
- func SetCompress(b bool) func(*SAMEmit) error
- func SetEncrypt(b bool) func(*SAMEmit) error
- func SetFastRecieve(b bool) func(*SAMEmit) error
- func SetInBackups(u int) func(*SAMEmit) error
- func SetInLength(u int) func(*SAMEmit) error
- func SetInQuantity(u int) func(*SAMEmit) error
- func SetInVariance(i int) func(*SAMEmit) error
- func SetLeaseSetKey(s string) func(*SAMEmit) error
- func SetLeaseSetPrivateKey(s string) func(*SAMEmit) error
- func SetLeaseSetPrivateSigningKey(s string) func(*SAMEmit) error
- func SetMessageReliability(s string) func(*SAMEmit) error
- func SetName(s string) func(*SAMEmit) error
- func SetOutBackups(u int) func(*SAMEmit) error
- func SetOutLength(u int) func(*SAMEmit) error
- func SetOutQuantity(u int) func(*SAMEmit) error
- func SetOutVariance(i int) func(*SAMEmit) error
- func SetReduceIdle(b bool) func(*SAMEmit) error
- func SetReduceIdleQuantity(u int) func(*SAMEmit) error
- func SetReduceIdleTime(u int) func(*SAMEmit) error
- func SetReduceIdleTimeMs(u int) func(*SAMEmit) error
- func SetSAMAddress(s string) func(*SAMEmit) error
- func SetSAMHost(s string) func(*SAMEmit) error
- func SetSAMPort(s string) func(*SAMEmit) error
- func SetType(s string) func(*SAMEmit) error
- func SplitHostPort(hostport string) (string, string, error)
- type Config
- type DatagramSession
- func (s *DatagramSession) Accept() (net.Conn, error)
- func (s *DatagramSession) Addr() net.Addr
- func (s *DatagramSession) B32() string
- func (s *DatagramSession) Close() error
- func (s *DatagramSession) Dial(net string, addr string) (*DatagramSession, error)
- func (s *DatagramSession) DialI2PRemote(net string, addr net.Addr) (*DatagramSession, error)
- func (s *DatagramSession) DialRemote(net, addr string) (net.PacketConn, error)
- func (s *DatagramSession) LocalAddr() net.Addr
- func (s *DatagramSession) LocalI2PAddr() i2pkeys.I2PAddr
- func (s *DatagramSession) Lookup(name string) (a net.Addr, err error)
- func (s *DatagramSession) Read(b []byte) (n int, err error)
- func (s *DatagramSession) ReadFrom(b []byte) (n int, addr net.Addr, err error)
- func (s *DatagramSession) RemoteAddr() net.Addr
- func (s *DatagramSession) SetDeadline(t time.Time) error
- func (s *DatagramSession) SetReadDeadline(t time.Time) error
- func (s *DatagramSession) SetWriteBuffer(bytes int) error
- func (s *DatagramSession) SetWriteDeadline(t time.Time) error
- func (s *DatagramSession) Write(b []byte) (int, error)
- func (s *DatagramSession) WriteTo(b []byte, addr net.Addr) (n int, err error)
- type I2PConfig
- func (f *I2PConfig) Accesslist() string
- func (f *I2PConfig) Accesslisttype() string
- func (f *I2PConfig) Close() string
- func (f *I2PConfig) DestinationKey() string
- func (f *I2PConfig) DoZero() string
- func (f *I2PConfig) EncryptLease() string
- func (f *I2PConfig) FromPort() string
- func (f *I2PConfig) ID() string
- func (f *I2PConfig) LeaseSetEncryptionType() string
- func (f *I2PConfig) Leasesetsettings() (string, string, string)
- func (f *I2PConfig) MaxSAM() string
- func (f *I2PConfig) MinSAM() string
- func (f *I2PConfig) Print() []string
- func (f *I2PConfig) Reduce() string
- func (f *I2PConfig) Reliability() string
- func (f *I2PConfig) Sam() string
- func (f *I2PConfig) SessionStyle() string
- func (f *I2PConfig) SetSAMAddress(addr string)
- func (f *I2PConfig) SignatureType() string
- func (f *I2PConfig) ToPort() string
- type Option
- type Options
- type PrimarySession
- func (ss *PrimarySession) Addr() i2pkeys.I2PAddr
- func (ss *PrimarySession) Close() error
- func (sam *PrimarySession) Dial(network, addr string) (net.Conn, error)
- func (sam *PrimarySession) DialTCP(network string, laddr, raddr net.Addr) (net.Conn, error)
- func (sam *PrimarySession) DialTCPI2P(network string, laddr, raddr string) (net.Conn, error)
- func (sam *PrimarySession) DialUDP(network string, laddr, raddr net.Addr) (net.PacketConn, error)
- func (sam *PrimarySession) DialUDPI2P(network, laddr, raddr string) (*DatagramSession, error)
- func (ss *PrimarySession) From() string
- func (ss *PrimarySession) ID() string
- func (ss *PrimarySession) Keys() i2pkeys.I2PKeys
- func (ss *PrimarySession) LocalAddr() net.Addr
- func (s *PrimarySession) Lookup(name string) (a net.Addr, err error)
- func (s *PrimarySession) NewDatagramSubSession(id string, udpPort int) (*DatagramSession, error)
- func (s *PrimarySession) NewRawSubSession(id string, udpPort int) (*RawSession, error)
- func (sam *PrimarySession) NewStreamSubSession(id string) (*StreamSession, error)
- func (sam *PrimarySession) NewStreamSubSessionWithPorts(id, from, to string) (*StreamSession, error)
- func (sam *PrimarySession) NewUniqueStreamSubSession(id string) (*StreamSession, error)
- func (sam *PrimarySession) Resolve(network, addr string) (net.Addr, error)
- func (sam *PrimarySession) ResolveTCPAddr(network, dest string) (net.Addr, error)
- func (sam *PrimarySession) ResolveUDPAddr(network, dest string) (net.Addr, error)
- func (ss *PrimarySession) SignatureType() string
- func (ss *PrimarySession) To() string
- type RawSession
- func (s *RawSession) Close() error
- func (s *RawSession) LocalAddr() i2pkeys.I2PAddr
- func (s *RawSession) Read(b []byte) (n int, err error)
- func (s *RawSession) SetDeadline(t time.Time) error
- func (s *RawSession) SetReadDeadline(t time.Time) error
- func (s *RawSession) SetWriteDeadline(t time.Time) error
- func (s *RawSession) WriteTo(b []byte, addr i2pkeys.I2PAddr) (n int, err error)
- type SAM
- func (sam *SAM) Close() error
- func (sam *SAM) EnsureKeyfile(fname string) (keys i2pkeys.I2PKeys, err error)
- func (sam *SAM) Keys() (k *i2pkeys.I2PKeys)
- func (sam *SAM) Lookup(name string) (i2pkeys.I2PAddr, error)
- func (s *SAM) NewDatagramSession(id string, keys i2pkeys.I2PKeys, options []string, udpPort int) (*DatagramSession, error)
- func (sam *SAM) NewKeys(sigType ...string) (i2pkeys.I2PKeys, error)
- func (sam *SAM) NewPrimarySession(id string, keys i2pkeys.I2PKeys, options []string) (*PrimarySession, error)
- func (sam *SAM) NewPrimarySessionWithSignature(id string, keys i2pkeys.I2PKeys, options []string, sigType string) (*PrimarySession, error)
- func (s *SAM) NewRawSession(id string, keys i2pkeys.I2PKeys, options []string, udpPort int) (*RawSession, error)
- func (sam *SAM) NewStreamSession(id string, keys i2pkeys.I2PKeys, options []string) (*StreamSession, error)
- func (sam *SAM) NewStreamSessionWithSignature(id string, keys i2pkeys.I2PKeys, options []string, sigType string) (*StreamSession, error)
- func (sam *SAM) NewStreamSessionWithSignatureAndPorts(id, from, to string, keys i2pkeys.I2PKeys, options []string, sigType string) (*StreamSession, error)
- func (sam *SAM) ReadKeys(r io.Reader) (err error)
- type SAMConn
- func (sc *SAMConn) Close() error
- func (sc *SAMConn) LocalAddr() net.Addr
- func (sc *SAMConn) Read(buf []byte) (int, error)
- func (sc *SAMConn) RemoteAddr() net.Addr
- func (sc *SAMConn) SetDeadline(t time.Time) error
- func (sc *SAMConn) SetReadDeadline(t time.Time) error
- func (sc *SAMConn) SetWriteDeadline(t time.Time) error
- func (sc *SAMConn) Write(buf []byte) (int, error)
- type SAMEmit
- func (e *SAMEmit) Accept() string
- func (e *SAMEmit) AcceptBytes() []byte
- func (e *SAMEmit) Connect(dest string) string
- func (e *SAMEmit) ConnectBytes(dest string) []byte
- func (e *SAMEmit) Create() string
- func (e *SAMEmit) CreateBytes() []byte
- func (e *SAMEmit) GenerateDestination() string
- func (e *SAMEmit) GenerateDestinationBytes() []byte
- func (e *SAMEmit) Hello() string
- func (e *SAMEmit) HelloBytes() []byte
- func (e *SAMEmit) Lookup(name string) string
- func (e *SAMEmit) LookupBytes(name string) []byte
- func (e *SAMEmit) OptStr() string
- type SAMResolver
- type StreamListener
- type StreamSession
- func (s *StreamSession) Addr() i2pkeys.I2PAddr
- func (s *StreamSession) Close() error
- func (s *StreamSession) Dial(n, addr string) (c net.Conn, err error)
- func (s *StreamSession) DialContext(ctx context.Context, n, addr string) (net.Conn, error)
- func (s *StreamSession) DialContextI2P(ctx context.Context, n, addr string) (*SAMConn, error)
- func (s *StreamSession) DialI2P(addr i2pkeys.I2PAddr) (*SAMConn, error)
- func (s *StreamSession) From() string
- func (s *StreamSession) ID() string
- func (s *StreamSession) Keys() i2pkeys.I2PKeys
- func (s *StreamSession) Listen() (*StreamListener, error)
- func (s *StreamSession) LocalAddr() net.Addr
- func (s *StreamSession) Lookup(name string) (i2pkeys.I2PAddr, error)
- func (s *StreamSession) Read(buf []byte) (int, error)
- func (s *StreamSession) SetDeadline(t time.Time) error
- func (s *StreamSession) SetReadDeadline(t time.Time) error
- func (s *StreamSession) SetWriteDeadline(t time.Time) error
- func (s *StreamSession) SignatureType() string
- func (s *StreamSession) To() string
- func (s *StreamSession) Write(data []byte) (int, error)
Examples ¶
Constants ¶
const ( Sig_NONE = "SIGNATURE_TYPE=EdDSA_SHA512_Ed25519" Sig_DSA_SHA1 = "SIGNATURE_TYPE=DSA_SHA1" Sig_ECDSA_SHA256_P256 = "SIGNATURE_TYPE=ECDSA_SHA256_P256" Sig_ECDSA_SHA384_P384 = "SIGNATURE_TYPE=ECDSA_SHA384_P384" Sig_ECDSA_SHA512_P521 = "SIGNATURE_TYPE=ECDSA_SHA512_P521" Sig_EdDSA_SHA512_Ed25519 = "SIGNATURE_TYPE=EdDSA_SHA512_Ed25519" )
Variables ¶
var ( // Suitable options if you are shuffling A LOT of traffic. If unused, this // will waste your resources. Options_Humongous = []string{"inbound.length=3", "outbound.length=3", "inbound.lengthVariance=1", "outbound.lengthVariance=1", "inbound.backupQuantity=3", "outbound.backupQuantity=3", "inbound.quantity=6", "outbound.quantity=6"} // Suitable for shuffling a lot of traffic. Options_Large = []string{"inbound.length=3", "outbound.length=3", "inbound.lengthVariance=1", "outbound.lengthVariance=1", "inbound.backupQuantity=1", "outbound.backupQuantity=1", "inbound.quantity=4", "outbound.quantity=4"} // Suitable for shuffling a lot of traffic quickly with minimum // anonymity. Uses 1 hop and multiple tunnels. Options_Wide = []string{"inbound.length=1", "outbound.length=1", "inbound.lengthVariance=1", "outbound.lengthVariance=1", "inbound.backupQuantity=2", "outbound.backupQuantity=2", "inbound.quantity=3", "outbound.quantity=3"} // Suitable for shuffling medium amounts of traffic. Options_Medium = []string{"inbound.length=3", "outbound.length=3", "inbound.lengthVariance=1", "outbound.lengthVariance=1", "inbound.backupQuantity=0", "outbound.backupQuantity=0", "inbound.quantity=2", "outbound.quantity=2"} // Sensible defaults for most people Options_Default = []string{"inbound.length=3", "outbound.length=3", "inbound.lengthVariance=0", "outbound.lengthVariance=0", "inbound.backupQuantity=1", "outbound.backupQuantity=1", "inbound.quantity=1", "outbound.quantity=1"} // Suitable only for small dataflows, and very short lasting connections: // You only have one tunnel in each direction, so if any of the nodes // through which any of your two tunnels pass through go offline, there will // be a complete halt in the dataflow, until a new tunnel is built. Options_Small = []string{"inbound.length=3", "outbound.length=3", "inbound.lengthVariance=1", "outbound.lengthVariance=1", "inbound.backupQuantity=0", "outbound.backupQuantity=0", "inbound.quantity=1", "outbound.quantity=1"} // Does not use any anonymization, you connect directly to others tunnel // endpoints, thus revealing your identity but not theirs. Use this only // if you don't care. Options_Warning_ZeroHop = []string{"inbound.length=0", "outbound.length=0", "inbound.lengthVariance=0", "outbound.lengthVariance=0", "inbound.backupQuantity=0", "outbound.backupQuantity=0", "inbound.quantity=2", "outbound.quantity=2"} )
Examples and suggestions for options when creating sessions.
var PrimarySessionSwitch string = PrimarySessionString()
var SAM_HOST = getEnv("sam_host", "127.0.0.1")
var SAM_PORT = getEnv("sam_port", "7656")
Functions ¶
func ExtractDest ¶
func ExtractPairInt ¶
func ExtractPairString ¶
func GenerateOptionString ¶
func GetSAM3Logger ¶
GetSAM3Logger returns the initialized logger
func IgnorePortError ¶
func InitializeSAM3Logger ¶
func InitializeSAM3Logger()
func PrimarySessionString ¶
func PrimarySessionString() string
func RandString ¶
func RandString() string
func SAMDefaultAddr ¶
func SetAccessList ¶
SetAccessList tells the system to treat the AccessList as a whitelist
func SetAccessListType ¶
SetAccessListType tells the system to treat the AccessList as a whitelist
func SetAllowZeroIn ¶
SetAllowZeroIn tells the tunnel to accept zero-hop peers
func SetAllowZeroOut ¶
SetAllowZeroOut tells the tunnel to accept zero-hop peers
func SetCloseIdle ¶
SetCloseIdle tells the connection to close it's tunnels during extended idle time.
func SetCloseIdleTime ¶
SetCloseIdleTime sets the time to wait before closing tunnels to idle levels
func SetCloseIdleTimeMs ¶
SetCloseIdleTimeMs sets the time to wait before closing tunnels to idle levels in milliseconds
func SetCompress ¶
SetCompress tells clients to use compression
func SetEncrypt ¶
SetEncrypt tells the router to use an encrypted leaseset
func SetFastRecieve ¶
SetFastRecieve tells clients to use compression
func SetInBackups ¶
SetInBackups sets the inbound tunnel backups
func SetInLength ¶
SetInLength sets the number of hops inbound
func SetInQuantity ¶
SetInQuantity sets the inbound tunnel quantity
func SetInVariance ¶
SetInVariance sets the variance of a number of hops inbound
func SetLeaseSetKey ¶
SetLeaseSetKey sets the host of the SAMEmit's SAM bridge
func SetLeaseSetPrivateKey ¶
SetLeaseSetPrivateKey sets the host of the SAMEmit's SAM bridge
func SetLeaseSetPrivateSigningKey ¶
SetLeaseSetPrivateSigningKey sets the host of the SAMEmit's SAM bridge
func SetMessageReliability ¶
SetMessageReliability sets the host of the SAMEmit's SAM bridge
func SetOutBackups ¶
SetOutBackups sets the inbound tunnel backups
func SetOutLength ¶
SetOutLength sets the number of hops outbound
func SetOutQuantity ¶
SetOutQuantity sets the outbound tunnel quantity
func SetOutVariance ¶
SetOutVariance sets the variance of a number of hops outbound
func SetReduceIdle ¶
SetReduceIdle tells the connection to reduce it's tunnels during extended idle time.
func SetReduceIdleQuantity ¶
SetReduceIdleQuantity sets minimum number of tunnels to reduce to during idle time
func SetReduceIdleTime ¶
SetReduceIdleTime sets the time to wait before reducing tunnels to idle levels
func SetReduceIdleTimeMs ¶
SetReduceIdleTimeMs sets the time to wait before reducing tunnels to idle levels in milliseconds
func SetSAMAddress ¶
SetSAMAddress sets the SAM address all-at-once
func SetSAMHost ¶
SetSAMHost sets the host of the SAMEmit's SAM bridge
func SetSAMPort ¶
SetSAMPort sets the port of the SAMEmit's SAM bridge using a string
Types ¶
type Config ¶
Config is the config type for the sam connector api for i2p which allows applications to 'speak' with i2p
func (*Config) DatagramSession ¶
func (cfg *Config) DatagramSession() (session *DatagramSession, err error)
create new sam datagram session from config
func (*Config) StreamSession ¶
func (cfg *Config) StreamSession() (session *StreamSession, err error)
create new sam connector from config with a stream session
type DatagramSession ¶
type DatagramSession struct {
// contains filtered or unexported fields
}
The DatagramSession implements net.PacketConn. It works almost like ordinary UDP, except that datagrams may be at most 31kB large. These datagrams are also end-to-end encrypted, signed and includes replay-protection. And they are also built to be surveillance-resistant (yey!).
Example ¶
// Creates a new DatagramSession, which behaves just like a net.PacketConn. const samBridge = "127.0.0.1:7656" sam, err := NewSAM(samBridge) if err != nil { fmt.Println(err.Error()) return } keys, err := sam.NewKeys() if err != nil { fmt.Println(err.Error()) return } myself := keys.Addr() // See the example Option_* variables. dg, err := sam.NewDatagramSession("DGTUN", keys, Options_Small, 0) if err != nil { fmt.Println(err.Error()) return } someone, err := sam.Lookup("zzz.i2p") if err != nil { fmt.Println(err.Error()) return } dg.WriteTo([]byte("Hello stranger!"), someone) dg.WriteTo([]byte("Hello myself!"), myself) buf := make([]byte, 31*1024) n, _, err := dg.ReadFrom(buf) if err != nil { fmt.Println(err.Error()) return } fmt.Println("Got message: '" + string(buf[:n]) + "'") fmt.Println("Got message: " + string(buf[:n])) return
Output: Got message: Hello myself!
func (*DatagramSession) Addr ¶
func (s *DatagramSession) Addr() net.Addr
func (*DatagramSession) B32 ¶
func (s *DatagramSession) B32() string
func (*DatagramSession) Close ¶
func (s *DatagramSession) Close() error
Closes the DatagramSession. Implements net.PacketConn
func (*DatagramSession) Dial ¶
func (s *DatagramSession) Dial(net string, addr string) (*DatagramSession, error)
func (*DatagramSession) DialI2PRemote ¶
func (s *DatagramSession) DialI2PRemote(net string, addr net.Addr) (*DatagramSession, error)
func (*DatagramSession) DialRemote ¶
func (s *DatagramSession) DialRemote(net, addr string) (net.PacketConn, error)
func (*DatagramSession) LocalAddr ¶
func (s *DatagramSession) LocalAddr() net.Addr
Implements net.PacketConn
func (*DatagramSession) LocalI2PAddr ¶
func (s *DatagramSession) LocalI2PAddr() i2pkeys.I2PAddr
Returns the I2P destination of the DatagramSession.
func (*DatagramSession) Lookup ¶
func (s *DatagramSession) Lookup(name string) (a net.Addr, err error)
func (*DatagramSession) ReadFrom ¶
Reads one datagram sent to the destination of the DatagramSession. Returns the number of bytes read, from what address it was sent, or an error. implements net.PacketConn
func (*DatagramSession) RemoteAddr ¶
func (s *DatagramSession) RemoteAddr() net.Addr
func (*DatagramSession) SetDeadline ¶
func (s *DatagramSession) SetDeadline(t time.Time) error
Sets read and write deadlines for the DatagramSession. Implements net.PacketConn and does the same thing. Setting write deadlines for datagrams is seldom done.
func (*DatagramSession) SetReadDeadline ¶
func (s *DatagramSession) SetReadDeadline(t time.Time) error
Sets read deadline for the DatagramSession. Implements net.PacketConn
func (*DatagramSession) SetWriteBuffer ¶
func (s *DatagramSession) SetWriteBuffer(bytes int) error
func (*DatagramSession) SetWriteDeadline ¶
func (s *DatagramSession) SetWriteDeadline(t time.Time) error
Sets the write deadline for the DatagramSession. Implements net.Packetconn.
type I2PConfig ¶
type I2PConfig struct { SamHost string SamPort string TunName string SamMin string SamMax string Fromport string Toport string Style string TunType string DestinationKeys i2pkeys.I2PKeys SigType string EncryptLeaseSet string LeaseSetKey string LeaseSetPrivateKey string LeaseSetPrivateSigningKey string LeaseSetKeys i2pkeys.I2PKeys InAllowZeroHop string OutAllowZeroHop string InLength string OutLength string InQuantity string OutQuantity string InVariance string OutVariance string InBackupQuantity string OutBackupQuantity string FastRecieve string UseCompression string MessageReliability string CloseIdle string CloseIdleTime string ReduceIdle string ReduceIdleTime string ReduceIdleQuantity string LeaseSetEncryption string //Streaming Library options AccessListType string AccessList []string }
I2PConfig is a struct which manages I2P configuration options
func (*I2PConfig) Accesslist ¶
func (*I2PConfig) Accesslisttype ¶
func (*I2PConfig) DestinationKey ¶
func (*I2PConfig) EncryptLease ¶
func (*I2PConfig) LeaseSetEncryptionType ¶
func (*I2PConfig) Leasesetsettings ¶
func (*I2PConfig) Reliability ¶
func (*I2PConfig) SessionStyle ¶
func (*I2PConfig) SetSAMAddress ¶
func (*I2PConfig) SignatureType ¶
type PrimarySession ¶
type PrimarySession struct { Timeout time.Duration Deadline time.Time Config SAMEmit // contains filtered or unexported fields }
Represents a primary session.
func (*PrimarySession) Addr ¶
func (ss *PrimarySession) Addr() i2pkeys.I2PAddr
Returns the I2P destination (the address) of the stream session
func (*PrimarySession) Close ¶
func (ss *PrimarySession) Close() error
func (*PrimarySession) Dial ¶
func (sam *PrimarySession) Dial(network, addr string) (net.Conn, error)
func (*PrimarySession) DialTCPI2P ¶
func (*PrimarySession) DialUDP ¶
func (sam *PrimarySession) DialUDP(network string, laddr, raddr net.Addr) (net.PacketConn, error)
DialUDP implements x/dialer
func (*PrimarySession) DialUDPI2P ¶
func (sam *PrimarySession) DialUDPI2P(network, laddr, raddr string) (*DatagramSession, error)
func (*PrimarySession) From ¶
func (ss *PrimarySession) From() string
func (*PrimarySession) ID ¶
func (ss *PrimarySession) ID() string
Returns the local tunnel name of the I2P tunnel used for the stream session
func (*PrimarySession) Keys ¶
func (ss *PrimarySession) Keys() i2pkeys.I2PKeys
Returns the keys associated with the stream session
func (*PrimarySession) LocalAddr ¶
func (ss *PrimarySession) LocalAddr() net.Addr
func (*PrimarySession) Lookup ¶
func (s *PrimarySession) Lookup(name string) (a net.Addr, err error)
func (*PrimarySession) NewDatagramSubSession ¶
func (s *PrimarySession) NewDatagramSubSession(id string, udpPort int) (*DatagramSession, error)
Creates a new datagram session. udpPort is the UDP port SAM is listening on, and if you set it to zero, it will use SAMs standard UDP port.
func (*PrimarySession) NewRawSubSession ¶
func (s *PrimarySession) NewRawSubSession(id string, udpPort int) (*RawSession, error)
Creates a new raw session. udpPort is the UDP port SAM is listening on, and if you set it to zero, it will use SAMs standard UDP port.
func (*PrimarySession) NewStreamSubSession ¶
func (sam *PrimarySession) NewStreamSubSession(id string) (*StreamSession, error)
Creates a new StreamSession with the I2CP- and streaminglib options as specified. See the I2P documentation for a full list of options.
func (*PrimarySession) NewStreamSubSessionWithPorts ¶
func (sam *PrimarySession) NewStreamSubSessionWithPorts(id, from, to string) (*StreamSession, error)
Creates a new StreamSession with the I2CP- and streaminglib options as specified. See the I2P documentation for a full list of options.
func (*PrimarySession) NewUniqueStreamSubSession ¶
func (sam *PrimarySession) NewUniqueStreamSubSession(id string) (*StreamSession, error)
Creates a new StreamSession with the I2CP- and streaminglib options as specified. See the I2P documentation for a full list of options.
func (*PrimarySession) Resolve ¶
func (sam *PrimarySession) Resolve(network, addr string) (net.Addr, error)
func (*PrimarySession) ResolveTCPAddr ¶
func (sam *PrimarySession) ResolveTCPAddr(network, dest string) (net.Addr, error)
func (*PrimarySession) ResolveUDPAddr ¶
func (sam *PrimarySession) ResolveUDPAddr(network, dest string) (net.Addr, error)
func (*PrimarySession) SignatureType ¶
func (ss *PrimarySession) SignatureType() string
func (*PrimarySession) To ¶
func (ss *PrimarySession) To() string
type RawSession ¶
type RawSession struct {
// contains filtered or unexported fields
}
The RawSession provides no authentication of senders, and there is no sender address attached to datagrams, so all communication is anonymous. The messages send are however still endpoint-to-endpoint encrypted. You need to figure out a way to identify and authenticate clients yourself, iff that is needed. Raw datagrams may be at most 32 kB in size. There is no overhead of authentication, which is the reason to use this..
func (*RawSession) LocalAddr ¶
func (s *RawSession) LocalAddr() i2pkeys.I2PAddr
Returns the local I2P destination of the RawSession.
func (*RawSession) Read ¶
func (s *RawSession) Read(b []byte) (n int, err error)
Reads one raw datagram sent to the destination of the DatagramSession. Returns the number of bytes read. Who sent the raw message can not be determined at this layer - you need to do it (in a secure way!).
func (*RawSession) SetDeadline ¶
func (s *RawSession) SetDeadline(t time.Time) error
func (*RawSession) SetReadDeadline ¶
func (s *RawSession) SetReadDeadline(t time.Time) error
func (*RawSession) SetWriteDeadline ¶
func (s *RawSession) SetWriteDeadline(t time.Time) error
type SAM ¶
type SAM struct { Config SAMEmit // contains filtered or unexported fields }
Used for controlling I2Ps SAMv3.
func (*SAM) EnsureKeyfile ¶
if keyfile fname does not exist
func (*SAM) Lookup ¶
Performs a lookup, probably this order: 1) routers known addresses, cached addresses, 3) by asking peers in the I2P network.
func (*SAM) NewDatagramSession ¶
func (s *SAM) NewDatagramSession(id string, keys i2pkeys.I2PKeys, options []string, udpPort int) (*DatagramSession, error)
Creates a new datagram session. udpPort is the UDP port SAM is listening on, and if you set it to zero, it will use SAMs standard UDP port.
func (*SAM) NewKeys ¶
Creates the I2P-equivalent of an IP address, that is unique and only the one who has the private keys can send messages from. The public keys are the I2P desination (the address) that anyone can send messages to.
func (*SAM) NewPrimarySession ¶
func (sam *SAM) NewPrimarySession(id string, keys i2pkeys.I2PKeys, options []string) (*PrimarySession, error)
Creates a new PrimarySession with the I2CP- and streaminglib options as specified. See the I2P documentation for a full list of options.
func (*SAM) NewPrimarySessionWithSignature ¶
func (sam *SAM) NewPrimarySessionWithSignature(id string, keys i2pkeys.I2PKeys, options []string, sigType string) (*PrimarySession, error)
Creates a new PrimarySession with the I2CP- and PRIMARYinglib options as specified. See the I2P documentation for a full list of options.
func (*SAM) NewRawSession ¶
func (s *SAM) NewRawSession(id string, keys i2pkeys.I2PKeys, options []string, udpPort int) (*RawSession, error)
Creates a new raw session. udpPort is the UDP port SAM is listening on, and if you set it to zero, it will use SAMs standard UDP port.
func (*SAM) NewStreamSession ¶
func (sam *SAM) NewStreamSession(id string, keys i2pkeys.I2PKeys, options []string) (*StreamSession, error)
Creates a new StreamSession with the I2CP- and streaminglib options as specified. See the I2P documentation for a full list of options.
func (*SAM) NewStreamSessionWithSignature ¶
func (sam *SAM) NewStreamSessionWithSignature(id string, keys i2pkeys.I2PKeys, options []string, sigType string) (*StreamSession, error)
Creates a new StreamSession with the I2CP- and streaminglib options as specified. See the I2P documentation for a full list of options.
func (*SAM) NewStreamSessionWithSignatureAndPorts ¶
func (sam *SAM) NewStreamSessionWithSignatureAndPorts(id, from, to string, keys i2pkeys.I2PKeys, options []string, sigType string) (*StreamSession, error)
Creates a new StreamSession with the I2CP- and streaminglib options as specified. See the I2P documentation for a full list of options.
type SAMConn ¶
type SAMConn struct {
// contains filtered or unexported fields
}
import (
. "github.com/go-i2p/i2pkeys"
)
Implements net.Conn
func (*SAMConn) RemoteAddr ¶
func (*SAMConn) SetReadDeadline ¶
Implements net.Conn
func (*SAMConn) SetWriteDeadline ¶
Implements net.Conn
type SAMEmit ¶
type SAMEmit struct {
I2PConfig
}
func (*SAMEmit) AcceptBytes ¶
func (*SAMEmit) ConnectBytes ¶
func (*SAMEmit) CreateBytes ¶
func (*SAMEmit) GenerateDestination ¶
func (*SAMEmit) GenerateDestinationBytes ¶
func (*SAMEmit) HelloBytes ¶
func (*SAMEmit) LookupBytes ¶
type SAMResolver ¶
type SAMResolver struct {
*SAM
}
func NewFullSAMResolver ¶
func NewFullSAMResolver(address string) (*SAMResolver, error)
func NewSAMResolver ¶
func NewSAMResolver(parent *SAM) (*SAMResolver, error)
type StreamListener ¶
type StreamListener struct {
// contains filtered or unexported fields
}
Example ¶
// One server Accept()ing on a StreamListener, and one client that Dials // through I2P to the server. Server writes "Hello world!" through a SAMConn // (which implements net.Conn) and the client prints the message. const samBridge = "127.0.0.1:7656" sam, err := NewSAM(samBridge) if err != nil { fmt.Println(err.Error()) return } defer sam.Close() keys, err := sam.NewKeys() if err != nil { fmt.Println(err.Error()) return } quit := make(chan bool) // Client connecting to the server go func(server i2pkeys.I2PAddr) { csam, err := NewSAM(samBridge) if err != nil { fmt.Println(err.Error()) return } defer csam.Close() keys, err := csam.NewKeys() if err != nil { fmt.Println(err.Error()) return } cs, err := csam.NewStreamSession("client_example", keys, Options_Small) if err != nil { fmt.Println(err.Error()) quit <- false return } conn, err := cs.DialI2P(server) if err != nil { fmt.Println(err.Error()) quit <- false return } buf := make([]byte, 256) n, err := conn.Read(buf) if err != nil { fmt.Println(err.Error()) quit <- false return } fmt.Println(string(buf[:n])) quit <- true }(keys.Addr()) // end of client ss, err := sam.NewStreamSession("server_example", keys, Options_Small) if err != nil { fmt.Println(err.Error()) return } l, err := ss.Listen() if err != nil { fmt.Println(err.Error()) return } conn, err := l.Accept() if err != nil { fmt.Println(err.Error()) return } conn.Write([]byte("Hello world!")) <-quit // waits for client to die, for example only
Output: Hello world!
func (*StreamListener) Accept ¶
func (l *StreamListener) Accept() (net.Conn, error)
implements net.Listener
func (*StreamListener) AcceptI2P ¶
func (l *StreamListener) AcceptI2P() (*SAMConn, error)
accept a new inbound connection
func (*StreamListener) Addr ¶
func (l *StreamListener) Addr() net.Addr
get our address implements net.Listener
func (*StreamListener) From ¶
func (l *StreamListener) From() string
func (*StreamListener) To ¶
func (l *StreamListener) To() string
type StreamSession ¶
type StreamSession struct { Timeout time.Duration Deadline time.Time // contains filtered or unexported fields }
Represents a streaming session.
Example ¶
// Creates a new StreamingSession, dials to idk.i2p and gets a SAMConn // which behaves just like a normal net.Conn. const samBridge = "127.0.0.1:7656" sam, err := NewSAM(samBridge) if err != nil { fmt.Println(err.Error()) return } defer sam.Close() keys, err := sam.NewKeys() if err != nil { fmt.Println(err.Error()) return } // See the example Option_* variables. ss, err := sam.NewStreamSession("stream_example", keys, Options_Small) if err != nil { fmt.Println(err.Error()) return } someone, err := sam.Lookup("idk.i2p") if err != nil { fmt.Println(err.Error()) return } conn, err := ss.DialI2P(someone) if err != nil { fmt.Println(err.Error()) return } defer conn.Close() fmt.Println("Sending HTTP GET /") if _, err := conn.Write([]byte("GET /\n")); err != nil { fmt.Println(err.Error()) return } buf := make([]byte, 4096) n, err := conn.Read(buf) if !strings.Contains(strings.ToLower(string(buf[:n])), "http") && !strings.Contains(strings.ToLower(string(buf[:n])), "html") { fmt.Printf("Probably failed to StreamSession.DialI2P(idk.i2p)? It replied %d bytes, but nothing that looked like http/html", n) log.Printf("Probably failed to StreamSession.DialI2P(idk.i2p)? It replied %d bytes, but nothing that looked like http/html", n) } else { fmt.Println("Read HTTP/HTML from idk.i2p") log.Println("Read HTTP/HTML from idk.i2p") } return
Output: Sending HTTP GET / Read HTTP/HTML from idk.i2p
func (*StreamSession) Addr ¶
func (s *StreamSession) Addr() i2pkeys.I2PAddr
Returns the I2P destination (the address) of the stream session
func (*StreamSession) Close ¶
func (s *StreamSession) Close() error
func (*StreamSession) Dial ¶
func (s *StreamSession) Dial(n, addr string) (c net.Conn, err error)
implement net.Dialer
func (*StreamSession) DialContext ¶
context-aware dialer, eventually...
func (*StreamSession) DialContextI2P ¶
context-aware dialer, eventually...
func (*StreamSession) DialI2P ¶
func (s *StreamSession) DialI2P(addr i2pkeys.I2PAddr) (*SAMConn, error)
Dials to an I2P destination and returns a SAMConn, which implements a net.Conn.
func (*StreamSession) From ¶
func (s *StreamSession) From() string
func (*StreamSession) ID ¶
func (s *StreamSession) ID() string
Returns the local tunnel name of the I2P tunnel used for the stream session
func (*StreamSession) Keys ¶
func (s *StreamSession) Keys() i2pkeys.I2PKeys
Returns the keys associated with the stream session
func (*StreamSession) Listen ¶
func (s *StreamSession) Listen() (*StreamListener, error)
create a new stream listener to accept inbound connections
func (*StreamSession) LocalAddr ¶
func (s *StreamSession) LocalAddr() net.Addr
func (*StreamSession) Lookup ¶
func (s *StreamSession) Lookup(name string) (i2pkeys.I2PAddr, error)
lookup name, convenience function
func (*StreamSession) Read ¶
func (s *StreamSession) Read(buf []byte) (int, error)
Read reads data from the stream.
func (*StreamSession) SetDeadline ¶
func (s *StreamSession) SetDeadline(t time.Time) error
func (*StreamSession) SetReadDeadline ¶
func (s *StreamSession) SetReadDeadline(t time.Time) error
func (*StreamSession) SetWriteDeadline ¶
func (s *StreamSession) SetWriteDeadline(t time.Time) error
func (*StreamSession) SignatureType ¶
func (s *StreamSession) SignatureType() string
func (*StreamSession) To ¶
func (s *StreamSession) To() string