/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#ifndef _INC_CARDMOD
#define _INC_CARDMOD
#include <wincrypt.h>
#define CARD_BUFFER_SIZE_ONLY 0x20000000
#define CARD_PADDING_INFO_PRESENT 0x40000000
#define CARD_PADDING_NONE 0
#define CARD_PADDING_PKCS1 1
#define CARD_PADDING_PSS 4
#define CARD_CREATE_CONTAINER_KEY_GEN 1
#define CARD_CREATE_CONTAINER_KEY_IMPORT 2
#define AT_KEYEXCHANGE 1
#define AT_SIGNATURE 2
#define AT_ECDSA_P256 3
#define AT_ECDSA_P384 4
#define AT_ECDSA_P521 5
#define AT_ECDHE_P256 6
#define AT_ECDHE_P384 7
#define AT_ECDHE_P521 8
#ifdef __cplusplus
extern "C" {
#endif
#define InvalidAc 0
typedef enum _CARD_DIRECTORY_ACCESS_CONDITION {
UserCreateDeleteDirAc = 1,
AdminCreateDeleteDirAc = 2
} CARD_DIRECTORY_ACCESS_CONDITION;
typedef enum _CARD_FILE_ACCESS_CONDITION {
EveryoneReadUserWriteAc = 1,
UserWriteExecuteAc = 2,
EveryoneReadAdminWriteAc = 3,
UnknownAc = 4
} CARD_FILE_ACCESS_CONDITION;
typedef struct _CARD_SIGNING_INFO {
DWORD dwVersion;
BYTE bContainerIndex;
DWORD dwKeySpec;
DWORD dwSigningFlags;
ALG_ID aiHashAlg;
PBYTE pbData;
DWORD cbData;
PBYTE pbSignedData;
DWORD cbSignedData;
LPVOID pPaddingInfo;
DWORD dwPaddingType;
} CARD_SIGNING_INFO, *PCARD_SIGNING_INFO;
typedef struct _CARD_CAPABILITIES {
DWORD dwVersion;
WINBOOL fCertificateCompression;
WINBOOL fKeyGen;
} CARD_CAPABILITIES, *PCARD_CAPABILITIES;
typedef struct _CONTAINER_INFO {
DWORD dwVersion;
DWORD dwReserved;
DWORD cbSigPublicKey;
PBYTE pbSigPublicKey;
DWORD cbKeyExPublicKey;
PBYTE pbKeyExPublicKey;
} CONTAINER_INFO, *PCONTAINER_INFO;
typedef LPVOID ( WINAPI *PFN_CSP_ALLOC )(SIZE_T Size);
typedef LPVOID ( WINAPI *PFN_CSP_REALLOC )(LPVOID Address,SIZE_T Size);
typedef VOID ( WINAPI *PFN_CSP_FREE )(LPVOID Address);
typedef DWORD ( WINAPI *PFN_CSP_CACHE_ADD_FILE )(
PVOID pvCacheContext,
LPWSTR wszTag,
DWORD dwFlags,
PBYTE pbData,
DWORD cbData
);
typedef DWORD ( WINAPI *PFN_CSP_CACHE_LOOKUP_FILE )(
PVOID pvCacheContext,
LPWSTR wszTag,
DWORD dwFlags,
PBYTE *ppbData,
PDWORD pcbData
);
typedef DWORD ( WINAPI *PFN_CSP_CACHE_DELETE_FILE )(
PVOID pvCacheContext,
LPWSTR wszTag,
DWORD dwFlags
);
typedef DWORD ( WINAPI *PFN_CSP_PAD_DATA )(
PCARD_SIGNING_INFO pSigningInfo,
DWORD cbMaxWidth,
DWORD *pcbPaddedBuffer,
PBYTE *ppbPaddedBuffer
);
typedef struct _CARD_DERIVE_KEY {
DWORD dwVersion;
DWORD dwFlags;
LPCWSTR pwszKDF;
BYTE bSecretAgreementIndex;
PVOID pParameterList;
PUCHAR pbDerivedKey;
DWORD cbDerivedKey;
} CARD_DERIVE_KEY, *PCARD_DERIVE_KEY;
typedef struct _CARD_FILE_INFO {
DWORD dwVersion;
DWORD cbFileSize;
CARD_FILE_ACCESS_CONDITION AccessCondition;
} CARD_FILE_INFO, *PCARD_FILE_INFO;
typedef struct _CARD_FREE_SPACE_INFO {
DWORD dwVersion;
DWORD dwBytesAvailable;
DWORD dwKeyContainersAvailable;
DWORD dwMaxKeyContainers;
} CARD_FREE_SPACE_INFO, *PCARD_FREE_SPACE_INFO;
typedef struct _CARD_RSA_DECRYPT_INFO {
DWORD dwVersion;
BYTE bContainerIndex;
DWORD dwKeySpec;
PBYTE pbData;
DWORD cbData;
} CARD_RSA_DECRYPT_INFO, *PCARD_RSA_DECRYPT_INFO;
typedef struct _CARD_DH_AGREEMENT_INFO {
DWORD dwVersion;
BYTE bContainerIndex;
DWORD dwFlags;
DWORD dwPublicKey;
PBYTE pbPublicKey;
PBYTE pbReserved;
DWORD cbReserved;
BYTE bSecretAgreementIndex;
} CARD_DH_AGREEMENT_INFO, *PCARD_DH_AGREEMENT_INFO;
typedef struct _CARD_KEY_SIZES {
DWORD dwVersion;
DWORD dwMinimumBitlen;
DWORD dwMaximumBitlen;
DWORD dwIncrementalBitlen;
} CARD_KEY_SIZES, *PCARD_KEY_SIZES;
typedef struct _CARD_DATA *PCARD_DATA;
typedef DWORD (WINAPI *PFN_CARD_DELETE_CONTEXT)(
PCARD_DATA pCardData
);
typedef DWORD (WINAPI *PFN_CARD_QUERY_CAPABILITIES)(
PCARD_DATA pCardData,
PCARD_CAPABILITIES pCardCapabilities
);
typedef DWORD (WINAPI *PFN_CARD_DELETE_CONTAINER)(
PCARD_DATA pCardData,
BYTE bContainerIndex,
DWORD dwReserved
);
typedef DWORD (WINAPI *PFN_CARD_CREATE_CONTAINER)(
PCARD_DATA pCardData,
BYTE bContainerIndex,
DWORD dwFlags,
DWORD dwKeySpec,
DWORD dwKeySize,
PBYTE pbKeyData
);
typedef DWORD (WINAPI *PFN_CARD_GET_CONTAINER_INFO)(
PCARD_DATA pCardData,
BYTE bContainerIndex,
DWORD dwFlags,
PCONTAINER_INFO pContainerInfo
);
typedef DWORD (WINAPI *PFN_CARD_AUTHENTICATE_PIN)(
PCARD_DATA pCardData,
LPWSTR pwszUserId,
PBYTE pbPin,
DWORD cbPin,
PDWORD pcAttemptsRemaining
);
typedef DWORD (WINAPI *PFN_CARD_GET_CHALLENGE)(
PCARD_DATA pCardData,
PBYTE *ppbChallengeData,
PDWORD pcbChallengeData
);
typedef DWORD (WINAPI *PFN_CARD_AUTHENTICATE_CHALLENGE)(
PCARD_DATA pCardData,
PBYTE pbResponseData,
DWORD cbResponseData,
PDWORD pcAttemptsRemaining
);
typedef DWORD (WINAPI *PFN_CARD_UNBLOCK_PIN)(
PCARD_DATA pCardData,
LPWSTR pwszUserId,
PBYTE pbAuthenticationData,
DWORD cbAuthenticationData,
PBYTE pbNewPinData,
DWORD cbNewPinData,
DWORD cRetryCount,
DWORD dwFlags
);
typedef DWORD (WINAPI *PFN_CARD_CHANGE_AUTHENTICATOR)(
PCARD_DATA pCardData,
LPWSTR pwszUserId,
PBYTE pbCurrentAuthenticator,
DWORD cbCurrentAuthenticator,
PBYTE pbNewAuthenticator,
DWORD cbNewAuthenticator,
DWORD cRetryCount,
DWORD dwFlags,
PDWORD pcAttemptsRemaining
);
typedef DWORD (WINAPI *PFN_CARD_DEAUTHENTICATE)(
PCARD_DATA pCardData,
LPWSTR pwszUserId,
DWORD dwFlags
);
typedef DWORD (WINAPI *PFN_CARD_CREATE_DIRECTORY)(
PCARD_DATA pCardData,
LPSTR pszDirectory,
CARD_DIRECTORY_ACCESS_CONDITION AccessCondition
);
typedef DWORD (WINAPI *PFN_CARD_DELETE_DIRECTORY)(
PCARD_DATA pCardData,
LPSTR pszDirectoryName
);
typedef DWORD (WINAPI *PFN_CARD_CREATE_FILE)(
PCARD_DATA pCardData,
LPSTR pszDirectoryName,
LPSTR pszFileName,
DWORD cbInitialCreationSize,
CARD_FILE_ACCESS_CONDITION AccessCondition
);
typedef DWORD (WINAPI *PFN_CARD_READ_FILE)(
PCARD_DATA pCardData,
LPSTR pszDirectoryName,
LPSTR pszFileName,
DWORD dwFlags,
PBYTE *ppbData,
PDWORD pcbData
);
typedef DWORD (WINAPI *PFN_CARD_WRITE_FILE)(
PCARD_DATA pCardData,
LPSTR pszDirectoryName,
LPSTR pszFileName,
DWORD dwFlags,
PBYTE pbData,
DWORD cbData
);
typedef DWORD (WINAPI *PFN_CARD_DELETE_FILE)(
PCARD_DATA pCardData,
LPSTR pszDirectoryName,
LPSTR pszFileName,
DWORD dwFlags
);
typedef DWORD (WINAPI *PFN_CARD_ENUM_FILES)(
PCARD_DATA pCardData,
LPSTR pszDirectoryName,
LPSTR *pmszFileNames,
LPDWORD pdwcbFileName,
DWORD dwFlags
);
typedef DWORD (WINAPI *PFN_CARD_GET_FILE_INFO)(
PCARD_DATA pCardData,
LPSTR pszDirectoryName,
LPSTR pszFileName,
PCARD_FILE_INFO pCardFileInfo
);
typedef DWORD (WINAPI *PFN_CARD_QUERY_FREE_SPACE)(
PCARD_DATA pCardData,
DWORD dwFlags,
PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo
);
typedef DWORD (WINAPI *PFN_CARD_QUERY_KEY_SIZES)(
PCARD_DATA pCardData,
DWORD dwKeySpec,
DWORD dwFlags,
PCARD_KEY_SIZES pKeySizes
);
typedef DWORD (WINAPI *PFN_CARD_SIGN_DATA)(
PCARD_DATA pCardData,
PCARD_SIGNING_INFO pInfo
);
typedef DWORD (WINAPI *PFN_CARD_RSA_DECRYPT)(
PCARD_DATA pCardData,
PCARD_RSA_DECRYPT_INFO pInfo
);
typedef DWORD (WINAPI *PFN_CARD_CONSTRUCT_DH_AGREEMENT)(
PCARD_DATA pCardData,
PCARD_DH_AGREEMENT_INFO pAgreementInfo
);
#if (_WIN32_WINNT >= 0x0600)
typedef DWORD (WINAPI *PFN_CARD_DERIVE_KEY)(
PCARD_DATA pCardData,
PCARD_DERIVE_KEY pAgreementInfo
);
typedef DWORD (WINAPI *PFN_CARD_DESTROY_DH_AGREEMENT)(
PCARD_DATA pCardData,
BYTE bSecretAgreementIndex,
DWORD dwFlags
);
typedef DWORD (WINAPI *PFN_CSP_GET_DH_AGREEMENT)(
PCARD_DATA pCardData,
PVOID hSecretAgreement,
BYTE *pbSecretAgreementIndex,
DWORD dwFlags
);
#else
typedef LPVOID PFN_CARD_DERIVE_KEY;
typedef LPVOID PFN_CARD_DESTROY_DH_AGREEMENT;
typedef LPVOID PFN_CSP_GET_DH_AGREEMENT;
#endif /*(_WIN32_WINNT >= 0x0600)*/
typedef struct _CARD_DATA {
DWORD dwVersion;
PBYTE pbAtr;
DWORD cbAtr;
LPWSTR pwszCardName;
PFN_CSP_ALLOC pfnCspAlloc;
PFN_CSP_REALLOC pfnCspReAlloc;
PFN_CSP_FREE pfnCspFree;
PFN_CSP_CACHE_ADD_FILE pfnCspCacheAddFile;
PFN_CSP_CACHE_LOOKUP_FILE pfnCspCacheLookupFile;
PFN_CSP_CACHE_DELETE_FILE pfnCspCacheDeleteFile;
PVOID pvCacheContext;
PFN_CSP_PAD_DATA pfnCspPadData;
SCARDCONTEXT hSCardCtx;
SCARDHANDLE hScard;
PVOID pvVendorSpecific;
PFN_CARD_DELETE_CONTEXT pfnCardDeleteContext;
PFN_CARD_QUERY_CAPABILITIES pfnCardQueryCapabilities;
PFN_CARD_DELETE_CONTAINER pfnCardDeleteContainer;
PFN_CARD_CREATE_CONTAINER pfnCardCreateContainer;
PFN_CARD_GET_CONTAINER_INFO pfnCardGetContainerInfo;
PFN_CARD_AUTHENTICATE_PIN pfnCardAuthenticatePin;
PFN_CARD_GET_CHALLENGE pfnCardGetChallenge;
PFN_CARD_AUTHENTICATE_CHALLENGE pfnCardAuthenticateChallenge;
PFN_CARD_UNBLOCK_PIN pfnCardUnblockPin;
PFN_CARD_CHANGE_AUTHENTICATOR pfnCardChangeAuthenticator;
PFN_CARD_DEAUTHENTICATE pfnCardDeauthenticate;
PFN_CARD_CREATE_DIRECTORY pfnCardCreateDirectory;
PFN_CARD_DELETE_DIRECTORY pfnCardDeleteDirectory;
LPVOID pvUnused3;
LPVOID pvUnused4;
PFN_CARD_CREATE_FILE pfnCardCreateFile;
PFN_CARD_READ_FILE pfnCardReadFile;
PFN_CARD_WRITE_FILE pfnCardWriteFile;
PFN_CARD_DELETE_FILE pfnCardDeleteFile;
PFN_CARD_ENUM_FILES pfnCardEnumFiles;
PFN_CARD_GET_FILE_INFO pfnCardGetFileInfo;
PFN_CARD_QUERY_FREE_SPACE pfnCardQueryFreeSpace;
PFN_CARD_QUERY_KEY_SIZES pfnCardQueryKeySizes;
PFN_CARD_SIGN_DATA pfnCardSignData;
PFN_CARD_RSA_DECRYPT pfnCardRSADecrypt;
PFN_CARD_CONSTRUCT_DH_AGREEMENT pfnCardConstructDHAgreement;
PFN_CARD_DERIVE_KEY pfnCardDeriveKey;
PFN_CARD_DESTROY_DH_AGREEMENT pfnCardDestroyDHAgreement;
PFN_CSP_GET_DH_AGREEMENT pfnCspGetDHAgreement;
} CARD_DATA, *PCARD_DATA;
DWORD WINAPI CardAcquireContext(
PCARD_DATA pCardData,
DWORD dwFlags
);
DWORD WINAPI CardDeleteContainer(
PCARD_DATA pCardData,
BYTE bContainerIndex,
DWORD dwReserved
);
#ifdef __cplusplus
}
#endif
#endif /*_INC_CARDMOD*/