1 extern "C"
2 {
3 #include "globmdrv.h"
4 #include "bcrypt.h"
5 }
6
7
8 /****************************************************************************************************/
9
10 extern BYTE gbLoggedOn;
11 extern VFO_CONTAINER_INFO gContainerInfo[MAX_CONTAINERS];
12
13 /****************************************************************************************************/
14
15 //
16 // Function: CardRSADecrypt
17 //
18 // Purpose: Perform a private key decryption on the supplied data. The
19 // card module should assume that pbData is the length of the
20 // key modulus.
21 //
22
23 #define WHERE "CardRSADecrypt()"
CardRSADecrypt(__in PCARD_DATA pCardData,__inout PCARD_RSA_DECRYPT_INFO pInfo)24 DWORD WINAPI CardRSADecrypt
25 (
26 __in PCARD_DATA pCardData,
27 __inout PCARD_RSA_DECRYPT_INFO pInfo
28 )
29 {
30 DWORD dwReturn = 0;
31 LogTrace(LOGTYPE_INFO, WHERE, "Enter API...");
32
33 CLEANUP(SCARD_E_UNSUPPORTED_FEATURE);
34
35 cleanup:
36 LogTrace(LOGTYPE_INFO, WHERE, "Exit API...");
37 return(dwReturn);
38 }
39 #undef WHERE
40
41 /****************************************************************************************************/
42
43 //
44 // Function: CardConstructDHAgreement
45 //
46 // Purpose: compute a DH secret agreement from a ECDH key on the card
47 // and the public portion of another ECDH key
48 //
49
50 #define WHERE "CardConstructDHAgreement()"
CardConstructDHAgreement(__in PCARD_DATA pCardData,__in PCARD_DH_AGREEMENT_INFO pAgreementInfo)51 DWORD WINAPI CardConstructDHAgreement
52 (
53 __in PCARD_DATA pCardData,
54 __in PCARD_DH_AGREEMENT_INFO pAgreementInfo
55 )
56 {
57 DWORD dwReturn = 0;
58 LogTrace(LOGTYPE_INFO, WHERE, "Enter API...");
59
60 /*
61 * For RSA-only card minidrivers, this entry point is not defined and is
62 * set to NULL in the CARD_DATA structure returned from CardAcquireContext
63 */
64 CLEANUP(SCARD_E_UNSUPPORTED_FEATURE);
65
66 cleanup:
67 LogTrace(LOGTYPE_INFO, WHERE, "Exit API...");
68 return(dwReturn);
69 }
70 #undef WHERE
71
72 /****************************************************************************************************/
73
74 //
75 // Function: CardDeriveKey
76 //
77 // Purpose: Generate a dervived session key using a generated agreed
78 // secret and various other parameters.
79 //
80
81 #define WHERE "CardDeriveKey()"
CardDeriveKey(__in PCARD_DATA pCardData,__in PCARD_DERIVE_KEY pAgreementInfo)82 DWORD WINAPI CardDeriveKey
83 (
84 __in PCARD_DATA pCardData,
85 __in PCARD_DERIVE_KEY pAgreementInfo
86 )
87 {
88 DWORD dwReturn = 0;
89 LogTrace(LOGTYPE_INFO, WHERE, "Enter API...");
90
91 /*
92 * For RSA-only card minidrivers, this entry point is not defined and is
93 * set to NULL in the CARD_DATA structure returned from CardAcquireContext
94 */
95 CLEANUP(SCARD_E_UNSUPPORTED_FEATURE);
96
97 cleanup:
98 LogTrace(LOGTYPE_INFO, WHERE, "Exit API...");
99 return(dwReturn);
100 }
101 #undef WHERE
102
103 /****************************************************************************************************/
104
105 //
106 // Function: CardDestroyDHAgreement
107 //
108
109 #define WHERE "CardDestroyDHAgreement()"
CardDestroyDHAgreement(__in PCARD_DATA pCardData,__in BYTE bSecretAgreementIndex,__in DWORD dwFlags)110 DWORD WINAPI CardDestroyDHAgreement
111 (
112 __in PCARD_DATA pCardData,
113 __in BYTE bSecretAgreementIndex,
114 __in DWORD dwFlags
115 )
116 {
117 DWORD dwReturn = 0;
118 LogTrace(LOGTYPE_INFO, WHERE, "Enter API...");
119
120 /*
121 * For RSA-only card minidrivers, this entry point is not defined and is
122 * set to NULL in the CARD_DATA structure returned from CardAcquireContext
123 */
124 CLEANUP(SCARD_E_UNSUPPORTED_FEATURE);
125
126 cleanup:
127 LogTrace(LOGTYPE_INFO, WHERE, "Exit API...");
128 return(dwReturn);
129 }
130 #undef WHERE
131
132 /****************************************************************************************************/
133
134 //
135 // Function: CardSignData
136 //
137 // Purpose: Sign inupt data using a specified key
138 //
139
140 #define WHERE "CardSignData()"
CardSignData(__in PCARD_DATA pCardData,__in PCARD_SIGNING_INFO pInfo)141 DWORD WINAPI CardSignData
142 (
143 __in PCARD_DATA pCardData,
144 __in PCARD_SIGNING_INFO pInfo
145 )
146 {
147 DWORD dwReturn = 0;
148
149 BCRYPT_PKCS1_PADDING_INFO PkcsPadInfo;
150
151 LogTrace(LOGTYPE_INFO, WHERE, "Enter API...");
152
153 /********************/
154 /* Check Parameters */
155 /********************/
156 if ( pCardData == NULL )
157 {
158 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pCardData]");
159 CLEANUP(SCARD_E_INVALID_PARAMETER);
160 }
161 if ( pInfo == NULL )
162 {
163 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pInfo]");
164 CLEANUP(SCARD_E_INVALID_PARAMETER);
165 }
166
167 if ( ( pInfo->dwVersion != CARD_SIGNING_INFO_BASIC_VERSION ) &&
168 ( pInfo->dwVersion != CARD_SIGNING_INFO_CURRENT_VERSION ) )
169 {
170 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pInfo->dwVersion][0x%X]", pInfo->dwVersion);
171 CLEANUP(ERROR_REVISION_MISMATCH);
172 }
173
174 if ( pInfo->pbData == NULL )
175 {
176 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pInfo->pbData]");
177 CLEANUP(SCARD_E_INVALID_PARAMETER);
178 }
179
180 LogTrace(LOGTYPE_ERROR, WHERE, "[pInfo->bContainerIndex][0x%X]", pInfo->bContainerIndex);
181 if ( ( pInfo->bContainerIndex != 0 ) &&
182 ( pInfo->bContainerIndex != 1 ) )
183 {
184 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pInfo->bContainerIndex]");
185 CLEANUP(SCARD_E_NO_KEY_CONTAINER);
186 }
187 LogTrace(LOGTYPE_ERROR, WHERE, "[pInfo->dwKeySpec][0x%X]", pInfo->dwKeySpec);
188 if ( pInfo->dwKeySpec != AT_SIGNATURE )
189 {
190 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pInfo->dwKeySpec]");
191 CLEANUP(SCARD_E_INVALID_PARAMETER);
192 }
193
194 LogTrace(LOGTYPE_ERROR, WHERE, "[pInfo->dwSigningFlags][0x%X]", pInfo->dwSigningFlags);
195 if ( pInfo->dwSigningFlags == 0xFFFFFFFF )
196 {
197 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pInfo->dwSigningFlags]");
198 CLEANUP(SCARD_E_INVALID_PARAMETER);
199 }
200
201 if ( ( pInfo->dwSigningFlags & CARD_BUFFER_SIZE_ONLY ) == CARD_BUFFER_SIZE_ONLY)
202 {
203 LogTrace(LOGTYPE_INFO, WHERE, "pInfo->dwSigningFlags: CARD_BUFFER_SIZE_ONLY");
204
205 pInfo->cbSignedData = 128;
206 CLEANUP(SCARD_S_SUCCESS);
207 }
208
209 if ( ( pInfo->dwSigningFlags & CARD_PADDING_INFO_PRESENT ) == CARD_PADDING_INFO_PRESENT)
210 {
211 LogTrace(LOGTYPE_INFO, WHERE, "pInfo->dwSigningFlags: CARD_PADDING_INFO_PRESENT");
212 switch(pInfo->dwPaddingType)
213 {
214 case CARD_PADDING_PKCS1:
215 LogTrace(LOGTYPE_INFO, WHERE, "pInfo->dwPaddingType: CARD_PADDING_PKCS1");
216 memcpy (&PkcsPadInfo, pInfo->pPaddingInfo, sizeof(PkcsPadInfo));
217 break;
218 case CARD_PADDING_PSS:
219 LogTrace(LOGTYPE_INFO, WHERE, "pInfo->dwPaddingType: CARD_PADDING_PSS");
220 break;
221 case CARD_PADDING_NONE:
222 LogTrace(LOGTYPE_INFO, WHERE, "pInfo->dwPaddingType: CARD_PADDING_NONE");
223 break;
224 default:
225 LogTrace(LOGTYPE_INFO, WHERE, "pInfo->dwPaddingType: UNSUPPORTED");
226 break;
227 }
228 }
229
230 LogTrace(LOGTYPE_ERROR, WHERE, "[pInfo->aiHashAlg][0x%X]");
231 if ( pInfo->aiHashAlg == 0xFFFFFFFF )
232 {
233 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pInfo->aiHashAlg][0x%X]",pInfo->aiHashAlg);
234 CLEANUP(SCARD_E_INVALID_PARAMETER);
235 }
236 if ( ( pInfo->aiHashAlg != CALG_MD2 ) &&
237 ( pInfo->aiHashAlg != CALG_MD4 ) &&
238 ( pInfo->aiHashAlg != CALG_MD5 ) &&
239 ( pInfo->aiHashAlg != CALG_SHA1 ) &&
240 ( pInfo->aiHashAlg != CALG_SHA_256 ) &&
241 ( pInfo->aiHashAlg != CALG_SHA_384 ) &&
242 ( pInfo->aiHashAlg != CALG_SHA_512 ) )
243 {
244 LogTrace(LOGTYPE_ERROR, WHERE, "UNSUPPORTED parameter [pInfo->aiHashAlg][0x%X]",pInfo->aiHashAlg);
245 CLEANUP(SCARD_E_UNSUPPORTED_FEATURE);
246 }
247
248 if ( gbLoggedOn == 0 )
249 {
250 LogTrace(LOGTYPE_ERROR, WHERE, "Not logged on...");
251 CLEANUP( SCARD_W_SECURITY_VIOLATION);
252 }
253
254 #ifdef _DEBUG
255 LogTrace(LOGTYPE_INFO, WHERE, "Data to be Signed...[%d]", pInfo->cbData);
256 LogDump (pInfo->cbData, (char *)pInfo->pbData);
257 #endif
258
259 dwReturn = BeidSignData(pCardData,
260 pInfo->aiHashAlg,
261 pInfo->cbData,
262 pInfo->pbData,
263 &(pInfo->cbSignedData),
264 &(pInfo->pbSignedData));
265 if ( dwReturn != 0 )
266 {
267 LogTrace(LOGTYPE_ERROR, WHERE, "BeidSignData() returned [0x%X]", dwReturn);
268 CLEANUP(dwReturn);
269 }
270
271 #ifdef _DEBUG
272 LogTrace(LOGTYPE_INFO, WHERE, "Signature Data...[%d]", pInfo->cbSignedData);
273 LogDump (pInfo->cbSignedData, (char *)pInfo->pbSignedData);
274 #endif
275
276 cleanup:
277 LogTrace(LOGTYPE_INFO, WHERE, "Exit API...");
278 return(dwReturn);
279 }
280 #undef WHERE
281
282 /****************************************************************************************************/
283
284 //
285 // Function: CardQueryKeySizes
286 //
287
288 #define WHERE "CardQueryKeySizes()"
CardQueryKeySizes(__in PCARD_DATA pCardData,__in DWORD dwKeySpec,__in DWORD dwFlags,__in PCARD_KEY_SIZES pKeySizes)289 DWORD WINAPI CardQueryKeySizes
290 (
291 __in PCARD_DATA pCardData,
292 __in DWORD dwKeySpec,
293 __in DWORD dwFlags,
294 __in PCARD_KEY_SIZES pKeySizes
295 )
296 {
297 DWORD dwReturn = 0;
298
299 LogTrace(LOGTYPE_INFO, WHERE, "Enter API...");
300
301 /********************/
302 /* Check Parameters */
303 /********************/
304 if ( pCardData == NULL )
305 {
306 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pCardData]");
307 CLEANUP(SCARD_E_INVALID_PARAMETER);
308 }
309 if ( dwKeySpec != AT_SIGNATURE )
310 {
311 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [dwKeySpec]");
312 CLEANUP(SCARD_E_INVALID_PARAMETER);
313 }
314 if ( dwFlags != 0 )
315 {
316 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [dwKeySpec]");
317 CLEANUP(SCARD_E_INVALID_PARAMETER);
318 }
319 if ( pKeySizes == NULL )
320 {
321 LogTrace(LOGTYPE_ERROR, WHERE, "Invalid parameter [pKeySizes]");
322 CLEANUP(SCARD_E_INVALID_PARAMETER);
323 }
324
325 pKeySizes->dwVersion = CARD_KEY_SIZES_CURRENT_VERSION;
326 pKeySizes->dwMinimumBitlen = 1024;
327 pKeySizes->dwDefaultBitlen = 1024;
328 pKeySizes->dwMaximumBitlen = 1024;
329 pKeySizes->dwIncrementalBitlen = 0;
330
331 cleanup:
332 LogTrace(LOGTYPE_INFO, WHERE, "Exit API...");
333 return(dwReturn);
334 }
335 #undef WHERE
336
337 /****************************************************************************************************/
338