34 |
) |
) |
35 |
{ |
{ |
36 |
DWORD dwReturn = 0, dwVersion; |
DWORD dwReturn = 0, dwVersion; |
37 |
|
POPENPGP_CONTEXT pContext = NULL; |
38 |
Trace(WINEVENT_LEVEL_VERBOSE, L"Enter"); |
Trace(WINEVENT_LEVEL_VERBOSE, L"Enter"); |
39 |
__try |
__try |
40 |
{ |
{ |
57 |
dwReturn = ERROR_REVISION_MISMATCH; |
dwReturn = ERROR_REVISION_MISMATCH; |
58 |
__leave; |
__leave; |
59 |
} |
} |
60 |
pCardCapabilities->fCertificateCompression = TRUE; |
dwReturn = CheckContext(pCardData); |
61 |
pCardCapabilities->fKeyGen = TRUE; |
if ( dwReturn) |
62 |
|
{ |
63 |
|
__leave; |
64 |
|
} |
65 |
|
pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific; |
66 |
|
pCardCapabilities->fKeyGen = !pContext->fIsReadOnly; |
67 |
|
pCardCapabilities->fCertificateCompression = FALSE; |
68 |
dwReturn = 0; |
dwReturn = 0; |
69 |
} |
} |
70 |
__finally |
__finally |
100 |
dwReturn = SCARD_E_INVALID_PARAMETER; |
dwReturn = SCARD_E_INVALID_PARAMETER; |
101 |
__leave; |
__leave; |
102 |
} |
} |
103 |
|
if ( pbData == NULL ) |
104 |
|
{ |
105 |
|
Trace(WINEVENT_LEVEL_ERROR, L"pbData == NULL"); |
106 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
107 |
|
__leave; |
108 |
|
} |
109 |
if ( pdwDataLen == NULL ) |
if ( pdwDataLen == NULL ) |
110 |
{ |
{ |
111 |
Trace(WINEVENT_LEVEL_ERROR, L"pdwDataLen == NULL"); |
Trace(WINEVENT_LEVEL_ERROR, L"pdwDataLen == NULL"); |
260 |
DWORD dwReturn = 0; |
DWORD dwReturn = 0; |
261 |
PBYTE pbTempData = NULL; |
PBYTE pbTempData = NULL; |
262 |
DWORD dwTempSize = 0; |
DWORD dwTempSize = 0; |
263 |
|
POPENPGP_CONTEXT pContext = NULL; |
264 |
Trace(WINEVENT_LEVEL_VERBOSE, L"Enter wszProperty = %s", wszProperty); |
Trace(WINEVENT_LEVEL_VERBOSE, L"Enter wszProperty = %s", wszProperty); |
265 |
__try |
__try |
266 |
{ |
{ |
276 |
dwReturn = SCARD_E_INVALID_PARAMETER; |
dwReturn = SCARD_E_INVALID_PARAMETER; |
277 |
__leave; |
__leave; |
278 |
} |
} |
279 |
|
if ( pbData == NULL ) |
280 |
|
{ |
281 |
|
Trace(WINEVENT_LEVEL_ERROR, L"pbData == NULL"); |
282 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
283 |
|
__leave; |
284 |
|
} |
285 |
if ( pdwDataLen == NULL ) |
if ( pdwDataLen == NULL ) |
286 |
{ |
{ |
287 |
Trace(WINEVENT_LEVEL_ERROR, L"pdwDataLen == NULL"); |
Trace(WINEVENT_LEVEL_ERROR, L"pdwDataLen == NULL"); |
288 |
dwReturn = SCARD_E_INVALID_PARAMETER; |
dwReturn = SCARD_E_INVALID_PARAMETER; |
289 |
__leave; |
__leave; |
290 |
} |
} |
291 |
|
dwReturn = CheckContext(pCardData); |
292 |
|
if ( dwReturn ) |
293 |
|
{ |
294 |
|
Trace(WINEVENT_LEVEL_ERROR, L"GetContext dwReturn == 0x%08X", dwReturn); |
295 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
296 |
|
__leave; |
297 |
|
} |
298 |
|
pContext = (POPENPGP_CONTEXT) pCardData->pvVendorSpecific; |
299 |
if (wcscmp(wszProperty,CP_CARD_FREE_SPACE) == 0) |
if (wcscmp(wszProperty,CP_CARD_FREE_SPACE) == 0) |
300 |
{ |
{ |
301 |
|
if (dwFlags) |
302 |
|
{ |
303 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
304 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
305 |
|
__leave; |
306 |
|
} |
307 |
*pdwDataLen = sizeof(CARD_FREE_SPACE_INFO); |
*pdwDataLen = sizeof(CARD_FREE_SPACE_INFO); |
308 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
309 |
{ |
{ |
315 |
} |
} |
316 |
else if (wcscmp(wszProperty,CP_CARD_CAPABILITIES) == 0) |
else if (wcscmp(wszProperty,CP_CARD_CAPABILITIES) == 0) |
317 |
{ |
{ |
318 |
|
if (dwFlags) |
319 |
|
{ |
320 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
321 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
322 |
|
__leave; |
323 |
|
} |
324 |
*pdwDataLen = sizeof(CARD_CAPABILITIES); |
*pdwDataLen = sizeof(CARD_CAPABILITIES); |
325 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
326 |
{ |
{ |
343 |
} |
} |
344 |
else if (wcscmp(wszProperty,CP_CARD_READ_ONLY) == 0) |
else if (wcscmp(wszProperty,CP_CARD_READ_ONLY) == 0) |
345 |
{ |
{ |
346 |
|
if (dwFlags) |
347 |
|
{ |
348 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
349 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
350 |
|
__leave; |
351 |
|
} |
352 |
*pdwDataLen = sizeof(BOOL); |
*pdwDataLen = sizeof(BOOL); |
353 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
354 |
{ |
{ |
356 |
dwReturn = ERROR_INSUFFICIENT_BUFFER; |
dwReturn = ERROR_INSUFFICIENT_BUFFER; |
357 |
__leave; |
__leave; |
358 |
} |
} |
359 |
*((PBOOL)pbData) = TRUE; |
*((PBOOL)pbData) = pContext->fIsReadOnly; |
360 |
} |
} |
361 |
else if (wcscmp(wszProperty,CP_CARD_CACHE_MODE) == 0) |
else if (wcscmp(wszProperty,CP_CARD_CACHE_MODE) == 0) |
362 |
{ |
{ |
363 |
|
if (dwFlags) |
364 |
|
{ |
365 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
366 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
367 |
|
__leave; |
368 |
|
} |
369 |
*pdwDataLen = sizeof(DWORD); |
*pdwDataLen = sizeof(DWORD); |
370 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
371 |
{ |
{ |
377 |
} |
} |
378 |
else if (wcscmp(wszProperty,CP_SUPPORTS_WIN_X509_ENROLLMENT) == 0) |
else if (wcscmp(wszProperty,CP_SUPPORTS_WIN_X509_ENROLLMENT) == 0) |
379 |
{ |
{ |
380 |
|
if (dwFlags) |
381 |
|
{ |
382 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
383 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
384 |
|
__leave; |
385 |
|
} |
386 |
*pdwDataLen = sizeof(BOOL); |
*pdwDataLen = sizeof(BOOL); |
387 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
388 |
{ |
{ |
394 |
} |
} |
395 |
else if (wcscmp(wszProperty,CP_CARD_GUID) == 0) |
else if (wcscmp(wszProperty,CP_CARD_GUID) == 0) |
396 |
{ |
{ |
397 |
|
if (dwFlags) |
398 |
|
{ |
399 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
400 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
401 |
|
__leave; |
402 |
|
} |
403 |
dwReturn = CardReadFile(pCardData, NULL, szCARD_IDENTIFIER_FILE, 0, &pbTempData, &dwTempSize); |
dwReturn = CardReadFile(pCardData, NULL, szCARD_IDENTIFIER_FILE, 0, &pbTempData, &dwTempSize); |
404 |
if (dwReturn) |
if (dwReturn) |
405 |
{ |
{ |
416 |
} |
} |
417 |
else if (wcscmp(wszProperty,CP_CARD_SERIAL_NO) == 0) |
else if (wcscmp(wszProperty,CP_CARD_SERIAL_NO) == 0) |
418 |
{ |
{ |
419 |
|
if (dwFlags) |
420 |
|
{ |
421 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
422 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
423 |
|
__leave; |
424 |
|
} |
425 |
*pdwDataLen = sizeof(OPENPGP_AID); |
*pdwDataLen = sizeof(OPENPGP_AID); |
426 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
427 |
{ |
{ |
448 |
else if (wcscmp(wszProperty,CP_CARD_LIST_PINS) == 0) |
else if (wcscmp(wszProperty,CP_CARD_LIST_PINS) == 0) |
449 |
{ |
{ |
450 |
PPIN_SET pPinSet; |
PPIN_SET pPinSet; |
451 |
|
if (dwFlags) |
452 |
|
{ |
453 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
454 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
455 |
|
__leave; |
456 |
|
} |
457 |
*pdwDataLen = sizeof(PIN_SET); |
*pdwDataLen = sizeof(PIN_SET); |
458 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
459 |
{ |
{ |
462 |
__leave; |
__leave; |
463 |
} |
} |
464 |
pPinSet = (PPIN_SET) pbData; |
pPinSet = (PPIN_SET) pbData; |
465 |
|
*pPinSet = CREATE_PIN_SET(ROLE_SIGNATURE); |
466 |
|
SET_PIN(*pPinSet, ROLE_AUTHENTICATION); |
467 |
|
SET_PIN(*pPinSet, ROLE_CONFIDENTIALITY); |
468 |
|
SET_PIN(*pPinSet, ROLE_PUK); |
469 |
|
SET_PIN(*pPinSet, ROLE_ADMIN); |
470 |
} |
} |
471 |
else if (wcscmp(wszProperty,CP_CARD_AUTHENTICATED_STATE) == 0) |
else if (wcscmp(wszProperty,CP_CARD_AUTHENTICATED_STATE) == 0) |
472 |
{ |
{ |
473 |
|
if (dwFlags) |
474 |
|
{ |
475 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
476 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
477 |
|
__leave; |
478 |
|
} |
479 |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
480 |
} |
} |
481 |
else if (wcscmp(wszProperty,CP_CARD_PIN_STRENGTH_VERIFY) == 0) |
else if (wcscmp(wszProperty,CP_CARD_PIN_STRENGTH_VERIFY) == 0) |
482 |
{ |
{ |
483 |
PPIN_SET pPinSet; |
PPIN_SET pPinSet; |
484 |
|
switch(dwFlags) |
485 |
|
{ |
486 |
|
case ROLE_SIGNATURE: |
487 |
|
case ROLE_AUTHENTICATION: |
488 |
|
case ROLE_CONFIDENTIALITY: |
489 |
|
case ROLE_ADMIN: |
490 |
|
case ROLE_PUK: |
491 |
|
break; |
492 |
|
default: |
493 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
494 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
495 |
|
__leave; |
496 |
|
} |
497 |
*pdwDataLen = sizeof(PIN_SET); |
*pdwDataLen = sizeof(PIN_SET); |
498 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
499 |
{ |
{ |
506 |
} |
} |
507 |
else if (wcscmp(wszProperty,CP_KEY_IMPORT_SUPPORT) == 0) |
else if (wcscmp(wszProperty,CP_KEY_IMPORT_SUPPORT) == 0) |
508 |
{ |
{ |
509 |
|
if (dwFlags) |
510 |
|
{ |
511 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == 0"); |
512 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
513 |
|
__leave; |
514 |
|
} |
515 |
*pdwDataLen = sizeof(DWORD); |
*pdwDataLen = sizeof(DWORD); |
516 |
if (cbData < *pdwDataLen) |
if (cbData < *pdwDataLen) |
517 |
{ |
{ |
519 |
dwReturn = ERROR_INSUFFICIENT_BUFFER; |
dwReturn = ERROR_INSUFFICIENT_BUFFER; |
520 |
__leave; |
__leave; |
521 |
} |
} |
522 |
*((PDWORD)pbData) = CARD_KEY_IMPORT_RSA_KEYEST; |
if (pContext->fIsReadOnly) |
523 |
|
{ |
524 |
|
*((PDWORD)pbData) = 0; |
525 |
|
} |
526 |
|
else |
527 |
|
{ |
528 |
|
*((PDWORD)pbData) = CARD_KEY_IMPORT_RSA_KEYEST; |
529 |
|
} |
530 |
} |
} |
531 |
else if (wcscmp(wszProperty,CP_ENUM_ALGORITHMS ) == 0) |
else if (wcscmp(wszProperty,CP_ENUM_ALGORITHMS ) == 0) |
532 |
{ |
{ |
562 |
{ |
{ |
563 |
if (dwFlags == CARD_CIPHER_OPERATION) |
if (dwFlags == CARD_CIPHER_OPERATION) |
564 |
{ |
{ |
565 |
|
Trace(WINEVENT_LEVEL_ERROR, L"CARD_CIPHER_OPERATION", wszProperty); |
566 |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
567 |
} |
} |
568 |
else if (dwFlags == CARD_ASYMMETRIC_OPERATION ) |
else if (dwFlags == CARD_ASYMMETRIC_OPERATION ) |
585 |
} |
} |
586 |
else if (wcscmp(wszProperty,CP_CHAINING_MODES ) == 0) |
else if (wcscmp(wszProperty,CP_CHAINING_MODES ) == 0) |
587 |
{ |
{ |
588 |
|
if (dwFlags) |
589 |
|
{ |
590 |
|
Trace(WINEVENT_LEVEL_ERROR, L"dwFlags == %d", dwFlags); |
591 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
592 |
|
__leave; |
593 |
|
} |
594 |
|
Trace(WINEVENT_LEVEL_ERROR, L"wszProperty == %s", wszProperty); |
595 |
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
596 |
|
} |
597 |
|
else if ( wcscmp(wszProperty,CP_CARD_PIN_STRENGTH_CHANGE ) == 0 |
598 |
|
|| wcscmp(wszProperty,CP_CARD_PIN_STRENGTH_UNBLOCK ) == 0) |
599 |
|
{ |
600 |
|
Trace(WINEVENT_LEVEL_ERROR, L"wszProperty == %s SCARD_E_UNSUPPORTED_FEATURE", wszProperty); |
601 |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
602 |
} |
} |
603 |
else |
else |
604 |
{ |
{ |
605 |
Trace(WINEVENT_LEVEL_ERROR, L"wszProperty == %s", wszProperty); |
Trace(WINEVENT_LEVEL_ERROR, L"wszProperty == %s SCARD_E_INVALID_PARAMETER", wszProperty); |
606 |
dwReturn = SCARD_E_INVALID_PARAMETER; |
dwReturn = SCARD_E_INVALID_PARAMETER; |
607 |
__leave; |
__leave; |
608 |
} |
} |
658 |
|| wcscmp(wszProperty,CP_KEY_IMPORT_SUPPORT) == 0 |
|| wcscmp(wszProperty,CP_KEY_IMPORT_SUPPORT) == 0 |
659 |
|| wcscmp(wszProperty,CP_ENUM_ALGORITHMS) == 0 |
|| wcscmp(wszProperty,CP_ENUM_ALGORITHMS) == 0 |
660 |
|| wcscmp(wszProperty,CP_PADDING_SCHEMES) == 0 |
|| wcscmp(wszProperty,CP_PADDING_SCHEMES) == 0 |
661 |
|| wcscmp(wszProperty,CP_CHAINING_MODES) == 0) |
|| wcscmp(wszProperty,CP_CHAINING_MODES) == 0 |
662 |
|
|| wcscmp(wszProperty,CP_SUPPORTS_WIN_X509_ENROLLMENT) == 0 |
663 |
|
|| wcscmp(wszProperty,CP_CARD_CACHE_MODE) == 0 |
664 |
|
|| wcscmp(wszProperty,CP_CARD_SERIAL_NO) == 0 |
665 |
|
|| wcscmp(wszProperty,CP_CARD_GUID) == 0 |
666 |
|
|| wcscmp(wszProperty,CP_CARD_PIN_INFO) == 0 |
667 |
|
|| wcscmp(wszProperty,CP_CARD_PIN_STRENGTH_VERIFY) == 0) |
668 |
{ |
{ |
669 |
|
if ( pbData == NULL ) |
670 |
|
{ |
671 |
|
Trace(WINEVENT_LEVEL_ERROR, L"pbData == NULL"); |
672 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
673 |
|
__leave; |
674 |
|
} |
675 |
Trace(WINEVENT_LEVEL_ERROR, L"wszProperty == %s SCARD_E_UNSUPPORTED_FEATURE", wszProperty); |
Trace(WINEVENT_LEVEL_ERROR, L"wszProperty == %s SCARD_E_UNSUPPORTED_FEATURE", wszProperty); |
676 |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
677 |
__leave; |
__leave; |
678 |
} |
} |
679 |
else if (wcscmp(wszProperty,CP_CARD_READ_ONLY) == 0) |
else if (wcscmp(wszProperty,CP_CARD_READ_ONLY) == 0) |
680 |
{ |
{ |
681 |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
if ( pbData == NULL ) |
682 |
} |
{ |
683 |
else if (wcscmp(wszProperty,CP_CARD_CACHE_MODE) == 0) |
Trace(WINEVENT_LEVEL_ERROR, L"pbData == NULL"); |
684 |
{ |
dwReturn = SCARD_E_INVALID_PARAMETER; |
685 |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
__leave; |
686 |
} |
} |
687 |
else if (wcscmp(wszProperty,CP_SUPPORTS_WIN_X509_ENROLLMENT) == 0) |
dwReturn = SCARD_W_SECURITY_VIOLATION; |
|
{ |
|
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
|
|
} |
|
|
else if (wcscmp(wszProperty,CP_CARD_GUID) == 0) |
|
|
{ |
|
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
|
|
} |
|
|
else if (wcscmp(wszProperty,CP_CARD_SERIAL_NO) == 0) |
|
|
{ |
|
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
|
688 |
} |
} |
689 |
else if (wcscmp(wszProperty,CP_CARD_PIN_INFO) == 0) |
else if (wcscmp(wszProperty,CP_PARENT_WINDOW) == 0) |
690 |
{ |
{ |
691 |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
if ( pbData == NULL ) |
692 |
|
{ |
693 |
|
Trace(WINEVENT_LEVEL_ERROR, L"pbData == NULL"); |
694 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
695 |
|
__leave; |
696 |
|
} |
697 |
|
if ( cbDataLen != sizeof(HWND) ) |
698 |
|
{ |
699 |
|
Trace(WINEVENT_LEVEL_ERROR, L"cbDataLen == %d", cbDataLen); |
700 |
|
dwReturn = SCARD_E_INVALID_PARAMETER ; |
701 |
|
__leave; |
702 |
|
} |
703 |
|
if ( *pbData != 0 && !IsWindow((HWND) *pbData) ) |
704 |
|
{ |
705 |
|
Trace(WINEVENT_LEVEL_ERROR, L"*pbData == %d GetLastError == %d", *pbData, GetLastError()); |
706 |
|
dwReturn = SCARD_E_INVALID_PARAMETER ; |
707 |
|
__leave; |
708 |
|
} |
709 |
|
dwReturn = 0; |
710 |
} |
} |
711 |
else if (wcscmp(wszProperty,CP_CARD_PIN_STRENGTH_VERIFY) == 0) |
else if (wcscmp(wszProperty,CP_PIN_CONTEXT_STRING) == 0) |
712 |
{ |
{ |
713 |
dwReturn = SCARD_E_UNSUPPORTED_FEATURE ; |
if ( pbData == NULL ) |
714 |
|
{ |
715 |
|
Trace(WINEVENT_LEVEL_ERROR, L"pbData == NULL"); |
716 |
|
dwReturn = SCARD_E_INVALID_PARAMETER; |
717 |
|
__leave; |
718 |
|
} |
719 |
|
dwReturn = 0; |
720 |
} |
} |
721 |
else |
else |
722 |
{ |
{ |
723 |
Trace(WINEVENT_LEVEL_ERROR, L"wszProperty == %s", wszProperty); |
Trace(WINEVENT_LEVEL_ERROR, L"wszProperty == %s Unknown", wszProperty); |
724 |
dwReturn = SCARD_E_INVALID_PARAMETER; |
dwReturn = SCARD_E_INVALID_PARAMETER; |
725 |
__leave; |
__leave; |
726 |
} |
} |
|
dwReturn = SCARD_E_UNSUPPORTED_FEATURE; |
|
727 |
} |
} |
728 |
__finally |
__finally |
729 |
{ |
{ |