/[openpgpmdrv]/trunk/OpenPGPminidriverTest/CryptoOperations.cpp
ViewVC logotype

Diff of /trunk/OpenPGPminidriverTest/CryptoOperations.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4 by vletoux, Thu Feb 25 22:09:17 2010 UTC revision 5 by vletoux, Tue Mar 2 18:54:34 2010 UTC
# Line 76  DWORD ImportKey(DWORD dwIndex) Line 76  DWORD ImportKey(DWORD dwIndex)
76          HCRYPTKEY hKey = NULL;          HCRYPTKEY hKey = NULL;
77          TCHAR szContainerName[] = OPENPGP_TEST_CONTAINER;          TCHAR szContainerName[] = OPENPGP_TEST_CONTAINER;
78          BYTE pbData[4096];          BYTE pbData[4096];
79            BYTE pbDataControl[4096];
80          BYTE pbBlobRef[4096];          BYTE pbBlobRef[4096];
81          DWORD dwDataSize = ARRAYSIZE(pbData);          DWORD dwDataSize = ARRAYSIZE(pbData);
82          DWORD dwBlobRefSize = ARRAYSIZE(pbBlobRef);          DWORD dwBlobRefSize = ARRAYSIZE(pbBlobRef);
# Line 134  DWORD ImportKey(DWORD dwIndex) Line 135  DWORD ImportKey(DWORD dwIndex)
135                          dwReturn = GetLastError();                          dwReturn = GetLastError();
136                          __leave;                          __leave;
137                  }                  }
138                    memcpy(pbDataControl, pbData, ARRAYSIZE(pbData));
139                  dwSize = sizeof(DWORD);                  dwSize = sizeof(DWORD);
140                  bStatus = CryptGetKeyParam(hKey, KP_KEYLEN, (PBYTE) &dwAglLen,&dwSize , 0);                  bStatus = CryptGetKeyParam(hKey, KP_KEYLEN, (PBYTE) &dwAglLen,&dwSize , 0);
141                  dwReturn = pCardData->pfnCardCreateContainerEx(pCardData, (BYTE) dwIndex,                  dwReturn = pCardData->pfnCardCreateContainerEx(pCardData, (BYTE) dwIndex,
# Line 143  DWORD ImportKey(DWORD dwIndex) Line 145  DWORD ImportKey(DWORD dwIndex)
145                  {                  {
146                          __leave;                          __leave;
147                  }                  }
148                    // check if the buffer has been altered
149                    if (memcmp(pbDataControl,pbData, ARRAYSIZE(pbData)) != 0)
150                    {
151                            dwReturn = SCARD_E_UNEXPECTED;
152                            __leave;
153                    }
154    
155                  memset(&ContainerInfo,0,sizeof(CONTAINER_INFO));                  memset(&ContainerInfo,0,sizeof(CONTAINER_INFO));
156                  ContainerInfo.dwVersion = 0;                  ContainerInfo.dwVersion = 0;
157                  dwReturn = pCardData->pfnCardGetContainerInfo(pCardData, (BYTE) dwIndex, 0, &ContainerInfo);                  dwReturn = pCardData->pfnCardGetContainerInfo(pCardData, (BYTE) dwIndex, 0, &ContainerInfo);
# Line 157  DWORD ImportKey(DWORD dwIndex) Line 166  DWORD ImportKey(DWORD dwIndex)
166                          __leave;                          __leave;
167                  }                  }
168                  pBlobRef = (PRSAPUBLICKEYBLOB) pbBlobRef;                  pBlobRef = (PRSAPUBLICKEYBLOB) pbBlobRef;
169                  pBlob = (PRSAPUBLICKEYBLOB) ContainerInfo.pbSigPublicKey;                  pBlob = (PRSAPUBLICKEYBLOB) (dwKeySpec==AT_SIGNATURE ? ContainerInfo.pbSigPublicKey : ContainerInfo.pbKeyExPublicKey);
170                  //if (memcmp(pBlobRef, pBlob, ContainerInfo.cbSigPublicKey) != 0)                  //if (memcmp(pBlobRef, pBlob, ContainerInfo.cbSigPublicKey) != 0)
171                  for (DWORD dwI = 0; dwI < pBlobRef->rsapubkey.bitlen / 8; dwI++)                  for (DWORD dwI = 0; dwI < pBlobRef->rsapubkey.bitlen / 8; dwI++)
172                  {                  {
# Line 168  DWORD ImportKey(DWORD dwIndex) Line 177  DWORD ImportKey(DWORD dwIndex)
177                          }                          }
178                  }                  }
179                  dwReturn = 0;                  dwReturn = 0;
180    
181            }
182            __finally
183            {
184                    if (hKey)
185                            CryptDestroyKey(hKey);
186                    //CryptAcquireContext(&hProv, szContainerName, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
187                    if (hProv)
188                            CryptReleaseContext(hProv,0);
189            }
190            return dwReturn;
191    }
192    
193    DWORD SetTheSameKeyForAllContainers()
194    {
195            DWORD dwReturn, dwKeySpec;
196            PIN_ID  PinId;
197            HCRYPTPROV hProv = NULL;
198            HCRYPTKEY hKey = NULL;
199            TCHAR szContainerName[] = OPENPGP_TEST_CONTAINER;
200            BYTE pbData[4096];
201            BYTE pbDataControl[4096];
202            BYTE pbBlobRef[4096];
203            DWORD dwDataSize = ARRAYSIZE(pbData);
204            DWORD dwBlobRefSize = ARRAYSIZE(pbBlobRef);
205            BOOL bStatus;
206            CONTAINER_INFO  ContainerInfo;
207            PRSAPUBLICKEYBLOB pBlob, pBlobRef;
208            DWORD dwAglLen, dwSize, dwIndex;
209            __try
210            {
211                     if (!pCardData)
212                    {
213                            dwReturn = SCARD_E_COMM_DATA_LOST;
214                            __leave;
215                    }
216                    bStatus = CryptAcquireContext(&hProv, szContainerName, MS_ENHANCED_PROV, PROV_RSA_FULL, 0);
217                    if (!bStatus)
218                    {
219                            dwReturn = GetLastError();
220                            if (dwReturn == NTE_BAD_KEYSET)
221                            {
222                                    bStatus = CryptAcquireContext(&hProv, szContainerName, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);
223                            }
224                            if (!bStatus)
225                            {
226                                    dwReturn = GetLastError();
227                                    __leave;
228                            }
229                    }
230                    bStatus = CryptGenKey(hProv, AT_SIGNATURE, CRYPT_EXPORTABLE, &hKey);
231                    if (!bStatus)
232                    {
233                            dwReturn = GetLastError();
234                            __leave;
235                    }
236                    bStatus = CryptExportKey(hKey,  NULL, PRIVATEKEYBLOB, 0, pbData, &dwDataSize);
237                    if (!bStatus)
238                    {
239                            dwReturn = GetLastError();
240                            __leave;
241                    }
242                    memcpy(pbDataControl, pbData, ARRAYSIZE(pbData));
243                    dwSize = sizeof(DWORD);
244                    bStatus = CryptGetKeyParam(hKey, KP_KEYLEN, (PBYTE) &dwAglLen,&dwSize , 0);
245    
246                    for(dwIndex = 0; dwIndex < 3; dwIndex++)
247                    {
248                            switch(dwIndex)
249                            {
250                            case 0: //Signature,
251                                    dwKeySpec = AT_SIGNATURE;
252                                    PinId = ROLE_USER;
253                                    break;
254                            case 1: //Authentication,
255                                    dwKeySpec = AT_SIGNATURE;
256                                    PinId = 3;
257                                    break;
258                            case 2: // Confidentiality,
259                                    dwKeySpec = AT_KEYEXCHANGE;
260                                    PinId = 4;
261                                    break;
262                            default:
263                                    dwReturn = SCARD_E_UNEXPECTED;
264                                    __leave;
265                            }
266    
267                            dwReturn = pCardData->pfnCardCreateContainerEx(pCardData, (BYTE) dwIndex,
268                                                                                                    CARD_CREATE_CONTAINER_KEY_IMPORT,
269                                                                                                    dwKeySpec, dwAglLen, pbData, PinId);
270                            if (dwReturn)
271                            {
272                                    __leave;
273                            }
274                            // check if the buffer has been altered
275                            if (memcmp(pbDataControl,pbData, ARRAYSIZE(pbData)) != 0)
276                            {
277                                    dwReturn = SCARD_E_UNEXPECTED;
278                                    __leave;
279                            }
280    
281                            memset(&ContainerInfo,0,sizeof(CONTAINER_INFO));
282                            ContainerInfo.dwVersion = 0;
283                            dwReturn = pCardData->pfnCardGetContainerInfo(pCardData, (BYTE) dwIndex, 0, &ContainerInfo);
284                            if (dwReturn)
285                            {
286                                    __leave;
287                            }
288                            bStatus = CryptExportKey(hKey,  NULL, PUBLICKEYBLOB, 0, pbBlobRef, &dwBlobRefSize);
289                            if (!bStatus)
290                            {
291                                    dwReturn = GetLastError();
292                                    __leave;
293                            }
294                            pBlobRef = (PRSAPUBLICKEYBLOB) pbBlobRef;
295                            pBlob = (PRSAPUBLICKEYBLOB) (dwKeySpec==AT_SIGNATURE ? ContainerInfo.pbSigPublicKey : ContainerInfo.pbKeyExPublicKey);
296                            //if (memcmp(pBlobRef, pBlob, ContainerInfo.cbSigPublicKey) != 0)
297                            for (DWORD dwI = 0; dwI < pBlobRef->rsapubkey.bitlen / 8; dwI++)
298                            {
299                                    if ( pBlobRef->modulus[dwI] != pBlob->modulus[dwI])
300                                    {
301                                            dwReturn = SCARD_E_UNEXPECTED;
302                                            __leave;
303                                    }
304                            }
305                    }
306                    dwReturn = 0;
307    
308          }          }
309          __finally          __finally

Legend:
Removed from v.4  
changed lines
  Added in v.5

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26