github.com/status-im/status-go@v1.1.0/server/pairing/components_test.go (about) 1 package pairing 2 3 import ( 4 "crypto/ecdsa" 5 "crypto/elliptic" 6 "crypto/rand" 7 "crypto/tls" 8 "net" 9 "testing" 10 "time" 11 12 "github.com/stretchr/testify/require" 13 14 "github.com/status-im/status-go/protocol/common" 15 "github.com/status-im/status-go/server" 16 ) 17 18 type TestPairingServerComponents struct { 19 EphemeralPK *ecdsa.PrivateKey 20 EphemeralAES []byte 21 IPAddresses []net.IP 22 Cert tls.Certificate 23 SS *SenderServer 24 RS *ReceiverServer 25 } 26 27 func (tpsc *TestPairingServerComponents) SetupPairingServerComponents(t *testing.T) { 28 var err error 29 30 // Get 4 key components for tls.cert generation 31 // 1) Ephemeral private key 32 tpsc.EphemeralPK, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader) 33 require.NoError(t, err) 34 35 // 2) AES encryption key 36 tpsc.EphemeralAES, err = common.MakeECDHSharedKey(tpsc.EphemeralPK, &tpsc.EphemeralPK.PublicKey) 37 require.NoError(t, err) 38 39 // 3) Device IP address 40 tpsc.IPAddresses, err = server.GetLocalAddressesForPairingServer() 41 require.NoError(t, err) 42 43 // Generate tls.Certificate and Server 44 tpsc.Cert, _, err = GenerateCertFromKey(tpsc.EphemeralPK, time.Now(), tpsc.IPAddresses, []string{}) 45 require.NoError(t, err) 46 47 sc := &ServerConfig{ 48 PK: &tpsc.EphemeralPK.PublicKey, 49 EK: tpsc.EphemeralAES, 50 Cert: &tpsc.Cert, 51 IPAddresses: tpsc.IPAddresses, 52 ListenIP: net.IPv4zero, 53 } 54 55 tpsc.SS, err = NewSenderServer(nil, &SenderServerConfig{ServerConfig: sc, SenderConfig: &SenderConfig{}}) 56 require.NoError(t, err) 57 tpsc.RS, err = NewReceiverServer(nil, &ReceiverServerConfig{ 58 ServerConfig: sc, 59 ReceiverConfig: &ReceiverConfig{}, 60 }) 61 require.NoError(t, err) 62 } 63 64 type MockPayloadReceiver struct { 65 encryptor *PayloadEncryptor 66 } 67 68 func NewMockPayloadReceiver(aesKey []byte) *MockPayloadReceiver { 69 return &MockPayloadReceiver{NewPayloadEncryptor(aesKey)} 70 } 71 72 func (m *MockPayloadReceiver) Receive(data []byte) error { 73 return m.encryptor.decrypt(data) 74 } 75 76 func (m *MockPayloadReceiver) Received() []byte { 77 return m.encryptor.getDecrypted() 78 } 79 80 func (m *MockPayloadReceiver) LockPayload() {} 81 82 type MockPayloadMounter struct { 83 encryptor *PayloadEncryptor 84 } 85 86 func NewMockPayloadMounter(aesKey []byte) *MockPayloadMounter { 87 return &MockPayloadMounter{NewPayloadEncryptor(aesKey)} 88 } 89 90 func (m *MockPayloadMounter) Mount() error { 91 // Make a random payload 92 data := make([]byte, 32) 93 _, err := rand.Read(data) 94 if err != nil { 95 return err 96 } 97 98 return m.encryptor.encrypt(data) 99 } 100 101 func (m *MockPayloadMounter) ToSend() []byte { 102 return m.encryptor.getEncrypted() 103 } 104 105 func (m *MockPayloadMounter) LockPayload() { 106 m.encryptor.lockPayload() 107 }