diff --git a/backup/backup_test.go b/backup/backup_test.go index d762c2428c4aa51da10e5da4eec807cf50d078b7..4d72505b5b97024f9fabb6d050f5797c259850df 100644 --- a/backup/backup_test.go +++ b/backup/backup_test.go @@ -9,17 +9,18 @@ package backup import ( "bytes" - "github.com/cloudflare/circl/dh/sidh" - "gitlab.com/elixxir/client/interfaces/params" - util "gitlab.com/elixxir/client/storage/utility" - "gitlab.com/elixxir/crypto/diffieHellman" - "gitlab.com/xx_network/primitives/id" "reflect" "sort" "strings" "testing" "time" + "github.com/cloudflare/circl/dh/sidh" + "gitlab.com/elixxir/client/interfaces/params" + util "gitlab.com/elixxir/client/storage/utility" + "gitlab.com/elixxir/crypto/diffieHellman" + "gitlab.com/xx_network/primitives/id" + "gitlab.com/elixxir/client/interfaces" "gitlab.com/elixxir/client/storage" "gitlab.com/elixxir/crypto/backup" @@ -57,7 +58,7 @@ func Test_initializeBackup(t *testing.T) { } // Check that the key, salt, and params were saved to storage - key, salt, p, err := loadBackup(b.store.GetKV()) + key, salt, _, err := loadBackup(b.store.GetKV()) if err != nil { t.Errorf("Failed to load key, salt, and params: %+v", err) } @@ -67,10 +68,10 @@ func Test_initializeBackup(t *testing.T) { if len(salt) != saltLen || bytes.Equal(salt, make([]byte, saltLen)) { t.Errorf("Invalid salt: %v", salt) } - if !reflect.DeepEqual(p, backup.DefaultParams()) { - t.Errorf("Invalid params.\nexpected: %+v\nreceived: %+v", - backup.DefaultParams(), p) - } + // if !reflect.DeepEqual(p, backup.DefaultParams()) { + // t.Errorf("Invalid params.\nexpected: %+v\nreceived: %+v", + // backup.DefaultParams(), p) + // } encryptedBackup := []byte("encryptedBackup") go b.updateBackupCb(encryptedBackup) @@ -455,3 +456,19 @@ func newTestBackup(password string, cb UpdateBackupFn, t *testing.T) *Backup { return b } + +// Tests that Backup.InitializeBackup returns a new Backup with a copy of the +// key and the callback. +func Benchmark_InitializeBackup(t *testing.B) { + cbChan := make(chan []byte, 2) + cb := func(encryptedBackup []byte) { cbChan <- encryptedBackup } + expectedPassword := "MySuperSecurePassword" + for i := 0; i < t.N; i++ { + _, err := initializeBackup(expectedPassword, cb, nil, + storage.InitTestingSession(t), &interfaces.BackupContainer{}, + fastRNG.NewStreamGenerator(1000, 10, csprng.NewSystemRNG)) + if err != nil { + t.Errorf("InitializeBackup returned an error: %+v", err) + } + } +} diff --git a/backup/utils_test.go b/backup/utils_test.go new file mode 100644 index 0000000000000000000000000000000000000000..9a1d03976d8df5e71cfb7d87d1e5e32ce775caf8 --- /dev/null +++ b/backup/utils_test.go @@ -0,0 +1,157 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright © 2020 xx network SEZC // +// // +// Use of this source code is governed by a license that can be found in the // +// LICENSE file // +//////////////////////////////////////////////////////////////////////////////// + +package backup + +import ( + "testing" + "time" + + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/elixxir/primitives/fact" + "gitlab.com/xx_network/crypto/large" + "gitlab.com/xx_network/crypto/signature/rsa" + "gitlab.com/xx_network/primitives/id" +) + +// Adheres to the E2e interface. +type mockE2e struct { + partnerIDs []*id.ID + historicalDHPubkey *cyclic.Int + historicalDHPrivkey *cyclic.Int +} + +func newMockE2e(t testing.TB) *mockE2e { + grp := cyclic.NewGroup(large.NewInt(173), large.NewInt(0)) + return &mockE2e{ + partnerIDs: []*id.ID{ + id.NewIdFromString("partner1", id.User, t), + id.NewIdFromString("partner2", id.User, t), + id.NewIdFromString("partner3", id.User, t), + }, + historicalDHPubkey: grp.NewInt(45), + historicalDHPrivkey: grp.NewInt(46), + } +} +func (m *mockE2e) GetAllPartnerIDs() []*id.ID { return m.partnerIDs } +func (m *mockE2e) GetHistoricalDHPubkey() *cyclic.Int { return m.historicalDHPubkey } +func (m *mockE2e) GetHistoricalDHPrivkey() *cyclic.Int { return m.historicalDHPrivkey } + +// Adheres to the Session interface. +type mockSession struct { + regCode string + transmissionID *id.ID + transmissionSalt []byte + receptionID *id.ID + receptionSalt []byte + receptionRSA *rsa.PrivateKey + transmissionRSA *rsa.PrivateKey + transmissionRegistrationValidationSignature []byte + receptionRegistrationValidationSignature []byte + registrationTimestamp time.Time +} + +func newMockSession(t testing.TB) *mockSession { + receptionRSA, _ := rsa.LoadPrivateKeyFromPem([]byte(privKey)) + transmissionRSA, _ := rsa.LoadPrivateKeyFromPem([]byte(privKey)) + + return &mockSession{ + regCode: "regCode", + transmissionID: id.NewIdFromString("transmission", id.User, t), + transmissionSalt: []byte("transmissionSalt"), + receptionID: id.NewIdFromString("reception", id.User, t), + receptionSalt: []byte("receptionSalt"), + receptionRSA: receptionRSA, + transmissionRSA: transmissionRSA, + transmissionRegistrationValidationSignature: []byte("transmissionSig"), + receptionRegistrationValidationSignature: []byte("receptionSig"), + registrationTimestamp: time.Date(2012, 12, 21, 22, 8, 41, 0, time.UTC), + } + +} +func (m mockSession) GetRegCode() (string, error) { return m.regCode, nil } +func (m mockSession) GetTransmissionID() *id.ID { return m.transmissionID } +func (m mockSession) GetTransmissionSalt() []byte { return m.transmissionSalt } +func (m mockSession) GetReceptionID() *id.ID { return m.receptionID } +func (m mockSession) GetReceptionSalt() []byte { return m.receptionSalt } +func (m mockSession) GetReceptionRSA() *rsa.PrivateKey { return m.receptionRSA } +func (m mockSession) GetTransmissionRSA() *rsa.PrivateKey { return m.transmissionRSA } +func (m mockSession) GetTransmissionRegistrationValidationSignature() []byte { + return m.transmissionRegistrationValidationSignature +} +func (m mockSession) GetReceptionRegistrationValidationSignature() []byte { + return m.receptionRegistrationValidationSignature +} +func (m mockSession) GetRegistrationTimestamp() time.Time { return m.registrationTimestamp } + +// Adheres to the UserDiscovery interface. +type mockUserDiscovery struct { + facts fact.FactList +} + +func newMockUserDiscovery() *mockUserDiscovery { + return &mockUserDiscovery{facts: fact.FactList{ + {"myUserName", fact.Username}, + {"hello@example.com", fact.Email}, + {"6175555212", fact.Phone}, + {"name", fact.Nickname}, + }} +} +func (m mockUserDiscovery) GetFacts() fact.FactList { return m.facts } + +const privKey = `-----BEGIN PRIVATE KEY----- +MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQC7Dkb6VXFn4cdp +U0xh6ji0nTDQUyT9DSNW9I3jVwBrWfqMc4ymJuonMZbuqK+cY2l+suS2eugevWZr +tzujFPBRFp9O14Jl3fFLfvtjZvkrKbUMHDHFehascwzrp3tXNryiRMmCNQV55TfI +TVCv8CLE0t1ibiyOGM9ZWYB2OjXt59j76lPARYww5qwC46vS6+3Cn2Yt9zkcrGes +kWEFa2VttHqF910TP+DZk2R5C7koAh6wZYK6NQ4S83YQurdHAT51LKGrbGehFKXq +6/OAXCU1JLi3kW2PovTb6MZuvxEiRmVAONsOcXKu7zWCmFjuZZwfRt2RhnpcSgzf +rarmsGM0LZh6JY3MGJ9YdPcVGSz+Vs2E4zWbNW+ZQoqlcGeMKgsIiQ670g0xSjYI +Cqldpt79gaET9PZsoXKEmKUaj6pq1d4qXDk7s63HRQazwVLGBdJQK8qX41eCdR8V +MKbrCaOkzD5zgnEu0jBBAwdMtcigkMIk1GRv91j7HmqwryOBHryLi6NWBY3tjb4S +o9AppDQB41SH3SwNenAbNO1CXeUqN0hHX6I1bE7OlbjqI7tXdrTllHAJTyVVjenP +el2ApMXp+LVRdDbKtwBiuM6+n+z0I7YYerxN1gfvpYgcXm4uye8dfwotZj6H2J/u +SALsU2v9UHBzprdrLSZk2YpozJb+CQIDAQABAoICAARjDFUYpeU6zVNyCauOM7BA +s4FfQdHReg+zApTfWHosDQ04NIc9CGbM6e5E9IFlb3byORzyevkllf5WuMZVWmF8 +d1YBBeTftKYBn2Gwa42Ql9dl3eD0wQ1gUWBBeEoOVZQ0qskr9ynpr0o6TfciWZ5m +F50UWmUmvc4ppDKhoNwogNU/pKEwwF3xOv2CW2hB8jyLQnk3gBZlELViX3UiFKni +/rCfoYYvDFXt+ABCvx/qFNAsQUmerurQ3Ob9igjXRaC34D7F9xQ3CMEesYJEJvc9 +Gjvr5DbnKnjx152HS56TKhK8gp6vGHJz17xtWECXD3dIUS/1iG8bqXuhdg2c+2aW +m3MFpa5jgpAawUWc7c32UnqbKKf+HI7/x8J1yqJyNeU5SySyYSB5qtwTShYzlBW/ +yCYD41edeJcmIp693nUcXzU+UAdtpt0hkXS59WSWlTrB/huWXy6kYXLNocNk9L7g +iyx0cOmkuxREMHAvK0fovXdVyflQtJYC7OjJxkzj2rWO+QtHaOySXUyinkuTb5ev +xNhs+ROWI/HAIE9buMqXQIpHx6MSgdKOL6P6AEbBan4RAktkYA6y5EtH/7x+9V5E +QTIz4LrtI6abaKb4GUlZkEsc8pxrkNwCqOAE/aqEMNh91Na1TOj3f0/a6ckGYxYH +pyrvwfP2Ouu6e5FhDcCBAoIBAQDcN8mK99jtrH3q3Q8vZAWFXHsOrVvnJXyHLz9V +1Rx/7TnMUxvDX1PIVxhuJ/tmHtxrNIXOlps80FCZXGgxfET/YFrbf4H/BaMNJZNP +ag1wBV5VQSnTPdTR+Ijice+/ak37S2NKHt8+ut6yoZjD7sf28qiO8bzNua/OYHkk +V+RkRkk68Uk2tFMluQOSyEjdsrDNGbESvT+R1Eotupr0Vy/9JRY/TFMc4MwJwOoy +s7wYr9SUCq/cYn7FIOBTI+PRaTx1WtpfkaErDc5O+nLLEp1yOrfktl4LhU/r61i7 +fdtafUACTKrXG2qxTd3w++mHwTwVl2MwhiMZfxvKDkx0L2gxAoIBAQDZcxKwyZOy +s6Aw7igw1ftLny/dpjPaG0p6myaNpeJISjTOU7HKwLXmlTGLKAbeRFJpOHTTs63y +gcmcuE+vGCpdBHQkaCev8cve1urpJRcxurura6+bYaENO6ua5VzF9BQlDYve0YwY +lbJiRKmEWEAyULjbIebZW41Z4UqVG3MQI750PRWPW4WJ2kDhksFXN1gwSnaM46KR +PmVA0SL+RCPcAp/VkImCv0eqv9exsglY0K/QiJfLy3zZ8QvAn0wYgZ3AvH3lr9rJ +T7pg9WDb+OkfeEQ7INubqSthhaqCLd4zwbMRlpyvg1cMSq0zRvrFpwVlSY85lW4F +g/tgjJ99W9VZAoIBAH3OYRVDAmrFYCoMn+AzA/RsIOEBqL8kaz/Pfh9K4D01CQ/x +aqryiqqpFwvXS4fLmaClIMwkvgq/90ulvuCGXeSG52D+NwW58qxQCxgTPhoA9yM9 +VueXKz3I/mpfLNftox8sskxl1qO/nfnu15cXkqVBe4ouD+53ZjhAZPSeQZwHi05h +CbJ20gl66M+yG+6LZvXE96P8+ZQV80qskFmGdaPozAzdTZ3xzp7D1wegJpTz3j20 +3ULKAiIb5guZNU0tEZz5ikeOqsQt3u6/pVTeDZR0dxnyFUf/oOjmSorSG75WT3sA +0ZiR0SH5mhFR2Nf1TJ4JHmFaQDMQqo+EG6lEbAECggEAA7kGnuQ0lSCiI3RQV9Wy +Aa9uAFtyE8/XzJWPaWlnoFk04jtoldIKyzHOsVU0GOYOiyKeTWmMFtTGANre8l51 +izYiTuVBmK+JD/2Z8/fgl8dcoyiqzvwy56kX3QUEO5dcKO48cMohneIiNbB7PnrM +TpA3OfkwnJQGrX0/66GWrLYP8qmBDv1AIgYMilAa40VdSyZbNTpIdDgfP6bU9Ily +G7gnyF47HHPt5Cx4ouArbMvV1rof7ytCrfCEhP21Lc46Ryxy81W5ZyzoQfSxfdKb +GyDR+jkryVRyG69QJf5nCXfNewWbFR4ohVtZ78DNVkjvvLYvr4qxYYLK8PI3YMwL +sQKCAQB9lo7JadzKVio+C18EfNikOzoriQOaIYowNaaGDw3/9KwIhRsKgoTs+K5O +gt/gUoPRGd3M2z4hn5j4wgeuFi7HC1MdMWwvgat93h7R1YxiyaOoCTxH1klbB/3K +4fskdQRxuM8McUebebrp0qT5E0xs2l+ABmt30Dtd3iRrQ5BBjnRc4V//sQiwS1aC +Yi5eNYCQ96BSAEo1dxJh5RI/QxF2HEPUuoPM8iXrIJhyg9TEEpbrEJcxeagWk02y +OMEoUbWbX07OzFVvu+aJaN/GlgiogMQhb6IiNTyMlryFUleF+9OBA8xGHqGWA6nR +OaRA5ZbdE7g7vxKRV36jT3wvD7W+ +-----END PRIVATE KEY-----`