Ice 3.7 C++11 API Reference
Plugin.h
Go to the documentation of this file.
1 //
2 // Copyright (c) ZeroC, Inc. All rights reserved.
3 //
4 
5 #ifndef ICESSL_PLUGIN_H
6 #define ICESSL_PLUGIN_H
7 
8 #include <Ice/Plugin.h>
9 #include <IceSSL/Config.h>
10 #include <IceSSL/ConnectionInfoF.h>
11 
12 #ifdef ICE_CPP11_MAPPING
13 # include <chrono>
14 #else
15 # include <IceUtil/Time.h>
16 #endif
17 
18 #include <vector>
19 #include <list>
20 
21 #ifndef ICESSL_API
22 # if defined(ICE_STATIC_LIBS)
23 # define ICESSL_API
24 # elif defined(ICESSL_API_EXPORTS)
25 # define ICESSL_API ICE_DECLSPEC_EXPORT
26 # else
27 # define ICESSL_API ICE_DECLSPEC_IMPORT
28 # endif
29 #endif
30 
31 namespace IceSSL
32 {
33 
37 #ifdef ICE_CPP11_MAPPING
38 enum class TrustError : unsigned char
39 #else
40 enum TrustError
41 #endif
42 {
44  NoError = 0,
46  ChainTooLong,
48  HasExcludedNameConstraint,
50  HasNonDefinedNameConstraint,
52  HasNonPermittedNameConstraint,
54  HasNonSupportedCriticalExtension,
56  HasNonSupportedNameConstraint,
58  HostNameMismatch,
60  InvalidBasicConstraints,
62  InvalidExtension,
64  InvalidNameConstraints,
66  InvalidPolicyConstraints,
68  InvalidPurpose,
70  InvalidSignature,
73  InvalidTime,
75  NotTrusted,
77  PartialChain,
79  RevocationStatusUnknown,
81  Revoked,
83  UntrustedRoot,
86 };
87 
88 ICESSL_API TrustError getTrustError(const IceSSL::ConnectionInfoPtr&);
90 ICESSL_API std::string getHost(const IceSSL::ConnectionInfoPtr&);
91 
95 const unsigned int KEY_USAGE_DIGITAL_SIGNATURE = 1u << 0;
99 const unsigned int KEY_USAGE_NON_REPUDIATION = 1u << 1;
103 const unsigned int KEY_USAGE_KEY_ENCIPHERMENT = 1u << 2;
107 const unsigned int KEY_USAGE_DATA_ENCIPHERMENT = 1u << 3;
111 const unsigned int KEY_USAGE_KEY_AGREEMENT = 1u << 4;
115 const unsigned int KEY_USAGE_KEY_CERT_SIGN = 1u << 5;
119 const unsigned int KEY_USAGE_CRL_SIGN = 1u << 6;
123 const unsigned int KEY_USAGE_ENCIPHER_ONLY = 1u << 7;
127 const unsigned int KEY_USAGE_DECIPHER_ONLY = 1u << 8;
128 
132 const unsigned int EXTENDED_KEY_USAGE_ANY_KEY_USAGE = 1u << 0;
136 const unsigned int EXTENDED_KEY_USAGE_SERVER_AUTH = 1u << 1;
140 const unsigned int EXTENDED_KEY_USAGE_CLIENT_AUTH = 1u << 2;
144 const unsigned int EXTENDED_KEY_USAGE_CODE_SIGNING = 1u << 3;
148 const unsigned int EXTENDED_KEY_USAGE_EMAIL_PROTECTION = 1u << 4;
152 const unsigned int EXTENDED_KEY_USAGE_TIME_STAMPING = 1u << 5;
156 const unsigned int EXTENDED_KEY_USAGE_OCSP_SIGNING = 1u << 6;
157 
162 class ICESSL_API CertificateReadException : public IceUtil::ExceptionHelper<CertificateReadException>
163 {
164 public:
165 
166  CertificateReadException(const char*, int, const std::string&);
167 
168 #ifndef ICE_CPP11_COMPILER
169  virtual ~CertificateReadException() throw();
170 #endif
171 
172  virtual std::string ice_id() const;
173 
174 #ifndef ICE_CPP11_MAPPING
175 
179  virtual CertificateReadException* ice_clone() const;
180 #endif
181 
183  std::string reason;
184 
185 private:
186 
187  static const char* _name;
188 };
189 
194 class ICESSL_API CertificateEncodingException : public IceUtil::ExceptionHelper<CertificateEncodingException>
195 {
196 public:
197 
198  CertificateEncodingException(const char*, int, const std::string&);
199 
200 #ifndef ICE_CPP11_COMPILER
201  virtual ~CertificateEncodingException() throw();
202 #endif
203 
204  virtual std::string ice_id() const;
205 
206 #ifndef ICE_CPP11_MAPPING
207 
211  virtual CertificateEncodingException* ice_clone() const;
212 #endif
213 
215  std::string reason;
216 
217 private:
218 
219  static const char* _name;
220 };
221 
226 class ICESSL_API ParseException : public IceUtil::ExceptionHelper<ParseException>
227 {
228 public:
229 
230  ParseException(const char*, int, const std::string&);
231 
232 #ifndef ICE_CPP11_COMPILER
233  virtual ~ParseException() throw();
234 #endif
235 
236  virtual std::string ice_id() const;
237 
238 #ifndef ICE_CPP11_MAPPING
239 
243  virtual ParseException* ice_clone() const;
244 #endif
245 
247  std::string reason;
248 
249 private:
250 
251  static const char* _name;
252 };
253 
268 {
269 public:
270 
276  explicit DistinguishedName(const std::string& name);
277 
285  explicit DistinguishedName(const std::list<std::pair<std::string, std::string> >&);
286 
291 
296 
303  bool match(const DistinguishedName& dn) const;
304 
311  bool match(const std::string& dn) const;
312 
317  operator std::string() const;
318 
319 protected:
320 
322  void unescape();
324 
325 private:
326 
327  std::list<std::pair<std::string, std::string> > _rdns;
328  std::list<std::pair<std::string, std::string> > _unescaped;
329 };
330 
334 inline bool
336 {
337  return rhs < lhs;
338 }
339 
343 inline bool
344 operator<=(const DistinguishedName& lhs, const DistinguishedName& rhs)
345 {
346  return !(lhs > rhs);
347 }
348 
352 inline bool
354 {
355  return !(lhs < rhs);
356 }
357 
361 inline bool
363 {
364  return !(lhs == rhs);
365 }
366 
372 #ifndef ICE_CPP11_MAPPING
373  : public virtual IceUtil::Shared
374 #endif
375 {
376 public:
377 
382  virtual bool isCritical() const = 0;
383 
388  virtual std::string getOID() const = 0;
389 
394  virtual std::vector<Ice::Byte> getData() const = 0;
395 };
397 
398 class Certificate;
400 
407 #ifdef ICE_CPP11_MAPPING
408  public std::enable_shared_from_this<Certificate>
409 #else
410  public virtual IceUtil::Shared
411 #endif
412 {
413 public:
414 
418  virtual bool operator==(const Certificate&) const = 0;
419 
423  virtual bool operator!=(const Certificate&) const = 0;
424 
429  virtual std::vector<Ice::Byte> getAuthorityKeyIdentifier() const = 0;
430 
435  virtual std::vector<Ice::Byte> getSubjectKeyIdentifier() const = 0;
436 
443  virtual bool verify(const CertificatePtr& cert) const = 0;
444 
450  virtual std::string encode() const = 0;
451 
457  virtual bool checkValidity() const = 0;
458 
464 #ifdef ICE_CPP11_MAPPING
465  virtual bool checkValidity(const std::chrono::system_clock::time_point& t) const = 0;
466 #else
467  virtual bool checkValidity(const IceUtil::Time& t) const = 0;
468 #endif
469 
477  unsigned int getKeyUsage() const;
478 
486  unsigned int getExtendedKeyUsage() const;
487 
492 #ifdef ICE_CPP11_MAPPING
493  virtual std::chrono::system_clock::time_point getNotAfter() const = 0;
494 #else
495  virtual IceUtil::Time getNotAfter() const = 0;
496 #endif
497 
502 #ifdef ICE_CPP11_MAPPING
503  virtual std::chrono::system_clock::time_point getNotBefore() const = 0;
504 #else
505  virtual IceUtil::Time getNotBefore() const = 0;
506 #endif
507 
512  virtual std::string getSerialNumber() const = 0;
513 
518  virtual DistinguishedName getIssuerDN() const = 0;
519 
548  virtual std::vector<std::pair<int, std::string> > getIssuerAlternativeNames() const = 0;
549 
554  virtual DistinguishedName getSubjectDN() const = 0;
555 
560  virtual std::vector<std::pair<int, std::string> > getSubjectAlternativeNames() const = 0;
561 
566  virtual int getVersion() const = 0;
567 
573  virtual std::string toString() const = 0;
574 
579  virtual std::vector<X509ExtensionPtr> getX509Extensions() const = 0;
580 
586  virtual X509ExtensionPtr getX509Extension(const std::string& oid) const = 0;
587 
595  static CertificatePtr load(const std::string& file);
596 
602  static CertificatePtr decode(const std::string& str);
603 };
604 
605 #ifndef ICE_CPP11_MAPPING // C++98 mapping
606 
612 class ICESSL_API CertificateVerifier : public IceUtil::Shared
613 {
614 public:
615 
616  virtual ~CertificateVerifier();
617 
623  virtual bool verify(const ConnectionInfoPtr& info) = 0;
624 };
625 typedef IceUtil::Handle<CertificateVerifier> CertificateVerifierPtr;
626 
643 class ICESSL_API PasswordPrompt : public IceUtil::Shared
644 {
645 public:
646 
647  virtual ~PasswordPrompt();
648 
655  virtual std::string getPassword() = 0;
656 };
657 typedef IceUtil::Handle<PasswordPrompt> PasswordPromptPtr;
658 #endif
659 
665 {
666 public:
667 
668  virtual ~Plugin();
669 
675 #ifdef ICE_CPP11_MAPPING
676  virtual void setCertificateVerifier(std::function<bool(const std::shared_ptr<ConnectionInfo>&)> v) = 0;
677 #else
678  virtual void setCertificateVerifier(const CertificateVerifierPtr& v) = 0;
679 #endif
680 
686 #ifdef ICE_CPP11_MAPPING
687  virtual void setPasswordPrompt(std::function<std::string()> p) = 0;
688 #else
689  virtual void setPasswordPrompt(const PasswordPromptPtr& p) = 0;
690 #endif
691 
698  virtual CertificatePtr load(const std::string& file) const = 0;
699 
706  virtual CertificatePtr decode(const std::string& str) const = 0;
707 };
709 
710 }
711 
712 #endif
IceSSL::operator>
bool operator>(const DistinguishedName &lhs, const DistinguishedName &rhs)
Performs an exact match.
Definition: Plugin.h:335
IceSSL::TrustError::NoError
@ NoError
The certification verification succeed.
IceSSL::Plugin::setPasswordPrompt
virtual void setPasswordPrompt(std::function< std::string()> p)=0
Establish the password prompt object.
IceSSL::ParseException::ice_id
virtual std::string ice_id() const
Returns the type ID of this exception.
IceSSL
Definition: ConnectionInfo.h:59
IceSSL::KEY_USAGE_DECIPHER_ONLY
const unsigned int KEY_USAGE_DECIPHER_ONLY
The key usage "decipherOnly" bit is set.
Definition: Plugin.h:127
IceSSL::EXTENDED_KEY_USAGE_CODE_SIGNING
const unsigned int EXTENDED_KEY_USAGE_CODE_SIGNING
The extended key usage "codeSigning" bit is set.
Definition: Plugin.h:144
IceSSL::getHost
std::string getHost(const IceSSL::ConnectionInfoPtr &)
IceSSL::getTrustErrorDescription
std::string getTrustErrorDescription(TrustError)
IceSSL::X509Extension
Represents an X509 Certificate extension.
Definition: Plugin.h:375
ICE_DEFINE_PTR
#define ICE_DEFINE_PTR(TPtr, T)
Definition: Config.h:359
Ice::Plugin
A communicator plug-in.
Definition: Plugin.h:78
IceSSL::CertificateReadException::~CertificateReadException
virtual ~CertificateReadException()
IceSSL::ParseException::~ParseException
virtual ~ParseException()
IceSSL::Certificate::operator==
virtual bool operator==(const Certificate &) const =0
Compares the certificates for equality using the native certificate comparison method.
IceSSL::EXTENDED_KEY_USAGE_TIME_STAMPING
const unsigned int EXTENDED_KEY_USAGE_TIME_STAMPING
The extended key usage "timeStamping" bit is set.
Definition: Plugin.h:152
IceSSL::Certificate::getKeyUsage
unsigned int getKeyUsage() const
Returns the value of the key usage extension.
IceSSL::Plugin::setCertificateVerifier
virtual void setCertificateVerifier(std::function< bool(const std::shared_ptr< ConnectionInfo > &)> v)=0
Establish the certificate verifier object.
IceSSL::KEY_USAGE_ENCIPHER_ONLY
const unsigned int KEY_USAGE_ENCIPHER_ONLY
The key usage "encipherOnly" bit is set.
Definition: Plugin.h:123
IceSSL::EXTENDED_KEY_USAGE_EMAIL_PROTECTION
const unsigned int EXTENDED_KEY_USAGE_EMAIL_PROTECTION
The extended key usage "emailProtection" bit is set.
Definition: Plugin.h:148
IceSSL::EXTENDED_KEY_USAGE_CLIENT_AUTH
const unsigned int EXTENDED_KEY_USAGE_CLIENT_AUTH
The extended key usage "clientAuth" bit is set.
Definition: Plugin.h:140
IceSSL::X509Extension::isCritical
virtual bool isCritical() const =0
Determines whether the information in this extension is important.
IceSSL::EXTENDED_KEY_USAGE_ANY_KEY_USAGE
const unsigned int EXTENDED_KEY_USAGE_ANY_KEY_USAGE
The extended key usage "anyKeyUsage" bit is set.
Definition: Plugin.h:132
IceSSL::X509Extension::getData
virtual std::vector< Ice::Byte > getData() const =0
Obtains the data associated with this extension.
IceSSL::KEY_USAGE_CRL_SIGN
const unsigned int KEY_USAGE_CRL_SIGN
The key usage "cRLSign" bit is set.
Definition: Plugin.h:119
IceSSL::CertificatePtr
::std::shared_ptr< Certificate > CertificatePtr
Definition: Plugin.h:399
IceSSL::KEY_USAGE_DATA_ENCIPHERMENT
const unsigned int KEY_USAGE_DATA_ENCIPHERMENT
The key usage "dataEncipherment" bit is set.
Definition: Plugin.h:107
IceSSL::Plugin
Represents the IceSSL plug-in object.
Definition: Plugin.h:665
IceSSL::Plugin::decode
virtual CertificatePtr decode(const std::string &str) const =0
Decode a certificate from a string that uses the PEM encoding format.
IceSSL::operator<=
bool operator<=(const DistinguishedName &lhs, const DistinguishedName &rhs)
Performs an exact match.
Definition: Plugin.h:344
IceSSL::CertificateReadException
Thrown if the certificate cannot be read.
Definition: Plugin.h:163
IceSSL::KEY_USAGE_KEY_AGREEMENT
const unsigned int KEY_USAGE_KEY_AGREEMENT
The key usage "keyAgreement" bit is set.
Definition: Plugin.h:111
IceSSL::Certificate::getSubjectAlternativeNames
virtual std::vector< std::pair< int, std::string > > getSubjectAlternativeNames() const =0
See the comment for Plugin::getIssuerAlternativeNames.
IceSSL::DistinguishedName::DistinguishedName
DistinguishedName(const std::string &name)
Creates a DistinguishedName from a string encoded using the rules in RFC2253.
IceSSL::CertificateEncodingException
Thrown if the certificate cannot be encoded.
Definition: Plugin.h:195
IceSSL::Certificate::getAuthorityKeyIdentifier
virtual std::vector< Ice::Byte > getAuthorityKeyIdentifier() const =0
Obtains the authority key identifier.
IceSSL::DistinguishedName::DistinguishedName
DistinguishedName(const std::list< std::pair< std::string, std::string > > &)
Creates a DistinguishedName from a list of RDN pairs, where each pair consists of the RDN's type and ...
IceSSL::KEY_USAGE_KEY_ENCIPHERMENT
const unsigned int KEY_USAGE_KEY_ENCIPHERMENT
The key usage "keyEncipherment" bit is set.
Definition: Plugin.h:103
IceSSL::CertificateEncodingException::CertificateEncodingException
CertificateEncodingException(const char *, int, const std::string &)
IceSSL::CertificateReadException::reason
std::string reason
The reason for the exception.
Definition: Plugin.h:183
IceSSL::TrustError
TrustError
The reason for an IceSSL certificate verification failure.
Definition: Plugin.h:42
IceSSL::Certificate::getSubjectKeyIdentifier
virtual std::vector< Ice::Byte > getSubjectKeyIdentifier() const =0
Obtains the subject key identifier.
IceSSL::Certificate::getSubjectDN
virtual DistinguishedName getSubjectDN() const =0
Obtains the subject's distinguished name (DN).
IceSSL::X509ExtensionPtr
::std::shared_ptr< X509Extension > X509ExtensionPtr
Definition: Plugin.h:396
IceSSL::Certificate::load
static CertificatePtr load(const std::string &file)
Loads the certificate from a file.
IceSSL::Certificate::verify
virtual bool verify(const CertificatePtr &cert) const =0
Verifies that this certificate was signed by the given certificate public key.
IceSSL::Certificate::getNotAfter
virtual std::chrono::system_clock::time_point getNotAfter() const =0
Obtains the not-after validity time.
IceSSL::Plugin::load
virtual CertificatePtr load(const std::string &file) const =0
Load the certificate from a file.
IceSSL::Plugin::~Plugin
virtual ~Plugin()
IceSSL::Certificate::getX509Extension
virtual X509ExtensionPtr getX509Extension(const std::string &oid) const =0
Obtains the extension with the given OID.
IceSSL::EXTENDED_KEY_USAGE_SERVER_AUTH
const unsigned int EXTENDED_KEY_USAGE_SERVER_AUTH
The extended key usage "serverAuth" bit is set.
Definition: Plugin.h:136
IceSSL::operator>=
bool operator>=(const DistinguishedName &lhs, const DistinguishedName &rhs)
Performs an exact match.
Definition: Plugin.h:353
IceSSL::KEY_USAGE_DIGITAL_SIGNATURE
const unsigned int KEY_USAGE_DIGITAL_SIGNATURE
The key usage "digitalSignature" bit is set.
Definition: Plugin.h:95
IceSSL::Certificate::checkValidity
virtual bool checkValidity(const std::chrono::system_clock::time_point &t) const =0
Checks that the certificate is valid at the given time.
ConnectionInfoF.h
Plugin.h
IceSSL::DistinguishedName
This class represents a DistinguishedName, similar to the Java type X500Principal and the ....
Definition: Plugin.h:268
IceUtil::Time
Definition: Time.h:18
IceSSL::X509Extension::getOID
virtual std::string getOID() const =0
Obtains the object ID of this extension.
IceSSL::Certificate::getVersion
virtual int getVersion() const =0
Obtains the certificate version number.
IceSSL::Certificate::getIssuerAlternativeNames
virtual std::vector< std::pair< int, std::string > > getIssuerAlternativeNames() const =0
Obtains the values in the issuer's alternative names extension.
ICESSL_API
#define ICESSL_API
Definition: Plugin.h:27
Time.h
IceSSL::operator!=
bool operator!=(const DistinguishedName &lhs, const DistinguishedName &rhs)
Performs an exact match.
Definition: Plugin.h:362
IceSSL::Certificate::getIssuerDN
virtual DistinguishedName getIssuerDN() const =0
Obtains the issuer's distinguished name (DN).
IceSSL::PluginPtr
::std::shared_ptr< Plugin > PluginPtr
Definition: Plugin.h:708
IceSSL::Certificate::checkValidity
virtual bool checkValidity() const =0
Checks that the certificate is currently valid, that is, the current date falls between the validity ...
IceSSL::CertificateReadException::CertificateReadException
CertificateReadException(const char *, int, const std::string &)
IceSSL::Certificate
This convenience class is a wrapper around a native certificate.
Definition: Plugin.h:412
IceSSL::Certificate::getExtendedKeyUsage
unsigned int getExtendedKeyUsage() const
Returns the value of the extended key usage extension.
IceSSL::KEY_USAGE_NON_REPUDIATION
const unsigned int KEY_USAGE_NON_REPUDIATION
The key usage "nonRepudiation" bit is set.
Definition: Plugin.h:99
Config.h
IceSSL::Certificate::decode
static CertificatePtr decode(const std::string &str)
Decodes a certificate from a string that uses the PEM encoding format.
IceSSL::Certificate::getX509Extensions
virtual std::vector< X509ExtensionPtr > getX509Extensions() const =0
Obtains a list of the X509v3 extensions contained in the certificate.
IceSSL::KEY_USAGE_KEY_CERT_SIGN
const unsigned int KEY_USAGE_KEY_CERT_SIGN
The key usage "keyCertSign" bit is set.
Definition: Plugin.h:115
IceUtil::Handle
Definition: Handle.h:143
IceSSL::Certificate::encode
virtual std::string encode() const =0
Obtains a string encoding of the certificate in PEM format.
IceSSL::CertificateEncodingException::reason
std::string reason
The reason for the exception.
Definition: Plugin.h:215
IceSSL::ParseException
This exception is thrown if a distinguished name cannot be parsed.
Definition: Plugin.h:227
IceSSL::DistinguishedName::match
bool match(const DistinguishedName &dn) const
Performs a partial match with another DistinguishedName.
IceSSL::getTrustError
TrustError getTrustError(const IceSSL::ConnectionInfoPtr &)
IceSSL::DistinguishedName::operator<
friend bool operator<(const DistinguishedName &, const DistinguishedName &)
Performs an exact match.
IceSSL::ParseException::reason
std::string reason
The reason for the exception.
Definition: Plugin.h:247
IceSSL::Certificate::operator!=
virtual bool operator!=(const Certificate &) const =0
Compares the certificates for equality using the native certificate comparison method.
IceSSL::DistinguishedName::match
bool match(const std::string &dn) const
Performs a partial match with another DistinguishedName.
IceUtil::ExceptionHelper
Helper template for the implementation of Ice::Exception.
Definition: Exception.h:128
IceSSL::CertificateEncodingException::~CertificateEncodingException
virtual ~CertificateEncodingException()
IceSSL::CertificateReadException::ice_id
virtual std::string ice_id() const
Returns the type ID of this exception.
IceSSL::EXTENDED_KEY_USAGE_OCSP_SIGNING
const unsigned int EXTENDED_KEY_USAGE_OCSP_SIGNING
The extended key usage "OCSPSigning" bit is set.
Definition: Plugin.h:156
IceSSL::Certificate::getSerialNumber
virtual std::string getSerialNumber() const =0
Obtains the serial number.
IceSSL::Certificate::getNotBefore
virtual std::chrono::system_clock::time_point getNotBefore() const =0
Obtains the not-before validity time.
IceUtil::Shared
Definition: Shared.h:78
IceSSL::DistinguishedName::operator==
friend bool operator==(const DistinguishedName &, const DistinguishedName &)
Performs an exact match.
IceSSL::Certificate::toString
virtual std::string toString() const =0
Stringifies the certificate.
IceSSL::CertificateEncodingException::ice_id
virtual std::string ice_id() const
Returns the type ID of this exception.
IceSSL::ParseException::ParseException
ParseException(const char *, int, const std::string &)