| 1 | /** |
| 2 | * This file has no copyright assigned and is placed in the Public Domain. |
| 3 | * This file is part of the mingw-w64 runtime package. |
| 4 | * No warranty is given; refer to the file DISCLAIMER.PD within this package. |
| 5 | */ |
| 6 | |
| 7 | #ifndef _INC_CARDMOD |
| 8 | #define _INC_CARDMOD |
| 9 | #include <wincrypt.h> |
| 10 | |
| 11 | #define CARD_BUFFER_SIZE_ONLY 0x20000000 |
| 12 | #define CARD_PADDING_INFO_PRESENT 0x40000000 |
| 13 | |
| 14 | #define CARD_PADDING_NONE 0 |
| 15 | #define CARD_PADDING_PKCS1 1 |
| 16 | #define CARD_PADDING_PSS 4 |
| 17 | |
| 18 | #define CARD_CREATE_CONTAINER_KEY_GEN 1 |
| 19 | #define CARD_CREATE_CONTAINER_KEY_IMPORT 2 |
| 20 | |
| 21 | #define AT_KEYEXCHANGE 1 |
| 22 | #define AT_SIGNATURE 2 |
| 23 | #define AT_ECDSA_P256 3 |
| 24 | #define AT_ECDSA_P384 4 |
| 25 | #define AT_ECDSA_P521 5 |
| 26 | #define AT_ECDHE_P256 6 |
| 27 | #define AT_ECDHE_P384 7 |
| 28 | #define AT_ECDHE_P521 8 |
| 29 | |
| 30 | #ifdef __cplusplus |
| 31 | extern "C" { |
| 32 | #endif |
| 33 | |
| 34 | #define InvalidAc 0 |
| 35 | |
| 36 | typedef enum _CARD_DIRECTORY_ACCESS_CONDITION { |
| 37 | UserCreateDeleteDirAc = 1, |
| 38 | AdminCreateDeleteDirAc = 2 |
| 39 | } CARD_DIRECTORY_ACCESS_CONDITION; |
| 40 | |
| 41 | typedef enum _CARD_FILE_ACCESS_CONDITION { |
| 42 | EveryoneReadUserWriteAc = 1, |
| 43 | UserWriteExecuteAc = 2, |
| 44 | EveryoneReadAdminWriteAc = 3, |
| 45 | UnknownAc = 4 |
| 46 | } CARD_FILE_ACCESS_CONDITION; |
| 47 | |
| 48 | typedef struct _CARD_SIGNING_INFO { |
| 49 | DWORD dwVersion; |
| 50 | BYTE bContainerIndex; |
| 51 | DWORD dwKeySpec; |
| 52 | DWORD dwSigningFlags; |
| 53 | ALG_ID aiHashAlg; |
| 54 | PBYTE pbData; |
| 55 | DWORD cbData; |
| 56 | PBYTE pbSignedData; |
| 57 | DWORD cbSignedData; |
| 58 | LPVOID pPaddingInfo; |
| 59 | DWORD dwPaddingType; |
| 60 | } CARD_SIGNING_INFO, *PCARD_SIGNING_INFO; |
| 61 | |
| 62 | typedef struct _CARD_CAPABILITIES { |
| 63 | DWORD dwVersion; |
| 64 | WINBOOL fCertificateCompression; |
| 65 | WINBOOL fKeyGen; |
| 66 | } CARD_CAPABILITIES, *PCARD_CAPABILITIES; |
| 67 | |
| 68 | typedef struct _CONTAINER_INFO { |
| 69 | DWORD dwVersion; |
| 70 | DWORD dwReserved; |
| 71 | DWORD cbSigPublicKey; |
| 72 | PBYTE pbSigPublicKey; |
| 73 | DWORD cbKeyExPublicKey; |
| 74 | PBYTE pbKeyExPublicKey; |
| 75 | } CONTAINER_INFO, *PCONTAINER_INFO; |
| 76 | |
| 77 | typedef LPVOID ( WINAPI *PFN_CSP_ALLOC )(SIZE_T Size); |
| 78 | typedef LPVOID ( WINAPI *PFN_CSP_REALLOC )(LPVOID Address,SIZE_T Size); |
| 79 | typedef VOID ( WINAPI *PFN_CSP_FREE )(LPVOID Address); |
| 80 | typedef DWORD ( WINAPI *PFN_CSP_CACHE_ADD_FILE )( |
| 81 | PVOID pvCacheContext, |
| 82 | LPWSTR wszTag, |
| 83 | DWORD dwFlags, |
| 84 | PBYTE pbData, |
| 85 | DWORD cbData |
| 86 | ); |
| 87 | |
| 88 | typedef DWORD ( WINAPI *PFN_CSP_CACHE_LOOKUP_FILE )( |
| 89 | PVOID pvCacheContext, |
| 90 | LPWSTR wszTag, |
| 91 | DWORD dwFlags, |
| 92 | PBYTE *ppbData, |
| 93 | PDWORD pcbData |
| 94 | ); |
| 95 | |
| 96 | typedef DWORD ( WINAPI *PFN_CSP_CACHE_DELETE_FILE )( |
| 97 | PVOID pvCacheContext, |
| 98 | LPWSTR wszTag, |
| 99 | DWORD dwFlags |
| 100 | ); |
| 101 | |
| 102 | typedef DWORD ( WINAPI *PFN_CSP_PAD_DATA )( |
| 103 | PCARD_SIGNING_INFO pSigningInfo, |
| 104 | DWORD cbMaxWidth, |
| 105 | DWORD *pcbPaddedBuffer, |
| 106 | PBYTE *ppbPaddedBuffer |
| 107 | ); |
| 108 | |
| 109 | typedef struct _CARD_DERIVE_KEY { |
| 110 | DWORD dwVersion; |
| 111 | DWORD dwFlags; |
| 112 | LPCWSTR pwszKDF; |
| 113 | BYTE bSecretAgreementIndex; |
| 114 | PVOID pParameterList; |
| 115 | PUCHAR pbDerivedKey; |
| 116 | DWORD cbDerivedKey; |
| 117 | } CARD_DERIVE_KEY, *PCARD_DERIVE_KEY; |
| 118 | |
| 119 | typedef struct _CARD_FILE_INFO { |
| 120 | DWORD dwVersion; |
| 121 | DWORD cbFileSize; |
| 122 | CARD_FILE_ACCESS_CONDITION AccessCondition; |
| 123 | } CARD_FILE_INFO, *PCARD_FILE_INFO; |
| 124 | |
| 125 | typedef struct _CARD_FREE_SPACE_INFO { |
| 126 | DWORD dwVersion; |
| 127 | DWORD dwBytesAvailable; |
| 128 | DWORD dwKeyContainersAvailable; |
| 129 | DWORD dwMaxKeyContainers; |
| 130 | } CARD_FREE_SPACE_INFO, *PCARD_FREE_SPACE_INFO; |
| 131 | |
| 132 | typedef struct _CARD_RSA_DECRYPT_INFO { |
| 133 | DWORD dwVersion; |
| 134 | BYTE bContainerIndex; |
| 135 | DWORD dwKeySpec; |
| 136 | PBYTE pbData; |
| 137 | DWORD cbData; |
| 138 | } CARD_RSA_DECRYPT_INFO, *PCARD_RSA_DECRYPT_INFO; |
| 139 | |
| 140 | typedef struct _CARD_DH_AGREEMENT_INFO { |
| 141 | DWORD dwVersion; |
| 142 | BYTE bContainerIndex; |
| 143 | DWORD dwFlags; |
| 144 | DWORD dwPublicKey; |
| 145 | PBYTE pbPublicKey; |
| 146 | PBYTE pbReserved; |
| 147 | DWORD cbReserved; |
| 148 | BYTE bSecretAgreementIndex; |
| 149 | } CARD_DH_AGREEMENT_INFO, *PCARD_DH_AGREEMENT_INFO; |
| 150 | |
| 151 | typedef struct _CARD_KEY_SIZES { |
| 152 | DWORD dwVersion; |
| 153 | DWORD dwMinimumBitlen; |
| 154 | DWORD dwMaximumBitlen; |
| 155 | DWORD dwIncrementalBitlen; |
| 156 | } CARD_KEY_SIZES, *PCARD_KEY_SIZES; |
| 157 | |
| 158 | typedef struct _CARD_DATA *PCARD_DATA; |
| 159 | |
| 160 | typedef DWORD (WINAPI *PFN_CARD_DELETE_CONTEXT)( |
| 161 | PCARD_DATA pCardData |
| 162 | ); |
| 163 | |
| 164 | typedef DWORD (WINAPI *PFN_CARD_QUERY_CAPABILITIES)( |
| 165 | PCARD_DATA pCardData, |
| 166 | PCARD_CAPABILITIES pCardCapabilities |
| 167 | ); |
| 168 | |
| 169 | typedef DWORD (WINAPI *PFN_CARD_DELETE_CONTAINER)( |
| 170 | PCARD_DATA pCardData, |
| 171 | BYTE bContainerIndex, |
| 172 | DWORD dwReserved |
| 173 | ); |
| 174 | |
| 175 | typedef DWORD (WINAPI *PFN_CARD_CREATE_CONTAINER)( |
| 176 | PCARD_DATA pCardData, |
| 177 | BYTE bContainerIndex, |
| 178 | DWORD dwFlags, |
| 179 | DWORD dwKeySpec, |
| 180 | DWORD dwKeySize, |
| 181 | PBYTE pbKeyData |
| 182 | ); |
| 183 | |
| 184 | typedef DWORD (WINAPI *PFN_CARD_GET_CONTAINER_INFO)( |
| 185 | PCARD_DATA pCardData, |
| 186 | BYTE bContainerIndex, |
| 187 | DWORD dwFlags, |
| 188 | PCONTAINER_INFO pContainerInfo |
| 189 | ); |
| 190 | |
| 191 | typedef DWORD (WINAPI *PFN_CARD_AUTHENTICATE_PIN)( |
| 192 | PCARD_DATA pCardData, |
| 193 | LPWSTR pwszUserId, |
| 194 | PBYTE pbPin, |
| 195 | DWORD cbPin, |
| 196 | PDWORD pcAttemptsRemaining |
| 197 | ); |
| 198 | |
| 199 | typedef DWORD (WINAPI *PFN_CARD_GET_CHALLENGE)( |
| 200 | PCARD_DATA pCardData, |
| 201 | PBYTE *ppbChallengeData, |
| 202 | PDWORD pcbChallengeData |
| 203 | ); |
| 204 | |
| 205 | typedef DWORD (WINAPI *PFN_CARD_AUTHENTICATE_CHALLENGE)( |
| 206 | PCARD_DATA pCardData, |
| 207 | PBYTE pbResponseData, |
| 208 | DWORD cbResponseData, |
| 209 | PDWORD pcAttemptsRemaining |
| 210 | ); |
| 211 | |
| 212 | typedef DWORD (WINAPI *PFN_CARD_UNBLOCK_PIN)( |
| 213 | PCARD_DATA pCardData, |
| 214 | LPWSTR pwszUserId, |
| 215 | PBYTE pbAuthenticationData, |
| 216 | DWORD cbAuthenticationData, |
| 217 | PBYTE pbNewPinData, |
| 218 | DWORD cbNewPinData, |
| 219 | DWORD cRetryCount, |
| 220 | DWORD dwFlags |
| 221 | ); |
| 222 | |
| 223 | typedef DWORD (WINAPI *PFN_CARD_CHANGE_AUTHENTICATOR)( |
| 224 | PCARD_DATA pCardData, |
| 225 | LPWSTR pwszUserId, |
| 226 | PBYTE pbCurrentAuthenticator, |
| 227 | DWORD cbCurrentAuthenticator, |
| 228 | PBYTE pbNewAuthenticator, |
| 229 | DWORD cbNewAuthenticator, |
| 230 | DWORD cRetryCount, |
| 231 | DWORD dwFlags, |
| 232 | PDWORD pcAttemptsRemaining |
| 233 | ); |
| 234 | |
| 235 | typedef DWORD (WINAPI *PFN_CARD_DEAUTHENTICATE)( |
| 236 | PCARD_DATA pCardData, |
| 237 | LPWSTR pwszUserId, |
| 238 | DWORD dwFlags |
| 239 | ); |
| 240 | |
| 241 | typedef DWORD (WINAPI *PFN_CARD_CREATE_DIRECTORY)( |
| 242 | PCARD_DATA pCardData, |
| 243 | LPSTR pszDirectory, |
| 244 | CARD_DIRECTORY_ACCESS_CONDITION AccessCondition |
| 245 | ); |
| 246 | |
| 247 | typedef DWORD (WINAPI *PFN_CARD_DELETE_DIRECTORY)( |
| 248 | PCARD_DATA pCardData, |
| 249 | LPSTR pszDirectoryName |
| 250 | ); |
| 251 | |
| 252 | typedef DWORD (WINAPI *PFN_CARD_CREATE_FILE)( |
| 253 | PCARD_DATA pCardData, |
| 254 | LPSTR pszDirectoryName, |
| 255 | LPSTR pszFileName, |
| 256 | DWORD cbInitialCreationSize, |
| 257 | CARD_FILE_ACCESS_CONDITION AccessCondition |
| 258 | ); |
| 259 | |
| 260 | typedef DWORD (WINAPI *PFN_CARD_READ_FILE)( |
| 261 | PCARD_DATA pCardData, |
| 262 | LPSTR pszDirectoryName, |
| 263 | LPSTR pszFileName, |
| 264 | DWORD dwFlags, |
| 265 | PBYTE *ppbData, |
| 266 | PDWORD pcbData |
| 267 | ); |
| 268 | |
| 269 | typedef DWORD (WINAPI *PFN_CARD_WRITE_FILE)( |
| 270 | PCARD_DATA pCardData, |
| 271 | LPSTR pszDirectoryName, |
| 272 | LPSTR pszFileName, |
| 273 | DWORD dwFlags, |
| 274 | PBYTE pbData, |
| 275 | DWORD cbData |
| 276 | ); |
| 277 | |
| 278 | typedef DWORD (WINAPI *PFN_CARD_DELETE_FILE)( |
| 279 | PCARD_DATA pCardData, |
| 280 | LPSTR pszDirectoryName, |
| 281 | LPSTR pszFileName, |
| 282 | DWORD dwFlags |
| 283 | ); |
| 284 | |
| 285 | typedef DWORD (WINAPI *PFN_CARD_ENUM_FILES)( |
| 286 | PCARD_DATA pCardData, |
| 287 | LPSTR pszDirectoryName, |
| 288 | LPSTR *pmszFileNames, |
| 289 | LPDWORD pdwcbFileName, |
| 290 | DWORD dwFlags |
| 291 | ); |
| 292 | |
| 293 | typedef DWORD (WINAPI *PFN_CARD_GET_FILE_INFO)( |
| 294 | PCARD_DATA pCardData, |
| 295 | LPSTR pszDirectoryName, |
| 296 | LPSTR pszFileName, |
| 297 | PCARD_FILE_INFO pCardFileInfo |
| 298 | ); |
| 299 | |
| 300 | typedef DWORD (WINAPI *PFN_CARD_QUERY_FREE_SPACE)( |
| 301 | PCARD_DATA pCardData, |
| 302 | DWORD dwFlags, |
| 303 | PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo |
| 304 | ); |
| 305 | |
| 306 | typedef DWORD (WINAPI *PFN_CARD_QUERY_KEY_SIZES)( |
| 307 | PCARD_DATA pCardData, |
| 308 | DWORD dwKeySpec, |
| 309 | DWORD dwFlags, |
| 310 | PCARD_KEY_SIZES pKeySizes |
| 311 | ); |
| 312 | |
| 313 | typedef DWORD (WINAPI *PFN_CARD_SIGN_DATA)( |
| 314 | PCARD_DATA pCardData, |
| 315 | PCARD_SIGNING_INFO pInfo |
| 316 | ); |
| 317 | |
| 318 | typedef DWORD (WINAPI *PFN_CARD_RSA_DECRYPT)( |
| 319 | PCARD_DATA pCardData, |
| 320 | PCARD_RSA_DECRYPT_INFO pInfo |
| 321 | ); |
| 322 | |
| 323 | typedef DWORD (WINAPI *PFN_CARD_CONSTRUCT_DH_AGREEMENT)( |
| 324 | PCARD_DATA pCardData, |
| 325 | PCARD_DH_AGREEMENT_INFO pAgreementInfo |
| 326 | ); |
| 327 | |
| 328 | #if (_WIN32_WINNT >= 0x0600) |
| 329 | typedef DWORD (WINAPI *PFN_CARD_DERIVE_KEY)( |
| 330 | PCARD_DATA pCardData, |
| 331 | PCARD_DERIVE_KEY pAgreementInfo |
| 332 | ); |
| 333 | |
| 334 | typedef DWORD (WINAPI *PFN_CARD_DESTROY_DH_AGREEMENT)( |
| 335 | PCARD_DATA pCardData, |
| 336 | BYTE bSecretAgreementIndex, |
| 337 | DWORD dwFlags |
| 338 | ); |
| 339 | |
| 340 | typedef DWORD (WINAPI *PFN_CSP_GET_DH_AGREEMENT)( |
| 341 | PCARD_DATA pCardData, |
| 342 | PVOID hSecretAgreement, |
| 343 | BYTE *pbSecretAgreementIndex, |
| 344 | DWORD dwFlags |
| 345 | ); |
| 346 | |
| 347 | #else |
| 348 | typedef LPVOID PFN_CARD_DERIVE_KEY; |
| 349 | typedef LPVOID PFN_CARD_DESTROY_DH_AGREEMENT; |
| 350 | typedef LPVOID PFN_CSP_GET_DH_AGREEMENT; |
| 351 | #endif /*(_WIN32_WINNT >= 0x0600)*/ |
| 352 | |
| 353 | typedef struct _CARD_DATA { |
| 354 | DWORD dwVersion; |
| 355 | PBYTE pbAtr; |
| 356 | DWORD cbAtr; |
| 357 | LPWSTR pwszCardName; |
| 358 | PFN_CSP_ALLOC pfnCspAlloc; |
| 359 | PFN_CSP_REALLOC pfnCspReAlloc; |
| 360 | PFN_CSP_FREE pfnCspFree; |
| 361 | PFN_CSP_CACHE_ADD_FILE pfnCspCacheAddFile; |
| 362 | PFN_CSP_CACHE_LOOKUP_FILE pfnCspCacheLookupFile; |
| 363 | PFN_CSP_CACHE_DELETE_FILE pfnCspCacheDeleteFile; |
| 364 | PVOID pvCacheContext; |
| 365 | PFN_CSP_PAD_DATA pfnCspPadData; |
| 366 | SCARDCONTEXT hSCardCtx; |
| 367 | SCARDHANDLE hScard; |
| 368 | PVOID pvVendorSpecific; |
| 369 | PFN_CARD_DELETE_CONTEXT pfnCardDeleteContext; |
| 370 | PFN_CARD_QUERY_CAPABILITIES pfnCardQueryCapabilities; |
| 371 | PFN_CARD_DELETE_CONTAINER pfnCardDeleteContainer; |
| 372 | PFN_CARD_CREATE_CONTAINER pfnCardCreateContainer; |
| 373 | PFN_CARD_GET_CONTAINER_INFO pfnCardGetContainerInfo; |
| 374 | PFN_CARD_AUTHENTICATE_PIN pfnCardAuthenticatePin; |
| 375 | PFN_CARD_GET_CHALLENGE pfnCardGetChallenge; |
| 376 | PFN_CARD_AUTHENTICATE_CHALLENGE pfnCardAuthenticateChallenge; |
| 377 | PFN_CARD_UNBLOCK_PIN pfnCardUnblockPin; |
| 378 | PFN_CARD_CHANGE_AUTHENTICATOR pfnCardChangeAuthenticator; |
| 379 | PFN_CARD_DEAUTHENTICATE pfnCardDeauthenticate; |
| 380 | PFN_CARD_CREATE_DIRECTORY pfnCardCreateDirectory; |
| 381 | PFN_CARD_DELETE_DIRECTORY pfnCardDeleteDirectory; |
| 382 | LPVOID pvUnused3; |
| 383 | LPVOID pvUnused4; |
| 384 | PFN_CARD_CREATE_FILE pfnCardCreateFile; |
| 385 | PFN_CARD_READ_FILE pfnCardReadFile; |
| 386 | PFN_CARD_WRITE_FILE pfnCardWriteFile; |
| 387 | PFN_CARD_DELETE_FILE pfnCardDeleteFile; |
| 388 | PFN_CARD_ENUM_FILES pfnCardEnumFiles; |
| 389 | PFN_CARD_GET_FILE_INFO pfnCardGetFileInfo; |
| 390 | PFN_CARD_QUERY_FREE_SPACE pfnCardQueryFreeSpace; |
| 391 | PFN_CARD_QUERY_KEY_SIZES pfnCardQueryKeySizes; |
| 392 | PFN_CARD_SIGN_DATA pfnCardSignData; |
| 393 | PFN_CARD_RSA_DECRYPT pfnCardRSADecrypt; |
| 394 | PFN_CARD_CONSTRUCT_DH_AGREEMENT pfnCardConstructDHAgreement; |
| 395 | PFN_CARD_DERIVE_KEY pfnCardDeriveKey; |
| 396 | PFN_CARD_DESTROY_DH_AGREEMENT pfnCardDestroyDHAgreement; |
| 397 | PFN_CSP_GET_DH_AGREEMENT pfnCspGetDHAgreement; |
| 398 | } CARD_DATA, *PCARD_DATA; |
| 399 | |
| 400 | DWORD WINAPI CardAcquireContext( |
| 401 | PCARD_DATA pCardData, |
| 402 | DWORD dwFlags |
| 403 | ); |
| 404 | |
| 405 | DWORD WINAPI CardDeleteContainer( |
| 406 | PCARD_DATA pCardData, |
| 407 | BYTE bContainerIndex, |
| 408 | DWORD dwReserved |
| 409 | ); |
| 410 | |
| 411 | #ifdef __cplusplus |
| 412 | } |
| 413 | #endif |
| 414 | #endif /*_INC_CARDMOD*/ |