diff --git a/lib/common/lease/lease_test.go b/lib/common/lease/lease_test.go index 2485808..4e8aa4d 100644 --- a/lib/common/lease/lease_test.go +++ b/lib/common/lease/lease_test.go @@ -2,6 +2,7 @@ package lease import ( "testing" + "github.com/stretchr/testify/assert" . "github.com/go-i2p/go-i2p/lib/common/data" @@ -14,7 +15,7 @@ func TestTunnelGateway(t *testing.T) { var lease_bytes []byte lease_bytes = append(lease_bytes, expectedTunnelGatewayBytes...) - lease_bytes = append(lease_bytes, make([]byte, LEASE_SIZE - LEASE_TUNNEL_GW_SIZE)...) + lease_bytes = append(lease_bytes, make([]byte, LEASE_SIZE-LEASE_TUNNEL_GW_SIZE)...) lease := Lease(lease_bytes) tunnelGateway := lease.TunnelGateway() @@ -29,7 +30,7 @@ func TestTunnelID(t *testing.T) { var lease_bytes []byte lease_bytes = append(lease_bytes, make([]byte, LEASE_TUNNEL_GW_SIZE)...) lease_bytes = append(lease_bytes, expectedTunnelIDBytes...) - lease_bytes = append(lease_bytes, make([]byte, LEASE_SIZE - LEASE_TUNNEL_ID_SIZE - LEASE_TUNNEL_GW_SIZE)...) + lease_bytes = append(lease_bytes, make([]byte, LEASE_SIZE-LEASE_TUNNEL_ID_SIZE-LEASE_TUNNEL_GW_SIZE)...) lease := Lease(lease_bytes) tunnelID := lease.TunnelID() @@ -42,7 +43,7 @@ func TestDate(t *testing.T) { expectedDateBytes := []byte{0x21, 0x37, 0x31, 0x33, 0x16, 0x93, 0x13, 0x28} var lease_bytes []byte - lease_bytes = append(lease_bytes, make([]byte, LEASE_TUNNEL_GW_SIZE + LEASE_TUNNEL_ID_SIZE)...) + lease_bytes = append(lease_bytes, make([]byte, LEASE_TUNNEL_GW_SIZE+LEASE_TUNNEL_ID_SIZE)...) lease_bytes = append(lease_bytes, expectedDateBytes...) lease := Lease(lease_bytes) diff --git a/lib/transport/noise/outgoing_handshake.go b/lib/transport/noise/outgoing_handshake.go index 74af93e..e80ebbf 100644 --- a/lib/transport/noise/outgoing_handshake.go +++ b/lib/transport/noise/outgoing_handshake.go @@ -45,40 +45,50 @@ func (c *NoiseSession) RunOutgoingHandshake() error { return nil } -func (c *NoiseSession) ComposeInitiatorHandshakeMessage(s noise.DHKey, rs []byte, payload []byte, ePrivate []byte) (negData, msg []byte, state *noise.HandshakeState, err error) { +func (c *NoiseSession) ComposeInitiatorHandshakeMessage( + localStatic noise.DHKey, + remoteStatic []byte, + payload []byte, + ephemeralPrivate []byte, +) ( + negotiationData, + handshakeMessage []byte, + handshakeState *noise.HandshakeState, + err error, +) { log.Debug("Starting ComposeInitiatorHandshakeMessage") - if len(rs) != 0 && len(rs) != noise.DH25519.DHLen() { + if len(remoteStatic) != 0 && len(remoteStatic) != noise.DH25519.DHLen() { return nil, nil, nil, errors.New("only 32 byte curve25519 public keys are supported") } - negData = make([]byte, 6) - copy(negData, initNegotiationData(nil)) + negotiationData = make([]byte, 6) + copy(negotiationData, initNegotiationData(nil)) pattern := noise.HandshakeXK - negData[5] = NOISE_PATTERN_XK + negotiationData[5] = NOISE_PATTERN_XK var random io.Reader - if len(ePrivate) == 0 { + if len(ephemeralPrivate) == 0 { random = rand.Reader } else { - random = bytes.NewBuffer(ePrivate) + random = bytes.NewBuffer(ephemeralPrivate) } config := noise.Config{ CipherSuite: noise.NewCipherSuite(noise.DH25519, noise.CipherChaChaPoly, noise.HashSHA256), Pattern: pattern, Initiator: true, - StaticKeypair: s, + StaticKeypair: localStatic, Random: random, } - state, err = noise.NewHandshakeState(config) + handshakeState, err = noise.NewHandshakeState(config) if err != nil { return nil, nil, nil, err } // Write message, expecting no CipherStates yet since this is message 1 - msg, cs0, cs1, err := state.WriteMessage(nil, payload) + handshakeMessage, cs0, cs1, err := handshakeState.WriteMessage(nil, payload) if err != nil { return nil, nil, nil, err } @@ -88,5 +98,5 @@ func (c *NoiseSession) ComposeInitiatorHandshakeMessage(s noise.DHKey, rs []byte return nil, nil, nil, errors.New("unexpected cipher states in message 1") } - return negData, msg, state, nil + return negotiationData, handshakeMessage, handshakeState, nil } diff --git a/lib/transport/ntcp/outgoing_handshake.go b/lib/transport/ntcp/outgoing_handshake.go index fe51ca1..c1de489 100644 --- a/lib/transport/ntcp/outgoing_handshake.go +++ b/lib/transport/ntcp/outgoing_handshake.go @@ -13,44 +13,44 @@ var log = logger.GetGoI2PLogger() // Modify ComposeInitiatorHandshakeMessage in outgoing_handshake.go func (c *NTCP2Session) ComposeInitiatorHandshakeMessage(s noise.DHKey, rs []byte, payload []byte, ePrivate []byte) (negData, msg []byte, state *noise.HandshakeState, err error) { - // Create session request - request, err := c.CreateSessionRequest() - if err != nil { - return nil, nil, nil, err - } - - // Buffer for the complete message - buf := new(bytes.Buffer) - - // Write obfuscated key - buf.Write(request.ObfuscatedKey) - - // Write timestamp - binary.BigEndian.PutUint32(buf.Next(4), request.Timestamp) - - // Initialize Noise - config := noise.Config{ - CipherSuite: noise.NewCipherSuite(noise.DH25519, noise.CipherChaChaPoly, noise.HashSHA256), - Pattern: noise.HandshakeXK, - Initiator: true, - StaticKeypair: s, - Random: rand.Reader, - } - - state, err = noise.NewHandshakeState(config) - if err != nil { - return nil, nil, nil, err - } - - // Create Noise message - msg, _, _, err = state.WriteMessage(nil, buf.Bytes()) - if err != nil { - return nil, nil, nil, err - } - - // Add padding - msg = append(msg, request.Padding...) - - // Ensure entire message is written at once - return nil, msg, state, nil -} \ No newline at end of file + // Create session request + request, err := c.CreateSessionRequest() + if err != nil { + return nil, nil, nil, err + } + + // Buffer for the complete message + buf := new(bytes.Buffer) + + // Write obfuscated key + buf.Write(request.ObfuscatedKey) + + // Write timestamp + binary.BigEndian.PutUint32(buf.Next(4), request.Timestamp) + + // Initialize Noise + config := noise.Config{ + CipherSuite: noise.NewCipherSuite(noise.DH25519, noise.CipherChaChaPoly, noise.HashSHA256), + Pattern: noise.HandshakeXK, + Initiator: true, + StaticKeypair: s, + Random: rand.Reader, + } + + state, err = noise.NewHandshakeState(config) + if err != nil { + return nil, nil, nil, err + } + + // Create Noise message + msg, _, _, err = state.WriteMessage(nil, buf.Bytes()) + if err != nil { + return nil, nil, nil, err + } + + // Add padding + msg = append(msg, request.Padding...) + + // Ensure entire message is written at once + return nil, msg, state, nil +} diff --git a/lib/transport/ntcp/session.go b/lib/transport/ntcp/session.go index 663502b..5d767bf 100644 --- a/lib/transport/ntcp/session.go +++ b/lib/transport/ntcp/session.go @@ -34,38 +34,38 @@ type NTCP2Session struct { } type SessionRequest struct { - ObfuscatedKey []byte // 32 bytes - Timestamp uint32 // 4 bytes - Padding []byte // Random padding + ObfuscatedKey []byte // 32 bytes + Timestamp uint32 // 4 bytes + Padding []byte // Random padding } func (s *NTCP2Session) CreateSessionRequest() (*SessionRequest, error) { - // Get our ephemeral key pair - ephemeralKey := make([]byte, 32) - if _, err := rand.Read(ephemeralKey); err != nil { - return nil, err - } - - // Obfuscate the ephemeral key using Bob's static key - obfuscatedKey, err := s.ObfuscateEphemeral(ephemeralKey) - if err != nil { - return nil, err - } - - // Create timestamp (current time in seconds) - timestamp := uint32(time.Now().Unix()) - - // Add random padding (implementation specific) - padding := make([]byte, rand.Intn(16)) // Up to 16 bytes of padding - if _, err := rand.Read(padding); err != nil { - return nil, err - } - - return &SessionRequest{ - ObfuscatedKey: obfuscatedKey, - Timestamp: timestamp, - Padding: padding, - }, nil + // Get our ephemeral key pair + ephemeralKey := make([]byte, 32) + if _, err := rand.Read(ephemeralKey); err != nil { + return nil, err + } + + // Obfuscate the ephemeral key using Bob's static key + obfuscatedKey, err := s.ObfuscateEphemeral(ephemeralKey) + if err != nil { + return nil, err + } + + // Create timestamp (current time in seconds) + timestamp := uint32(time.Now().Unix()) + + // Add random padding (implementation specific) + padding := make([]byte, rand.Intn(16)) // Up to 16 bytes of padding + if _, err := rand.Read(padding); err != nil { + return nil, err + } + + return &SessionRequest{ + ObfuscatedKey: obfuscatedKey, + Timestamp: timestamp, + Padding: padding, + }, nil } // NewNTCP2Session creates a new NTCP2 session using the existing noise implementation diff --git a/main.go b/main.go index 5e8f004..7cee785 100644 --- a/main.go +++ b/main.go @@ -6,8 +6,8 @@ import ( "github.com/go-i2p/go-i2p/lib/config" "github.com/go-i2p/go-i2p/lib/router" - "github.com/go-i2p/logger" "github.com/go-i2p/go-i2p/lib/util/signals" + "github.com/go-i2p/logger" "github.com/spf13/cobra" "github.com/spf13/viper" "gopkg.in/yaml.v3"