Open-Transactions  0.93.0-ge03d287
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
OTCredential.hpp
Go to the documentation of this file.
1 /************************************************************
2  *
3  * OTCredential.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_OTCREDENTIAL_HPP
134 #define OPENTXS_CORE_CRYPTO_OTCREDENTIAL_HPP
135 
136 #include "OTMasterkey.hpp"
137 #include "../OTString.hpp"
138 
139 // A nym contains a list of master credentials, via OTCredential.
140 // The whole purpose of a Nym is to be an identity, which can have
141 // master credentials.
142 //
143 // Each credential is like a master key for the Nym's identity,
144 // which can issue its own subkeys.
145 //
146 // Each subkey has 3 key pairs: encryption, signing, and authentication.
147 // Not all subcredentials are a subkey. For example, you might have a
148 // subcredential that uses Google Authenticator, and thus doesn't contain
149 // any keys, because it uses alternate methods for its own authentication.
150 //
151 // Each OTCredential contains a "master" subkey, and a list of subcredentials
152 // (some of them subkeys) signed by that master.
153 //
154 // The same class (subcredential/subkey) is used because there are master
155 // credentials and subcredentials, so we're using inheritance for
156 // "subcredential"
157 // and "subkey" to encapsulate the credentials, so we don't have to repeat code
158 // across both.
159 // We're using a "has-a" model here, since the OTCredential "has a" master
160 // subkey, and also "has a" list of subcredentials, some of which are subkeys.
161 //
162 // Each subcredential must be signed by the subkey that is the master key.
163 // Each subkey has 3 key pairs: encryption, signing, and authentication.
164 //
165 // Each key pair has 2 OTAsymmetricKeys (public and private.)
166 //
167 // I'm thinking that the Nym should also have a key pair (for whatever is
168 // its current key pair, copied from its credentials.)
169 //
170 // the master should never be able to do any actions except for sign subkeys.
171 // the subkeys, meanwhile should only be able to do actions, and not issue
172 // any new keys.
173 
174 namespace opentxs
175 {
176 
177 class OTCredential;
178 class OTIdentifier;
179 class OTPassword;
180 class OTPasswordData;
181 class OTSubcredential;
182 class OTSubkey;
183 
184 typedef std::map<std::string, OTSubcredential*> mapOfSubcredentials;
185 
186 // THE MASTER CREDENTIAL (below -- OTCredential)
187 //
188 // Contains a "master" subkey,
189 // and a list of subcredentials signed by that master.
190 // (Some of which are subkeys, since subkey inherits from
191 // subcredential.)
192 // Each subcredential can generate its own "credential" contract,
193 // even the master subcredential, so an OTCredential object
194 // actually may include many "credentials." (That is, each may be
195 // issued at separate times. Each may be registered on a server at
196 // separate times. Etc.)
197 //
198 // Each nym has multiple OTCredentials because there may be
199 // several master keys, each with their own subcredentials.
200 //
201 // Two things to verify on a master credential:
202 //
203 // 1. If you hash m_pstrSourceForNymID, you should get m_pstrNymID.
204 // 2. m_pstrSourceForNymID should somehow verify m_Masterkey.GetContents().
205 // For example, if m_pstrSourceForNymID contains CA DN info, then GetContents
206 // should contain a verifiable Cert with that same DN info. Another example,
207 // if m_pstrSourceForNymID contains a public key, then
208 // m_Masterkey.GetContents
209 // should contain that same public key, or a cert that contains it. Another
210 // example,
211 // if m_pstrSourceForNymID contains a URL, then m_Masterkey.GetContents
212 // should contain
213 // a public key found at that URL, or a public key that, when hashed, matches
214 // one of
215 // the hashes posted at that URL.
216 //
218 {
219 private:
220  OTMasterkey m_Masterkey;
221  mapOfSubcredentials m_mapSubcredentials;
222  OTString m_strNymID;
223  OTString m_strSourceForNymID;
224  // --------------------------------------
225  OTString m_strMasterCredID; // This can't be stored in the master itself
226  // since it's a hash of that master. But this
227  // SHOULD be found in every subcredential signed
228  // by that master.
229 
230  const OTPassword* m_pImportPassword; // Not owned. Just here for
231  // convenience.
232  // Sometimes it will be set, so that when
233  // loading something up (and decrypting it)
234  // the password is already available, so the
235  // user doesn't have to type it a million
236  // times (such as during import.) So we use
237  // it when it's available. And usually
238  // whoever set it, will immediately set it
239  // back to nullptr when he's done.
240 private:
241  OTCredential();
242  bool SetPublicContents(const OTString::Map& mapPublic); // For master
243  // credential.
244  bool SetPrivateContents(const OTString::Map& mapPrivate); // For master
245  // credential.
246  void SetSourceForNymID(const OTString& strSourceForNymID); // The source is
247  // the
248  // URL/DN/pubkey
249  // that hashes to
250  // form the
251  // NymID. Any
252  // credential
253  // must verify
254  // against its
255  // own source.
256  void SetMasterCredID(const OTString& strID); // The master credential ID is
257  // a hash of the master
258  // credential m_MasterKey
259  bool GenerateMasterkey(int32_t nBits = 1024); // CreateMaster is able to
260  // create keys from scratch
261  // (by calling this function.)
262  bool SignNewMaster(const OTPasswordData* pPWData = nullptr); // SignMaster
263  // is used
264  // when creating master
265  // credential.
266  bool SignNewSubcredential(OTSubcredential& theSubCred,
267  OTIdentifier& theSubCredID_out,
268  const OTPasswordData* pPWData = nullptr); // Used
269  // when
270  // creating a new
271  // subcredential.
272 public:
273  EXPORT const OTPassword* GetImportPassword() const
274  {
275  return m_pImportPassword;
276  }
277  EXPORT void SetImportPassword(const OTPassword* pImportPassword)
278  {
279  m_pImportPassword = pImportPassword;
280  }
281  static OTCredential* CreateMaster(
282  const OTString& strSourceForNymID,
283  int32_t nBits = 1024, // Ignored unless pmapPrivate is nullptr
284  const OTString::Map* pmapPrivate = nullptr,
285  const OTString::Map* pmapPublic = nullptr,
286  const OTPasswordData* pPWData = nullptr);
287  static OTCredential* LoadMaster(const OTString& strNymID, // Caller is
288  // responsible to
289  // delete, in both
290  // CreateMaster and LoadMaster.
291  const OTString& strMasterCredID,
292  const OTPasswordData* pPWData = nullptr);
294  const OTString& strInput,
295  const OTString& strNymID, // Caller is responsible to delete, in both
296  // CreateMaster and LoadMaster.
297  const OTString& strMasterCredID, OTPasswordData* pPWData = nullptr,
298  const OTPassword* pImportPassword = nullptr);
299  EXPORT bool Load_Master(const OTString& strNymID,
300  const OTString& strMasterCredID,
301  const OTPasswordData* pPWData = nullptr);
302  EXPORT bool Load_MasterFromString(
303  const OTString& strInput, const OTString& strNymID,
304  const OTString& strMasterCredID,
305  const OTPasswordData* pPWData = nullptr,
306  const OTPassword* pImportPassword = nullptr);
307  // For subcredentials that are specifically *subkeys*. Meaning it will
308  // contain 3 keypairs: signing, authentication, and encryption.
309  //
310  EXPORT bool AddNewSubkey(
311  int32_t nBits = 1024, // Ignored unless pmapPrivate is nullptr
312  const OTString::Map* pmapPrivate = nullptr, // Public keys are derived
313  // from the private.
314  const OTPasswordData* pPWData = nullptr, // The master key will sign the
315  // subkey.
316  OTSubkey* *ppSubkey = nullptr); // output
317  // For non-key credentials, such as for 3rd-party authentication.
318  //
319  EXPORT bool AddNewSubcredential(
320  const OTString::Map& mapPrivate, const OTString::Map& mapPublic,
321  const OTPasswordData* pPWData = nullptr, // The master key will sign the
322  // subcredential.
323  OTSubcredential* *ppSubcred = nullptr); // output
324  EXPORT bool ReEncryptPrivateCredentials(const OTPassword& theExportPassword,
325  bool bImporting); // Like for when
326  // you are
327  // exporting a Nym
328  // from the
329  // wallet.
330  EXPORT bool LoadSubkey(const OTString& strSubID);
331  EXPORT bool LoadSubcredential(const OTString& strSubID);
332  EXPORT bool LoadSubkeyFromString(
333  const OTString& strInput, const OTString& strSubID,
334  const OTPassword* pImportPassword = nullptr);
335  EXPORT bool LoadSubcredentialFromString(
336  const OTString& strInput, const OTString& strSubID,
337  const OTPassword* pImportPassword = nullptr);
338  EXPORT size_t GetSubcredentialCount() const;
339  EXPORT const OTSubcredential* GetSubcredential(
340  const OTString& strSubID,
341  const OTString::List* plistRevokedIDs = nullptr) const;
342  EXPORT const OTSubcredential* GetSubcredentialByIndex(int32_t nIndex) const;
343  EXPORT const std::string GetSubcredentialIDByIndex(size_t nIndex) const;
344  EXPORT const OTString& GetPubCredential() const; // Returns: m_Masterkey's
345  // public credential
346  // string.
347  EXPORT const OTString& GetPriCredential() const; // Returns: m_Masterkey's
348  // private credential
349  // string.
350  EXPORT const OTString& GetMasterCredID() const; // Returns: Master
351  // Credential ID!
352  EXPORT const OTString& GetNymID() const;
353  EXPORT const OTString& GetSourceForNymID() const;
354  // listRevokedIDs should contain a list of std::strings for IDs of
355  // already-revoked subcredentials.
356  // That way, SerializeIDs will know whether to mark them as valid while
357  // serializing them.
358  // bShowRevoked allows us to include/exclude the revoked credentials from
359  // the output (filter for valid-only.)
360  // bValid=true means we are saving OTPseudonym::m_mapCredentials. Whereas
361  // bValid=false means we're saving m_mapRevoked.
362  //
363  EXPORT void SerializeIDs(OTString& strOutput,
364  const OTString::List& listRevokedIDs,
365  OTString::Map* pmapPubInfo = nullptr,
366  OTString::Map* pmapPriInfo = nullptr,
367  bool bShowRevoked = false,
368  bool bValid = true) const;
369  EXPORT bool VerifyInternally() const;
370  EXPORT bool VerifyAgainstSource() const;
371  EXPORT const OTMasterkey& GetMasterkey() const
372  {
373  return m_Masterkey;
374  }
375  EXPORT int32_t GetPublicKeysBySignature(
376  listOfAsymmetricKeys& listOutput, const OTSignature& theSignature,
377  char cKeyType = '0') const; // 'S' (signing key) or
378  // 'E' (encryption key)
379  // or 'A'
380  // (authentication key)
381  EXPORT const OTAsymmetricKey& GetPublicAuthKey(
382  const OTString::List* plistRevokedIDs = nullptr) const;
383  EXPORT const OTAsymmetricKey& GetPublicEncrKey(
384  const OTString::List* plistRevokedIDs = nullptr) const;
385  EXPORT const OTAsymmetricKey& GetPublicSignKey(
386  const OTString::List* plistRevokedIDs = nullptr) const;
387  EXPORT const OTAsymmetricKey& GetPrivateSignKey(
388  const OTString::List* plistRevokedIDs = nullptr) const;
389  EXPORT const OTAsymmetricKey& GetPrivateEncrKey(
390  const OTString::List* plistRevokedIDs = nullptr) const;
391  EXPORT const OTAsymmetricKey& GetPrivateAuthKey(
392  const OTString::List* plistRevokedIDs = nullptr) const;
393  EXPORT const OTKeypair& GetAuthKeypair(
394  const OTString::List* plistRevokedIDs = nullptr) const;
395  EXPORT const OTKeypair& GetEncrKeypair(
396  const OTString::List* plistRevokedIDs = nullptr) const;
397  EXPORT const OTKeypair& GetSignKeypair(
398  const OTString::List* plistRevokedIDs = nullptr) const;
399  EXPORT void ClearSubcredentials();
400  EXPORT ~OTCredential();
401 };
402 
403 } // namespace opentxs
404 
405 #endif // OPENTXS_CORE_CRYPTO_OTCREDENTIAL_HPP
std::map< std::string, std::string > Map
Definition: OTString.hpp:162
EXPORT const OTAsymmetricKey & GetPublicSignKey(const OTString::List *plistRevokedIDs=nullptr) const
std::list< OTAsymmetricKey * > listOfAsymmetricKeys
EXPORT const OTSubcredential * GetSubcredential(const OTString &strSubID, const OTString::List *plistRevokedIDs=nullptr) const
EXPORT const OTString & GetNymID() const
EXPORT bool LoadSubcredentialFromString(const OTString &strInput, const OTString &strSubID, const OTPassword *pImportPassword=nullptr)
EXPORT bool LoadSubcredential(const OTString &strSubID)
EXPORT const OTAsymmetricKey & GetPrivateAuthKey(const OTString::List *plistRevokedIDs=nullptr) const
EXPORT bool AddNewSubkey(int32_t nBits=1024, const OTString::Map *pmapPrivate=nullptr, const OTPasswordData *pPWData=nullptr, OTSubkey **ppSubkey=nullptr)
EXPORT bool Load_MasterFromString(const OTString &strInput, const OTString &strNymID, const OTString &strMasterCredID, const OTPasswordData *pPWData=nullptr, const OTPassword *pImportPassword=nullptr)
EXPORT const OTKeypair & GetEncrKeypair(const OTString::List *plistRevokedIDs=nullptr) const
EXPORT void ClearSubcredentials()
EXPORT const OTKeypair & GetSignKeypair(const OTString::List *plistRevokedIDs=nullptr) const
static OTCredential * CreateMaster(const OTString &strSourceForNymID, int32_t nBits=1024, const OTString::Map *pmapPrivate=nullptr, const OTString::Map *pmapPublic=nullptr, const OTPasswordData *pPWData=nullptr)
EXPORT bool ReEncryptPrivateCredentials(const OTPassword &theExportPassword, bool bImporting)
static OTCredential * LoadMaster(const OTString &strNymID, const OTString &strMasterCredID, const OTPasswordData *pPWData=nullptr)
EXPORT bool AddNewSubcredential(const OTString::Map &mapPrivate, const OTString::Map &mapPublic, const OTPasswordData *pPWData=nullptr, OTSubcredential **ppSubcred=nullptr)
std::map< std::string, OTSubcredential * > mapOfSubcredentials
EXPORT const OTString & GetPriCredential() const
EXPORT const OTString & GetMasterCredID() const
EXPORT bool LoadSubkeyFromString(const OTString &strInput, const OTString &strSubID, const OTPassword *pImportPassword=nullptr)
static OTCredential * LoadMasterFromString(const OTString &strInput, const OTString &strNymID, const OTString &strMasterCredID, OTPasswordData *pPWData=nullptr, const OTPassword *pImportPassword=nullptr)
EXPORT const OTKeypair & GetAuthKeypair(const OTString::List *plistRevokedIDs=nullptr) const
EXPORT const OTString & GetPubCredential() const
EXPORT const OTAsymmetricKey & GetPublicAuthKey(const OTString::List *plistRevokedIDs=nullptr) const
std::list< std::string > List
Definition: OTString.hpp:161
EXPORT size_t GetSubcredentialCount() const
EXPORT void SetImportPassword(const OTPassword *pImportPassword)
EXPORT bool Load_Master(const OTString &strNymID, const OTString &strMasterCredID, const OTPasswordData *pPWData=nullptr)
EXPORT const OTAsymmetricKey & GetPublicEncrKey(const OTString::List *plistRevokedIDs=nullptr) const
EXPORT const OTString & GetSourceForNymID() const
EXPORT const OTPassword * GetImportPassword() const
EXPORT const OTMasterkey & GetMasterkey() const
EXPORT bool LoadSubkey(const OTString &strSubID)
EXPORT const OTSubcredential * GetSubcredentialByIndex(int32_t nIndex) const
EXPORT const OTAsymmetricKey & GetPrivateEncrKey(const OTString::List *plistRevokedIDs=nullptr) const
EXPORT const OTAsymmetricKey & GetPrivateSignKey(const OTString::List *plistRevokedIDs=nullptr) const
EXPORT void SerializeIDs(OTString &strOutput, const OTString::List &listRevokedIDs, OTString::Map *pmapPubInfo=nullptr, OTString::Map *pmapPriInfo=nullptr, bool bShowRevoked=false, bool bValid=true) const
EXPORT bool VerifyAgainstSource() const
EXPORT bool VerifyInternally() const
EXPORT const std::string GetSubcredentialIDByIndex(size_t nIndex) const
EXPORT int32_t GetPublicKeysBySignature(listOfAsymmetricKeys &listOutput, const OTSignature &theSignature, char cKeyType= '0') const