mirror of
https://github.com/go-i2p/go-i2p.git
synced 2025-07-11 17:56:52 -04:00
reorganized old hansdhake stuff
This commit is contained in:
@ -65,78 +65,6 @@ func NewHandshakeState(localKey types.PrivateKey, remoteKey types.PublicKey, ri
|
||||
return hs, nil
|
||||
}
|
||||
|
||||
// PerformOutboundHandshake initiates and completes a handshake as the initiator
|
||||
func (c *NTCP2Session) PerformOutboundHandshake(conn net.Conn, hs *HandshakeState) error {
|
||||
// Set deadline for the entire handshake process
|
||||
if err := conn.SetDeadline(time.Now().Add(NTCP2_HANDSHAKE_TIMEOUT)); err != nil {
|
||||
return oops.Errorf("failed to set deadline: %v", err)
|
||||
}
|
||||
defer conn.SetDeadline(time.Time{}) // Clear deadline after handshake
|
||||
|
||||
// 1. Send SessionRequest
|
||||
if err := c.sendSessionRequest(conn, hs); err != nil {
|
||||
return oops.Errorf("failed to send session request: %v", err)
|
||||
}
|
||||
|
||||
// 2. Receive SessionCreated
|
||||
if err := c.receiveSessionCreated(conn, hs); err != nil {
|
||||
return oops.Errorf("failed to receive session created: %v", err)
|
||||
}
|
||||
|
||||
// 3. Send SessionConfirm
|
||||
if err := c.sendSessionConfirm(conn, hs); err != nil {
|
||||
return oops.Errorf("failed to send session confirm: %v", err)
|
||||
}
|
||||
|
||||
// Handshake complete, derive session keys
|
||||
return c.deriveSessionKeys(hs)
|
||||
}
|
||||
|
||||
// PerformInboundHandshake handles a handshake initiated by a remote peer
|
||||
func (c *NTCP2Session) PerformInboundHandshake(conn net.Conn, localKey types.PrivateKey) (*HandshakeState, error) {
|
||||
// Set deadline for the entire handshake process
|
||||
if err := conn.SetDeadline(time.Now().Add(NTCP2_HANDSHAKE_TIMEOUT)); err != nil {
|
||||
return nil, oops.Errorf("failed to set deadline: %v", err)
|
||||
}
|
||||
defer conn.SetDeadline(time.Time{}) // Clear deadline after handshake
|
||||
|
||||
// Create handshake state for responder
|
||||
hs := &HandshakeState{
|
||||
isInitiator: false,
|
||||
localStaticKey: localKey,
|
||||
timestamp: uint32(time.Now().Unix()),
|
||||
}
|
||||
|
||||
// Generate ephemeral keypair
|
||||
var err error
|
||||
_, hs.localEphemeral, err = curve25519.GenerateKeyPair()
|
||||
if err != nil {
|
||||
return nil, oops.Errorf("failed to generate ephemeral key: %v", err)
|
||||
}
|
||||
|
||||
// 1. Receive SessionRequest
|
||||
if err := c.receiveSessionRequest(conn, hs); err != nil {
|
||||
return nil, oops.Errorf("failed to receive session request: %v", err)
|
||||
}
|
||||
|
||||
// 2. Send SessionCreated
|
||||
if err := c.sendSessionCreated(conn, hs); err != nil {
|
||||
return nil, oops.Errorf("failed to send session created: %v", err)
|
||||
}
|
||||
|
||||
// 3. Receive SessionConfirm
|
||||
if err := c.receiveSessionConfirm(conn, hs); err != nil {
|
||||
return nil, oops.Errorf("failed to receive session confirm: %v", err)
|
||||
}
|
||||
|
||||
// Handshake complete, derive session keys
|
||||
if err := c.deriveSessionKeys(hs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return hs, nil
|
||||
}
|
||||
|
||||
// sendSessionRequest sends Message 1 (SessionRequest) to the remote peer
|
||||
func (c *NTCP2Session) sendSessionRequest(conn net.Conn, hs *HandshakeState) error {
|
||||
// Implement according to NTCP2 spec
|
||||
|
55
lib/transport/ntcp/incoming_handshake.go
Normal file
55
lib/transport/ntcp/incoming_handshake.go
Normal file
@ -0,0 +1,55 @@
|
||||
package ntcp
|
||||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/go-i2p/go-i2p/lib/crypto/curve25519"
|
||||
"github.com/go-i2p/go-i2p/lib/crypto/types"
|
||||
"github.com/samber/oops"
|
||||
)
|
||||
|
||||
// PerformInboundHandshake handles a handshake initiated by a remote peer
|
||||
func (c *NTCP2Session) PerformInboundHandshake(conn net.Conn, localKey types.PrivateKey) (*HandshakeState, error) {
|
||||
// Set deadline for the entire handshake process
|
||||
if err := conn.SetDeadline(time.Now().Add(NTCP2_HANDSHAKE_TIMEOUT)); err != nil {
|
||||
return nil, oops.Errorf("failed to set deadline: %v", err)
|
||||
}
|
||||
defer conn.SetDeadline(time.Time{}) // Clear deadline after handshake
|
||||
|
||||
// Create handshake state for responder
|
||||
hs := &HandshakeState{
|
||||
isInitiator: false,
|
||||
localStaticKey: localKey,
|
||||
timestamp: uint32(time.Now().Unix()),
|
||||
}
|
||||
|
||||
// Generate ephemeral keypair
|
||||
var err error
|
||||
_, hs.localEphemeral, err = curve25519.GenerateKeyPair()
|
||||
if err != nil {
|
||||
return nil, oops.Errorf("failed to generate ephemeral key: %v", err)
|
||||
}
|
||||
|
||||
// 1. Receive SessionRequest
|
||||
if err := c.receiveSessionRequest(conn, hs); err != nil {
|
||||
return nil, oops.Errorf("failed to receive session request: %v", err)
|
||||
}
|
||||
|
||||
// 2. Send SessionCreated
|
||||
if err := c.sendSessionCreated(conn, hs); err != nil {
|
||||
return nil, oops.Errorf("failed to send session created: %v", err)
|
||||
}
|
||||
|
||||
// 3. Receive SessionConfirm
|
||||
if err := c.receiveSessionConfirm(conn, hs); err != nil {
|
||||
return nil, oops.Errorf("failed to receive session confirm: %v", err)
|
||||
}
|
||||
|
||||
// Handshake complete, derive session keys
|
||||
if err := c.deriveSessionKeys(hs); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return hs, nil
|
||||
}
|
@ -4,8 +4,11 @@ import (
|
||||
"github.com/go-i2p/go-i2p/lib/common/router_info"
|
||||
"github.com/go-i2p/go-i2p/lib/transport/noise"
|
||||
"github.com/go-i2p/go-i2p/lib/util/time/sntp"
|
||||
"github.com/go-i2p/logger"
|
||||
)
|
||||
|
||||
var log = logger.GetGoI2PLogger()
|
||||
|
||||
func NewNTCP2Transport(routerInfo *router_info.RouterInfo) (*NTCP2Transport, error) {
|
||||
defaultClient := &sntp.DefaultNTPClient{}
|
||||
timestamper := sntp.NewRouterTimestamper(defaultClient)
|
||||
|
@ -3,13 +3,13 @@ package ntcp
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/flynn/noise"
|
||||
"github.com/go-i2p/logger"
|
||||
"github.com/samber/oops"
|
||||
)
|
||||
|
||||
var log = logger.GetGoI2PLogger()
|
||||
|
||||
// Modify ComposeInitiatorHandshakeMessage in outgoing_handshake.go
|
||||
// At the moment, remoteStatic is stored in the NTCP2Session() and doesn't need to be passed as an argument.
|
||||
// You actually get it directly out of the remote RouterInfo, which the NoiseSession also has access to.
|
||||
@ -84,3 +84,30 @@ func (c *NTCP2Session) ComposeInitiatorHandshakeMessage(
|
||||
// Return the complete handshake message
|
||||
return negotiationData, handshakeMessage, handshakeState, nil
|
||||
}
|
||||
|
||||
// PerformOutboundHandshake initiates and completes a handshake as the initiator
|
||||
func (c *NTCP2Session) PerformOutboundHandshake(conn net.Conn, hs *HandshakeState) error {
|
||||
// Set deadline for the entire handshake process
|
||||
if err := conn.SetDeadline(time.Now().Add(NTCP2_HANDSHAKE_TIMEOUT)); err != nil {
|
||||
return oops.Errorf("failed to set deadline: %v", err)
|
||||
}
|
||||
defer conn.SetDeadline(time.Time{}) // Clear deadline after handshake
|
||||
|
||||
// 1. Send SessionRequest
|
||||
if err := c.sendSessionRequest(conn, hs); err != nil {
|
||||
return oops.Errorf("failed to send session request: %v", err)
|
||||
}
|
||||
|
||||
// 2. Receive SessionCreated
|
||||
if err := c.receiveSessionCreated(conn, hs); err != nil {
|
||||
return oops.Errorf("failed to receive session created: %v", err)
|
||||
}
|
||||
|
||||
// 3. Send SessionConfirm
|
||||
if err := c.sendSessionConfirm(conn, hs); err != nil {
|
||||
return oops.Errorf("failed to send session confirm: %v", err)
|
||||
}
|
||||
|
||||
// Handshake complete, derive session keys
|
||||
return c.deriveSessionKeys(hs)
|
||||
}
|
||||
|
Reference in New Issue
Block a user