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