Certificates
    
        Interface to create and validate certificates.
    
    File information
    
    Logging
    To enable logging for ICertificates, the flag LOG_TLS must be set in the managers diagnostic settings.
    Classes
    ICertificates
    class ICertificates {
public:
    static certificate_error_t ValidateCertificate(class IInstanceLog * log, const byte * cert, size_t certLen, class ICertificateInformation * info = nullptr, bool privateKeyRequired = true, bool verifyChain = true);
    static bool CreateCertificateSigningRequest(class IInstanceLog * log, class ICertificateSigningRequest * iCsr);
    static byte * ConvertPEMToDER(this, csr->GetRequestPEM(), outLength);
    static char * ConvertDERToPEM(class IInstanceLog * log, const byte * der, size_t derLength);
    virtual byte * CertificateFingerprint(class IInstanceLog * log, const byte * cert, size_t certLen, size_t * length, fingerprint_t type = FINGERPRINT_SHA256) = 0;
    virtual byte * CreateCertificate(class IInstanceLog * log, size_t * certLen, certificate_type_t type = CERTIFICATE_PEM) = 0;
};
    Public functions
    ValidateCertificate (static function)
    
        - 
            This function validates a certificate in PEM format.
            
Parameters
            
                | IInstanceLog * log  | An IInstanceLog pointer to the logging interface. | 
                | const byte * cert  | A byte buffer which holds the certificate. | 
                | size_t certLen  | The length of the byte buffer. | 
                | ICertificateInformation * info  | An optional ICertificateInformation object which will hold information about the certificate after successfull information. | 
                | bool privateKeyRequired  | Default true; if false, the chain does not need to contain a private key. | 
                | bool verifyChain  | Default true; if false, the certificate chain is not verified. | 
            
            Return value
            An enum certificate_error_t which indicates a possible error.
            Remarks
            If you want certificate informations, you must hand an instance of ICertificateInformation, which you can create with ICertificateInformation::Create.
            You are responsible for deletion of this object afterwards!
         
    
    CreateCertificateSigningRequest (static function)
    
        - 
            This function will create a private RSA key together with a certificate signing request.
            
Parameters
            
                | IInstanceLog * log  | An IInstanceLog pointer to the logging interface. | 
                | ICertificateSigningRequest * iCsr  | An ICertificateSigningRequest object which will hold information about the CSR and after the creation the private key and request. | 
            
            Return value
            A boolean, if false, something failed (enable TLS traces to see possible erros).
            Remarks
            As the generation of an RSA certificate may take a while, depending on the architecture and key length, you should consider to call this function inside a thread to avoid blocking of your App.
         
    
    ConvertPEMToDER (static function)
    
        - 
            This function will convert a PEM formatted certificate to a DER format.
            
Parameters
            
                | IInstanceLog * log  | An IInstanceLog pointer to the logging interface. | 
                | const char * pem  | A const char * which holds the null terminated PEM string. | 
                | size_t & outLength  | A reference to a size_t variable which will hold the length of the returned buffer afterwards. | 
            
            Return value
            A byte * buffer. You must free this buffer yourself! On errors, a nullptr is returned and the error can be found in the log file with an enabled TLS log flag.
            Remarks
            Just simple PEMs with a single certificate and without certificate data description, just with ----- lines and base64 encoding are supported.
         
    
    ConvertDERToPEM (static function)
    
        - 
            This function will convert a DER formatted certificate to a PEM format.
            
Parameters
            
                | IInstanceLog * log  | An IInstanceLog pointer to the logging interface. | 
                | const byte * der  | A const byte * which holds the DER binary data. | 
                | size_t derLength  | The length of the der byte array. | 
            
            Return value
            A char * buffer. You must free this buffer yourself! On errors, a nullptr is returned and the error can be found in the log file with an enabled TLS log flag.
            Remarks
            Just a single public key certificate is supported.
         
    
    CertificateFingerprint
    
        - 
            This function generates a certificate fingerprint for PEM certificates.
            
Parameters
            
                | IInstanceLog * log  | An IInstanceLog pointer to the logging interface. | 
                | const byte * cert  | A byte buffer which holds the certificate. | 
                | size_t certLen  | The length of the byte buffer. | 
                | fingerprint_t type  | The fingerprint hash type. | 
            
            Return value
            A byte buffer holding the fingerprint hash. The buffer must be freed by the caller.
         
    
    CreateCertificate
    
        - 
            This function creates a certificate.
            
Parameters
            
                | IInstanceLog * log  | An IInstanceLog pointer to the logging interface. | 
                | size_t * certLen  | The length of the returned buffer. | 
                | certificate_type_t type  | The output certificate type. | 
            
            Return value
            A byte buffer holding the certificates private and public key. The buffer must be freed by the caller.
         
    
    ICertificateSigningRequest
    class ICertificateSigningRequest {
public:
    static ICertificateSigningRequest * Create(const char * commonName, certificate_key_length_t keyLength);;
    virtual void AddDnsName(const char * dnsName) = 0;;
    virtual certificate_key_length_t GetKeyLength() = 0;;
    virtual const char * GetCommonName() = 0;;
    virtual const char * GetPrivateKeyPEM() = 0;;
    virtual const char * GetRequestPEM() = 0;;
};
    Usage
    This class is used to hand neccessary information to ICertificates::CreateCertificateSigningRequest and afterwards also holds the created privated key and CSR on success.
    An object is created by ICertificateSigningRequest::Create.
    You can hand one or multiple DNS names with the function AddDnsName(const char * dnsName).
    You must delete the object after your usage.
    Public functions
    Create (static function)
    
        - 
            This function creates an object for the interface class ICertificateSigningRequest.
            
Parameters
            
                | const char * commonName  | The common name for the signing request. | 
                | certificate_key_length_t keyLength  | The key length of the generated certificate. | 
            
            Return value
            An object of type ICertificateSigningRequest.
         
    
    AddDnsName
    
        - 
            Adds a DNS name which will be added as subject alternative name to the CSR.
            
Parameters
            
                | const char * dnsName  | The DNS name. | 
            
         
    
    GetKeyLength
    
        - 
            
Return value
            An enum certificate_key_length_t with the set key length.
         
    
    GetCommonName
    
        - 
            
Return value
            A const char * with the common name.
         
    
    GetPrivateKeyPEM
    
        - 
            
Return value
            A const char * with the private key in PEM format.
         
    
    GetRequestPEM
    
        - 
            
Return value
            A const char * with the certificate signing request in PEM format..
         
    
    ICertificateInformation
    
    class ICertificateInformation {
    public:
    static ICertificateInformation * Create();
    virtual const char * GetCommonName() = 0;
    virtual const char * GetIssuer() = 0;
    virtual int GetNotAfter() = 0;
    virtual int GetNotBefore() = 0;
    virtual size_t GetChainDepth() = 0;
    virtual const char * GetChainCertificate(size_t index) = 0;
    virtual size_t GetDnsNamesCount() = 0;
    virtual const char * GetDnsName(size_t index) = 0;
    virtual size_t GetIpAddressesCount() = 0;
    virtual const char * GetIpAddress(size_t index) = 0;
    virtual const char * GetFingerprintSHA256() = 0;
    virtual const char * GetSignatureAlgorithm() = 0;
    };
    Usage
    An object is created by ICertificateInformation::Create.
    You must delete the object after your usage.
    Public functions
    Create (static function)
    
        - 
            This function creates an object for the interface class ICertificateInformation.
            
Return value
            An object of type ICertificateInformation.
         
    
    GetCommonName
    
        - 
            
Return value
            A const char * with the common name.
         
    
    GetCommonName
    
        - 
            
Return value
            A const char * with the issuer.
         
    
    GetNotAfter
    
        - 
            
Return value
            Valid not after as ulong64 UTC timestamp in milliseconds.
         
    
    GetNotBefore
    
        - 
            
Return value
            Valid not before as ulong64 UTC timestamp in milliseconds.
         
    
    GetChainDepth
    
        - 
            
Return value
            The size_t chain depth, aka count of chain certificates.
         
    
    GetChainCertificate
    
        - 
            
Parameters
            
                | size_t index  | The index of the chain certificate which shall be returned. | 
            
            Return value
            A const char * pointer to the chain certificate in PEM format. If index is not found, nullptr is returned.
         
    
    GetDnsNamesCount
    
        - 
            
Return value
            The size_t count of DNS SAN entries.
         
    
    GetDnsName
    
        - 
            
Parameters
            
                | size_t index  | The index of the DNS name which shall be returned. | 
            
            Return value
            A const char * pointer to the DNS name. If index is not found, nullptr is returned.
         
    
    GetIpAddressesCount
    
        - 
            
Return value
            The size_t count of IP address SAN entries.
         
    
    GetIpAddress
    
        - 
            
Parameters
            
                | size_t index  | The index of the IP address which shall be returned. | 
            
            Return value
            A const char * pointer to the IP address. If index is not found, nullptr is returned.
         
    
    GetFingerprintSHA256
    
        - 
            
Return value
            A const char * pointer to the SHA256 fingerprint.
         
    
    GetSignatureAlgorithm
    
        - 
            
Return value
            A const char * pointer to the used signature algorithm.
         
    
    Data types
    certificate_error_t
    typedef enum {
    CERTIFICATE_OK = 0,
    CERTIFICATE_PARSING_FAILED,
    CERTIFICATE_PUBLIC_KEY_INVALID,
    CERTIFICATE_PRIVATE_KEY_INVALID,
    CERTIFICATE_LOAD_FAILED,
    CERTIFICATE_CHAIN_INVALID
} certificate_error_t;
    Overview
    The enum certificate_error_t is used to determine the error code of the parsing or if the parsing succeeded.
    certificate_type_t
    typedef enum {
    CERTIFICATE_PEM = 0
} certificate_type_t;
    Overview
    The enum certificate_type_t holds all supported certificate types.
    fingerprint_t
    typedef enum {
    FINGERPRINT_MD5,
    FINGERPRINT_SHA1,
    FINGERPRINT_SHA224,
    FINGERPRINT_SHA256,
    FINGERPRINT_SHA384,
    FINGERPRINT_SHA512
} fingerprint_t;
    certificate_key_length_t
    typedef enum {
    CERTIFICAFTE_KEY_LENGTH_2048,
    CERTIFICAFTE_KEY_LENGTH_3072,
    CERTIFICAFTE_KEY_LENGTH_4096
} certificate_key_length_t;
    Overview
    The enum fingerprint_t holds all supported fingerprint hash types.
     Code Example 
    
size_t pemBufferLen = 0;
byte * pemBuffer = ICertificates::CreateCertificate(logIf, &pemBufferLen, CERTIFICATE_PEM);
if(pemBuffer) {
    ICertificateInformation * info = ICertificateInformation::Create();
    if(ICertificates::ValidateCertificate(logIf, pemBuffer, pemBufferLen, info) == CERTIFICATE_OK) {
        size_t certFplength;
        byte * fingerPrint = CertificateFingerprint(logIf, pemBuffer, pemBufferLen, &certFplength, FINGERPRINT_SHA512);
        debug->printf("fingerprint of new certificate: %s notAfter:%llu", fingerPrint, info->GetNotAfter());
        free(fingerPrint);
    }
    free(pemBuffer);
    delete info;
}