reorganized old hansdhake stuff

This commit is contained in:
eyedeekay
2025-03-31 14:55:05 -04:00
parent 0099392f6d
commit 03eeeab781
4 changed files with 88 additions and 75 deletions

View File

@ -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

View 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
}

View File

@ -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)

View File

@ -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)
}