@ -152,6 +152,15 @@ bool CCryptoKeyStore::SetCrypted()
@@ -152,6 +152,15 @@ bool CCryptoKeyStore::SetCrypted()
return true ;
}
bool CCryptoKeyStore : : IsLocked ( ) const
{
if ( ! IsCrypted ( ) ) {
return false ;
}
LOCK ( cs_KeyStore ) ;
return vMasterKey . empty ( ) ;
}
bool CCryptoKeyStore : : Lock ( )
{
if ( ! SetCrypted ( ) )
@ -206,21 +215,23 @@ bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
@@ -206,21 +215,23 @@ bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
bool CCryptoKeyStore : : AddKeyPubKey ( const CKey & key , const CPubKey & pubkey )
{
{
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) )
return CBasicKeyStore : : AddKeyPubKey ( key , pubkey ) ;
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) ) {
return CBasicKeyStore : : AddKeyPubKey ( key , pubkey ) ;
}
if ( IsLocked ( ) )
return false ;
if ( IsLocked ( ) ) {
return false ;
}
std : : vector < unsigned char > vchCryptedSecret ;
CKeyingMaterial vchSecret ( key . begin ( ) , key . end ( ) ) ;
if ( ! EncryptSecret ( vMasterKey , vchSecret , pubkey . GetHash ( ) , vchCryptedSecret ) )
return false ;
std : : vector < unsigned char > vchCryptedSecret ;
CKeyingMaterial vchSecret ( key . begin ( ) , key . end ( ) ) ;
if ( ! EncryptSecret ( vMasterKey , vchSecret , pubkey . GetHash ( ) , vchCryptedSecret ) ) {
return false ;
}
if ( ! AddCryptedKey ( pubkey , vchCryptedSecret ) )
return false ;
if ( ! AddCryptedKey ( pubkey , vchCryptedSecret ) ) {
return false ;
}
return true ;
}
@ -228,72 +239,88 @@ bool CCryptoKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
@@ -228,72 +239,88 @@ bool CCryptoKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
bool CCryptoKeyStore : : AddCryptedKey ( const CPubKey & vchPubKey , const std : : vector < unsigned char > & vchCryptedSecret )
{
{
LOCK ( cs_KeyStore ) ;
if ( ! SetCrypted ( ) )
return false ;
mapCryptedKeys [ vchPubKey . GetID ( ) ] = make_pair ( vchPubKey , vchCryptedSecret ) ;
LOCK ( cs_KeyStore ) ;
if ( ! SetCrypted ( ) ) {
return false ;
}
mapCryptedKeys [ vchPubKey . GetID ( ) ] = make_pair ( vchPubKey , vchCryptedSecret ) ;
return true ;
}
bool CCryptoKeyStore : : HaveKey ( const CKeyID & address ) const
{
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) ) {
return CBasicKeyStore : : HaveKey ( address ) ;
}
return mapCryptedKeys . count ( address ) > 0 ;
}
bool CCryptoKeyStore : : GetKey ( const CKeyID & address , CKey & keyOut ) const
{
{
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) )
return CBasicKeyStore : : GetKey ( address , keyOut ) ;
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) ) {
return CBasicKeyStore : : GetKey ( address , keyOut ) ;
}
CryptedKeyMap : : const_iterator mi = mapCryptedKeys . find ( address ) ;
if ( mi ! = mapCryptedKeys . end ( ) )
{
const CPubKey & vchPubKey = ( * mi ) . second . first ;
const std : : vector < unsigned char > & vchCryptedSecret = ( * mi ) . second . second ;
return DecryptKey ( vMasterKey , vchCryptedSecret , vchPubKey , keyOut ) ;
}
CryptedKeyMap : : const_iterator mi = mapCryptedKeys . find ( address ) ;
if ( mi ! = mapCryptedKeys . end ( ) )
{
const CPubKey & vchPubKey = ( * mi ) . second . first ;
const std : : vector < unsigned char > & vchCryptedSecret = ( * mi ) . second . second ;
return DecryptKey ( vMasterKey , vchCryptedSecret , vchPubKey , keyOut ) ;
}
return false ;
}
bool CCryptoKeyStore : : GetPubKey ( const CKeyID & address , CPubKey & vchPubKeyOut ) const
{
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) )
return CBasicKeyStore : : GetPubKey ( address , vchPubKeyOut ) ;
CryptedKeyMap : : const_iterator mi = mapCryptedKeys . find ( address ) ;
if ( mi ! = mapCryptedKeys . end ( ) )
{
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) )
return CBasicKeyStore : : GetPubKey ( address , vchPubKeyOut ) ;
vchPubKeyOut = ( * mi ) . second . first ;
return true ;
}
// Check for watch-only pubkeys
return CBasicKeyStore : : GetPubKey ( address , vchPubKeyOut ) ;
}
CryptedKeyMap : : const_iterator mi = mapCryptedKeys . find ( address ) ;
if ( mi ! = mapCryptedKeys . end ( ) )
{
vchPubKeyOut = ( * mi ) . second . first ;
return true ;
}
// Check for watch-only pubkeys
return CBasicKeyStore : : GetPubKey ( address , vchPubKeyOut ) ;
std : : set < CKeyID > CCryptoKeyStore : : GetKeys ( ) const
{
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) ) {
return CBasicKeyStore : : GetKeys ( ) ;
}
std : : set < CKeyID > set_address ;
for ( const auto & mi : mapCryptedKeys ) {
set_address . insert ( mi . first ) ;
}
return set_address ;
}
bool CCryptoKeyStore : : EncryptKeys ( CKeyingMaterial & vMasterKeyIn )
{
LOCK ( cs_KeyStore ) ;
if ( ! mapCryptedKeys . empty ( ) | | IsCrypted ( ) )
return false ;
fUseCrypto = true ;
for ( KeyMap : : value_type & mKey : mapKeys )
{
LOCK ( cs_KeyStore ) ;
if ( ! mapCryptedKeys . empty ( ) | | IsCrypted ( ) )
const CKey & key = mKey . second ;
CPubKey vchPubKey = key . GetPubKey ( ) ;
CKeyingMaterial vchSecret ( key . begin ( ) , key . end ( ) ) ;
std : : vector < unsigned char > vchCryptedSecret ;
if ( ! EncryptSecret ( vMasterKeyIn , vchSecret , vchPubKey . GetHash ( ) , vchCryptedSecret ) )
return false ;
if ( ! AddCryptedKey ( vchPubKey , vchCryptedSecret ) )
return false ;
fUseCrypto = true ;
for ( KeyMap : : value_type & mKey : mapKeys )
{
const CKey & key = mKey . second ;
CPubKey vchPubKey = key . GetPubKey ( ) ;
CKeyingMaterial vchSecret ( key . begin ( ) , key . end ( ) ) ;
std : : vector < unsigned char > vchCryptedSecret ;
if ( ! EncryptSecret ( vMasterKeyIn , vchSecret , vchPubKey . GetHash ( ) , vchCryptedSecret ) )
return false ;
if ( ! AddCryptedKey ( vchPubKey , vchCryptedSecret ) )
return false ;
}
mapKeys . clear ( ) ;
}
mapKeys . clear ( ) ;
return true ;
}