Open-Transactions  0.93.0-ge03d287
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OTPassword.hpp
Go to the documentation of this file.
1 /************************************************************
2  *
3  * OTPassword.hpp
4  *
5  */
6 
7 /************************************************************
8  -----BEGIN PGP SIGNED MESSAGE-----
9  Hash: SHA1
10 
11  * OPEN TRANSACTIONS
12  *
13  * Financial Cryptography and Digital Cash
14  * Library, Protocol, API, Server, CLI, GUI
15  *
16  * -- Anonymous Numbered Accounts.
17  * -- Untraceable Digital Cash.
18  * -- Triple-Signed Receipts.
19  * -- Cheques, Vouchers, Transfers, Inboxes.
20  * -- Basket Currencies, Markets, Payment Plans.
21  * -- Signed, XML, Ricardian-style Contracts.
22  * -- Scripted smart contracts.
23  *
24  * Copyright (C) 2010-2013 by "Fellow Traveler" (A pseudonym)
25  *
26  * EMAIL:
28  *
29  * BITCOIN: 1NtTPVVjDsUfDWybS4BwvHpG2pdS9RnYyQ
30  *
31  * KEY FINGERPRINT (PGP Key in license file):
32  * 9DD5 90EB 9292 4B48 0484 7910 0308 00ED F951 BB8E
33  *
34  * OFFICIAL PROJECT WIKI(s):
35  * https://github.com/FellowTraveler/Moneychanger
36  * https://github.com/FellowTraveler/Open-Transactions/wiki
37  *
38  * WEBSITE:
39  * http://www.OpenTransactions.org/
40  *
41  * Components and licensing:
42  * -- Moneychanger..A Java client GUI.....LICENSE:.....GPLv3
43  * -- otlib.........A class library.......LICENSE:...LAGPLv3
44  * -- otapi.........A client API..........LICENSE:...LAGPLv3
45  * -- opentxs/ot....Command-line client...LICENSE:...LAGPLv3
46  * -- otserver......Server Application....LICENSE:....AGPLv3
47  * Github.com/FellowTraveler/Open-Transactions/wiki/Components
48  *
49  * All of the above OT components were designed and written by
50  * Fellow Traveler, with the exception of Moneychanger, which
51  * was contracted out to Vicky C ([email protected]).
52  * The open-source community has since actively contributed.
53  *
54  * -----------------------------------------------------
55  *
56  * LICENSE:
57  * This program is free software: you can redistribute it
58  * and/or modify it under the terms of the GNU Affero
59  * General Public License as published by the Free Software
60  * Foundation, either version 3 of the License, or (at your
61  * option) any later version.
62  *
63  * ADDITIONAL PERMISSION under the GNU Affero GPL version 3
64  * section 7: (This paragraph applies only to the LAGPLv3
65  * components listed above.) If you modify this Program, or
66  * any covered work, by linking or combining it with other
67  * code, such other code is not for that reason alone subject
68  * to any of the requirements of the GNU Affero GPL version 3.
69  * (==> This means if you are only using the OT API, then you
70  * don't have to open-source your code--only your changes to
71  * Open-Transactions itself must be open source. Similar to
72  * LGPLv3, except it applies to software-as-a-service, not
73  * just to distributing binaries.)
74  *
75  * Extra WAIVER for OpenSSL, Lucre, and all other libraries
76  * used by Open Transactions: This program is released under
77  * the AGPL with the additional exemption that compiling,
78  * linking, and/or using OpenSSL is allowed. The same is true
79  * for any other open source libraries included in this
80  * project: complete waiver from the AGPL is hereby granted to
81  * compile, link, and/or use them with Open-Transactions,
82  * according to their own terms, as long as the rest of the
83  * Open-Transactions terms remain respected, with regard to
84  * the Open-Transactions code itself.
85  *
86  * Lucre License:
87  * This code is also "dual-license", meaning that Ben Lau-
88  * rie's license must also be included and respected, since
89  * the code for Lucre is also included with Open Transactions.
90  * See Open-Transactions/src/otlib/lucre/LUCRE_LICENSE.txt
91  * The Laurie requirements are light, but if there is any
92  * problem with his license, simply remove the Lucre code.
93  * Although there are no other blind token algorithms in Open
94  * Transactions (yet. credlib is coming), the other functions
95  * will continue to operate.
96  * See Lucre on Github: https://github.com/benlaurie/lucre
97  * -----------------------------------------------------
98  * You should have received a copy of the GNU Affero General
99  * Public License along with this program. If not, see:
100  * http://www.gnu.org/licenses/
101  *
102  * If you would like to use this software outside of the free
103  * software license, please contact FellowTraveler.
104  * (Unfortunately many will run anonymously and untraceably,
105  * so who could really stop them?)
106  *
107  * DISCLAIMER:
108  * This program is distributed in the hope that it will be
109  * useful, but WITHOUT ANY WARRANTY; without even the implied
110  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
111  * PURPOSE. See the GNU Affero General Public License for
112  * more details.
113 
114  -----BEGIN PGP SIGNATURE-----
115  Version: GnuPG v1.4.9 (Darwin)
116 
117  iQIcBAEBAgAGBQJRSsfJAAoJEAMIAO35UbuOQT8P/RJbka8etf7wbxdHQNAY+2cC
118  vDf8J3X8VI+pwMqv6wgTVy17venMZJa4I4ikXD/MRyWV1XbTG0mBXk/7AZk7Rexk
119  KTvL/U1kWiez6+8XXLye+k2JNM6v7eej8xMrqEcO0ZArh/DsLoIn1y8p8qjBI7+m
120  aE7lhstDiD0z8mwRRLKFLN2IH5rAFaZZUvj5ERJaoYUKdn4c+RcQVei2YOl4T0FU
121  LWND3YLoH8naqJXkaOKEN4UfJINCwxhe5Ke9wyfLWLUO7NamRkWD2T7CJ0xocnD1
122  sjAzlVGNgaFDRflfIF4QhBx1Ddl6wwhJfw+d08bjqblSq8aXDkmFA7HeunSFKkdn
123  oIEOEgyj+veuOMRJC5pnBJ9vV+7qRdDKQWaCKotynt4sWJDGQ9kWGWm74SsNaduN
124  TPMyr9kNmGsfR69Q2Zq/FLcLX/j8ESxU+HYUB4vaARw2xEOu2xwDDv6jt0j3Vqsg
125  x7rWv4S/Eh18FDNDkVRChiNoOIilLYLL6c38uMf1pnItBuxP3uhgY6COm59kVaRh
126  nyGTYCDYD2TK+fI9o89F1297uDCwEJ62U0Q7iTDp5QuXCoxkPfv8/kX6lS6T3y9G
127  M9mqIoLbIQ1EDntFv7/t6fUTS2+46uCrdZWbQ5RjYXdrzjij02nDmJAm2BngnZvd
128  kamH0Y/n11lCvo1oQxM+
129  =uSzz
130  -----END PGP SIGNATURE-----
131  **************************************************************/
132 
133 #ifndef OPENTXS_CORE_CRYPTO_OTPASSWORD_HPP
134 #define OPENTXS_CORE_CRYPTO_OTPASSWORD_HPP
135 
136 namespace opentxs
137 {
138 
139 /*
140  To use:
141 
142  OTPassword thePass;
143  (Or...)
144  OTPassword thePass(strPassword, strPassword.length());
145 
146  const char * szPassword = thePass.getPassword();
147  const int32_t nPassLength = thePass.getPasswordSize();
148 
149  If the instance of OTPassword is not going to be destroyed immediately
150  after the password is used, then make sure to call zeroMemory() after
151  using the password. (Otherwise the destructor will handle this anyway.)
152 
153  (The primary purpose of this class is that it zeros its memory out when
154  it is destructed.)
155 
156  This class gives me a safe way to hand-off a password, and off-load the
157  handling risk to the user. This class will be included as part of the
158  OT-API SWIG interface so that it's available inside other languages.
159 
160  */
161 
162 #define OT_PW_DISPLAY "Enter master passphrase for wallet."
163 
164 #define OTPASSWORD_BLOCKSIZE 128 // (128 bytes max length for a password.)
165 #define OTPASSWORD_MEMSIZE 129 // +1 for null terminator.
166 
167 // UPDATE: Increasing the size here, so we can accommodate private keys (in
168 // addition to passphrases.)
169 //
170 #define OT_LARGE_BLOCKSIZE 32767 // (32767 bytes max length for a password.)
171 #define OT_LARGE_MEMSIZE 32768 // +1 for null terminator.
172 
173 // Default is the smaller size.
174 #define OT_DEFAULT_BLOCKSIZE 128
175 #define OT_DEFAULT_MEMSIZE 129
176 
177 // Originally written for the safe storage of passwords.
178 // Now used for symmetric keys as well.
179 // Specifically: when the clear version of a password or key must be stored
180 // usually for temporary reasons, it must be stored in memory locked from
181 // swapping to disk, and in an object like OTPassword that zeros the memory as
182 // soon as we're done.
183 //
184 // OTPassword tries to store a piece of data more securely.
185 // During the time I have to take a password from the user and pass it to
186 // OpenSSL,
187 // I want it stored as securely as possible, and that's what this class was
188 // written for.
189 // Now I'm adding the ability to store binary data in here, not just a
190 // text-based password.
191 // That way, OTSymmetricKey can store its plain key in an OTPassword. Well,
192 // it actually stores
193 // its key in an encrypted format, but whenever, for what brief moments that
194 // key is decrypted and
195 // USED, the decrypted form of it will be stored in an OTPassword (in binary
196 // mode.)
197 // This is basically just to save me from duplicating work that's already
198 // done here in OTPassword.
199 //
201 {
202 public:
203  enum BlockSize {
204  // (128 bytes max length for a password.)
206  // Update: now 32767 bytes if you use this size.
208  };
209 
210 public:
211  EXPORT OTPassword(BlockSize blockSize = DEFAULT_SIZE);
212  EXPORT OTPassword(const OTPassword& rhs);
213  EXPORT OTPassword(const char* input, uint32_t size,
214  BlockSize blockSize = DEFAULT_SIZE); // text / password
215  // stored.
216  EXPORT OTPassword(const uint8_t* input, uint32_t size,
217  BlockSize blockSize = DEFAULT_SIZE); // text / password
218  // stored.
219  EXPORT OTPassword(const void* input, uint32_t size,
220  BlockSize blockSize = DEFAULT_SIZE); // binary / symmetric
221  // key stored.
222  EXPORT ~OTPassword();
223  EXPORT OTPassword& operator=(const OTPassword& rhs);
224 
225  EXPORT bool isPassword() const;
226  EXPORT const uint8_t* getPassword_uint8() const;
227 
228  EXPORT const char* getPassword() const;
229  EXPORT uint8_t* getPasswordWritable();
230  EXPORT char* getPasswordWritable_char();
231  // (FYI, truncates if nInputSize larger than getBlockSize.)
232  EXPORT int32_t setPassword(const char* input, int32_t size);
233  // (FYI, truncates if nInputSize larger than getBlockSize.)
234  EXPORT int32_t setPassword_uint8(const uint8_t* input, uint32_t size);
235  EXPORT bool addChar(uint8_t c);
236  EXPORT int32_t randomizePassword(uint32_t size = DEFAULT_SIZE);
237  EXPORT static bool randomizePassword_uint8(uint8_t* destination,
238  uint32_t size);
239  EXPORT static bool randomizePassword(char* destination, uint32_t size);
240  EXPORT bool isMemory() const;
241  EXPORT const void* getMemory() const;
242  EXPORT const uint8_t* getMemory_uint8() const;
243  EXPORT void* getMemoryWritable();
244  // (FYI, truncates if size larger than getBlockSize.)
245  EXPORT int32_t setMemory(const void* input, uint32_t size);
246  // (FYI, truncates if size + getPasswordSize() is larger than
247  // getBlockSize.)
248  EXPORT int32_t addMemory(const void* append, uint32_t size);
249  EXPORT int32_t randomizeMemory(uint32_t size = DEFAULT_SIZE);
250  EXPORT static bool randomizeMemory_uint8(uint8_t* destination,
251  uint32_t size);
252  EXPORT static bool randomizeMemory(void* destination, uint32_t size);
253  EXPORT uint32_t getBlockSize() const;
254  EXPORT bool Compare(OTPassword& rhs) const;
255  EXPORT uint32_t getPasswordSize() const;
256  EXPORT uint32_t getMemorySize() const;
257  EXPORT void zeroMemory();
258  EXPORT static void zeroMemory(uint8_t* szMemory, uint32_t size);
259  EXPORT static void zeroMemory(void* vMemory, uint32_t size);
260  EXPORT static void* safe_memcpy(void* dest, uint32_t dsize, const void* src,
261  uint32_t ssize, bool zeroSource = false);
262 
263  // OTPassword thePass; will create a text password.
264  // But use the below function if you want one that has
265  // a text buffer of size (versus a 0 size.) This is for
266  // cases where you need the buffer to pre-exist so that
267  // some other function can populate that buffer directly.
268  // (Such as the OpenSSL password callback...)
269  // CALLER IS RESPONSIBLE TO DELETE.
270  // asserts already.
271  EXPORT static OTPassword* CreateTextBuffer();
272 
273  // There are certain weird cases, like in
274  // OTSymmetricKey::GetPassphraseFromUser,
275  // where we set the password using the getPassword_writable, and it's
276  // properly
277  // null-terminated, yet this instance still doesn't know its actual size
278  // (even though
279  // the size is known.) Therefore I added this call in order to set the size
280  // in
281  // those odd cases where it's necessary. That being said, YOU should
282  // normally NEVER
283  // need to use this function, so just pretend it doesn't exist.
284  EXPORT bool SetSize(uint32_t size);
285 
286 private:
287  uint32_t size_;
288  uint8_t data_[OT_DEFAULT_MEMSIZE];
289  bool isText_;
290  bool isBinary_;
291  bool isPageLocked_;
292  const BlockSize blockSize_;
293 };
294 
295 } // namespace opentxs
296 
297 #endif // OPENTXS_CORE_CRYPTO_OTPASSWORD_HPP
EXPORT const uint8_t * getMemory_uint8() const
Definition: OTPassword.cpp:582
EXPORT uint32_t getMemorySize() const
Definition: OTPassword.cpp:619
EXPORT OTPassword(BlockSize blockSize=DEFAULT_SIZE)
Definition: OTPassword.cpp:455
static EXPORT bool randomizePassword_uint8(uint8_t *destination, uint32_t size)
Definition: OTPassword.cpp:792
EXPORT uint8_t * getPasswordWritable()
Definition: OTPassword.cpp:560
EXPORT void zeroMemory()
Definition: OTPassword.cpp:281
EXPORT int32_t addMemory(const void *append, uint32_t size)
Definition: OTPassword.cpp:944
#define OT_LARGE_BLOCKSIZE
Definition: OTPassword.hpp:170
EXPORT bool isPassword() const
Definition: OTPassword.cpp:537
EXPORT char * getPasswordWritable_char()
Definition: OTPassword.cpp:568
EXPORT const void * getMemory() const
Definition: OTPassword.cpp:577
EXPORT int32_t setMemory(const void *input, uint32_t size)
EXPORT int32_t setPassword(const char *input, int32_t size)
Definition: OTPassword.cpp:665
EXPORT bool addChar(uint8_t c)
Definition: OTPassword.cpp:625
static EXPORT bool randomizeMemory_uint8(uint8_t *destination, uint32_t size)
Definition: OTPassword.cpp:881
EXPORT OTPassword & operator=(const OTPassword &rhs)
Definition: OTPassword.cpp:466
EXPORT int32_t randomizeMemory(uint32_t size=DEFAULT_SIZE)
Definition: OTPassword.cpp:890
#define OT_DEFAULT_BLOCKSIZE
Definition: OTPassword.hpp:174
EXPORT bool SetSize(uint32_t size)
Definition: OTPassword.cpp:758
static EXPORT OTPassword * CreateTextBuffer()
Definition: OTPassword.cpp:429
EXPORT uint32_t getPasswordSize() const
Definition: OTPassword.cpp:613
EXPORT const char * getPassword() const
Definition: OTPassword.cpp:547
EXPORT const uint8_t * getPassword_uint8() const
Definition: OTPassword.cpp:554
EXPORT bool isMemory() const
Definition: OTPassword.cpp:542
EXPORT void * getMemoryWritable()
Definition: OTPassword.cpp:589
EXPORT int32_t randomizePassword(uint32_t size=DEFAULT_SIZE)
Definition: OTPassword.cpp:823
EXPORT int32_t setPassword_uint8(const uint8_t *input, uint32_t size)
Definition: OTPassword.cpp:674
EXPORT uint32_t getBlockSize() const
Definition: OTPassword.cpp:595
EXPORT bool Compare(OTPassword &rhs) const
Definition: OTPassword.cpp:637
static EXPORT void * safe_memcpy(void *dest, uint32_t dsize, const void *src, uint32_t ssize, bool zeroSource=false)
Definition: OTPassword.cpp:357
#define OT_DEFAULT_MEMSIZE
Definition: OTPassword.hpp:175