@ -152,6 +152,15 @@ bool CCryptoKeyStore::SetCrypted()
return true ;
return true ;
}
}
bool CCryptoKeyStore : : IsLocked ( ) const
{
if ( ! IsCrypted ( ) ) {
return false ;
}
LOCK ( cs_KeyStore ) ;
return vMasterKey . empty ( ) ;
}
bool CCryptoKeyStore : : Lock ( )
bool CCryptoKeyStore : : Lock ( )
{
{
if ( ! SetCrypted ( ) )
if ( ! SetCrypted ( ) )
@ -206,20 +215,22 @@ bool CCryptoKeyStore::Unlock(const CKeyingMaterial& vMasterKeyIn)
bool CCryptoKeyStore : : AddKeyPubKey ( const CKey & key , const CPubKey & pubkey )
bool CCryptoKeyStore : : AddKeyPubKey ( const CKey & key , const CPubKey & pubkey )
{
{
{
LOCK ( cs_KeyStore ) ;
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) )
if ( ! IsCrypted ( ) ) {
return CBasicKeyStore : : AddKeyPubKey ( key , pubkey ) ;
return CBasicKeyStore : : AddKeyPubKey ( key , pubkey ) ;
}
if ( IsLocked ( ) )
if ( IsLocked ( ) ) {
return false ;
return false ;
}
std : : vector < unsigned char > vchCryptedSecret ;
std : : vector < unsigned char > vchCryptedSecret ;
CKeyingMaterial vchSecret ( key . begin ( ) , key . end ( ) ) ;
CKeyingMaterial vchSecret ( key . begin ( ) , key . end ( ) ) ;
if ( ! EncryptSecret ( vMasterKey , vchSecret , pubkey . GetHash ( ) , vchCryptedSecret ) )
if ( ! EncryptSecret ( vMasterKey , vchSecret , pubkey . GetHash ( ) , vchCryptedSecret ) ) {
return false ;
return false ;
}
if ( ! AddCryptedKey ( pubkey , vchCryptedSecret ) )
if ( ! AddCryptedKey ( pubkey , vchCryptedSecret ) ) {
return false ;
return false ;
}
}
return true ;
return true ;
@ -228,22 +239,30 @@ bool CCryptoKeyStore::AddKeyPubKey(const CKey& key, const CPubKey &pubkey)
bool CCryptoKeyStore : : AddCryptedKey ( const CPubKey & vchPubKey , const std : : vector < unsigned char > & vchCryptedSecret )
bool CCryptoKeyStore : : AddCryptedKey ( const CPubKey & vchPubKey , const std : : vector < unsigned char > & vchCryptedSecret )
{
{
{
LOCK ( cs_KeyStore ) ;
LOCK ( cs_KeyStore ) ;
if ( ! SetCrypted ( ) )
if ( ! SetCrypted ( ) ) {
return false ;
return false ;
}
mapCryptedKeys [ vchPubKey . GetID ( ) ] = make_pair ( vchPubKey , vchCryptedSecret ) ;
mapCryptedKeys [ vchPubKey . GetID ( ) ] = make_pair ( vchPubKey , vchCryptedSecret ) ;
}
return true ;
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
bool CCryptoKeyStore : : GetKey ( const CKeyID & address , CKey & keyOut ) const
{
{
{
LOCK ( cs_KeyStore ) ;
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) )
if ( ! IsCrypted ( ) ) {
return CBasicKeyStore : : GetKey ( address , keyOut ) ;
return CBasicKeyStore : : GetKey ( address , keyOut ) ;
}
CryptedKeyMap : : const_iterator mi = mapCryptedKeys . find ( address ) ;
CryptedKeyMap : : const_iterator mi = mapCryptedKeys . find ( address ) ;
if ( mi ! = mapCryptedKeys . end ( ) )
if ( mi ! = mapCryptedKeys . end ( ) )
@ -252,13 +271,11 @@ bool CCryptoKeyStore::GetKey(const CKeyID &address, CKey& keyOut) const
const std : : vector < unsigned char > & vchCryptedSecret = ( * mi ) . second . second ;
const std : : vector < unsigned char > & vchCryptedSecret = ( * mi ) . second . second ;
return DecryptKey ( vMasterKey , vchCryptedSecret , vchPubKey , keyOut ) ;
return DecryptKey ( vMasterKey , vchCryptedSecret , vchPubKey , keyOut ) ;
}
}
}
return false ;
return false ;
}
}
bool CCryptoKeyStore : : GetPubKey ( const CKeyID & address , CPubKey & vchPubKeyOut ) const
bool CCryptoKeyStore : : GetPubKey ( const CKeyID & address , CPubKey & vchPubKeyOut ) const
{
{
{
LOCK ( cs_KeyStore ) ;
LOCK ( cs_KeyStore ) ;
if ( ! IsCrypted ( ) )
if ( ! IsCrypted ( ) )
return CBasicKeyStore : : GetPubKey ( address , vchPubKeyOut ) ;
return CBasicKeyStore : : GetPubKey ( address , vchPubKeyOut ) ;
@ -271,12 +288,23 @@ bool CCryptoKeyStore::GetPubKey(const CKeyID &address, CPubKey& vchPubKeyOut) co
}
}
// Check for watch-only pubkeys
// Check for watch-only pubkeys
return CBasicKeyStore : : GetPubKey ( address , vchPubKeyOut ) ;
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 )
bool CCryptoKeyStore : : EncryptKeys ( CKeyingMaterial & vMasterKeyIn )
{
{
{
LOCK ( cs_KeyStore ) ;
LOCK ( cs_KeyStore ) ;
if ( ! mapCryptedKeys . empty ( ) | | IsCrypted ( ) )
if ( ! mapCryptedKeys . empty ( ) | | IsCrypted ( ) )
return false ;
return false ;
@ -294,6 +322,5 @@ bool CCryptoKeyStore::EncryptKeys(CKeyingMaterial& vMasterKeyIn)
return false ;
return false ;
}
}
mapKeys . clear ( ) ;
mapKeys . clear ( ) ;
}
return true ;
return true ;
}
}