Make the arguments to ComposeInitatorHandshakeMessage comprehensible

This commit is contained in:
eyedeekay
2024-12-12 14:55:40 -05:00
parent 280c877d39
commit db91315582
5 changed files with 96 additions and 85 deletions

View File

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

View File

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

View File

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

View File

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

View File

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