Open-Transactions  0.93.0-ge03d287
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OTPasswordData.hpp
Go to the documentation of this file.
1 /************************************************************
2  *
3  * OTPasswordData.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_OTPASSWORDDATA_HPP
134 #define OPENTXS_CORE_CRYPTO_OTPASSWORDDATA_HPP
135 
136 #include <string>
137 #include <memory>
138 
139 namespace opentxs
140 {
141 
142 class OTCachedKey;
143 class OTPassword;
144 class OTString;
145 
146 /*
147  To use:
148 
149  OTPassword thePass;
150  (Or...)
151  OTPassword thePass(strPassword, strPassword.length());
152 
153  const char * szPassword = thePass.getPassword();
154  const int32_t nPassLength = thePass.getPasswordSize();
155 
156  If the instance of OTPassword is not going to be destroyed immediately
157  after the password is used, then make sure to call zeroMemory() after
158  using the password. (Otherwise the destructor will handle this anyway.)
159 
160  (The primary purpose of this class is that it zeros its memory out when
161  it is destructed.)
162 
163  This class gives me a safe way to hand-off a password, and off-load the
164  handling risk to the user. This class will be included as part of the
165  OT-API SWIG interface so that it's available inside other languages.
166 
167  */
168 
169 #define OT_PW_DISPLAY "Enter master passphrase for wallet."
170 
171 #define OTPASSWORD_BLOCKSIZE 128 // (128 bytes max length for a password.)
172 #define OTPASSWORD_MEMSIZE 129 // +1 for null terminator.
173 
174 // UPDATE: Increasing the size here, so we can accommodate private keys (in
175 // addition to passphrases.)
176 #define OT_LARGE_BLOCKSIZE 32767 // (32767 bytes max length for a password.)
177 #define OT_LARGE_MEMSIZE 32768 // +1 for null terminator.
178 
179 // Default is the smaller size.
180 #define OT_DEFAULT_BLOCKSIZE 128
181 #define OT_DEFAULT_MEMSIZE 129
182 
183 // https://github.com/lorf/keepassx/blob/master/src/lib/SecString.cpp
184 
185 // Done: Although we have good memory ZEROING code (for destruction)
186 // we don't have code yet that will keep the contents SECURE while they
187 // are in memory. For example, that will prevent them from being paged
188 // to the hard drive during swapping. Such code would make OTPassword much
189 // more appropriate for use cases such as storing passphrases and private
190 // keys, and would even allow timeout procedures...
191 //
192 // NOTE: For Windows, use VirtualLock instead of mlock.
193 //
194 
195 /*
196  #include <sys/mman.h>
197 
198  void *locking_alloc(size_t numbytes)
199  {
200  static short have_warned = 0;
201 
202  void *mem = malloc(numbytes);
203 
204  if (mlock(mem, numbytes) && !have_warned)
205  {
206 
207  // We probably do not have permission.
208  // Sometimes, it might not be possible to lock enough memory.
209 
210  fprintf(stderr, "Warning: Using insecure memory!\n");
211 
212  have_warned = 1;
213 
214  }
215 
216  return mem;
217  }
218 
219 The mlock() call generally locks more memory than you want. Locking is done on a
220 per-page basis. All of the pages the memory spans will be locked in RAM, and
221 will not be swapped out under any circumstances, until the process unlocks
222 something in the same page by using mlock().
223 
224 There are some potentially negative consequences here. First, If your process
225 locks two buffers that happen to live on the same page, then unlocking either
226 one will unlock the entire page, causing both buffers to unlock. Second, when
227 locking lots of data, it is easy to lock more pages than necessary (the
228 operating system doesn't move data around once it has been allocated), which can
229 slow down machine performance significantly.
230 
231 Unlocking a chunk of memory looks exactly the same as locking it, except that
232 you call munlock():
233  munlock(mem, numbytes);
234 
235 
236  // TODO: Work in some usage of CryptProtectMemory and CryptUnprotectMemory
237 (Windows only)
238  // with sample code below. Also should make some kind of UNIX version.
239 
240 
241 #ifndef _WINDOWS_
242 #ifndef WIN32_LEAN_AND_MEAN
243 #define WIN32_LEAN_AND_MEAN
244 #endif
245 #include <windows.h>
246 #endif
247 #include <cstdio>
248 #include <Wincrypt.h>
249 
250 #define SSN_STR_LEN 12 // includes null
251 
252 void main()
253 {
254  HRESULT hr = S_OK;
255  LPWSTR pSensitiveText = nullptr;
256  DWORD cbSensitiveText = 0;
257  DWORD cbPlainText = SSN_STR_LEN*sizeof(WCHAR);
258  DWORD dwMod = 0;
259 
260  // Memory to encrypt must be a multiple of CRYPTPROTECTMEMORY_BLOCK_SIZE.
261  if (dwMod = cbPlainText % CRYPTPROTECTMEMORY_BLOCK_SIZE)
262  cbSensitiveText = cbPlainText +
263  (CRYPTPROTECTMEMORY_BLOCK_SIZE - dwMod);
264  else
265  cbSensitiveText = cbPlainText;
266 
267  pSensitiveText = (LPWSTR)LocalAlloc(LPTR, cbSensitiveText);
268  if (nullptr == pSensitiveText)
269  {
270  wprintf(L"Memory allocation failed.\n");
271  return E_OUTOFMEMORY;
272  }
273 
274  // Place sensitive string to encrypt in pSensitiveText.
275 
276  if (!CryptProtectMemory(pSensitiveText, cbSensitiveText,
277  CRYPTPROTECTMEMORY_SAME_PROCESS))
278  {
279  wprintf(L"CryptProtectMemory failed: %d\n", GetLastError());
280  SecureZeroMemory(pSensitiveText, cbSensitiveText);
281  LocalFree(pSensitiveText);
282  pSensitiveText = nullptr;
283  return E_FAIL;
284  }
285 
286  // Call CryptUnprotectMemory to decrypt and use the memory.
287 
288  SecureZeroMemory(pSensitiveText, cbSensitiveText);
289  LocalFree(pSensitiveText);
290  pSensitiveText = nullptr;
291 
292  return hr;
293 }
294 
295 
296 #ifndef _WINDOWS_
297 #ifndef WIN32_LEAN_AND_MEAN
298 #define WIN32_LEAN_AND_MEAN
299 #endif
300 #include <windows.h>
301 #endif
302 #include <cstdio>
303 #include <Wincrypt.h>
304 #include <strsafe.h>
305 
306 #pragma comment(lib, "crypt32.lib")
307 
308 void main()
309 {
310  LPWSTR pEncryptedText; // contains the encrypted text
311  DWORD cbEncryptedText; // number of bytes to which
312  // pEncryptedText points
313 
314  if (CryptUnprotectMemory(pEncryptedText, cbEncryptedText,
315  CRYPTPROTECTMEMORY_SAME_PROCESS))
316  {
317  // Use the decrypted string.
318  }
319  else
320  {
321  wprintf(L"CryptUnprotectMemory failed: %d\n",
322  GetLastError());
323  }
324 
325  // Clear and free memory after using
326  // the decrypted string or if an error occurs.
327  SecureZeroMemory(pEncryptedText, cbEncryptedText);
328  LocalFree(pEncryptedText);
329  pEncryptedText = nullptr;
330 }
331 
332 
333  */
334 
335 /*
336  OTPasswordData
337  This class is used for passing user data to the password callback.
338  Whenever actually doing some OpenSSL call that involves a private key,
339  just instantiate one of these and pass its address as the userdata for
340  the OpenSSL call. Then when the OT password callback is activated by
341  OpenSSL, that pointer will be passed into the callback, so the user string
342  can be displayed on the password dialog. (And also so the callback knows
343  whether it was activated for a normal key or for a master key.) If it was
344  activated for a normal key, then it will use the cached master key, or
345  if that's timed out then it will try to decrypt a copy of it using the
346  master Nym. Whereas if it WAS activated for the Master Nym, then it will
347  just pop up the passphrase dialog and get his passphrase, and use that to
348  decrypt the master key.
349 
350  NOTE: For internationalization later, we can add an OTPasswordData constructor
351  that takes a STRING CODE instead of an actual string. We can use an enum for
352  this. Then we just pass the code there, instead of the string itself, and
353  the class will do the work of looking up the actual string based on that code.
354  */
356 {
357 private:
358  OTPassword* m_pMasterPW; // Used only when isForCachedKey is true, for
359  // output. Points to output value from original
360  // caller (not owned.)
361  const std::string m_strDisplay;
362  bool m_bUsingOldSystem; // "Do NOT use CachedKey if this is true."
363 
364  // If m_pMasterPW is set, this must be set as well.
365  std::shared_ptr<OTCachedKey> m_pCachedKey;
366 
367 public:
368  EXPORT bool isForNormalNym() const;
369  EXPORT bool isForCachedKey() const;
370  EXPORT const char* GetDisplayString() const;
371  EXPORT bool isUsingOldSystem() const;
372  EXPORT void setUsingOldSystem(bool bUsing = true);
374  {
375  return m_pMasterPW;
376  }
377  std::shared_ptr<OTCachedKey> GetCachedKey() const
378  {
379  return m_pCachedKey;
380  }
381  EXPORT OTPasswordData(const char* szDisplay,
382  OTPassword* pMasterPW = nullptr,
383  std::shared_ptr<OTCachedKey> pCachedKey =
384  std::shared_ptr<OTCachedKey>());
385  EXPORT OTPasswordData(const std::string& str_Display,
386  OTPassword* pMasterPW = nullptr,
387  std::shared_ptr<OTCachedKey> pCachedKey =
388  std::shared_ptr<OTCachedKey>());
389  EXPORT OTPasswordData(const OTString& strDisplay,
390  OTPassword* pMasterPW = nullptr,
391  std::shared_ptr<OTCachedKey> pCachedKey =
392  std::shared_ptr<OTCachedKey>());
393  EXPORT ~OTPasswordData();
394 };
395 
396 } // namespace opentxs
397 
398 #endif // OPENTXS_CORE_CRYPTO_OTPASSWORDDATA_HPP
EXPORT const char * GetDisplayString() const
EXPORT bool isUsingOldSystem() const
std::shared_ptr< OTCachedKey > GetCachedKey() const
EXPORT void setUsingOldSystem(bool bUsing=true)
EXPORT OTPasswordData(const char *szDisplay, OTPassword *pMasterPW=nullptr, std::shared_ptr< OTCachedKey > pCachedKey=std::shared_ptr< OTCachedKey >())
OTPassword * GetMasterPW() const
EXPORT bool isForCachedKey() const
EXPORT bool isForNormalNym() const