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