//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1992 - 1999
//
//  File:       enrlhelp.h
//
//  Contents:   Headers for the helper functions for smard card enrollment station
//
//----------------------------------------------------------------------------

#ifndef __ENRLHELP_H__
#define __ENRLHELP_H__

#ifdef __cplusplus
extern "C" {
#endif
    
/////////////////////////////////////////////////////////////////////////////
// Contants defines
#define g_dwMsgAndCertEncodingType  PKCS_7_ASN_ENCODING | X509_ASN_ENCODING

const   WCHAR g_MyStoreName[]=L"MY";


/////////////////////////////////////////////////////////////////////////////
// SCrdEnroll_CSP_INFO
typedef struct  _SCrdEnroll_CERT_SELECT_INFO
{
    DWORD   dwFlags;
    LPWSTR  pwszCertTemplateName;
}SCrdEnroll_CERT_SELECT_INFO, *PSCrdEnroll_CERT_SELECT_INFO;

/////////////////////////////////////////////////////////////////////////////
// Function Prototypes
LPWSTR  CopyWideString(LPCWSTR wsz);

BOOL    SearchAndDeleteCert(PCCERT_CONTEXT  pCertContext);

BOOL    InitlializeCSPList(DWORD    *pdwCSPCount, SCrdEnroll_CSP_INFO **prgCSPInfo);

void    FreeCSPInfo(DWORD   dwCSPCount, SCrdEnroll_CSP_INFO *prgCSPInfo);

BOOL    GetCAInfoFromCertType(HANDLE					hToken,
							  LPWSTR                    pwszCTName,
                              DWORD                     *pdwValidCA,
                              SCrdEnroll_CA_INFO        **prgCAInfo);

HRESULT GetCAArchivalCert(LPWSTR           pwszCAName, 
			  PCCERT_CONTEXT  *ppCert);  

BOOL    InitializeCTList(DWORD              *pdwCTIndex,
                         DWORD              *pdwCTCount, 
                         SCrdEnroll_CT_INFO **prgCTInfo);

LPVOID  SCrdEnrollAlloc (
        ULONG cbSize);

LPVOID  SCrdEnrollRealloc (
        LPVOID pv,
        ULONG cbSize);

VOID    SCrdEnrollFree (
        LPVOID pv);


void    FreeCTInfo(DWORD    dwCTCount, SCrdEnroll_CT_INFO *rgCTInfo);

void    FreeCAInfo(DWORD    dwCACount, SCrdEnroll_CA_INFO *rgCAInfo);


HRESULT CodeToHR(HRESULT hr);

HRESULT GetSelectedUserName(IDsObjectPicker     *pDsObjectPicker,
			    LPWSTR              *ppwszSelectedUserSAM,
                            LPWSTR              *ppwszSelectedUserUPN);

BOOL    SignWithCert(LPSTR              pszCSPName,
                     DWORD              dwCSPType,
                     PCCERT_CONTEXT     pSigningCert);



HRESULT ChkSCardStatus(BOOL             fSCardSigningCert,
                       PCCERT_CONTEXT   pSigningCertCertContext,
                       LPSTR            pszCSPNameSigningCert,
                       DWORD            dwCSPTypeSigningCert,
                       LPSTR            pszContainerSigningCert,
                       LPWSTR           pwszSelectedCSP,
                       LPWSTR           *ppwszNewContainerName);


BOOL    ChKInsertedCardSigningCert(LPWSTR           pwszInsertProvider,
                                   DWORD            dwInsertProviderType,
                                   LPWSTR           pwszReaderName,
                                   PCCERT_CONTEXT   pSignCertContext,
                                   LPSTR            pszSignProvider,
                                   DWORD            dwSignProviderType,
                                   LPSTR            pszSignContainer,
                                   BOOL             *pfSame);

BOOL    DecodeBlobW(WCHAR   *pch,
                    DWORD   cch,
                    BYTE    **ppbData,
                    DWORD   *pcbData);


BOOL    EncodeBlobW(BYTE    *pbData,
                    DWORD   cbData,
                    DWORD   dwFlags,
                    WCHAR   **ppch,
                    DWORD   *pcch);


BOOL    GetNameFromPKCS10(BYTE      *pbPKCS10,
                          DWORD     cbPKCS10,
                          DWORD     dwFlags, 
                          LPSTR     pszOID, 
                          LPWSTR    *ppwszName);

BOOL    VerifyCertTemplateName(PCCERT_CONTEXT   pCertContext, 
                               LPWSTR           pwszCertTemplateName);


BOOL    WINAPI SelectSignCertCallBack(
                                PCCERT_CONTEXT  pCertContext,
                                BOOL            *pfInitialSelectedCert,
                                void            *pvCallbackData);

BOOL    VerifyCertChain(PCCERT_CONTEXT      pCertContext);

BOOL    IsNewerCert(PCCERT_CONTEXT  pFirstCert,
                    PCCERT_CONTEXT  pSecondCert);

BOOL    SmartCardCSP(PCCERT_CONTEXT pCertContext);

DWORD   GetEncodeFlag(DWORD dwFlags);

BOOL    GetName(LPWSTR                  pwszName,
                EXTENDED_NAME_FORMAT    NameFormat,
                EXTENDED_NAME_FORMAT    DesiredFormat,
                LPWSTR                  *ppwszDesiredName);	


BOOL	RetrieveCAName(DWORD					dwFlags, 
					   SCrdEnroll_CA_INFO		*pCAInfo, 
					   LPWSTR					*ppwszName);

#ifdef __cplusplus
}       // Balance extern "C" above
#endif



#endif  //__ENRLHELP_H__