SOL9 2.0 Class: CertChainEngine

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * CertChainEngine.h 
 * Copyright (c) 2009 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


// SOL9
// 2009/03/17

#pragma once

#include <sol/Object.h>
#include <wincrypt.h>

#include <sol/Bytes.h>


namespace SOL {

class CertChainEngine: public Object {
private:

    HCERTCHAINENGINE        hChainEngine;
    CERT_CHAIN_ENGINE_CONFIG chainConfig;

public:
    /**
     * Constructor
     */
    CertChainEngine()
        :hChainEngine(NULL) 
    {

        //chainPara.cbSize = sizeof(CERT_CHAIN_PARA);
        //chainPara.RequestedUsage=certUsage;

        chainConfig.cbSize = sizeof(CERT_CHAIN_ENGINE_CONFIG);
        chainConfig.hRestrictedRoot= NULL ;
        chainConfig.hRestrictedTrust= NULL;    
        chainConfig.hRestrictedOther= NULL ;
        chainConfig.cAdditionalStore=0 ;
        chainConfig.rghAdditionalStore = NULL ;
        chainConfig.dwFlags = CERT_CHAIN_CACHE_END_CERT;
        chainConfig.dwUrlRetrievalTimeout= 0 ;
        chainConfig.MaximumCachedCertificates=0 ;
        chainConfig.CycleDetectionModulus = 0;

        // Create a certificate chain engine.
        if(CertCreateCertificateChainEngine(
            &chainConfig,
            &hChainEngine) != TRUE) {

                printf("Engine creation failed.\n");

            throw GetLastError();
        }
        // Open the My system store.
    
    }

public:
    /**
     * Destructor
     */
    ~CertChainEngine()
    {
        if (hChainEngine) {
            CertFreeCertificateChainEngine(hChainEngine);
            hChainEngine = NULL;
        }
    }

public:
    HCERTCHAINENGINE getChainEngineHandle() {
        return hChainEngine;
    }

public:
    /**
     * Get a chain (ppChainContext) of certificate for a certificate pCertContext.
     *
     */
    int getCertificateChain(__in PCCERT_CONTEXT pCertContext,
                            __out PCCERT_CHAIN_CONTEXT*  ppChainContext)
    {
        int rc = NO_ERROR;

        CERT_ENHKEY_USAGE    enhkeyUsage;
        CERT_USAGE_MATCH    certUsage;  
        CERT_CHAIN_PARA        chainPara;
        
        memset(&enhkeyUsage, 0, sizeof(enhkeyUsage));
        memset(&certUsage, 0, sizeof(certUsage));
        memset(&chainPara, 0, sizeof(chainPara));
        
        enhkeyUsage.cUsageIdentifier = 0;
        enhkeyUsage.rgpszUsageIdentifier=NULL;

        certUsage.dwType = USAGE_MATCH_TYPE_AND;
        certUsage.Usage  = enhkeyUsage;

        chainPara.cbSize = sizeof(CERT_CHAIN_PARA);
        chainPara.RequestedUsage=certUsage;

        DWORD dwFlags = 0;

        // Get a chain of certificates by using CertGetCertificateChain
        // 
        if(CertGetCertificateChain(
            this->hChainEngine, // chain engine
            pCertContext,       
            NULL,               // default time
            NULL,               // no additional stores
            &chainPara,         
    
            dwFlags,
            NULL,                  
            ppChainContext) !=TRUE) {

             printf("Failed to get a chain of certifiates.\n");
             return GetLastError();

        } else {
            //OK
        }
        return rc;
    }
};

}

Last modified: 19 Dec 2009

Copyright (c) 2009 Antillia.com ALL RIGHTS RESERVED.