/[openpgpmdrv]/trunk/OpenPGPminidriver/CardCryptographicOperations.c
ViewVC logotype

Annotation of /trunk/OpenPGPminidriver/CardCryptographicOperations.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5 - (hide annotations)
Tue Mar 2 18:54:34 2010 UTC (15 years, 2 months ago) by vletoux
File MIME type: text/plain
File size: 8273 byte(s)
authentication working
1 vletoux 1 /* OpenPGP Smart Card Mini Driver
2     Copyright (C) 2009 Vincent Le Toux
3    
4     This library is Free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License version 2.1 as published by the Free Software Foundation.
7    
8     This library is distributed in the hope that it will be useful,
9     but WITHOUT ANY WARRANTY; without even the implied warranty of
10     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11     Lesser General Public License for more details.
12    
13     You should have received a copy of the GNU Lesser General Public
14     License along with this library; if not, write to the Free Software
15     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16     */
17    
18     #include <windows.h>
19     #include <cardmod.h>
20     #include "Tracing.h"
21     #include "Context.h"
22     #include "CryptoOperations.h"
23    
24     // 4.7 Cryptographic operations
25    
26     /** This function performs an RSA decryption operation on the passed buffer
27     by using the private key that a container index refers to. Note that for
28     ECC-only smart cards, this entry point is not defined and is set to NULL
29     in the returned CARD_DATA structure from CardAcquireContext. This operation
30     is restricted to a single buffer of a size equal to the key modulus.*/
31    
32     DWORD WINAPI CardRSADecrypt(
33     __in PCARD_DATA pCardData,
34     __inout PCARD_RSA_DECRYPT_INFO pInfo
35     )
36     {
37     DWORD dwReturn = 0;
38    
39     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
40     __try
41     {
42     if ( pCardData == NULL )
43     {
44     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
45     dwReturn = SCARD_E_INVALID_PARAMETER;
46     __leave;
47     }
48    
49     if ( pInfo == NULL )
50     {
51     Trace(WINEVENT_LEVEL_ERROR, L"pInfo == NULL");
52     dwReturn = SCARD_E_INVALID_PARAMETER;
53     __leave;
54     }
55     if ( pInfo->pbData == NULL )
56     {
57     Trace(WINEVENT_LEVEL_ERROR, L"pInfo->pbData == NULL");
58     dwReturn = SCARD_E_INVALID_PARAMETER;
59     __leave;
60     }
61     if (pInfo->dwVersion < CARD_RSA_KEY_DECRYPT_INFO_CURRENT_VERSION
62     && pCardData->dwVersion == CARD_DATA_CURRENT_VERSION)
63     {
64     Trace(WINEVENT_LEVEL_ERROR, L"ERROR_REVISION_MISMATCH");
65     dwReturn = ERROR_REVISION_MISMATCH;
66     __leave;
67     }
68     if (pInfo->dwKeySpec != AT_KEYEXCHANGE)
69     {
70     Trace(WINEVENT_LEVEL_ERROR, L"AT_KEYEXCHANGE %d", pInfo->dwKeySpec);
71     dwReturn = SCARD_E_NO_KEY_CONTAINER ;
72     __leave;
73     }
74     if (pInfo->bContainerIndex != Confidentiality)
75     {
76     Trace(WINEVENT_LEVEL_ERROR, L"Confidentiality %d", pInfo->bContainerIndex);
77     dwReturn = SCARD_E_NO_KEY_CONTAINER ;
78     __leave;
79     }
80     dwReturn = CheckContext(pCardData);
81     if ( dwReturn)
82     {
83     __leave;
84     }
85     dwReturn = SCardDecrypt(pCardData, pInfo);
86     }
87     __finally
88     {
89     }
90     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
91     return dwReturn;
92     }
93    
94    
95     /** The CardSignData function signs a block of unpadded data. This entry either performs
96     padding on the card or pads the data by using the PFN_CSP_PAD_DATA callback. All card
97     minidrivers must support this entry point.*/
98    
99     DWORD WINAPI CardSignData(
100     __in PCARD_DATA pCardData,
101     __in PCARD_SIGNING_INFO pInfo
102     )
103     {
104     DWORD dwReturn = 0;
105    
106     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
107     __try
108     {
109     if ( pCardData == NULL )
110     {
111     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
112     dwReturn = SCARD_E_INVALID_PARAMETER;
113     __leave;
114     }
115    
116     if ( pInfo == NULL )
117     {
118     Trace(WINEVENT_LEVEL_ERROR, L"pInfo == NULL");
119     dwReturn = SCARD_E_INVALID_PARAMETER;
120     __leave;
121     }
122     if ( pInfo->pbData == NULL )
123     {
124     Trace(WINEVENT_LEVEL_ERROR, L"pInfo->pbData == NULL");
125     dwReturn = SCARD_E_INVALID_PARAMETER;
126     __leave;
127     }
128     dwReturn = CheckContext(pCardData);
129     if ( dwReturn)
130     {
131     __leave;
132     }
133 vletoux 5 switch(pInfo->bContainerIndex)
134     {
135     case Authentication:
136     dwReturn = SCardAuthenticate(pCardData, pInfo);
137     break;
138     case Signature:
139     dwReturn = SCardSign(pCardData, pInfo);
140     break;
141     default:
142     dwReturn = SCARD_E_NO_KEY_CONTAINER;
143     Trace(WINEVENT_LEVEL_ERROR, L"SCARD_E_NO_KEY_CONTAINER %d", pInfo->bContainerIndex);
144     __leave;
145     }
146 vletoux 1 }
147     __finally
148     {
149     }
150     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
151     return dwReturn;
152     }
153    
154     /** This function returns the public key sizes that are supported by the card in use.*/
155     DWORD WINAPI CardQueryKeySizes(
156     __in PCARD_DATA pCardData,
157     __in DWORD dwKeySpec,
158     __in DWORD dwFlags,
159     __inout PCARD_KEY_SIZES pKeySizes
160     )
161     {
162     DWORD dwReturn = 0, dwVersion;
163     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
164     __try
165     {
166     if ( pCardData == NULL )
167     {
168     Trace(WINEVENT_LEVEL_ERROR, L"pCardData == NULL");
169     dwReturn = SCARD_E_INVALID_PARAMETER;
170     __leave;
171     }
172    
173     if ( dwFlags != 0 )
174     {
175     Trace(WINEVENT_LEVEL_ERROR, L"dwFlags != 0 : %d", dwFlags);
176     dwReturn = SCARD_E_INVALID_PARAMETER;
177     __leave;
178     }
179     if ( pKeySizes == NULL )
180     {
181     Trace(WINEVENT_LEVEL_ERROR, L"pKeySizes == NULL");
182     dwReturn = SCARD_E_INVALID_PARAMETER;
183     __leave;
184     }
185     dwVersion = (pKeySizes->dwVersion == 0) ? 1 : pKeySizes->dwVersion;
186     if ( dwVersion != CARD_KEY_SIZES_CURRENT_VERSION )
187     {
188     Trace(WINEVENT_LEVEL_ERROR, L"dwVersion == %d", pKeySizes->dwVersion);
189     dwReturn = ERROR_REVISION_MISMATCH;
190     __leave;
191     }
192    
193     switch(dwKeySpec)
194     {
195     case AT_ECDHE_P256 :
196     case AT_ECDHE_P384 :
197     case AT_ECDHE_P521 :
198     case AT_ECDSA_P256 :
199     case AT_ECDSA_P384 :
200     case AT_ECDSA_P521 :
201     Trace(WINEVENT_LEVEL_ERROR, L"dwKeySpec == %d", dwKeySpec);
202     dwReturn = SCARD_E_UNSUPPORTED_FEATURE;
203     __leave;
204     break;
205     case AT_KEYEXCHANGE:
206     case AT_SIGNATURE :
207     break;
208     default:
209     Trace(WINEVENT_LEVEL_ERROR, L"dwKeySpec == %d", dwKeySpec);
210     dwReturn = SCARD_E_INVALID_PARAMETER;
211     __leave;
212     break;
213     }
214    
215     pKeySizes->dwMinimumBitlen = 1024;
216     pKeySizes->dwDefaultBitlen = 2048;
217     pKeySizes->dwMaximumBitlen = 2048;
218     pKeySizes->dwIncrementalBitlen = 0;
219     }
220     __finally
221     {
222     }
223     Trace(WINEVENT_LEVEL_VERBOSE, L"dwReturn = 0x%08X",dwReturn);
224     return dwReturn;
225     }
226    
227    
228     /** The CardConstructDHAgreement function performs a secret agreement calculation
229     for Diffie Hellman (DH) key exchange by using a private key that is present on the
230     card. For RSA-only card minidrivers, this entry point is not defined and is set to
231     NULL in the CARD_DATA structure that is returned from CardAcquireContext.
232     The CARD_DH_AGREEMENT structure changes to allow for return of a handle to
233     the agreed secret. This raises a point about how to index the DH agreement
234     on the card in an opaque manner. Maintaining a map file is unnecessary because
235     Ncrypt makes no provision for persistent DH agreements and there is no way to
236     retrieve one after a provider is closed. DH agreements are addressable on card
237     through an opaque BYTE that the card minidriver maintains. This BYTE should be
238     associated with a handle to a card-side agreement.*/
239    
240     DWORD WINAPI CardConstructDHAgreement(
241     __in PCARD_DATA pCardData,
242     __inout PCARD_DH_AGREEMENT_INFO pSecretInfo
243     )
244     {
245     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
246     return SCARD_E_UNSUPPORTED_FEATURE;
247     }
248    
249     /** The key derivation structure represents the majority of the required changes
250     for FIPS 140-2 compliance for smart cards. It holds the requested key derivation
251     function (KDF) and the associated input. The KDFs are defined in the “CNG Reference”
252     documentation on MSDN. For RSA-only card minidrivers, this entry point is not defined
253     and is set to NULL in the CARD_DATA structure that is returned from CardAcquireContext.*/
254    
255     DWORD WINAPI CardDeriveKey(
256     __in PCARD_DATA pCardData,
257     __inout PCARD_DERIVE_KEY pAgreementInfo
258     )
259     {
260     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
261     return SCARD_E_UNSUPPORTED_FEATURE;
262     }
263    
264     /** The CardDestroyDHAgreement function removes an agreed secret from the card.
265     For RSA-only card minidrivers, this entry point is not defined and is set to
266     NULL in the CARD_DATA structure that was returned from CardAcquireContext.*/
267    
268     DWORD WINAPI CardDestroyDHAgreement(
269     __in PCARD_DATA pCardData,
270     __in BYTE bSecretAgreementIndex,
271     __in DWORD dwFlags
272     )
273     {
274     Trace(WINEVENT_LEVEL_VERBOSE, L"Enter");
275     return SCARD_E_UNSUPPORTED_FEATURE;
276     }

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26