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