master
  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
 31extern "C" {
 32#endif
 33
 34#define InvalidAc 0
 35
 36typedef enum _CARD_DIRECTORY_ACCESS_CONDITION {
 37  UserCreateDeleteDirAc    = 1,
 38  AdminCreateDeleteDirAc   = 2 
 39} CARD_DIRECTORY_ACCESS_CONDITION;
 40
 41typedef enum _CARD_FILE_ACCESS_CONDITION {
 42  EveryoneReadUserWriteAc    = 1,
 43  UserWriteExecuteAc         = 2,
 44  EveryoneReadAdminWriteAc   = 3,
 45  UnknownAc                  = 4 
 46} CARD_FILE_ACCESS_CONDITION;
 47
 48typedef 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
 62typedef struct _CARD_CAPABILITIES {
 63  DWORD   dwVersion;
 64  WINBOOL fCertificateCompression;
 65  WINBOOL fKeyGen;
 66} CARD_CAPABILITIES, *PCARD_CAPABILITIES;
 67
 68typedef 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
 77typedef LPVOID ( WINAPI *PFN_CSP_ALLOC )(SIZE_T Size);
 78typedef LPVOID ( WINAPI *PFN_CSP_REALLOC )(LPVOID Address,SIZE_T Size);
 79typedef VOID ( WINAPI *PFN_CSP_FREE )(LPVOID Address);
 80typedef DWORD ( WINAPI *PFN_CSP_CACHE_ADD_FILE )(
 81  PVOID pvCacheContext,
 82  LPWSTR wszTag,
 83  DWORD dwFlags,
 84  PBYTE pbData,
 85  DWORD cbData
 86);
 87
 88typedef DWORD ( WINAPI *PFN_CSP_CACHE_LOOKUP_FILE )(
 89  PVOID pvCacheContext,
 90  LPWSTR wszTag,
 91  DWORD dwFlags,
 92  PBYTE *ppbData,
 93  PDWORD pcbData
 94);
 95
 96typedef DWORD ( WINAPI *PFN_CSP_CACHE_DELETE_FILE )(
 97  PVOID pvCacheContext,
 98  LPWSTR wszTag,
 99  DWORD dwFlags
100);
101
102typedef DWORD ( WINAPI *PFN_CSP_PAD_DATA )(
103  PCARD_SIGNING_INFO pSigningInfo,
104  DWORD cbMaxWidth,
105  DWORD *pcbPaddedBuffer,
106  PBYTE *ppbPaddedBuffer
107);
108
109typedef 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
119typedef struct _CARD_FILE_INFO {
120  DWORD                      dwVersion;
121  DWORD                      cbFileSize;
122  CARD_FILE_ACCESS_CONDITION AccessCondition;
123} CARD_FILE_INFO, *PCARD_FILE_INFO;
124
125typedef 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
132typedef 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
140typedef 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
151typedef struct _CARD_KEY_SIZES {
152  DWORD dwVersion;
153  DWORD dwMinimumBitlen;
154  DWORD dwMaximumBitlen;
155  DWORD dwIncrementalBitlen;
156} CARD_KEY_SIZES, *PCARD_KEY_SIZES;
157
158typedef struct _CARD_DATA *PCARD_DATA;
159
160typedef DWORD (WINAPI *PFN_CARD_DELETE_CONTEXT)(
161  PCARD_DATA pCardData
162);
163
164typedef DWORD (WINAPI *PFN_CARD_QUERY_CAPABILITIES)(
165  PCARD_DATA pCardData,
166  PCARD_CAPABILITIES pCardCapabilities
167);
168
169typedef DWORD (WINAPI *PFN_CARD_DELETE_CONTAINER)(
170  PCARD_DATA pCardData,
171  BYTE bContainerIndex,
172  DWORD dwReserved
173);
174
175typedef 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
184typedef DWORD (WINAPI *PFN_CARD_GET_CONTAINER_INFO)(
185  PCARD_DATA pCardData,
186  BYTE bContainerIndex,
187  DWORD dwFlags,
188  PCONTAINER_INFO pContainerInfo
189);
190
191typedef DWORD (WINAPI *PFN_CARD_AUTHENTICATE_PIN)(
192  PCARD_DATA pCardData,
193  LPWSTR pwszUserId,
194  PBYTE pbPin,
195  DWORD cbPin,
196  PDWORD pcAttemptsRemaining
197);
198
199typedef DWORD (WINAPI *PFN_CARD_GET_CHALLENGE)(
200  PCARD_DATA pCardData,
201  PBYTE *ppbChallengeData,
202  PDWORD pcbChallengeData
203);
204
205typedef DWORD (WINAPI *PFN_CARD_AUTHENTICATE_CHALLENGE)(
206  PCARD_DATA pCardData,
207  PBYTE pbResponseData,
208  DWORD cbResponseData,
209  PDWORD pcAttemptsRemaining
210);
211
212typedef 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
223typedef 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
235typedef DWORD (WINAPI *PFN_CARD_DEAUTHENTICATE)(
236  PCARD_DATA pCardData,
237  LPWSTR pwszUserId,
238  DWORD dwFlags
239);
240
241typedef DWORD (WINAPI *PFN_CARD_CREATE_DIRECTORY)(
242  PCARD_DATA pCardData,
243  LPSTR pszDirectory,
244  CARD_DIRECTORY_ACCESS_CONDITION AccessCondition
245);
246
247typedef DWORD (WINAPI *PFN_CARD_DELETE_DIRECTORY)(
248  PCARD_DATA pCardData,
249  LPSTR pszDirectoryName
250);
251
252typedef 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
260typedef 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
269typedef 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
278typedef DWORD (WINAPI *PFN_CARD_DELETE_FILE)(
279  PCARD_DATA pCardData,
280  LPSTR pszDirectoryName,
281  LPSTR pszFileName,
282  DWORD dwFlags
283);
284
285typedef DWORD (WINAPI *PFN_CARD_ENUM_FILES)(
286  PCARD_DATA pCardData,
287  LPSTR pszDirectoryName,
288  LPSTR *pmszFileNames,
289  LPDWORD pdwcbFileName,
290  DWORD dwFlags
291);
292
293typedef DWORD (WINAPI *PFN_CARD_GET_FILE_INFO)(
294  PCARD_DATA pCardData,
295  LPSTR pszDirectoryName,
296  LPSTR pszFileName,
297  PCARD_FILE_INFO pCardFileInfo
298);
299
300typedef DWORD (WINAPI *PFN_CARD_QUERY_FREE_SPACE)(
301  PCARD_DATA pCardData,
302  DWORD dwFlags,
303  PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo
304);
305
306typedef DWORD (WINAPI *PFN_CARD_QUERY_KEY_SIZES)(
307  PCARD_DATA pCardData,
308  DWORD dwKeySpec,
309  DWORD dwFlags,
310  PCARD_KEY_SIZES pKeySizes
311);
312
313typedef DWORD (WINAPI *PFN_CARD_SIGN_DATA)(
314  PCARD_DATA pCardData,
315  PCARD_SIGNING_INFO pInfo
316);
317
318typedef DWORD (WINAPI *PFN_CARD_RSA_DECRYPT)(
319  PCARD_DATA pCardData,
320  PCARD_RSA_DECRYPT_INFO pInfo
321);
322
323typedef DWORD (WINAPI *PFN_CARD_CONSTRUCT_DH_AGREEMENT)(
324  PCARD_DATA pCardData,
325  PCARD_DH_AGREEMENT_INFO pAgreementInfo
326);
327
328#if (_WIN32_WINNT >= 0x0600)
329typedef DWORD (WINAPI *PFN_CARD_DERIVE_KEY)(
330  PCARD_DATA pCardData,
331  PCARD_DERIVE_KEY pAgreementInfo
332);
333
334typedef DWORD (WINAPI *PFN_CARD_DESTROY_DH_AGREEMENT)(
335  PCARD_DATA pCardData,
336  BYTE bSecretAgreementIndex,
337  DWORD dwFlags
338);
339
340typedef DWORD (WINAPI *PFN_CSP_GET_DH_AGREEMENT)(
341  PCARD_DATA pCardData,
342  PVOID hSecretAgreement,
343  BYTE *pbSecretAgreementIndex,
344  DWORD dwFlags
345);
346
347#else
348typedef LPVOID PFN_CARD_DERIVE_KEY;
349typedef LPVOID PFN_CARD_DESTROY_DH_AGREEMENT;
350typedef LPVOID PFN_CSP_GET_DH_AGREEMENT;
351#endif /*(_WIN32_WINNT >= 0x0600)*/
352
353typedef 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
400DWORD WINAPI CardAcquireContext(
401  PCARD_DATA pCardData,
402  DWORD dwFlags
403);
404
405DWORD WINAPI CardDeleteContainer(
406  PCARD_DATA pCardData,
407  BYTE bContainerIndex,
408  DWORD dwReserved
409);
410
411#ifdef __cplusplus
412}
413#endif
414#endif /*_INC_CARDMOD*/