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