104 lines
2.5 KiB
Go
104 lines
2.5 KiB
Go
package pairing
|
|
|
|
import (
|
|
"crypto/ecdsa"
|
|
"crypto/elliptic"
|
|
"crypto/rand"
|
|
"crypto/tls"
|
|
"net"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/status-im/status-go/protocol/common"
|
|
"github.com/status-im/status-go/server"
|
|
)
|
|
|
|
type TestPairingServerComponents struct {
|
|
EphemeralPK *ecdsa.PrivateKey
|
|
EphemeralAES []byte
|
|
OutboundIP net.IP
|
|
Cert tls.Certificate
|
|
SS *SenderServer
|
|
RS *ReceiverServer
|
|
}
|
|
|
|
func (tpsc *TestPairingServerComponents) SetupPairingServerComponents(t *testing.T) {
|
|
var err error
|
|
|
|
// Get 4 key components for tls.cert generation
|
|
// 1) Ephemeral private key
|
|
tpsc.EphemeralPK, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
|
require.NoError(t, err)
|
|
|
|
// 2) AES encryption key
|
|
tpsc.EphemeralAES, err = common.MakeECDHSharedKey(tpsc.EphemeralPK, &tpsc.EphemeralPK.PublicKey)
|
|
require.NoError(t, err)
|
|
|
|
// 3) Device outbound IP address
|
|
tpsc.OutboundIP, err = server.GetOutboundIP()
|
|
require.NoError(t, err)
|
|
|
|
// Generate tls.Certificate and Server
|
|
tpsc.Cert, _, err = GenerateCertFromKey(tpsc.EphemeralPK, time.Now(), tpsc.OutboundIP.String())
|
|
require.NoError(t, err)
|
|
|
|
sc := &ServerConfig{
|
|
PK: &tpsc.EphemeralPK.PublicKey,
|
|
EK: tpsc.EphemeralAES,
|
|
Cert: &tpsc.Cert,
|
|
Hostname: tpsc.OutboundIP.String(),
|
|
}
|
|
|
|
tpsc.SS, err = NewSenderServer(nil, &SenderServerConfig{ServerConfig: sc, SenderConfig: &SenderConfig{}})
|
|
require.NoError(t, err)
|
|
tpsc.RS, err = NewReceiverServer(nil, &ReceiverServerConfig{ServerConfig: sc, ReceiverConfig: &ReceiverConfig{}})
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
type MockPayloadReceiver struct {
|
|
encryptor *PayloadEncryptor
|
|
}
|
|
|
|
func NewMockPayloadReceiver(aesKey []byte) *MockPayloadReceiver {
|
|
return &MockPayloadReceiver{NewPayloadEncryptor(aesKey)}
|
|
}
|
|
|
|
func (m *MockPayloadReceiver) Receive(data []byte) error {
|
|
return m.encryptor.decrypt(data)
|
|
}
|
|
|
|
func (m *MockPayloadReceiver) Received() []byte {
|
|
return m.encryptor.getDecrypted()
|
|
}
|
|
|
|
func (m *MockPayloadReceiver) LockPayload() {}
|
|
|
|
type MockPayloadMounter struct {
|
|
encryptor *PayloadEncryptor
|
|
}
|
|
|
|
func NewMockPayloadMounter(aesKey []byte) *MockPayloadMounter {
|
|
return &MockPayloadMounter{NewPayloadEncryptor(aesKey)}
|
|
}
|
|
|
|
func (m *MockPayloadMounter) Mount() error {
|
|
// Make a random payload
|
|
data := make([]byte, 32)
|
|
_, err := rand.Read(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return m.encryptor.encrypt(data)
|
|
}
|
|
|
|
func (m *MockPayloadMounter) ToSend() []byte {
|
|
return m.encryptor.getEncrypted()
|
|
}
|
|
|
|
func (m *MockPayloadMounter) LockPayload() {
|
|
m.encryptor.lockPayload()
|
|
}
|