Bitcoin Core  22.99.0
P2P Digital Currency
crypter.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2020 The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_WALLET_CRYPTER_H
6 #define BITCOIN_WALLET_CRYPTER_H
7 
8 #include <serialize.h>
10 #include <script/signingprovider.h>
11 
12 
13 namespace wallet {
14 const unsigned int WALLET_CRYPTO_KEY_SIZE = 32;
15 const unsigned int WALLET_CRYPTO_SALT_SIZE = 8;
16 const unsigned int WALLET_CRYPTO_IV_SIZE = 16;
17 
35 {
36 public:
37  std::vector<unsigned char> vchCryptedKey;
38  std::vector<unsigned char> vchSalt;
41  unsigned int nDerivationMethod;
42  unsigned int nDeriveIterations;
45  std::vector<unsigned char> vchOtherDerivationParameters;
46 
48  {
49  READWRITE(obj.vchCryptedKey, obj.vchSalt, obj.nDerivationMethod, obj.nDeriveIterations, obj.vchOtherDerivationParameters);
50  }
51 
53  {
54  // 25000 rounds is just under 0.1 seconds on a 1.86 GHz Pentium M
55  // ie slightly lower than the lowest hardware we need bother supporting
56  nDeriveIterations = 25000;
58  vchOtherDerivationParameters = std::vector<unsigned char>(0);
59  }
60 };
61 
62 typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
63 
64 namespace wallet_crypto_tests
65 {
66  class TestCrypter;
67 }
68 
70 class CCrypter
71 {
72 friend class wallet_crypto_tests::TestCrypter; // for test access to chKey/chIV
73 private:
74  std::vector<unsigned char, secure_allocator<unsigned char>> vchKey;
75  std::vector<unsigned char, secure_allocator<unsigned char>> vchIV;
76  bool fKeySet;
77 
78  int BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, const SecureString& strKeyData, int count, unsigned char *key,unsigned char *iv) const;
79 
80 public:
81  bool SetKeyFromPassphrase(const SecureString &strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod);
82  bool Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext) const;
83  bool Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext) const;
84  bool SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV);
85 
86  void CleanKey()
87  {
88  memory_cleanse(vchKey.data(), vchKey.size());
89  memory_cleanse(vchIV.data(), vchIV.size());
90  fKeySet = false;
91  }
92 
94  {
95  fKeySet = false;
98  }
99 
101  {
102  CleanKey();
103  }
104 };
105 
106 bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext);
107 bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext);
108 bool DecryptKey(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key);
109 } // namespace wallet
110 
111 #endif // BITCOIN_WALLET_CRYPTER_H
wallet::CCrypter::SetKeyFromPassphrase
bool SetKeyFromPassphrase(const SecureString &strKeyData, const std::vector< unsigned char > &chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
Definition: crypter.cpp:40
count
static int count
Definition: tests.c:31
wallet::CCrypter::CleanKey
void CleanKey()
Definition: crypter.h:86
wallet::WALLET_CRYPTO_SALT_SIZE
const unsigned int WALLET_CRYPTO_SALT_SIZE
Definition: crypter.h:15
wallet::CMasterKey::vchOtherDerivationParameters
std::vector< unsigned char > vchOtherDerivationParameters
Use this for more parameters to key derivation, such as the various parameters to scrypt.
Definition: crypter.h:45
wallet::CMasterKey::SERIALIZE_METHODS
SERIALIZE_METHODS(CMasterKey, obj)
Definition: crypter.h:47
wallet::CCrypter::~CCrypter
~CCrypter()
Definition: crypter.h:100
wallet::CCrypter::Encrypt
bool Encrypt(const CKeyingMaterial &vchPlaintext, std::vector< unsigned char > &vchCiphertext) const
Definition: crypter.cpp:72
wallet::CCrypter::vchKey
std::vector< unsigned char, secure_allocator< unsigned char > > vchKey
Definition: crypter.h:74
wallet
Definition: node.h:38
memory_cleanse
void memory_cleanse(void *ptr, size_t len)
Secure overwrite a buffer (possibly containing secret data) with zero-bytes.
Definition: cleanse.cpp:14
wallet::CKeyingMaterial
std::vector< unsigned char, secure_allocator< unsigned char > > CKeyingMaterial
Definition: crypter.h:62
signingprovider.h
wallet::CCrypter
Encryption/decryption context with key information.
Definition: crypter.h:70
SecureString
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
Definition: secure.h:59
wallet::CCrypter::Decrypt
bool Decrypt(const std::vector< unsigned char > &vchCiphertext, CKeyingMaterial &vchPlaintext) const
Definition: crypter.cpp:90
wallet::WALLET_CRYPTO_KEY_SIZE
const unsigned int WALLET_CRYPTO_KEY_SIZE
Definition: crypter.h:14
wallet::EncryptSecret
bool EncryptSecret(const CKeyingMaterial &vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256 &nIV, std::vector< unsigned char > &vchCiphertext)
Definition: crypter.cpp:108
wallet::CMasterKey
Private key encryption is done based on a CMasterKey, which holds a salt and random encryption key.
Definition: crypter.h:34
uint256
256-bit opaque blob.
Definition: uint256.h:126
READWRITE
#define READWRITE(...)
Definition: serialize.h:140
wallet::CMasterKey::nDerivationMethod
unsigned int nDerivationMethod
0 = EVP_sha512() 1 = scrypt()
Definition: crypter.h:41
wallet::CCrypter::SetKey
bool SetKey(const CKeyingMaterial &chNewKey, const std::vector< unsigned char > &chNewIV)
Definition: crypter.cpp:60
wallet::CMasterKey::CMasterKey
CMasterKey()
Definition: crypter.h:52
wallet::CCrypter::TestCrypter
friend class wallet_crypto_tests::TestCrypter
Definition: crypter.h:72
wallet::CMasterKey::nDeriveIterations
unsigned int nDeriveIterations
Definition: crypter.h:42
secure.h
CPubKey
An encapsulated public key.
Definition: pubkey.h:33
CKey
An encapsulated private key.
Definition: key.h:26
wallet::TestCrypter
Definition: wallet_crypto_tests.cpp:16
wallet::CCrypter::vchIV
std::vector< unsigned char, secure_allocator< unsigned char > > vchIV
Definition: crypter.h:75
wallet::CCrypter::BytesToKeySHA512AES
int BytesToKeySHA512AES(const std::vector< unsigned char > &chSalt, const SecureString &strKeyData, int count, unsigned char *key, unsigned char *iv) const
Definition: crypter.cpp:14
serialize.h
wallet::CMasterKey::vchCryptedKey
std::vector< unsigned char > vchCryptedKey
Definition: crypter.h:37
wallet::DecryptSecret
bool DecryptSecret(const CKeyingMaterial &vMasterKey, const std::vector< unsigned char > &vchCiphertext, const uint256 &nIV, CKeyingMaterial &vchPlaintext)
Definition: crypter.cpp:118
wallet::CMasterKey::vchSalt
std::vector< unsigned char > vchSalt
Definition: crypter.h:38
wallet::CCrypter::fKeySet
bool fKeySet
Definition: crypter.h:76
wallet::WALLET_CRYPTO_IV_SIZE
const unsigned int WALLET_CRYPTO_IV_SIZE
Definition: crypter.h:16
wallet::CCrypter::CCrypter
CCrypter()
Definition: crypter.h:93
wallet::DecryptKey
bool DecryptKey(const CKeyingMaterial &vMasterKey, const std::vector< unsigned char > &vchCryptedSecret, const CPubKey &vchPubKey, CKey &key)
Definition: crypter.cpp:128