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  }