Open-Transactions  0.93.0-ge03d287
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OTCaller.cpp
Go to the documentation of this file.
1 /************************************************************
2  *
3  * OTCaller.cpp
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 #include "stdafx.hpp"
134 
135 #include "crypto/OTCaller.hpp"
136 #include "crypto/OTCallback.hpp"
137 #include "OTLog.hpp"
138 
139 // For SecureZeroMemory
140 #ifdef _WIN32
141 #else // not _WIN32
142 
143 // for mlock and munlock
144 #include <sys/types.h>
145 #include <sys/mman.h>
146 #include <limits.h>
147 
148 #ifndef PAGESIZE
149 #include <unistd.h>
150 #define PAGESIZE sysconf(_SC_PAGESIZE)
151 #endif
152 
153 // FT: Credit to the Bitcoin team for the mlock / munlock defines.
154 
155 #define mlock(a, b) \
156  mlock(((void*)(((size_t)(a)) & (~((PAGESIZE)-1)))), \
157  (((((size_t)(a)) + (b)-1) | ((PAGESIZE)-1)) + 1) - \
158  (((size_t)(a)) & (~((PAGESIZE)-1))))
159 #define munlock(a, b) \
160  munlock(((void*)(((size_t)(a)) & (~((PAGESIZE)-1)))), \
161  (((((size_t)(a)) + (b)-1) | ((PAGESIZE)-1)) + 1) - \
162  (((size_t)(a)) & (~((PAGESIZE)-1))))
163 #endif
164 
165 namespace opentxs
166 {
167 
169 {
170  otOut << "OTCaller::~OTCaller: (This should only happen as the application "
171  "is closing.)\n";
172 
173  delCallback();
174 }
175 
176 // A display string is set here before the Java dialog is shown, so that the
177 // string can be displayed on that dialog.
178 //
179 const char* OTCaller::GetDisplay() const
180 {
181  // I'm using the OTPassword class to store the display string, in addition
182  // to
183  // storing the password itself. (For convenience.)
184  //
185  return reinterpret_cast<const char*>(m_Display.getPassword_uint8());
186 }
187 
188 // A display string is set here before the Java dialog is shown, so that the
189 // string can be displayed on that dialog.
190 //
191 void OTCaller::SetDisplay(const char* szDisplay, int32_t nLength)
192 {
193  // I'm using the OTPassword class to store the display string, in addition
194  // to
195  // storing the password itself. (For convenience.)
196  //
197  m_Display.setPassword_uint8(reinterpret_cast<const uint8_t*>(szDisplay),
198  nLength);
199 }
200 
201 // The password will be stored here by the Java dialog, so that the C callback
202 // can retrieve it and pass it to OpenSSL
203 //
204 bool OTCaller::GetPassword(OTPassword& theOutput) const // Get the password....
205 {
206  otOut << "OTCaller::GetPassword: FYI, returning password after invoking a "
207  "(probably Java) password dialog.\n";
208 
209  theOutput.setPassword_uint8(m_Password.getPassword_uint8(),
210  m_Password.getPasswordSize());
211 
212  return true;
213 }
214 
215 void OTCaller::ZeroOutPassword() // Then ZERO IT OUT so copies aren't floating
216  // around.
217 {
219 }
220 
222 {
223  // if (nullptr != _callback) // TODO this may be a memory leak.
224  // delete _callback; // But I know we're currently crashing from
225  // deleting same object twice.
226  // And since the object comes from Java, who am I to delete it? Let Java
227  // clean it up.
228  if (isCallbackSet())
229  otOut << "OTCaller::delCallback: WARNING: setting existing callback "
230  "object pointer to nullptr. "
231  "(This message doesn't trigger if it was already nullptr.)\n";
232 
233  _callback = nullptr;
234 }
235 
237 {
238  otOut << "OTCaller::setCallback: Attempting to set the password OTCallback "
239  "pointer...\n";
240 
241  if (nullptr == cb) {
242  otOut << "OTCaller::setCallback: ERROR: nullptr password OTCallback "
243  "object passed in. (Returning.)\n";
244  return;
245  }
246 
247  delCallback(); // Sets _callback to nullptr, but LOGS first, if it was
248  // already
249  // set.
250 
251  _callback = cb;
252  otOut << "OTCaller::setCallback: FYI, the password OTCallback pointer was "
253  "set.\n";
254 }
255 
257 {
258  return (nullptr == _callback) ? false : true;
259 }
260 
262 {
263  ZeroOutPassword(); // Make sure there isn't some old password still in here.
264 
265  if (isCallbackSet()) {
266  otOut
267  << "OTCaller::callOne: FYI, Executing password callback (one)...\n";
269  }
270  else {
271  otOut << "OTCaller::callOne: WARNING: Failed attempt to trigger "
272  "password callback (one), due to \"it hasn't been set "
273  "yet.\"\n";
274  }
275 }
276 
278 {
279  ZeroOutPassword(); // Make sure there isn't some old password still in here.
280 
281  if (isCallbackSet()) {
282  otOut
283  << "OTCaller::callTwo: FYI, Executing password callback (two)...\n";
285  }
286  else {
287  otOut << "OTCaller::callTwo: WARNING: Failed attempt to trigger "
288  "password callback (two), due to \"it hasn't been set "
289  "yet.\"\n";
290  }
291 }
292 
293 /*
294  WCHAR szPassword[MAX_PATH];
295 
296  // Retrieve the password
297  if (GetPasswordFromUser(szPassword, MAX_PATH))
298 
299  UsePassword(szPassword); // <===========
300 
301  // WINDOWS MEMORY ZEROING CODE:
302  SecureZeroMemory(szPassword, sizeof(szPassword));
303 
304  */
305 
306 /*
307  SOURCE: https://www.securecoding.cert.org
308  TODO security: research all of these items and implement them in OT properly
309 along with all other code scanning and security measures.
310 
311  https://www.securecoding.cert.org/confluence/display/cplusplus/MSC06-CPP.+Be+aware+of+compiler+optimization+when+dealing+with+sensitive+data
312 
313 
314  Compliant Code Example (Windows)
315  This compliant solution uses a SecureZeroMemory() function provided by many
316 versions of the Microsoft Visual Studio compiler.
317  The documentation for the SecureZeroMemory() function guarantees that the
318 compiler does not optimize out this call when zeroing memory.
319 
320  void getPassword(void) {
321  char pwd[64];
322  if (retrievePassword(pwd, sizeof(pwd))) {
323  // checking of password, secure operations, etc
324  }
325  SecureZeroMemory(pwd, sizeof(pwd));
326 }
327 
328 Compliant Solution (Windows)
329 The #pragma directives in this compliant solution instruct the compiler to avoid
330 optimizing the enclosed code.
331  This #pragma directive is supported on some versions of Microsoft Visual Studio
332 and may be supported on other compilers.
333  Check compiler documentation to ensure its availability and its optimization
334 guarantees.
335 
336 void getPassword(void) {
337  char pwd[64];
338  if (retrievePassword(pwd, sizeof(pwd))) {
339  // checking of password, secure operations, etc
340  }
341 #pragma optimize("", off)
342  memset(pwd, 0, sizeof(pwd));
343 #pragma optimize("", on)
344 }
345 
346 Compliant Solution
347 This compliant solution uses the volatile type qualifier to inform the compiler
348 that the memory should be overwritten
349  and that the call to the memset_s() function should not be optimized out.
350 Unfortunately, this compliant solution may
351  not be as efficient as possible due to the nature of the volatile type
352 qualifier preventing the compiler from optimizing
353  the code at all. Typically, some compilers are smart enough to replace calls to
354 memset() with equivalent assembly instructions
355  that are much more efficient than the memset() implementation. Implementing a
356 memset_s() function as shown in the example may
357  prevent the compiler from using the optimal assembly instructions and may
358 result in less efficient code. Check compiler
359  documentation and the assembly output from the compiler.
360 
361 // memset_s.c
362 void *memset_s(void* v, int32_t c, size_t n) {
363  volatile uint8_t *p = v;
364  while (n--)
365  *p++ = c;
366 
367  return v;
368 }
369 
370 // getPassword.c
371 extern void *memset_s(void* v, int32_t c, size_t n);
372 
373 void getPassword(void) {
374  char pwd[64];
375 
376  if (retrievePassword(pwd, sizeof(pwd))) {
377  // checking of password, secure operations, etc
378  }
379  memset_s(pwd, 0, sizeof(pwd));
380 }
381 However, it should be noted that both calling functions and accessing volatile
382 qualified objects can still be optimized out
383  (while maintaining strict conformance to the standard), so the above may still
384 not work.
385  */
386 
387 } // namespace opentxs
EXPORT void delCallback()
Definition: OTCaller.cpp:221
EXPORT void ZeroOutPassword()
Definition: OTCaller.cpp:215
EXPORT void zeroMemory()
Definition: OTPassword.cpp:281
EXPORT ~OTCaller()
Definition: OTCaller.cpp:168
OTLOG_IMPORT OTLogStream otOut
OTPassword m_Display
Definition: OTCaller.hpp:350
OTCallback * _callback
Definition: OTCaller.hpp:354
virtual EXPORT void runOne(const char *szDisplay, OTPassword &theOutput) const
Definition: OTCallback.cpp:176
EXPORT void callTwo()
Definition: OTCaller.cpp:277
EXPORT void SetDisplay(const char *szDisplay, int32_t nLength)
Definition: OTCaller.cpp:191
EXPORT uint32_t getPasswordSize() const
Definition: OTPassword.cpp:613
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 uint8_t * getPassword_uint8() const
Definition: OTPassword.cpp:554
EXPORT const char * GetDisplay() const
Definition: OTCaller.cpp:179
EXPORT int32_t setPassword_uint8(const uint8_t *input, uint32_t size)
Definition: OTPassword.cpp:674
OTPassword m_Password
Definition: OTCaller.hpp:347
EXPORT void callOne()
Definition: OTCaller.cpp:261
virtual EXPORT void runTwo(const char *szDisplay, OTPassword &theOutput) const
Definition: OTCallback.cpp:186