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>
11
12
13const unsigned int WALLET_CRYPTO_KEY_SIZE = 32;
14const unsigned int WALLET_CRYPTO_SALT_SIZE = 8;
15const unsigned int WALLET_CRYPTO_IV_SIZE = 16;
16
34{
35public:
36 std::vector<unsigned char> vchCryptedKey;
37 std::vector<unsigned char> vchSalt;
40 unsigned int nDerivationMethod;
41 unsigned int nDeriveIterations;
44 std::vector<unsigned char> vchOtherDerivationParameters;
45
47 {
48 READWRITE(obj.vchCryptedKey, obj.vchSalt, obj.nDerivationMethod, obj.nDeriveIterations, obj.vchOtherDerivationParameters);
49 }
50
52 {
53 // 25000 rounds is just under 0.1 seconds on a 1.86 GHz Pentium M
54 // ie slightly lower than the lowest hardware we need bother supporting
55 nDeriveIterations = 25000;
57 vchOtherDerivationParameters = std::vector<unsigned char>(0);
58 }
59};
60
61typedef std::vector<unsigned char, secure_allocator<unsigned char> > CKeyingMaterial;
62
64{
65 class TestCrypter;
66}
67
70{
71friend class wallet_crypto_tests::TestCrypter; // for test access to chKey/chIV
72private:
73 std::vector<unsigned char, secure_allocator<unsigned char>> vchKey;
74 std::vector<unsigned char, secure_allocator<unsigned char>> vchIV;
75 bool fKeySet;
76
77 int BytesToKeySHA512AES(const std::vector<unsigned char>& chSalt, const SecureString& strKeyData, int count, unsigned char *key,unsigned char *iv) const;
78
79public:
80 bool SetKeyFromPassphrase(const SecureString &strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod);
81 bool Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext) const;
82 bool Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext) const;
83 bool SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV);
84
85 void CleanKey()
86 {
87 memory_cleanse(vchKey.data(), vchKey.size());
88 memory_cleanse(vchIV.data(), vchIV.size());
89 fKeySet = false;
90 }
91
93 {
94 fKeySet = false;
97 }
98
100 {
101 CleanKey();
102 }
103};
104
105bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext);
106bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext);
107bool DecryptKey(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCryptedSecret, const CPubKey& vchPubKey, CKey& key);
108
109#endif // BITCOIN_WALLET_CRYPTER_H
Encryption/decryption context with key information.
Definition: crypter.h:70
bool Encrypt(const CKeyingMaterial &vchPlaintext, std::vector< unsigned char > &vchCiphertext) const
Definition: crypter.cpp:71
bool SetKey(const CKeyingMaterial &chNewKey, const std::vector< unsigned char > &chNewIV)
Definition: crypter.cpp:59
friend class wallet_crypto_tests::TestCrypter
Definition: crypter.h:71
bool fKeySet
Definition: crypter.h:75
CCrypter()
Definition: crypter.h:92
bool SetKeyFromPassphrase(const SecureString &strKeyData, const std::vector< unsigned char > &chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
Definition: crypter.cpp:39
bool Decrypt(const std::vector< unsigned char > &vchCiphertext, CKeyingMaterial &vchPlaintext) const
Definition: crypter.cpp:89
int BytesToKeySHA512AES(const std::vector< unsigned char > &chSalt, const SecureString &strKeyData, int count, unsigned char *key, unsigned char *iv) const
Definition: crypter.cpp:13
void CleanKey()
Definition: crypter.h:85
std::vector< unsigned char, secure_allocator< unsigned char > > vchIV
Definition: crypter.h:74
std::vector< unsigned char, secure_allocator< unsigned char > > vchKey
Definition: crypter.h:73
~CCrypter()
Definition: crypter.h:99
An encapsulated private key.
Definition: key.h:27
Private key encryption is done based on a CMasterKey, which holds a salt and random encryption key.
Definition: crypter.h:34
std::vector< unsigned char > vchSalt
Definition: crypter.h:37
SERIALIZE_METHODS(CMasterKey, obj)
Definition: crypter.h:46
CMasterKey()
Definition: crypter.h:51
unsigned int nDerivationMethod
0 = EVP_sha512() 1 = scrypt()
Definition: crypter.h:40
std::vector< unsigned char > vchCryptedKey
Definition: crypter.h:36
std::vector< unsigned char > vchOtherDerivationParameters
Use this for more parameters to key derivation, such as the various parameters to scrypt.
Definition: crypter.h:44
unsigned int nDeriveIterations
Definition: crypter.h:41
An encapsulated public key.
Definition: pubkey.h:33
256-bit opaque blob.
Definition: uint256.h:124
void memory_cleanse(void *ptr, size_t len)
Secure overwrite a buffer (possibly containing secret data) with zero-bytes.
Definition: cleanse.cpp:14
bool DecryptKey(const CKeyingMaterial &vMasterKey, const std::vector< unsigned char > &vchCryptedSecret, const CPubKey &vchPubKey, CKey &key)
Definition: crypter.cpp:127
bool EncryptSecret(const CKeyingMaterial &vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256 &nIV, std::vector< unsigned char > &vchCiphertext)
Definition: crypter.cpp:107
const unsigned int WALLET_CRYPTO_IV_SIZE
Definition: crypter.h:15
std::vector< unsigned char, secure_allocator< unsigned char > > CKeyingMaterial
Definition: crypter.h:61
const unsigned int WALLET_CRYPTO_SALT_SIZE
Definition: crypter.h:14
const unsigned int WALLET_CRYPTO_KEY_SIZE
Definition: crypter.h:13
bool DecryptSecret(const CKeyingMaterial &vMasterKey, const std::vector< unsigned char > &vchCiphertext, const uint256 &nIV, CKeyingMaterial &vchPlaintext)
Definition: crypter.cpp:117
std::basic_string< char, std::char_traits< char >, secure_allocator< char > > SecureString
Definition: secure.h:59
#define READWRITE(...)
Definition: serialize.h:147
static int count
Definition: tests.c:41