From 2aa9c0253a8c41ce56fdc5cea75c0a5f7fb3e9cc Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 28 Sep 2016 17:58:08 -0700 Subject: [PATCH] Update to use new API in CCryptoKeyStore and store a viewing key in walletdb. --- src/wallet/wallet.cpp | 9 ++++++--- src/wallet/wallet.h | 4 ++-- src/wallet/walletdb.cpp | 9 +++++++-- src/wallet/walletdb.h | 1 + 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 20ef3dfb2..1bc954cc4 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -191,9 +191,10 @@ bool CWallet::AddCryptedKey(const CPubKey &vchPubKey, bool CWallet::AddCryptedSpendingKey(const libzcash::PaymentAddress &address, + const libzcash::ViewingKey &vk, const std::vector &vchCryptedSecret) { - if (!CCryptoKeyStore::AddCryptedSpendingKey(address, vchCryptedSecret)) + if (!CCryptoKeyStore::AddCryptedSpendingKey(address, vk, vchCryptedSecret)) return false; if (!fFileBacked) return true; @@ -201,10 +202,12 @@ bool CWallet::AddCryptedSpendingKey(const libzcash::PaymentAddress &address, LOCK(cs_wallet); if (pwalletdbEncryption) return pwalletdbEncryption->WriteCryptedZKey(address, + vk, vchCryptedSecret, mapZKeyMetadata[address]); else return CWalletDB(strWalletFile).WriteCryptedZKey(address, + vk, vchCryptedSecret, mapZKeyMetadata[address]); } @@ -233,9 +236,9 @@ bool CWallet::LoadCryptedKey(const CPubKey &vchPubKey, const std::vector &vchCryptedSecret) +bool CWallet::LoadCryptedZKey(const libzcash::PaymentAddress &addr, const libzcash::ViewingKey &vk, const std::vector &vchCryptedSecret) { - return CCryptoKeyStore::AddCryptedSpendingKey(addr, vchCryptedSecret); + return CCryptoKeyStore::AddCryptedSpendingKey(addr, vk, vchCryptedSecret); } bool CWallet::LoadZKey(const libzcash::SpendingKey &key) diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index 6dcf727c4..ccbc673d6 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -753,9 +753,9 @@ public: //! Load spending key metadata (used by LoadWallet) bool LoadZKeyMetadata(const libzcash::PaymentAddress &addr, const CKeyMetadata &meta); //! Adds an encrypted spending key to the store, without saving it to disk (used by LoadWallet) - bool LoadCryptedZKey(const libzcash::PaymentAddress &addr, const std::vector &vchCryptedSecret); + bool LoadCryptedZKey(const libzcash::PaymentAddress &addr, const libzcash::ViewingKey &vk, const std::vector &vchCryptedSecret); //! Adds an encrypted spending key to the store, and saves it to disk (virtual method, declared in crypter.h) - bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const std::vector &vchCryptedSecret); + bool AddCryptedSpendingKey(const libzcash::PaymentAddress &address, const libzcash::ViewingKey &vk, const std::vector &vchCryptedSecret); /** * Increment the next transaction order id diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp index 18490165a..5c7138a61 100644 --- a/src/wallet/walletdb.cpp +++ b/src/wallet/walletdb.cpp @@ -105,6 +105,7 @@ bool CWalletDB::WriteCryptedKey(const CPubKey& vchPubKey, } bool CWalletDB::WriteCryptedZKey(const libzcash::PaymentAddress & addr, + const libzcash::ViewingKey &vk, const std::vector& vchCryptedSecret, const CKeyMetadata &keyMeta) { @@ -114,7 +115,7 @@ bool CWalletDB::WriteCryptedZKey(const libzcash::PaymentAddress & addr, if (!Write(std::make_pair(std::string("zkeymeta"), addr), keyMeta)) return false; - if (!Write(std::make_pair(std::string("czkey"), addr), vchCryptedSecret, false)) + if (!Write(std::make_pair(std::string("czkey"), addr), std::make_pair(vk, vchCryptedSecret), false)) return false; if (fEraseUnencryptedKey) { @@ -581,11 +582,15 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, { libzcash::PaymentAddress addr; ssKey >> addr; + // Deserialization of a pair is just one item after another + uint256 vkValue; + ssValue >> vkValue; + libzcash::ViewingKey vk(vkValue); vector vchCryptedSecret; ssValue >> vchCryptedSecret; wss.nCKeys++; - if (!pwallet->LoadCryptedZKey(addr, vchCryptedSecret)) + if (!pwallet->LoadCryptedZKey(addr, vk, vchCryptedSecret)) { strErr = "Error reading wallet database: LoadCryptedZKey failed"; return false; diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h index fc50d5d15..f9f71e00c 100644 --- a/src/wallet/walletdb.h +++ b/src/wallet/walletdb.h @@ -136,6 +136,7 @@ public: /// Write spending key to wallet database, where key is payment address and value is spending key. bool WriteZKey(const libzcash::PaymentAddress& addr, const libzcash::SpendingKey& key, const CKeyMetadata &keyMeta); bool WriteCryptedZKey(const libzcash::PaymentAddress & addr, + const libzcash::ViewingKey & vk, const std::vector& vchCryptedSecret, const CKeyMetadata &keyMeta);