Add Sapling have/get sk crypter overrides
This commit is contained in:
@@ -151,6 +151,23 @@ static bool DecryptSpendingKey(const CKeyingMaterial& vMasterKey,
|
|||||||
return sk.address() == address;
|
return sk.address() == address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool DecryptSaplingSpendingKey(const CKeyingMaterial& vMasterKey,
|
||||||
|
const std::vector<unsigned char>& vchCryptedSecret,
|
||||||
|
const libzcash::SaplingFullViewingKey& fvk,
|
||||||
|
libzcash::SaplingSpendingKey& sk)
|
||||||
|
{
|
||||||
|
CKeyingMaterial vchSecret;
|
||||||
|
if(!DecryptSecret(vMasterKey, vchCryptedSecret, fvk.GetFingerprint(), vchSecret))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (vchSecret.size() != libzcash::SerializedSaplingSpendingKeySize)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
CSecureDataStream ss(vchSecret, SER_NETWORK, PROTOCOL_VERSION);
|
||||||
|
ss >> sk;
|
||||||
|
return sk.full_viewing_key() == fvk;
|
||||||
|
}
|
||||||
|
|
||||||
bool CCryptoKeyStore::SetCrypted()
|
bool CCryptoKeyStore::SetCrypted()
|
||||||
{
|
{
|
||||||
LOCK2(cs_KeyStore, cs_SpendingKeyStore);
|
LOCK2(cs_KeyStore, cs_SpendingKeyStore);
|
||||||
@@ -338,9 +355,8 @@ bool CCryptoKeyStore::AddSaplingSpendingKey(const libzcash::SaplingSpendingKey &
|
|||||||
CSecureDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
CSecureDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
|
||||||
ss << sk;
|
ss << sk;
|
||||||
CKeyingMaterial vchSecret(ss.begin(), ss.end());
|
CKeyingMaterial vchSecret(ss.begin(), ss.end());
|
||||||
auto address = sk.default_address();
|
|
||||||
auto fvk = sk.full_viewing_key();
|
auto fvk = sk.full_viewing_key();
|
||||||
if (!EncryptSecret(vMasterKey, vchSecret, address.GetHash(), vchCryptedSecret)) {
|
if (!EncryptSecret(vMasterKey, vchSecret, fvk.GetFingerprint(), vchCryptedSecret)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,6 +414,23 @@ bool CCryptoKeyStore::GetSpendingKey(const libzcash::SproutPaymentAddress &addre
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CCryptoKeyStore::GetSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk, libzcash::SaplingSpendingKey &skOut) const
|
||||||
|
{
|
||||||
|
{
|
||||||
|
LOCK(cs_SpendingKeyStore);
|
||||||
|
if (!IsCrypted())
|
||||||
|
return CBasicKeyStore::GetSaplingSpendingKey(fvk, skOut);
|
||||||
|
|
||||||
|
CryptedSaplingSpendingKeyMap::const_iterator mi = mapCryptedSaplingSpendingKeys.find(fvk);
|
||||||
|
if (mi != mapCryptedSaplingSpendingKeys.end())
|
||||||
|
{
|
||||||
|
const std::vector<unsigned char> &vchCryptedSecret = (*mi).second;
|
||||||
|
return DecryptSaplingSpendingKey(vMasterKey, vchCryptedSecret, fvk, skOut);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn)
|
bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -236,6 +236,18 @@ public:
|
|||||||
virtual bool AddCryptedSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk,
|
virtual bool AddCryptedSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk,
|
||||||
const std::vector<unsigned char> &vchCryptedSecret);
|
const std::vector<unsigned char> &vchCryptedSecret);
|
||||||
bool AddSaplingSpendingKey(const libzcash::SaplingSpendingKey &sk);
|
bool AddSaplingSpendingKey(const libzcash::SaplingSpendingKey &sk);
|
||||||
|
bool HaveSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk) const
|
||||||
|
{
|
||||||
|
{
|
||||||
|
LOCK(cs_SpendingKeyStore);
|
||||||
|
if (!IsCrypted())
|
||||||
|
return CBasicKeyStore::HaveSaplingSpendingKey(fvk);
|
||||||
|
return mapCryptedSaplingSpendingKeys.count(fvk) > 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool GetSaplingSpendingKey(const libzcash::SaplingFullViewingKey &fvk, libzcash::SaplingSpendingKey &skOut) const;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wallet status (encrypted, locked) changed.
|
* Wallet status (encrypted, locked) changed.
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
#include <librustzcash.h>
|
#include <librustzcash.h>
|
||||||
|
|
||||||
|
const unsigned char ZCASH_SAPLING_FVFP_PERSONALIZATION[crypto_generichash_blake2b_PERSONALBYTES] =
|
||||||
|
{'Z', 'c', 'a', 's', 'h', 'S', 'a', 'p', 'l', 'i', 'n', 'g', 'F', 'V', 'F', 'P'};
|
||||||
|
|
||||||
namespace libzcash {
|
namespace libzcash {
|
||||||
|
|
||||||
uint256 SproutPaymentAddress::GetHash() const {
|
uint256 SproutPaymentAddress::GetHash() const {
|
||||||
@@ -73,6 +76,13 @@ bool SaplingFullViewingKey::is_valid() const {
|
|||||||
return !ivk.IsNull();
|
return !ivk.IsNull();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint256 SaplingFullViewingKey::GetFingerprint() const {
|
||||||
|
CBLAKE2bWriter ss(SER_GETHASH, 0, ZCASH_SAPLING_FVFP_PERSONALIZATION);
|
||||||
|
ss << *this;
|
||||||
|
return ss.GetHash();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
SaplingSpendingKey SaplingSpendingKey::random() {
|
SaplingSpendingKey SaplingSpendingKey::random() {
|
||||||
while (true) {
|
while (true) {
|
||||||
auto sk = SaplingSpendingKey(random_uint256());
|
auto sk = SaplingSpendingKey(random_uint256());
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ const size_t SerializedPaymentAddressSize = 64;
|
|||||||
const size_t SerializedViewingKeySize = 64;
|
const size_t SerializedViewingKeySize = 64;
|
||||||
const size_t SerializedSpendingKeySize = 32;
|
const size_t SerializedSpendingKeySize = 32;
|
||||||
|
|
||||||
|
const size_t SerializedSaplingSpendingKeySize = 32;
|
||||||
|
|
||||||
typedef std::array<unsigned char, ZC_DIVERSIFIER_SIZE> diversifier_t;
|
typedef std::array<unsigned char, ZC_DIVERSIFIER_SIZE> diversifier_t;
|
||||||
|
|
||||||
class SproutPaymentAddress {
|
class SproutPaymentAddress {
|
||||||
@@ -146,12 +148,15 @@ public:
|
|||||||
ADD_SERIALIZE_METHODS;
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
template <typename Stream, typename Operation>
|
template <typename Stream, typename Operation>
|
||||||
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
inline void SerializationOp(Stream& s, Operation ser_action) {
|
||||||
READWRITE(ak);
|
READWRITE(ak);
|
||||||
READWRITE(nk);
|
READWRITE(nk);
|
||||||
READWRITE(ovk);
|
READWRITE(ovk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Get the fingerprint of this full viewing key (as defined in ZIP 32).
|
||||||
|
uint256 GetFingerprint() const;
|
||||||
|
|
||||||
SaplingIncomingViewingKey in_viewing_key() const;
|
SaplingIncomingViewingKey in_viewing_key() const;
|
||||||
bool is_valid() const;
|
bool is_valid() const;
|
||||||
|
|
||||||
@@ -178,7 +183,7 @@ public:
|
|||||||
ADD_SERIALIZE_METHODS;
|
ADD_SERIALIZE_METHODS;
|
||||||
|
|
||||||
template <typename Stream, typename Operation>
|
template <typename Stream, typename Operation>
|
||||||
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
|
inline void SerializationOp(Stream& s, Operation ser_action) {
|
||||||
READWRITE(ask);
|
READWRITE(ask);
|
||||||
READWRITE(nsk);
|
READWRITE(nsk);
|
||||||
READWRITE(ovk);
|
READWRITE(ovk);
|
||||||
|
|||||||
Reference in New Issue
Block a user