Cache note decryptors in encrypted keystore
This commit is contained in:
parent
6bffc46a87
commit
ad041fceec
|
@ -56,19 +56,26 @@ TEST(keystore_tests, store_and_retrieve_spending_key_in_encrypted_store) {
|
||||||
uint256 r {GetRandHash()};
|
uint256 r {GetRandHash()};
|
||||||
CKeyingMaterial vMasterKey (r.begin(), r.end());
|
CKeyingMaterial vMasterKey (r.begin(), r.end());
|
||||||
libzcash::SpendingKey keyOut;
|
libzcash::SpendingKey keyOut;
|
||||||
|
ZCNoteDecryption decOut;
|
||||||
std::set<libzcash::PaymentAddress> addrs;
|
std::set<libzcash::PaymentAddress> addrs;
|
||||||
|
|
||||||
// 1) Test adding a key to an unencrypted key store, then encrypting it
|
// 1) Test adding a key to an unencrypted key store, then encrypting it
|
||||||
auto sk = libzcash::SpendingKey::random();
|
auto sk = libzcash::SpendingKey::random();
|
||||||
auto addr = sk.address();
|
auto addr = sk.address();
|
||||||
|
EXPECT_FALSE(keyStore.GetNoteDecryptor(addr, decOut));
|
||||||
|
|
||||||
keyStore.AddSpendingKey(sk);
|
keyStore.AddSpendingKey(sk);
|
||||||
ASSERT_TRUE(keyStore.HaveSpendingKey(addr));
|
ASSERT_TRUE(keyStore.HaveSpendingKey(addr));
|
||||||
ASSERT_TRUE(keyStore.GetSpendingKey(addr, keyOut));
|
ASSERT_TRUE(keyStore.GetSpendingKey(addr, keyOut));
|
||||||
ASSERT_EQ(sk, keyOut);
|
ASSERT_EQ(sk, keyOut);
|
||||||
|
EXPECT_TRUE(keyStore.GetNoteDecryptor(addr, decOut));
|
||||||
|
EXPECT_EQ(ZCNoteDecryption(sk.viewing_key()), decOut);
|
||||||
|
|
||||||
ASSERT_TRUE(keyStore.EncryptKeys(vMasterKey));
|
ASSERT_TRUE(keyStore.EncryptKeys(vMasterKey));
|
||||||
ASSERT_TRUE(keyStore.HaveSpendingKey(addr));
|
ASSERT_TRUE(keyStore.HaveSpendingKey(addr));
|
||||||
ASSERT_FALSE(keyStore.GetSpendingKey(addr, keyOut));
|
ASSERT_FALSE(keyStore.GetSpendingKey(addr, keyOut));
|
||||||
|
EXPECT_TRUE(keyStore.GetNoteDecryptor(addr, decOut));
|
||||||
|
EXPECT_EQ(ZCNoteDecryption(sk.viewing_key()), decOut);
|
||||||
|
|
||||||
// Unlocking with a random key should fail
|
// Unlocking with a random key should fail
|
||||||
uint256 r2 {GetRandHash()};
|
uint256 r2 {GetRandHash()};
|
||||||
|
@ -92,18 +99,26 @@ TEST(keystore_tests, store_and_retrieve_spending_key_in_encrypted_store) {
|
||||||
// 2) Test adding a spending key to an already-encrypted key store
|
// 2) Test adding a spending key to an already-encrypted key store
|
||||||
auto sk2 = libzcash::SpendingKey::random();
|
auto sk2 = libzcash::SpendingKey::random();
|
||||||
auto addr2 = sk2.address();
|
auto addr2 = sk2.address();
|
||||||
|
EXPECT_FALSE(keyStore.GetNoteDecryptor(addr2, decOut));
|
||||||
|
|
||||||
keyStore.AddSpendingKey(sk2);
|
keyStore.AddSpendingKey(sk2);
|
||||||
ASSERT_TRUE(keyStore.HaveSpendingKey(addr2));
|
ASSERT_TRUE(keyStore.HaveSpendingKey(addr2));
|
||||||
ASSERT_TRUE(keyStore.GetSpendingKey(addr2, keyOut));
|
ASSERT_TRUE(keyStore.GetSpendingKey(addr2, keyOut));
|
||||||
ASSERT_EQ(sk2, keyOut);
|
ASSERT_EQ(sk2, keyOut);
|
||||||
|
EXPECT_TRUE(keyStore.GetNoteDecryptor(addr2, decOut));
|
||||||
|
EXPECT_EQ(ZCNoteDecryption(sk2.viewing_key()), decOut);
|
||||||
|
|
||||||
ASSERT_TRUE(keyStore.Lock());
|
ASSERT_TRUE(keyStore.Lock());
|
||||||
ASSERT_TRUE(keyStore.HaveSpendingKey(addr2));
|
ASSERT_TRUE(keyStore.HaveSpendingKey(addr2));
|
||||||
ASSERT_FALSE(keyStore.GetSpendingKey(addr2, keyOut));
|
ASSERT_FALSE(keyStore.GetSpendingKey(addr2, keyOut));
|
||||||
|
EXPECT_TRUE(keyStore.GetNoteDecryptor(addr2, decOut));
|
||||||
|
EXPECT_EQ(ZCNoteDecryption(sk2.viewing_key()), decOut);
|
||||||
|
|
||||||
ASSERT_TRUE(keyStore.Unlock(vMasterKey));
|
ASSERT_TRUE(keyStore.Unlock(vMasterKey));
|
||||||
ASSERT_TRUE(keyStore.GetSpendingKey(addr2, keyOut));
|
ASSERT_TRUE(keyStore.GetSpendingKey(addr2, keyOut));
|
||||||
ASSERT_EQ(sk2, keyOut);
|
ASSERT_EQ(sk2, keyOut);
|
||||||
|
EXPECT_TRUE(keyStore.GetNoteDecryptor(addr2, decOut));
|
||||||
|
EXPECT_EQ(ZCNoteDecryption(sk2.viewing_key()), decOut);
|
||||||
|
|
||||||
keyStore.GetPaymentAddresses(addrs);
|
keyStore.GetPaymentAddresses(addrs);
|
||||||
ASSERT_EQ(2, addrs.size());
|
ASSERT_EQ(2, addrs.size());
|
||||||
|
|
|
@ -318,13 +318,15 @@ bool CCryptoKeyStore::AddSpendingKey(const libzcash::SpendingKey &sk)
|
||||||
if (!EncryptSecret(vMasterKey, vchSecret, address.GetHash(), vchCryptedSecret))
|
if (!EncryptSecret(vMasterKey, vchSecret, address.GetHash(), vchCryptedSecret))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!AddCryptedSpendingKey(address, vchCryptedSecret))
|
if (!AddCryptedSpendingKey(address, sk.viewing_key(), vchCryptedSecret))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CCryptoKeyStore::AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const std::vector<unsigned char> &vchCryptedSecret)
|
bool CCryptoKeyStore::AddCryptedSpendingKey(const libzcash::PaymentAddress &address,
|
||||||
|
const libzcash::ViewingKey &vk,
|
||||||
|
const std::vector<unsigned char> &vchCryptedSecret)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
LOCK(cs_KeyStore);
|
LOCK(cs_KeyStore);
|
||||||
|
@ -332,6 +334,7 @@ bool CCryptoKeyStore::AddCryptedSpendingKey(const libzcash::PaymentAddress &addr
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
mapCryptedSpendingKeys[address] = vchCryptedSecret;
|
mapCryptedSpendingKeys[address] = vchCryptedSecret;
|
||||||
|
mapNoteDecryptors.insert(std::make_pair(address, ZCNoteDecryption(vk)));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -383,7 +386,7 @@ bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn)
|
||||||
std::vector<unsigned char> vchCryptedSecret;
|
std::vector<unsigned char> vchCryptedSecret;
|
||||||
if (!EncryptSecret(vMasterKeyIn, vchSecret, address.GetHash(), vchCryptedSecret))
|
if (!EncryptSecret(vMasterKeyIn, vchSecret, address.GetHash(), vchCryptedSecret))
|
||||||
return false;
|
return false;
|
||||||
if (!AddCryptedSpendingKey(address, vchCryptedSecret))
|
if (!AddCryptedSpendingKey(address, sk.viewing_key(), vchCryptedSecret))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mapSpendingKeys.clear();
|
mapSpendingKeys.clear();
|
||||||
|
|
|
@ -200,7 +200,9 @@ public:
|
||||||
mi++;
|
mi++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const std::vector<unsigned char> &vchCryptedSecret);
|
virtual bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address,
|
||||||
|
const libzcash::ViewingKey &vk,
|
||||||
|
const std::vector<unsigned char> &vchCryptedSecret);
|
||||||
bool AddSpendingKey(const libzcash::SpendingKey &sk);
|
bool AddSpendingKey(const libzcash::SpendingKey &sk);
|
||||||
bool HaveSpendingKey(const libzcash::PaymentAddress &address) const
|
bool HaveSpendingKey(const libzcash::PaymentAddress &address) const
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue