annotate src/crypter.cpp @ 3646:4314bbfbfee5 draft

Preliminary undo file creation Create files (one per block) with undo information for the transactions in it.
author Pieter Wuille <pieter.wuille@gmail.com>
date Sat, 23 Jun 2012 14:17:13 +0200
parents 59533c6e6ace
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1818
20667468f95b Update all copyrights to 2012
Gavin Andresen <gavinandresen@gmail.com>
parents: 1533
diff changeset
1 // Copyright (c) 2009-2012 The Bitcoin Developers
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
2 // Distributed under the MIT/X11 software license, see the accompanying
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
4
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
5 #include <openssl/aes.h>
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
6 #include <openssl/evp.h>
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
7 #include <vector>
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
8 #include <string>
1390
97bac6569f62 Fix build on windows and mac
Gavin Andresen <gavinandresen@gmail.com>
parents: 760
diff changeset
9 #ifdef WIN32
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
10 #include <windows.h>
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
11 #endif
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
12
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
13 #include "crypter.h"
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
14
1533
d0ccfedf2957 Implement an mlock()'d string class for storing passphrases
Dylan Noblesmith <nobled@dreamwidth.org>
parents: 1390
diff changeset
15 bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
16 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
17 if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
18 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
19
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
20 int i = 0;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
21 if (nDerivationMethod == 0)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
22 i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
23 (unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
24
2260
d9b2acb762b4 Fix misc. minor sign-comparison warnings
Jeff Garzik <jeff@garzik.org>
parents: 2162
diff changeset
25 if (i != (int)WALLET_CRYPTO_KEY_SIZE)
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
26 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
27 memset(&chKey, 0, sizeof chKey);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
28 memset(&chIV, 0, sizeof chIV);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
29 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
30 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
31
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
32 fKeySet = true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
33 return true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
34 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
35
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
36 bool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
37 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
38 if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_KEY_SIZE)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
39 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
40
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
41 memcpy(&chKey[0], &chNewKey[0], sizeof chKey);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
42 memcpy(&chIV[0], &chNewIV[0], sizeof chIV);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
43
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
44 fKeySet = true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
45 return true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
46 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
47
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
48 bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
49 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
50 if (!fKeySet)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
51 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
52
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
53 // max ciphertext len for a n bytes of plaintext is
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
54 // n + AES_BLOCK_SIZE - 1 bytes
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
55 int nLen = vchPlaintext.size();
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
56 int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
57 vchCiphertext = std::vector<unsigned char> (nCLen);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
58
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
59 EVP_CIPHER_CTX ctx;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
60
2162
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
61 bool fOk = true;
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
62
2162
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
63 EVP_CIPHER_CTX_init(&ctx);
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
64 if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
65 if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
66 if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen);
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
67 EVP_CIPHER_CTX_cleanup(&ctx);
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
68
2162
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
69 if (!fOk) return false;
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
70
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
71 vchCiphertext.resize(nCLen + nFLen);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
72 return true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
73 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
74
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
75 bool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
76 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
77 if (!fKeySet)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
78 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
79
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
80 // plaintext will always be equal to or lesser than length of ciphertext
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
81 int nLen = vchCiphertext.size();
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
82 int nPLen = nLen, nFLen = 0;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
83
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
84 vchPlaintext = CKeyingMaterial(nPLen);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
85
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
86 EVP_CIPHER_CTX ctx;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
87
2162
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
88 bool fOk = true;
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
89
2162
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
90 EVP_CIPHER_CTX_init(&ctx);
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
91 if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
92 if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
93 if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen);
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
94 EVP_CIPHER_CTX_cleanup(&ctx);
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
95
2162
d5e317f83474 Verify status of encrypt/decrypt calls to detect failed padding
Pieter Wuille <pieter.wuille@gmail.com>
parents: 1818
diff changeset
96 if (!fOk) return false;
760
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
97
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
98 vchPlaintext.resize(nPLen + nFLen);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
99 return true;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
100 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
101
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
102
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
103 bool EncryptSecret(CKeyingMaterial& vMasterKey, const CSecret &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
104 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
105 CCrypter cKeyCrypter;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
106 std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
107 memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
108 if(!cKeyCrypter.SetKey(vMasterKey, chIV))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
109 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
110 return cKeyCrypter.Encrypt((CKeyingMaterial)vchPlaintext, vchCiphertext);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
111 }
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
112
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
113 bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CSecret& vchPlaintext)
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
114 {
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
115 CCrypter cKeyCrypter;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
116 std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
117 memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
118 if(!cKeyCrypter.SetKey(vMasterKey, chIV))
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
119 return false;
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
120 return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));
fd7e5b1cfc08 Add wallet privkey encryption.
Matt Corallo <matt@bluematt.me>
parents:
diff changeset
121 }