/*
 * Copyright (C) 2008 Juan Lang
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */
#ifndef __CRYPTUIAPI_H__
#define __CRYPTUIAPI_H__

#include <wintrust.h>
#include <wincrypt.h>
#include <prsht.h>

#ifdef __cplusplus
extern "C" {
#endif

#include <pshpack8.h>

BOOL WINAPI CryptUIDlgViewContext(DWORD dwContextType, LPVOID pvContext,
 HWND hwnd, LPCWSTR pwszTitle, DWORD dwFlags, LPVOID pvReserved);

/* Values for dwDontUseColumn */
#define CRYPTUI_SELECT_ISSUEDTO_COLUMN     0x00000001
#define CRYPTUI_SELECT_ISSUEDBY_COLUMN     0x00000002
#define CRYPTUI_SELECT_INTENDEDUSE_COLUMN  0x00000004
#define CRYPTUI_SELECT_FRIENDLYNAME_COLUMN 0x00000008
#define CRYPTUI_SELECT_LOCATION_COLUMN     0x00000010
#define CRYPTUI_SELECT_EXPIRATION_COLUMN   0x00000020

PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateFromStore(
 HCERTSTORE hCertStore, HWND hwnd, LPCWSTR pwszTitle, LPCWSTR pwszDisplayString,
 DWORD dwDontUseColumn, DWORD dwFlags, LPVOID pvReserved);

/* Values for CRYPTUI_CERT_MGR_STRUCT's dwFlags */
#define CRYPTUI_CERT_MGR_PUBLISHER_TAB   0x00000004
#define CRYPTUI_CERT_MGR_TAB_MASK        0x0000000f
#define CRYPTUI_CERT_MGR_SINGLE_TAB_FLAG 0x00008000

typedef struct _CRYPTUI_CERT_MGR_STRUCT
{
    DWORD   dwSize;
    HWND    hwndParent;
    DWORD   dwFlags;
    LPCWSTR pwszTitle;
    LPCSTR  pszInitUsageOID;
} CRYPTUI_CERT_MGR_STRUCT, *PCRYPTUI_CERT_MGR_STRUCT;
typedef const struct _CRYPTUI_CERT_MGR_STRUCT *PCCRYPTUI_CERT_MGR_STRUCT;

BOOL WINAPI CryptUIDlgCertMgr(PCCRYPTUI_CERT_MGR_STRUCT pCryptUICertMgr);

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

typedef struct tagCRYPTUI_INITDIALOG_STRUCT
{
    LPARAM         lParam;
    PCCERT_CONTEXT pCertContext;
} CRYPTUI_INITDIALOG_STRUCT, *PCRYPTUI_INITDIALOG_STRUCT;

/* Values for CRYPTUI_VIEWCERTIFICATE_STRUCT's dwFlags */
#define CRYPTUI_HIDE_HIERARCHYPAGE               0x00000001
#define CRYPTUI_HIDE_DETAILPAGE                  0x00000002
#define CRYPTUI_DISABLE_EDITPROPERTIES           0x00000004
#define CRYPTUI_ENABLE_EDITPROPERTIES            0x00000008
#define CRYPTUI_DISABLE_ADDTOSTORE               0x00000010
#define CRYPTUI_ENABLE_ADDTOSTORE                0x00000020
#define CRYPTUI_ACCEPT_DECLINE_STYLE             0x00000040
#define CRYPTUI_IGNORE_UNTRUSTED_ROOT            0x00000080
#define CRYPTUI_DONT_OPEN_STORES                 0x00000100
#define CRYPTUI_ONLY_OPEN_ROOT_STORE             0x00000200
#define CRYPTUI_WARN_UNTRUSTED_ROOT              0x00000400
#define CRYPTUI_ENABLE_REVOCATION_CHECKING       0x00000800
#define CRYPTUI_WARN_REMOTE_TRUST                0x00001000
#define CRYPTUI_DISABLE_EXPORT                   0x00002000
#define CRYPTUI_ENABLE_REVOCATION_CHECK_END_CERT 0x00004000
#define CRYPTUI_ENABLE_REVOCATION_CHECK_CHAIN    0x00008000
#define CRYPTUI_ENABLE_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT CRYPTUI_ENABLE_REVOCATION_CHECKING
#define CRYPTUI_DISABLE_HTMLLINK                 0x00010000
#define CRYPTUI_DISABLE_ISSUERSTATEMENT          0x00020000

typedef struct tagCRYPTUI_VIEWCERTIFICATE_STRUCTA
{
    DWORD             dwSize;
    HWND              hwndParent;
    DWORD             dwFlags;
    LPCSTR            szTitle;
    PCCERT_CONTEXT    pCertContext;
    LPCSTR           *rgszPurposes;
    DWORD             cPurposes;
    union {
        CRYPT_PROVIDER_DATA const *pCryptProviderData;
        HANDLE                     hWVTStateData;
    } DUMMYUNIONNAME;
    BOOL              fpCryptProviderDataTrustedUsage;
    DWORD             idxSigner;
    DWORD             idxCert;
    BOOL              fCounterSigner;
    DWORD             idxCounterSigner;
    DWORD             cStores;
    HCERTSTORE       *rghStores;
    DWORD             cPropSheetPages;
    LPCPROPSHEETPAGEA rgPropSheetPages;
    DWORD             nStartPage;
} CRYPTUI_VIEWCERTIFICATE_STRUCTA, *PCRYPTUI_VIEWCERTIFICATE_STRUCTA;
typedef const CRYPTUI_VIEWCERTIFICATE_STRUCTA *PCCRYPTUI_VIEWCERTIFICATE_STRUCTA;

typedef struct tagCRYPTUI_VIEWCERTIFICATE_STRUCTW
{
    DWORD             dwSize;
    HWND              hwndParent;
    DWORD             dwFlags;
    LPCWSTR           szTitle;
    PCCERT_CONTEXT    pCertContext;
    LPCSTR           *rgszPurposes;
    DWORD             cPurposes;
    union {
        CRYPT_PROVIDER_DATA const *pCryptProviderData;
        HANDLE                     hWVTStateData;
    } DUMMYUNIONNAME;
    BOOL              fpCryptProviderDataTrustedUsage;
    DWORD             idxSigner;
    DWORD             idxCert;
    BOOL              fCounterSigner;
    DWORD             idxCounterSigner;
    DWORD             cStores;
    HCERTSTORE       *rghStores;
    DWORD             cPropSheetPages;
    LPCPROPSHEETPAGEW rgPropSheetPages;
    DWORD             nStartPage;
} CRYPTUI_VIEWCERTIFICATE_STRUCTW, *PCRYPTUI_VIEWCERTIFICATE_STRUCTW;
typedef const CRYPTUI_VIEWCERTIFICATE_STRUCTW *PCCRYPTUI_VIEWCERTIFICATE_STRUCTW;

#define CRYPTUI_VIEWCERTIFICATE_STRUCT   WINELIB_NAME_AW(CRYPTUI_VIEWCERTIFICATE_STRUCT)
#define PCCRYPTUI_VIEWCERTIFICATE_STRUCT WINELIB_NAME_AW(PCCRYPTUI_VIEWCERTIFICATE_STRUCT)

BOOL WINAPI CryptUIDlgViewCertificateA(
 PCCRYPTUI_VIEWCERTIFICATE_STRUCTA pCertViewInfo, BOOL *pfPropertiesChanged);
BOOL WINAPI CryptUIDlgViewCertificateW(
 PCCRYPTUI_VIEWCERTIFICATE_STRUCTW pCertViewInfo, BOOL *pfPropertiesChanged);
#define CryptUIDlgViewCertificate WINELIB_NAME_AW(CryptUIDlgViewCertificate)

typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO
{
    DWORD   dwSize;
    GUID   *pGuidSubject;
    DWORD   cbBlob;
    BYTE   *pbBlob;
    LPCWSTR pwszDisplayName;
} CRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO, *PCRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO;
typedef const CRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO *
 PCCRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO;

typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO
{
    DWORD          dwSize;
    DWORD          cCertStore;
    HCERTSTORE    *rghCertStore;
    PFNCFILTERPROC pFilterCallback;
    void          *pvCallbackData;
} CRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO, *PCRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO;
typedef const CRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO *
 PCCRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO;

typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO
{
    DWORD  dwSize;
    LPWSTR pwszPvkFileName;
    LPWSTR pwszProvName;
    DWORD  dwProvType;
} CRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO,
 *PCRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO;
typedef const CRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO *
 PCCRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO;

typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO
{
    DWORD  dwSize;
    LPWSTR pwszSigningCertFileName;
    DWORD  dwPvkChoice;
    union {
        PCCRYPTUI_WIZ_DIGITAL_SIGN_PVK_FILE_INFO pPvkFileInfo;
        PCRYPT_KEY_PROV_INFO                    pPvkProvInfo;
    } DUMMYUNIONNAME;
} CRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO,
 *PCRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO;
typedef const CRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO *
 PCCRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO;

typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO
{
    DWORD             dwSize;
    DWORD             dwAttrFlags;
    LPCWSTR           pwszDescription;
    LPCWSTR           pwszMoreInfoLocation;
    LPCSTR            pszHashAlg;
    LPCWSTR           pwszSigningCertDisplayString;
    HCERTSTORE        hAdditionalCertStore;
    PCRYPT_ATTRIBUTES psAuthenticated;
    PCRYPT_ATTRIBUTES psUnauthenticated;
} CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO,
 *PCRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO;
typedef const CRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO *
 PCCRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO;

typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_INFO
{
    DWORD   dwSize;
    DWORD   dwSubjectChoice;
    union {
        LPCWSTR                              pwszFileName;
        PCCRYPTUI_WIZ_DIGITAL_SIGN_BLOB_INFO pSignBlobInfo;
    } DUMMYUNIONNAME1;
    DWORD   dwSigningCertChoice;
    union {
        PCCERT_CONTEXT                           pSigningCertContext;
        PCCRYPTUI_WIZ_DIGITAL_SIGN_STORE_INFO    pSigningCertStore;
        PCCRYPTUI_WIZ_DIGITAL_SIGN_CERT_PVK_INFO pSigningCertPvkInfo;
    } DUMMYUNIONNAME2;
    LPCWSTR pwszTimestampURL;
    DWORD   dwAdditionalCertChoice;
    PCCRYPTUI_WIZ_DIGITAL_SIGN_EXTENDED_INFO pSignExtInfo;
} CRYPTUI_WIZ_DIGITAL_SIGN_INFO, *PCRYPTUI_WIZ_DIGITAL_SIGN_INFO;
typedef const CRYPTUI_WIZ_DIGITAL_SIGN_INFO *PCCRYPTUI_WIZ_DIGITAL_SIGN_INFO;

typedef struct _CRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT
{
    DWORD dwSize;
    DWORD cbBlob;
    BYTE *pbBlob;
} CRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT, *PCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT;

/* Values for CryptUIWizDigitalSign's dwFlags */
#define CRYPTUI_WIZ_NO_UI                            0x00000001
#define CRYPTUI_WIZ_DIGITAL_SIGN_EXCLUDE_PAGE_HASHES 0x00000002
#define CRYPTUI_WIZ_DIGITAL_SIGN_INCLUDE_PAGE_HASHES 0x00000004

BOOL WINAPI CryptUIWizDigitalSign(DWORD dwFlags, HWND hwndParent,
 LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_DIGITAL_SIGN_INFO pDigitalSignInfo,
 PCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT *ppSignContext);

BOOL WINAPI CryptUIWizFreeDigitalSignContext(
 PCRYPTUI_WIZ_DIGITAL_SIGN_CONTEXT pSignContext);

/* Values for CRYPTUI_WIZ_EXPORT_INFO's dwSubjectChoice */
#define CRYPTUI_WIZ_EXPORT_CERT_CONTEXT                 1
#define CRYPTUI_WIZ_EXPORT_CTL_CONTEXT                  2
#define CRYPTUI_WIZ_EXPORT_CRL_CONTEXT                  3
#define CRYPTUI_WIZ_EXPORT_CERT_STORE                   4
#define CRYPTUI_WIZ_EXPORT_CERT_STORE_CERTIFICATES_ONLY 5
#define CRYPTUI_WIZ_EXPORT_FORMAT_CRL                   6
#define CRYPTUI_WIZ_EXPORT_FORMAT_CTL                   7

typedef struct _CRYPTUI_WIZ_EXPORT_INFO
{
    DWORD       dwSize;
    LPCWSTR     pwszExportFileName;
    DWORD       dwSubjectChoice;
    union {
        PCCERT_CONTEXT pCertContext;
        PCCTL_CONTEXT  pCTLContext;
        PCCRL_CONTEXT  pCRLContext;
        HCERTSTORE     hCertStore;
    } DUMMYUNIONNAME;
    DWORD       cStores;
    HCERTSTORE *rghStores;
} CRYPTUI_WIZ_EXPORT_INFO, *PCRYPTUI_WIZ_EXPORT_INFO;
typedef const CRYPTUI_WIZ_EXPORT_INFO *PCCRYPTUI_WIZ_EXPORT_INFO;

/* Values for CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO's dwExportFormat */
#define CRYPTUI_WIZ_EXPORT_FORMAT_DER                   1
#define CRYPTUI_WIZ_EXPORT_FORMAT_PFX                   2
#define CRYPTUI_WIZ_EXPORT_FORMAT_PKCS7                 3
#define CRYPTUI_WIZ_EXPORT_FORMAT_BASE64                4
#define CRYPTUI_WIZ_EXPORT_FORMAT_SERIALIZED_CERT_STORE 5

typedef struct _CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO
{
    DWORD   dwSize;
    DWORD   dwExportFormat;
    BOOL    fExportChain;
    BOOL    fExportPrivateKeys;
    LPCWSTR pwszPassword;
    BOOL    fStrongEncryption;
} CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO, *PCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO;
typedef const CRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO *
 PCCRYPTUI_WIZ_EXPORT_CERTCONTEXT_INFO;

BOOL WINAPI CryptUIWizExport(DWORD dwFlags, HWND hwndParent,
 LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_EXPORT_INFO pExportInfo, void *pvoid);

/* Values for CRYPTUI_WIZ_IMPORT_SRC_INFO's dwSubjectChoice */
#define CRYPTUI_WIZ_IMPORT_SUBJECT_FILE         1
#define CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_CONTEXT 2
#define CRYPTUI_WIZ_IMPORT_SUBJECT_CTL_CONTEXT  3
#define CRYPTUI_WIZ_IMPORT_SUBJECT_CRL_CONTEXT  4
#define CRYPTUI_WIZ_IMPORT_SUBJECT_CERT_STORE   5

typedef struct _CRYPTUI_WIZ_IMPORT_SUBJECT_INFO
{
    DWORD   dwSize;
    DWORD   dwSubjectChoice;
    union {
        LPCWSTR        pwszFileName;
        PCCERT_CONTEXT pCertContext;
        PCCTL_CONTEXT  pCTLContext;
        PCCRL_CONTEXT  pCRLContext;
        HCERTSTORE     hCertStore;
    } DUMMYUNIONNAME;
    DWORD   dwFlags;
    LPCWSTR pwszPassword;
} CRYPTUI_WIZ_IMPORT_SRC_INFO, *PCRYPTUI_WIZ_IMPORT_SRC_INFO;
typedef const CRYPTUI_WIZ_IMPORT_SRC_INFO *PCCRYPTUI_WIZ_IMPORT_SRC_INFO;

/* Values for CryptUIWizImport's dwFlags */
#define CRYPTUI_WIZ_IMPORT_NO_CHANGE_DEST_STORE 0x00010000
#define CRYPTUI_WIZ_IMPORT_ALLOW_CERT           0x00020000
#define CRYPTUI_WIZ_IMPORT_ALLOW_CRL            0x00040000
#define CRYPTUI_WIZ_IMPORT_ALLOW_CTL            0x00080000
#define CRYPTUI_WIZ_IMPORT_TO_LOCALMACHINE      0x00100000
#define CRYPTUI_WIZ_IMPORT_TO_CURRENTUSER       0x00200000
#define CRYPTUI_WIZ_IMPORT_REMOTE_DEST_STORE    0x00400000

BOOL WINAPI CryptUIWizImport(DWORD dwFlags, HWND hwndParent,
 LPCWSTR pwszWizardTitle, PCCRYPTUI_WIZ_IMPORT_SRC_INFO pImportSrc,
 HCERTSTORE hDestCertStore);

/* Definitions missing from PSDK's cryptuiapi.h, but documented on MSDN. */
typedef BOOL (WINAPI *PFNCCERTDISPLAYPROC)(PCCERT_CONTEXT pCertContext,
 HWND hWndSelCertDlg, void *pvCallbackData);

/* Values for CRYPTUI_SELECTCERTIFICATE_STRUCT's dwFlags */
#define CRYPTUI_SELECTCERT_MULTISELECT 0x00000001

typedef struct _CRYPTUI_SELECTCERTIFICATE_STRUCTA
{
    DWORD               dwSize;
    HWND                hwndParent;
    DWORD               dwFlags;
    LPCSTR              szTitle;
    DWORD               dwDontUseColumn;
    LPCSTR              szDisplayString;
    PFNCFILTERPROC      pFilterCallback;
    PFNCCERTDISPLAYPROC pDisplayCallback;
    void               *pvCallbackData;
    DWORD               cDisplayStores;
    HCERTSTORE         *rghDisplayStores;
    DWORD               cStores;
    HCERTSTORE         *rghStores;
    DWORD               cPropSheetPages;
    LPCPROPSHEETPAGEA   rgPropSheetPages;
    HCERTSTORE          hSelectedCertStore;
} CRYPTUI_SELECTCERTIFICATE_STRUCTA, *PCRYPTUI_SELECTCERTIFICATE_STRUCTA;
typedef const CRYPTUI_SELECTCERTIFICATE_STRUCTA *
 PCCRYPTUI_SELECTCERTIFICATE_STRUCTA;

typedef struct _CRYPTUI_SELECTCERTIFICATE_STRUCTW
{
    DWORD               dwSize;
    HWND                hwndParent;
    DWORD               dwFlags;
    LPCWSTR             szTitle;
    DWORD               dwDontUseColumn;
    LPCWSTR             szDisplayString;
    PFNCFILTERPROC      pFilterCallback;
    PFNCCERTDISPLAYPROC pDisplayCallback;
    void               *pvCallbackData;
    DWORD               cDisplayStores;
    HCERTSTORE         *rghDisplayStores;
    DWORD               cStores;
    HCERTSTORE         *rghStores;
    DWORD               cPropSheetPages;
    LPCPROPSHEETPAGEW   rgPropSheetPages;
    HCERTSTORE          hSelectedCertStore;
} CRYPTUI_SELECTCERTIFICATE_STRUCTW, *PCRYPTUI_SELECTCERTIFICATE_STRUCTW;
typedef const CRYPTUI_SELECTCERTIFICATE_STRUCTW *
 PCCRYPTUI_SELECTCERTIFICATE_STRUCTW;

PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateA(
 PCCRYPTUI_SELECTCERTIFICATE_STRUCTA pcsc);
PCCERT_CONTEXT WINAPI CryptUIDlgSelectCertificateW(
 PCCRYPTUI_SELECTCERTIFICATE_STRUCTW pcsc);

typedef struct tagCRYPTUI_VIEWSIGNERINFO_STRUCTA
{
    DWORD             dwSize;
    HWND              hwndParent;
    DWORD             dwFlags;
    LPCSTR            szTitle;
    CMSG_SIGNER_INFO *pSignerInfo;
    HCRYPTMSG         hMsg;
    LPCSTR            pszOID;
    DWORD_PTR         dwReserved;
    DWORD             cStores;
    HCERTSTORE       *rghStores;
    DWORD             cPropSheetPages;
    LPCPROPSHEETPAGEA rgPropSheetPages;
} CRYPTUI_VIEWSIGNERINFO_STRUCTA, *PCRYPTUI_VIEWSIGNERINFO_STRUCTA;

typedef struct tagCRYPTUI_VIEWSIGNERINFO_STRUCTW
{
    DWORD             dwSize;
    HWND              hwndParent;
    DWORD             dwFlags;
    LPCWSTR           szTitle;
    CMSG_SIGNER_INFO *pSignerInfo;
    HCRYPTMSG         hMsg;
    LPCSTR            pszOID;
    DWORD_PTR         dwReserved;
    DWORD             cStores;
    HCERTSTORE       *rghStores;
    DWORD             cPropSheetPages;
    LPCPROPSHEETPAGEW rgPropSheetPages;
} CRYPTUI_VIEWSIGNERINFO_STRUCTW, *PCRYPTUI_VIEWSIGNERINFO_STRUCTW;

BOOL WINAPI CryptUIDlgViewSignerInfoA(CRYPTUI_VIEWSIGNERINFO_STRUCTA *pcvsi);
BOOL WINAPI CryptUIDlgViewSignerInfoW(CRYPTUI_VIEWSIGNERINFO_STRUCTW *pcvsi);

#include <poppack.h>

#ifdef __cplusplus
}
#endif

#endif
