/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Microsoft Windows Copyright (C) Microsoft Corporation, 1995 - 1999. File: Chain.h Content: Declaration of CChain. History: 11-15-99 dsie created ------------------------------------------------------------------------------*/ #ifndef __CHAIN_H_ #define __CHAIN_H_ #include "Resource.h" #include "Error.h" #include "Lock.h" #include "Debug.h" // // Chain policy error status. // typedef enum CAPICOM_CHAIN_STATUS { CAPICOM_CHAIN_STATUS_OK = 0x00000000, CAPICOM_CHAIN_STATUS_REVOKED = 0x80092010, CAPICOM_CHAIN_STATUS_REVOCATION_NO_CHECK = 0x80092012, CAPICOM_CHAIN_STATUS_REVOCATION_OFFLINE = 0x80092013, CAPICOM_CHAIN_STATUS_INVALID_BASIC_CONSTRAINTS = 0x80096019, CAPICOM_CHAIN_STATUS_INVALID_SIGNATURE = 0x80096004, CAPICOM_CHAIN_STATUS_EXPIRED = 0x800B0101, CAPICOM_CHAIN_STATUS_NESTED_VALIDITY_PERIOD = 0x800B0102, CAPICOM_CHAIN_STATUS_UNTRUSTEDROOT = 0x800B0109, CAPICOM_CHAIN_STATUS_PARTIAL_CHAINING = 0x800B010A, CAPICOM_CHAIN_STATUS_INVALID_USAGE = 0x800B0110, CAPICOM_CHAIN_STATUS_INVALID_POLICY = 0x800B0113, CAPICOM_CHAIN_STATUS_INVALID_NAME = 0x800B0114, } CAPICOM_CHAIN_STATUS; //////////////////////////////////////////////////////////////////////////////// // // Exported functions. // /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Function : CreateChainObject Synopsis : Create and initialize an IChain object by building the chain of a specified certificate and policy. Parameter: PCCERT_CONTEXT pCertContext - Pointer to CERT_CONTEXT. ICertificateStatus * pIStatus - Pointer to ICertificateStatus object. HCERTSTORE hAdditionalStore - Additional store handle. VARIANT_BOOL * pVal - Pointer to VARIANT_BOOL to receive chain overall validity result. IChain ** ppIChain - Pointer to pointer to IChain object. Remark : ------------------------------------------------------------------------------*/ HRESULT CreateChainObject (PCCERT_CONTEXT pCertContext, ICertificateStatus * pIStatus, HCERTSTORE hAdditionalStore, VARIANT_BOOL * pbResult, IChain ** ppIChain); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Function : CreateChainObject Synopsis : Create and initialize an IChain object by building the chain of a specified certificate and policy. Parameter: ICertificate * pICertificate - Poitner to ICertificate. HCERTSTORE hAdditionalStore - Additional store handle. VARIANT_BOOL * pVal - Pointer to VARIANT_BOOL to receive chain overall validity result. IChain ** ppIChain - Pointer to pointer to IChain object. Remark : ------------------------------------------------------------------------------*/ HRESULT CreateChainObject (ICertificate * pICertificate, HCERTSTORE hAdditionalStore, VARIANT_BOOL * pbResult, IChain ** ppIChain); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Function : CreateChainObject Synopsis : Create and initialize an IChain object from a built chain. Parameter: PCCERT_CHAIN_CONTEXT pChainContext - Chain context. IChain ** ppIChain - Pointer to pointer to IChain object. Remark : ------------------------------------------------------------------------------*/ HRESULT CreateChainObject (PCCERT_CHAIN_CONTEXT pChainContext, IChain ** ppIChain); /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Function : GetChainContext Synopsis : Return an array of PCCERT_CONTEXT from the chain. Parameter: IChain * pIChain - Pointer to IChain. CRYPT_DATA_BLOB * pChainBlob - Pointer to blob to recevie the size and array of PCERT_CONTEXT for the chain. Remark : ------------------------------------------------------------------------------*/ STDMETHODIMP GetChainContext (IChain * pIChain, CRYPT_DATA_BLOB * pChainBlob); //////////////////////////////////////////////////////////////////////////////// // // CChain // class ATL_NO_VTABLE CChain : public IChainContext, public CComObjectRootEx, public CComCoClass, public ICAPICOMError, public IDispatchImpl, public IObjectSafetyImpl { public: CChain() { m_pUnkMarshaler = NULL; } DECLARE_REGISTRY_RESOURCEID(IDR_CHAIN) DECLARE_GET_CONTROLLING_UNKNOWN() DECLARE_PROTECT_FINAL_CONSTRUCT() BEGIN_COM_MAP(CChain) COM_INTERFACE_ENTRY(IChain) COM_INTERFACE_ENTRY(IChain2) COM_INTERFACE_ENTRY(IChainContext) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(IObjectSafety) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p) END_COM_MAP() BEGIN_CATEGORY_MAP(CChain) IMPLEMENTED_CATEGORY(CATID_SafeForScripting) IMPLEMENTED_CATEGORY(CATID_SafeForInitializing) END_CATEGORY_MAP() HRESULT FinalConstruct() { HRESULT hr; if (FAILED(hr = m_Lock.Initialized())) { DebugTrace("Error [%#x]: Critical section could not be created for Chain object.\n", hr); return hr; } m_dwStatus = 0; m_pChainContext = NULL; return CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p); } void FinalRelease() { if (m_pChainContext) { ::CertFreeCertificateChain(m_pChainContext); } m_pUnkMarshaler.Release(); } CComPtr m_pUnkMarshaler; // // IChain // public: STDMETHOD(get_Certificates) (/*[out, retval]*/ ICertificates ** pVal); STDMETHOD(get_Status) (/*[in, defaultvalue(0)]*/ long Index, /*[out,retval]*/ long * pVal); STDMETHOD(Build) (/*[in]*/ ICertificate * pICertificate, /*[out, retval]*/ VARIANT_BOOL * pVal); STDMETHOD(CertificatePolicies) (/*[out, retval]*/ IOIDs ** pVal); STDMETHOD(ApplicationPolicies) (/*[out, retval]*/ IOIDs ** pVal); STDMETHOD(ExtendedErrorInfo) (/*[in, defaultvalue(1)]*/ long Index, /*[out, retval]*/ BSTR * pVal); // // Custom interfaces. // STDMETHOD(get_ChainContext) (/*[out, retval]*/ long * pChainContext); STDMETHOD(put_ChainContext) (/*[in]*/ long pChainContext); STDMETHOD(FreeContext) (/*[in]*/ long pChainContext); // // Non COM functions. // STDMETHOD(Init) (PCCERT_CONTEXT pCertContext, ICertificateStatus * pIStatus, HCERTSTORE hAdditionalStore, VARIANT_BOOL * pbResult); STDMETHOD(Verify) (CAPICOM_CHECK_FLAG CheckFlag, CAPICOM_CHAIN_STATUS * pVal); STDMETHOD(GetContext) (PCCERT_CHAIN_CONTEXT * ppChainContext); STDMETHOD(PutContext) (PCCERT_CHAIN_CONTEXT pChainContext); private: CLock m_Lock; DWORD m_dwStatus; PCCERT_CHAIN_CONTEXT m_pChainContext; }; #endif //__CHAIN_H_