/** * 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*/