Open-Transactions  0.93.0-ge03d287
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OTSymmetricKey.hpp
Go to the documentation of this file.
1 /************************************************************
2  *
3  * OTSymmetricKey.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_OTSYMMETRICKEY_HPP
134 #define OPENTXS_CORE_CRYPTO_OTSYMMETRICKEY_HPP
135 
136 #include "../OTPayload.hpp"
137 
138 namespace opentxs
139 {
140 
141 class OTASCIIArmor;
142 class OTIdentifier;
143 class OTPassword;
144 class OTString;
145 
147 {
148 private:
149  bool m_bIsGenerated; // GetKey asserts if this is false; GenerateKey asserts
150  // if it's true.
151  bool m_bHasHashCheck; // If a hash-check fo the Derived Key has been made
152  // yet.
153  uint32_t m_nKeySize; // The size, in bits. For example, 128 bit key, 256 bit
154  // key, etc.
155  uint32_t m_uIterationCount; // Stores the iteration count, which should
156  // probably be at least 2000. (Number of
157  // iterations used while generating key from
158  // passphrase.)
159  OTPayload m_dataSalt; // Stores the SALT (which is used with the password
160  // for generating / retrieving the key from
161  // m_dataEncryptedKey)
162  OTPayload m_dataIV; // Stores the IV used internally for encrypting /
163  // decrypting the actual key (using the derived key)
164  // from m_dataEncryptedKey.
165  OTPayload m_dataEncryptedKey; // Stores only encrypted version of symmetric
166  // key.
167  OTPayload m_dataHashCheck;
168 
169 public:
170  // The highest-level possible interface (used by the API)
171 
172  // Caller must delete.
173  EXPORT static OTPassword* GetPassphraseFromUser(
174  const OTString* pstrDisplay = nullptr,
175  bool bAskTwice = false); // returns a text OTPassword, or nullptr.
176 
177  // If you already have the passphrase, you can pass it in as an optional
178  // arg.
179  // That way if you have to use it 100 times in a row, the user doesn't
180  // actually have
181  // to TYPE it 100 times in a row.
182  //
183  EXPORT static bool CreateNewKey(OTString& strOutput,
184  const OTString* pstrDisplay = nullptr,
185  const OTPassword* pAlreadyHavePW = nullptr);
186  EXPORT static bool Encrypt(const OTString& strKey,
187  const OTString& strPlaintext,
188  OTString& strOutput,
189  const OTString* pstrDisplay = nullptr,
190  bool bBookends = true,
191  const OTPassword* pAlreadyHavePW = nullptr);
192 
193  EXPORT static bool Decrypt(const OTString& strKey, OTString& strCiphertext,
194  OTString& strOutput,
195  const OTString* pstrDisplay = nullptr,
196  const OTPassword* pAlreadyHavePW = nullptr);
197 
198  EXPORT static bool Encrypt(const OTSymmetricKey& theKey,
199  const OTString& strPlaintext,
200  OTString& strOutput,
201  const OTString* pstrDisplay = nullptr,
202  bool bBookends = true,
203  const OTPassword* pAlreadyHavePW = nullptr);
204 
205  EXPORT static bool Decrypt(const OTSymmetricKey& theKey,
206  const OTString& strCiphertext,
207  OTString& strOutput,
208  const OTString* pstrDisplay = nullptr,
209  const OTPassword* pAlreadyHavePW = nullptr);
210 
211  EXPORT bool SerializeTo(OTPayload& theOutput) const;
212  EXPORT bool SerializeFrom(OTPayload& theInput);
213 
214  EXPORT bool SerializeTo(OTASCIIArmor& ascOutput) const;
215  EXPORT bool SerializeFrom(const OTASCIIArmor& ascInput);
216 
217  EXPORT bool SerializeTo(OTString& strOutput, bool bEscaped = false) const;
218  EXPORT bool SerializeFrom(const OTString& strInput, bool bEscaped = false);
219  inline bool IsGenerated() const
220  {
221  return m_bIsGenerated;
222  }
223  inline bool HasHashCheck() const
224  {
225  return m_bHasHashCheck;
226  }
227  EXPORT void GetIdentifier(OTIdentifier& theIdentifier) const;
228  EXPORT void GetIdentifier(OTString& strIdentifier) const;
229  // The derived key is used for decrypting the actual symmetric key.
230  // It's called the derived key because it is derived from the passphrase.
231  //
232 
233  // Must have a hash-check already!
235  const OTPassword& thePassphrase, bool bCheckForHashCheck = true) const;
236 
237  // Must not have a hash-check yet!
239  const OTPassword& thePassphrase); // not const!
240 
241  // Assumes key is already generated. Tries to get the raw clear key from its
242  // encrypted form, via its passphrase being used to derive a key for that
243  // purpose.
244  //
245  EXPORT bool GetRawKeyFromPassphrase(
246  const OTPassword& thePassphrase, OTPassword& theRawKeyOutput,
247  OTPassword* pDerivedKey = nullptr) const;
248 
249  // Assumes key is already generated. Tries to get the raw clear key
250  // from its encrypted form, via a derived key.
251  //
252  EXPORT bool GetRawKeyFromDerivedKey(const OTPassword& theDerivedKey,
253  OTPassword& theRawKeyOutput) const;
254  // Generates this OTSymmetricKey based on an OTPassword. The generated key
255  // is
256  // stored in encrypted form, based on a derived key from that password.
257  //
258  EXPORT bool GenerateKey(const OTPassword& thePassphrase,
259  OTPassword** ppDerivedKey = nullptr); // If you
260  // want, I
261  // can pass this
262  // back to you.
263  // Changes the passphrase on an existing symmetric key.
264  //
265  EXPORT bool ChangePassphrase(const OTPassword& oldPassphrase,
266  const OTPassword& newPassphrase);
267  // For old SymmetricKey's that do not yet have a hash-check.
268  // This will generate a hash check for them.
269  //
270  EXPORT bool GenerateHashCheck(const OTPassword& thePassphrase);
271 
272  // Re-generates a hash-check for some reason. (maybe it was wrong?)
273  //
274  EXPORT bool ReGenerateHashCheck(const OTPassword& thePassphrase);
275 
276  EXPORT OTSymmetricKey();
277  EXPORT OTSymmetricKey(const OTPassword& thePassword);
278 
279  EXPORT virtual ~OTSymmetricKey();
280  EXPORT virtual void Release();
281 
282  EXPORT void Release_SymmetricKey();
283 };
284 
285 } // namespace opentxs
286 
287 #endif // OPENTXS_CORE_CRYPTO_OTSYMMETRICKEY_HPP
EXPORT OTPassword * CalculateNewDerivedKeyFromPassphrase(const OTPassword &thePassphrase)
EXPORT bool SerializeFrom(OTPayload &theInput)
EXPORT bool ReGenerateHashCheck(const OTPassword &thePassphrase)
EXPORT bool GetRawKeyFromPassphrase(const OTPassword &thePassphrase, OTPassword &theRawKeyOutput, OTPassword *pDerivedKey=nullptr) const
static EXPORT bool Decrypt(const OTString &strKey, OTString &strCiphertext, OTString &strOutput, const OTString *pstrDisplay=nullptr, const OTPassword *pAlreadyHavePW=nullptr)
static EXPORT OTPassword * GetPassphraseFromUser(const OTString *pstrDisplay=nullptr, bool bAskTwice=false)
EXPORT bool GetRawKeyFromDerivedKey(const OTPassword &theDerivedKey, OTPassword &theRawKeyOutput) const
static EXPORT bool Encrypt(const OTString &strKey, const OTString &strPlaintext, OTString &strOutput, const OTString *pstrDisplay=nullptr, bool bBookends=true, const OTPassword *pAlreadyHavePW=nullptr)
EXPORT void Release_SymmetricKey()
EXPORT bool GenerateKey(const OTPassword &thePassphrase, OTPassword **ppDerivedKey=nullptr)
EXPORT bool SerializeTo(OTPayload &theOutput) const
EXPORT OTPassword * CalculateDerivedKeyFromPassphrase(const OTPassword &thePassphrase, bool bCheckForHashCheck=true) const
virtual EXPORT void Release()
EXPORT bool GenerateHashCheck(const OTPassword &thePassphrase)
EXPORT bool ChangePassphrase(const OTPassword &oldPassphrase, const OTPassword &newPassphrase)
EXPORT void GetIdentifier(OTIdentifier &theIdentifier) const
static EXPORT bool CreateNewKey(OTString &strOutput, const OTString *pstrDisplay=nullptr, const OTPassword *pAlreadyHavePW=nullptr)
virtual EXPORT ~OTSymmetricKey()