ARC SDK
Credential.h
1 #ifndef __ARC_CREDENTIAL_H__
2 #define __ARC_CREDENTIAL_H__
3 
4 #include <stdlib.h>
5 #include <stdexcept>
6 #include <iostream>
7 #include <string>
8 #include <openssl/asn1.h>
9 #include <openssl/pem.h>
10 #include <openssl/x509.h>
11 #include <openssl/x509v3.h>
12 #include <openssl/pkcs12.h>
13 #include <openssl/err.h>
14 
15 #include <arc/Logger.h>
16 #include <arc/DateTime.h>
17 #include <arc/UserConfig.h>
18 
19 #include <arc/credential/CertUtil.h>
20 
21 namespace Arc {
22 
25 
26 
31 class CredentialError : public std::runtime_error {
32  public:
33  // Constructor
37  CredentialError(const std::string& what="");
38 };
39 
40 typedef enum {CRED_PEM, CRED_DER, CRED_PKCS, CRED_UNKNOWN} Credformat;
41 
43 extern Logger CredentialLogger;
44 
46 
62 class Credential {
63  public:
67  Credential();
68 
72  Credential(int keybits);
73 
74  virtual ~Credential();
75 
79  Credential(const std::string& CAfile, const std::string& CAkey,
80  const std::string& CAserial,
81  const std::string& extfile, const std::string& extsect,
82  const std::string& passphrase4key);
83 
123  Credential(Time start, Period lifetime = Period("PT12H"),
124  int keybits = 1024, std::string proxyversion = "rfc",
125  std::string policylang = "inheritAll", std::string policy = "",
126  int pathlength = -1);
127 
142  Credential(const std::string& cert, const std::string& key, const std::string& cadir,
143  const std::string& cafile, const std::string& passphrase4key = "",
144  const bool is_file = true);
145 
153  Credential(const UserConfig& usercfg, const std::string& passphrase4key = "");
154 
156  static void InitProxyCertInfo(void);
157 
162  static bool IsCredentialsValid(const UserConfig& usercfg);
163 
165  void AddCertExtObj(std::string& sn, std::string& oid);
166 
167  static std::string NoPassword(void) { return std::string("\0",1); };
168 
169  private:
170 
172  Credential(const Credential&);
173 
174  void InitCredential(const std::string& cert, const std::string& key, const std::string& cadir,
175  const std::string& cafile, const std::string& passphrase4key, const bool is_file);
176 
178  void loadKeyString(const std::string& key, EVP_PKEY* &pkey, const std::string& passphrase = "");
179  void loadKeyFile(const std::string& keyfile, EVP_PKEY* &pkey, const std::string& passphrase = "");
180  //void loadKey(BIO* bio, EVP_PKEY* &pkey, const std::string& passphrase = "", const std::string& prompt_info = "", const bool is_file = true);
181 
185  void loadCertificateString(const std::string& cert, X509* &x509, STACK_OF(X509)** certchain);
186  void loadCertificateFile(const std::string& certfile, X509* &x509, STACK_OF(X509)** certchain);
187  //void loadCertificate(BIO* bio, X509* &x509, STACK_OF(X509)** certchain, const bool is_file=true);
188 
190  void InitVerification(void);
191 
196  bool Verify(void);
197 
203  X509_EXTENSION* CreateExtension(const std::string& name, const std::string& data, bool crit = false);
204 
212  bool SetProxyPeriod(X509* tosign, X509* issuer, const Time& start, const Period& lifetime);
213 
217  bool SignRequestAssistant(Credential* proxy, EVP_PKEY* req_pubkey, X509** tosign);
218 
219  public:
221  void LogError(void) const;
222 
223  /************************************/
224  /*****Get information from "this" object**/
225 
227  bool GetVerification(void) const {return verification_valid; };
228 
230  EVP_PKEY* GetPrivKey(void) const;
231 
233  EVP_PKEY* GetPubKey(void) const;
234 
236  X509* GetCert(void) const;
237 
239  X509_REQ* GetCertReq(void) const;
240 
242  STACK_OF(X509)* GetCertChain(void) const;
243 
247  int GetCertNumofChain(void) const;
248 
253  Credformat getFormat_BIO(BIO * in, const bool is_file = true) const;
254  Credformat getFormat_str(const std::string& source) const;
255 
257  std::string GetDN(void) const;
258 
262  std::string GetIdentityName(void) const;
263 
265  ArcCredential::certType GetType(void) const;
266 
268  std::string GetIssuerName(void) const;
269 
273  std::string GetCAName(void) const;
274 
278  std::string GetProxyPolicy(void) const;
279 
283  void SetProxyPolicy(const std::string& proxyversion, const std::string& policylang,
284  const std::string& policy, int pathlength);
285 
291  bool OutputPrivatekey(std::string &content, bool encryption = false, const std::string& passphrase ="");
292 
294  bool OutputPublickey(std::string &content);
295 
300  bool OutputCertificate(std::string &content, bool is_der=false);
301 
306  bool OutputCertificateChain(std::string &content, bool is_der=false);
307 
309  Period GetLifeTime(void) const;
310 
312  Time GetStartTime() const;
313 
315  Time GetEndTime() const;
316 
318  void SetLifeTime(const Period& period);
319 
321  void SetStartTime(const Time& start_time);
322 
324  bool IsValid(void);
325 
326  /************************************/
327  /*****Generate certificate request, add certificate extension, inquire certificate request,
328  *and sign certificate request
329  **/
330 
337  bool AddExtension(const std::string& name, const std::string& data, bool crit = false);
338 
353  bool AddExtension(const std::string& name, char** binary);
354 
360  std::string GetExtension(const std::string& name);
361 
368  bool GenerateEECRequest(BIO* reqbio, BIO* keybio, const std::string& dn = "");
369 
371  bool GenerateEECRequest(std::string &reqcontent, std::string &keycontent, const std::string& dn = "");
372 
374  bool GenerateEECRequest(const char* request_filename, const char* key_filename, const std::string& dn = "");
375 
380  bool GenerateRequest(BIO* bio, bool if_der = false);
381 
383  bool GenerateRequest(std::string &content, bool if_der = false);
384 
386  bool GenerateRequest(const char* filename, bool if_der = false);
387 
396  bool InquireRequest(BIO* reqbio, bool if_eec = false, bool if_der = false);
397 
399  bool InquireRequest(std::string &content, bool if_eec = false, bool if_der = false);
400 
402  bool InquireRequest(const char* filename, bool if_eec = false, bool if_der = false);
403 
410  bool SignRequest(Credential* proxy, BIO* outputbio, bool if_der = false);
411 
417  bool SignRequest(Credential* proxy, std::string &content, bool if_der = false);
418 
424  bool SignRequest(Credential* proxy, const char* filename, bool if_der = false);
425 
433  bool SelfSignEECRequest(const std::string& dn, const char* extfile, const std::string& extsect, const char* certfile);
434 
435  //The following three methods is about signing an EEC certificate by implementing the same
436  //functionality as a normal CA
438  bool SignEECRequest(Credential* eec, const std::string& dn, BIO* outputbio);
439 
441  bool SignEECRequest(Credential* eec, const std::string& dn, std::string &content);
442 
444  bool SignEECRequest(Credential* eec, const std::string& dn, const char* filename);
445 
446  private:
447  // PKI files
448  std::string cacertfile_;
449  std::string cacertdir_;
450  std::string certfile_;
451  std::string keyfile_;
452 
453  // Verification context
455 
456  //Verification result
457  bool verification_valid;
458 
459  //Certificate structures
460  X509 * cert_; //certificate
461  ArcCredential::certType cert_type_;
462  EVP_PKEY * pkey_; //private key
463  STACK_OF(X509) * cert_chain_; //certificates chain which is parsed
464  //from the certificate, after
465  //verification, the ca certificate
466  //will be included
467  ArcCredential::PROXYCERTINFO* proxy_cert_info_;
468  Credformat format;
469  Time start_;
470  Period lifetime_;
471 
472  //Certificate request
473  X509_REQ* req_;
474  RSA* rsa_key_;
475  EVP_MD* signing_alg_;
476  int keybits_;
477 
478  //Proxy policy
479  std::string proxyversion_;
480  std::string policy_;
481  std::string policylang_;
482  int proxyver_;
483  int pathlength_;
484 
485  //Extensions for certificate, such as certificate policy, attributes, etc.
486  STACK_OF(X509_EXTENSION)* extensions_;
487 
488  //CA functionality related information
489  std::string CAserial_;
490  std::string extfile_;
491  std::string extsect_;
492 
493  static X509_NAME *parse_name(char *subject, long chtype, int multirdn);
494 };
495 
496 }// namespace Arc
497 
498 #endif /* __ARC_CREDENTIAL_H__ */
499