diff --git a/configure.ac b/configure.ac index 816d04eb..4ab2c4fe 100644 --- a/configure.ac +++ b/configure.ac @@ -128,10 +128,10 @@ AC_ARG_ENABLE( ) AC_ARG_ENABLE( - [cardmod], - [AS_HELP_STRING([--enable-cardmod],[enable cardmod module on Windows @<:@disabled@:>@])], + [minidriver], + [AS_HELP_STRING([--enable-minidriver],[enable minidriver on Windows @<:@disabled@:>@])], , - [enable_cardmod="no"] + [enable_minidriver="no"] ) AC_ARG_ENABLE( @@ -293,14 +293,14 @@ if test "${WIN32}" = "no"; then CC="${PTHREAD_CC}" fi -if test "${enable_cardmod}" = "yes"; then +if test "${enable_minidriver}" = "yes"; then dnl win32 special test for minidriver AC_CHECK_HEADER( [cardmod.h], , - [AC_MSG_ERROR([cardmod.h is not found and required for cardmod])] + [AC_MSG_ERROR([cardmod.h is not found and required for minidriver])] ) - AC_DEFINE([ENABLE_CARDMOD], [1], [Enable cardmod support]) + AC_DEFINE([ENABLE_MINIDRIVER], [1], [Enable minidriver support]) fi AC_ARG_VAR([ZLIB_CFLAGS], [C compiler flags for zlib]) @@ -523,9 +523,6 @@ fi if test "${enable_ctapi}" = "yes"; then OPENSC_FEATURES="${OPENSC_FEATURES} ctapi" fi -if test "${enable_cardmod}" = "yes"; then - OPENSC_FEATURES="${OPENSC_FEATURES} cardmod" -fi AC_DEFINE_UNQUOTED([OPENSC_VERSION_MAJOR], [${OPENSC_VERSION_MAJOR}], [OpenSC version major component]) AC_DEFINE_UNQUOTED([OPENSC_VERSION_MINOR], [${OPENSC_VERSION_MINOR}], [OpenSC version minor component]) @@ -564,7 +561,7 @@ AM_CONDITIONAL([ENABLE_OPENCT], [test "${enable_openct}" = "yes"]) AM_CONDITIONAL([ENABLE_DOC], [test "${enable_doc}" = "yes"]) AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"]) AM_CONDITIONAL([CYGWIN], [test "${CYGWIN}" = "yes"]) -AM_CONDITIONAL([ENABLE_CARDMOD], [test "${enable_cardmod}" = "yes"]) +AM_CONDITIONAL([ENABLE_MINIDRIVER], [test "${enable_minidriver}" = "yes"]) if test "${enable_pedantic}" = "yes"; then enable_strict="yes"; @@ -592,8 +589,8 @@ AC_CONFIG_FILES([ src/tests/Makefile src/tests/regression/Makefile src/tools/Makefile - src/cardmod/Makefile - src/cardmod/cardmod.inf + src/minidriver/Makefile + src/minidriver/opensc-minidriver.inf win32/Makefile win32/versioninfo.rc win32/winconfig.h @@ -620,7 +617,7 @@ OpenSSL support: ${enable_openssl} PC/SC support: ${enable_pcsc} OpenCT support: ${enable_openct} CT-API support: ${enable_ctapi} -cardmod support: ${enable_cardmod} +minidriver support: ${enable_minidriver} PC/SC default provider: ${DEFAULT_PCSC_PROVIDER} diff --git a/etc/opensc.conf.in b/etc/opensc.conf.in index e5831ad2..29871d13 100644 --- a/etc/opensc.conf.in +++ b/etc/opensc.conf.in @@ -447,6 +447,7 @@ app tokend { } } +# XXX: remove cardmod pseudodriver app cardmod { # cardmod app name use special pcsc reader subset # fix options for this reader driver here. @@ -457,4 +458,3 @@ app cardmod { # enable_pinpad = false; } } - diff --git a/src/Makefile.am b/src/Makefile.am index 9bda57cd..88b757bd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,4 +3,4 @@ EXTRA_DIST = Makefile.mak # Order IS important SUBDIRS = common scconf pkcs15init libopensc pkcs11 \ - tools tests cardmod + tools tests minidriver diff --git a/src/Makefile.mak b/src/Makefile.mak index f56c983d..dfb53a21 100644 --- a/src/Makefile.mak +++ b/src/Makefile.mak @@ -4,13 +4,8 @@ TOPDIR = .. SUBDIRS = common scconf pkcs15init libopensc pkcs11 tools tests -!IF "$(MINIDRIVER_DEF)" == "/DENABLE_CARDMOD" -SUBDIRS = $(SUBDIRS) cardmod -!ENDIF - -!IF "$(WIX_MSI_DEF)" == "/DBUILD_MSI" -SUBDIRS = $(SUBDIRS) "$(TOPDIR)\etc" -SUBDIRS = $(SUBDIRS) "$(TOPDIR)\win32\opensc-msi" +!IF "$(MINIDRIVER_DEF)" == "/DENABLE_MINIDRIVER" +SUBDIRS = $(SUBDIRS) minidriver !ENDIF all:: diff --git a/src/cardmod/Makefile.am b/src/cardmod/Makefile.am deleted file mode 100644 index facebfd9..00000000 --- a/src/cardmod/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -include $(top_srcdir)/win32/ltrc.inc - -MAINTAINERCLEANFILES = $(srcdir)/Makefile.in -EXTRA_DIST = Makefile.mak - -if ENABLE_CARDMOD -lib_LTLIBRARIES = opensc-cardmod@LIBRARY_BITNESS@.la -# Do we need this on bin? Why can't we -# put it in dedicated directory -dist_sbin_SCRIPTS = cardmod.inf cardmod-westcos.reg -else -dist_noinst_DATA = cardmod.inf cardmod-westcos.reg -endif - -INCLUDES = -I$(top_srcdir)/src - -opensc_cardmod@LIBRARY_BITNESS@_la_SOURCES = cardmod.c cardmod.exports \ - $(top_builddir)/win32/versioninfo.rc -opensc_cardmod@LIBRARY_BITNESS@_la_LIBADD = $(LTLIB_LIBS) \ - $(top_builddir)/src/libopensc/libopensc.la \ - -lcrypt32 -opensc_cardmod@LIBRARY_BITNESS@_la_LDFLAGS = $(AM_LDFLAGS) \ - -export-symbols "$(srcdir)/cardmod.exports" \ - -module -avoid-version -no-undefined - -if ENABLE_CARDMOD -install-exec-hook: - mv "$(DESTDIR)$(libdir)/opensc-cardmod@LIBRARY_BITNESS@.dll" "$(DESTDIR)$(bindir)/" -endif diff --git a/src/libopensc/ctx.c b/src/libopensc/ctx.c index f89b51cd..b7fe5756 100644 --- a/src/libopensc/ctx.c +++ b/src/libopensc/ctx.c @@ -654,11 +654,12 @@ int sc_context_create(sc_context_t **ctx_out, const sc_context_param_t *parm) #ifdef ENABLE_PCSC ctx->reader_driver = sc_get_pcsc_driver(); - #ifdef ENABLE_CARDMOD +/* XXX: remove cardmod pseudoreader driver */ +#ifdef ENABLE_MINIDRIVER if(strcmp(ctx->app_name, "cardmod") == 0) { ctx->reader_driver = sc_get_cardmod_driver(); } - #endif +#endif #elif ENABLE_CTAPI ctx->reader_driver = sc_get_ctapi_driver(); #elif ENABLE_OPENCT @@ -681,8 +682,8 @@ int sc_context_create(sc_context_t **ctx_out, const sc_context_param_t *parm) return SC_SUCCESS; } -/* use by cardmod to pass in provided handles to reader-pcsc */ -int sc_ctx_use_reader(sc_context_t *ctx, void * pcsc_context_handle, void * pcsc_card_handle) +/* Used by minidriver to pass in provided handles to reader-pcsc */ +int sc_ctx_use_reader(sc_context_t *ctx, void *pcsc_context_handle, void *pcsc_card_handle) { SC_FUNC_CALLED(ctx, SC_LOG_DEBUG_NORMAL); if (ctx->reader_driver->ops->use_reader != NULL) diff --git a/src/libopensc/opensc.h b/src/libopensc/opensc.h index 2a6565ff..bfd52bbe 100644 --- a/src/libopensc/opensc.h +++ b/src/libopensc/opensc.h @@ -388,8 +388,8 @@ struct sc_reader_operations { int timeout, void **reader_states); /* Reset a reader */ int (*reset)(struct sc_reader *, int); - /* used to pass in reader handles in cardmod mode */ - int (*use_reader)(struct sc_context *ctx, void * pcsc_context_handle, void * pcsc_card_handle); + /* Used to pass in PC/SC handles to minidriver */ + int (*use_reader)(struct sc_context *ctx, void *pcsc_context_handle, void *pcsc_card_handle); }; /* diff --git a/src/libopensc/reader-pcsc.c b/src/libopensc/reader-pcsc.c index 90dd93d6..1071e045 100644 --- a/src/libopensc/reader-pcsc.c +++ b/src/libopensc/reader-pcsc.c @@ -1551,7 +1551,7 @@ struct sc_reader_driver * sc_get_pcsc_driver(void) return &pcsc_drv; } -#ifdef ENABLE_CARDMOD +#ifdef ENABLE_MINIDRIVER #define SCARD_CLASS_SYSTEM 0x7fff #define SCARD_ATTR_VALUE(Class, Tag) ((((ULONG)(Class)) << 16) | ((ULONG)(Tag))) diff --git a/src/minidriver/Makefile.am b/src/minidriver/Makefile.am new file mode 100644 index 00000000..7b389d0d --- /dev/null +++ b/src/minidriver/Makefile.am @@ -0,0 +1,29 @@ +include $(top_srcdir)/win32/ltrc.inc + +MAINTAINERCLEANFILES = $(srcdir)/Makefile.in +EXTRA_DIST = Makefile.mak + +if ENABLE_MINIDRIVER +lib_LTLIBRARIES = opensc-minidriver@LIBRARY_BITNESS@.la +# Do we need this on bin? Why can't we +# put it in dedicated directory +dist_sbin_SCRIPTS = opensc-minidriver.inf minidriver-westcos.reg +else +dist_noinst_DATA = opensc-minidriver.inf minidriver-westcos.reg +endif + +INCLUDES = -I$(top_srcdir)/src + +opensc_minidriver@LIBRARY_BITNESS@_la_SOURCES = minidriver.c minidriver.exports \ + $(top_builddir)/win32/versioninfo.rc +opensc_minidriver@LIBRARY_BITNESS@_la_LIBADD = $(LTLIB_LIBS) \ + $(top_builddir)/src/libopensc/libopensc.la \ + -lcrypt32 +opensc_minidriver@LIBRARY_BITNESS@_la_LDFLAGS = $(AM_LDFLAGS) \ + -export-symbols "$(srcdir)/minidriver.exports" \ + -module -avoid-version -no-undefined + +if ENABLE_MINIDRIVER +install-exec-hook: + mv "$(DESTDIR)$(libdir)/opensc-minidriver@LIBRARY_BITNESS@.dll" "$(DESTDIR)$(bindir)/" +endif diff --git a/src/cardmod/Makefile.mak b/src/minidriver/Makefile.mak similarity index 81% rename from src/cardmod/Makefile.mak rename to src/minidriver/Makefile.mak index 3b7fea35..cad16131 100644 --- a/src/cardmod/Makefile.mak +++ b/src/minidriver/Makefile.mak @@ -1,7 +1,7 @@ TOPDIR = ..\.. -TARGET = opensc-cardmod.dll -OBJECTS = cardmod.obj +TARGET = opensc-minidriver.dll +OBJECTS = opensc-minidriver.obj !INCLUDE $(TOPDIR)\win32\Make.rules.mak @@ -10,6 +10,6 @@ all: $(TARGET) $(TARGET): $(OBJECTS) echo LIBRARY $* > $*.def echo EXPORTS >> $*.def - type cardmod.exports >> $*.def + type minidriver.exports >> $*.def link /dll $(LINKFLAGS) /def:$*.def /out:$(TARGET) $(OBJECTS) ..\libopensc\opensc_a.lib $(ZLIB_LIB) $(OPENSSL_LIB) ..\common\libscdl.lib ws2_32.lib gdi32.lib advapi32.lib winscard.lib Crypt32.lib User32.lib if EXIST $(TARGET).manifest mt -manifest $(TARGET).manifest -outputresource:$(TARGET);2 diff --git a/src/cardmod/cardmod-westcos.reg b/src/minidriver/minidriver-westcos.reg similarity index 77% rename from src/cardmod/cardmod-westcos.reg rename to src/minidriver/minidriver-westcos.reg index e052db53..840daee6 100644 --- a/src/cardmod/cardmod-westcos.reg +++ b/src/minidriver/minidriver-westcos.reg @@ -1,8 +1,7 @@ -Windows Registry Editor Version 5.00 +Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\CEV WESTCOS] -"80000001"="opensc-cardmod.dll" +"80000001"="opensc-minidriver.dll" "ATR"=hex:3f,69,00,00,00,64,01,00,00,00,80,90,00 "ATRMask"=hex:ff,ff,ff,ff,ff,ff,ff,00,00,00,f0,ff,ff "Crypto Provider"="Microsoft Base Smart Card Crypto Provider" - diff --git a/src/cardmod/cardmod.c b/src/minidriver/minidriver.c similarity index 95% rename from src/cardmod/cardmod.c rename to src/minidriver/minidriver.c index 9b20cdc3..65be28b9 100644 --- a/src/cardmod/cardmod.c +++ b/src/minidriver/minidriver.c @@ -1,7 +1,7 @@ /* - * cardmod.c: card module support for opensc + * minidriver.c: OpenSC minidriver * - * Copyright (C) 2009,2010 francois.leblanc@cev-sa.com + * Copyright (C) 2009,2010 francois.leblanc@cev-sa.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,16 +19,16 @@ */ /* - * This module require "cardmod.h" from CNG SDK or plattform SDK to - * be build. + * This module requires "cardmod.h" from CNG SDK or platform SDK to build. */ +#include "config.h" +#ifdef ENABLE_MINIDRIVER + #ifdef _MANAGED #pragma managed(push, off) #endif -#include "config.h" - #include #include @@ -63,14 +63,14 @@ typedef struct _VENDOR_SPECIFIC { char *pin; - + sc_pkcs15_object_t *cert_objs[32]; int cert_count; sc_pkcs15_object_t *prkey_objs[32]; int prkey_count; sc_pkcs15_object_t *pin_objs[8]; int pin_count; - + sc_context_t *ctx; sc_reader_t *reader; sc_card_t *card; @@ -85,7 +85,7 @@ typedef struct _VENDOR_SPECIFIC }cardFiles; SCARDCONTEXT hSCardCtx; SCARDHANDLE hScard; - + }VENDOR_SPECIFIC; static int associate_card(PCARD_DATA pCardData); @@ -97,9 +97,9 @@ static void logprintf(PCARD_DATA pCardData, int level, const char* format, ...) VENDOR_SPECIFIC *vs; /* #define CARDMOD_LOW_LEVEL_DEBUG 1 */ #ifdef CARDMOD_LOW_LEVEL_DEBUG -/* Use a simplied log to get all messages including messages +/* Use a simplied log to get all messages including messages * before opensc is loaded. The file must be modifiable by all - * users as we maybe called under lsa or user. Note data from + * users as we maybe called under lsa or user. Note data from * multiple process and threads may get intermingled. * flush to get last message before ann crash * close so as the file is not left open during any wait. @@ -118,7 +118,7 @@ static void logprintf(PCARD_DATA pCardData, int level, const char* format, ...) } return; } -#endif +#endif va_start(arg, format); if(pCardData != NULL) @@ -139,7 +139,7 @@ static void logprintf(PCARD_DATA pCardData, int level, const char* format, ...) } } va_end(arg); -} +} static void loghex(PCARD_DATA pCardData, int level, PBYTE data, int len) { @@ -147,7 +147,7 @@ static void loghex(PCARD_DATA pCardData, int level, PBYTE data, int len) char *c; int i, a; unsigned char * p; - + logprintf(pCardData, level, "--- %p:%d\n", data, len); if (data == NULL || len <= 0) return; @@ -175,7 +175,8 @@ static void loghex(PCARD_DATA pCardData, int level, PBYTE data, int len) } if (i%32 != 0) logprintf(pCardData, level, " %04X %s\n", a, line); -} +} + static void print_werror(PCARD_DATA pCardData, char *str) { void *buf; @@ -190,7 +191,7 @@ static void print_werror(PCARD_DATA pCardData, char *str) } /* - * check if the card has been removed, or the + * check if the card has been removed, or the * caller has changed the handles. * if so, then free up all previous card info * and reestablish @@ -204,31 +205,29 @@ static int check_reader_status(PCARD_DATA pCardData) { if(!pCardData) return SCARD_E_INVALID_PARAMETER; - + vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); if(!vs) return SCARD_E_INVALID_PARAMETER; logprintf(pCardData, 7, "pCardData->hSCardCtx:0x%08X hScard:0x%08X\n", pCardData->hSCardCtx, pCardData->hScard); - - - if (pCardData->hSCardCtx != vs->hSCardCtx + + if (pCardData->hSCardCtx != vs->hSCardCtx || pCardData->hScard != vs->hScard) { - logprintf (pCardData, 1, "HANDLES CHANGED from 0x%08X 0x%08X\n", vs->hSCardCtx, vs->hScard); + logprintf (pCardData, 1, "HANDLES CHANGED from 0x%08X 0x%08X\n", vs->hSCardCtx, vs->hScard); r = disassociate_card(pCardData); logprintf(pCardData, 1, "disassociate_card r = 0x%08X\n"); r = associate_card(pCardData); /* need to check return codes */ logprintf(pCardData, 1, "associate_card r = 0x%08X\n"); - } else /* This should always work, as BaseCSP should be checking for removal too */ if (vs->reader) { r = sc_detect_card_presence(vs->reader); logprintf(pCardData, 2, "check_reader_status r=%d flags 0x%08X\n", - r, vs->reader->flags); + r, vs->reader->flags); } return SCARD_S_SUCCESS; } @@ -255,7 +254,7 @@ static int get_pin_by_role(PCARD_DATA pCardData, PIN_ID role, struct sc_pkcs15_o VENDOR_SPECIFIC *vs; int i; - if (!pCardData) + if (!pCardData) return SCARD_E_INVALID_PARAMETER; logprintf(pCardData, 2, "get PIN with role %i\n", role); @@ -327,7 +326,7 @@ static void dump_objects (PCARD_DATA pCardData) prkey_info->modulus_length); loghex(pCardData, 5, prkey_info->subject.value, prkey_info->subject.len); } - + for(i = 0; i < vs->cert_count; i++) { sc_pkcs15_read_certificate(vs->p15card, \ @@ -336,10 +335,10 @@ static void dump_objects (PCARD_DATA pCardData) loghex(pCardData, 5, cert->subject, cert->subject_len); sc_pkcs15_free_certificate(cert); } - + for(i = 0; i < vs->pin_count; i++) { - const char *pin_flags[] = + const char *pin_flags[] = { "case-sensitive", "local", "change-disabled", "unblock-disabled", "initialized", "needs-padding", @@ -348,7 +347,7 @@ static void dump_objects (PCARD_DATA pCardData) "exchangeRefData" }; const char *pin_types[] = {"bcd", "ascii-numeric", "UTF-8", - "halfnibble bcd", "iso 9664-1"}; + "halfnibble bcd", "iso 9664-1"}; const struct sc_pkcs15_object *obj = vs->pin_objs[i]; const struct sc_pkcs15_pin_info *pin = (const struct sc_pkcs15_pin_info *) (obj->data); const size_t pf_count = sizeof(pin_flags)/sizeof(pin_flags[0]); @@ -390,12 +389,12 @@ DWORD WINAPI CardDeleteContext(__inout PCARD_DATA pCardData) return SCARD_E_INVALID_PARAMETER; vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); - + if(!vs) return SCARD_E_INVALID_PARAMETER; disassociate_card(pCardData); - + if(vs->ctx) { logprintf(pCardData, 6, "release context\n"); @@ -412,7 +411,7 @@ DWORD WINAPI CardDeleteContext(__inout PCARD_DATA pCardData) return SCARD_S_SUCCESS; } -DWORD WINAPI CardQueryCapabilities(__in PCARD_DATA pCardData, +DWORD WINAPI CardQueryCapabilities(__in PCARD_DATA pCardData, __in PCARD_CAPABILITIES pCardCapabilities) { @@ -425,7 +424,7 @@ DWORD WINAPI CardQueryCapabilities(__in PCARD_DATA pCardData, if (pCardCapabilities->dwVersion != CARD_CAPABILITIES_CURRENT_VERSION && pCardCapabilities->dwVersion != 0) return ERROR_REVISION_MISMATCH; - + pCardCapabilities->dwVersion = CARD_CAPABILITIES_CURRENT_VERSION; pCardCapabilities->fCertificateCompression = TRUE; pCardCapabilities->fKeyGen = FALSE; @@ -469,7 +468,7 @@ DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, int r; sc_pkcs15_cert_t *cert = NULL; VENDOR_SPECIFIC *vs = NULL; - + PUBKEYSTRUCT_BASE *oh = NULL; PUBKEYSTRUCT_BASE *oh2 = NULL; @@ -478,7 +477,7 @@ DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, DWORD ret; sc_pkcs15_pubkey_t *pubkey = NULL; - + logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); logprintf(pCardData, 1, "CardGetContainerInfo bContainerIndex=%u, dwFlags=0x%08X, " \ "dwVersion=%u, cbSigPublicKey=%u, cbKeyExPublicKey=%u\n", \ @@ -488,17 +487,17 @@ DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, if(!pCardData) return SCARD_E_INVALID_PARAMETER; if (!pContainerInfo) SCARD_E_INVALID_PARAMETER; if (dwFlags) return SCARD_E_INVALID_PARAMETER; - if (pContainerInfo->dwVersion < 0 - || pContainerInfo->dwVersion > CONTAINER_INFO_CURRENT_VERSION) + if (pContainerInfo->dwVersion < 0 + || pContainerInfo->dwVersion > CONTAINER_INFO_CURRENT_VERSION) return ERROR_REVISION_MISMATCH; vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); - + check_reader_status(pCardData); if(bContainerIndex>=vs->cert_count) return SCARD_E_INVALID_PARAMETER; - + r = sc_pkcs15_read_certificate(vs->p15card, \ (struct sc_pkcs15_cert_info *)(vs->cert_objs[bContainerIndex]->data), \ &cert); @@ -513,7 +512,7 @@ DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, if(pubkey->algorithm == SC_ALGORITHM_RSA) { int modulus = compute_keybits(&(pubkey->u.rsa.modulus)); - + PCCERT_CONTEXT cer = CertCreateCertificateContext(X509_ASN_ENCODING \ | PKCS_7_ASN_ENCODING, cert->data, cert->data_len); PCERT_PUBLIC_KEY_INFO pinf = \ @@ -523,7 +522,7 @@ DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, CryptDecodeObject(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, \ RSA_CSP_PUBLICKEYBLOB, pinf->PublicKey.pbData, \ pinf->PublicKey.cbData , 0, oh, &sz); - sz2 = sz; + sz2 = sz; oh = (PUBKEYSTRUCT_BASE*)pCardData->pfnCspAlloc(sz); oh2 = (PUBKEYSTRUCT_BASE*)pCardData->pfnCspAlloc(sz2); @@ -532,7 +531,7 @@ DWORD WINAPI CardGetContainerInfo(__in PCARD_DATA pCardData, CryptDecodeObject(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, \ RSA_CSP_PUBLICKEYBLOB, pinf->PublicKey.pbData, \ pinf->PublicKey.cbData , 0, oh, &sz); - + oh->publickeystruc.aiKeyAlg = CALG_RSA_SIGN; pContainerInfo->cbSigPublicKey = sz; pContainerInfo->pbSigPublicKey = (PBYTE)oh; @@ -576,7 +575,7 @@ DWORD WINAPI CardAuthenticatePin(__in PCARD_DATA pCardData, VENDOR_SPECIFIC *vs; if(!pCardData) return SCARD_E_INVALID_PARAMETER; - + vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); @@ -593,37 +592,37 @@ DWORD WINAPI CardAuthenticatePin(__in PCARD_DATA pCardData, if (cbPin < 4 || cbPin > 12) return SCARD_W_WRONG_CHV; - if (wcscmp(wszCARD_USER_ADMIN,pwszUserId) == 0) + if (wcscmp(wszCARD_USER_ADMIN,pwszUserId) == 0) { return SCARD_W_WRONG_CHV; } - + wcstombs(type, pwszUserId, 100); type[10] = 0; - + logprintf(pCardData, 1, "CardAuthenticatePin %.20s, %d, %d\n", NULLSTR(type), \ cbPin, (pcAttemptsRemaining==NULL?-2:*pcAttemptsRemaining)); - + pin_obj = vs->pin_objs[0]; r = sc_pkcs15_verify_pin(vs->p15card, pin_obj, (const u8 *) pbPin, cbPin); - if (r) + if (r) { logprintf(pCardData, 1, "PIN code verification failed: %s\n", sc_strerror(r)); - - if(pcAttemptsRemaining) + + if(pcAttemptsRemaining) { (*pcAttemptsRemaining) = -1; } return SCARD_W_WRONG_CHV; } - + logprintf(pCardData, 3, "Pin code correct.\n"); - + SET_PIN(vs->cardFiles.file_cardcf.bPinsFreshness, ROLE_USER); logprintf(pCardData, 3, "PinsFreshness = %d\n", vs->cardFiles.file_cardcf.bPinsFreshness); - - return SCARD_S_SUCCESS; + + return SCARD_S_SUCCESS; } DWORD WINAPI CardGetChallenge(__in PCARD_DATA pCardData, @@ -683,7 +682,7 @@ DWORD WINAPI CardDeauthenticate(__in PCARD_DATA pCardData, logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); logprintf(pCardData, 1, "CardDeauthenticate%S %d\n", NULLWSTR(pwszUserId), - dwFlags); + dwFlags); if(!pCardData) return SCARD_E_INVALID_PARAMETER; @@ -762,7 +761,7 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, if(pszDirectoryName == NULL) { - if(strcmp(pszFileName, "cardid") == 0) + if(strcmp(pszFileName, "cardid") == 0) { *pcbData = strlen(vs->p15card->tokeninfo->serial_number) + 10; *ppbData = pCardData->pfnCspAlloc(*pcbData); @@ -770,16 +769,16 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, { return SCARD_E_NO_MEMORY; } - + strcpy(*ppbData, vs->p15card->tokeninfo->serial_number); - + logprintf(pCardData, 7, "return cardid "); loghex(pCardData, 7, *ppbData, *pcbData); return SCARD_S_SUCCESS; } - if(strcmp(pszFileName, "cardcf") == 0) + if(strcmp(pszFileName, "cardcf") == 0) { *pcbData = sizeof(vs->cardFiles.file_cardcf); *ppbData = pCardData->pfnCspAlloc(*pcbData); @@ -787,7 +786,7 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, { return SCARD_E_NO_MEMORY; } - + memcpy(*ppbData, &(vs->cardFiles.file_cardcf), *pcbData); logprintf(pCardData, 7, "return cardcf "); @@ -797,32 +796,32 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, } } - + if(pszDirectoryName != NULL && strcmp(pszDirectoryName, "mscp") == 0) { int r,i,n; sc_pkcs15_cert_t *cert = NULL; - if(strcmp(pszFileName, "cmapfile") == 0) + if(strcmp(pszFileName, "cmapfile") == 0) { PCONTAINER_MAP_RECORD p; sc_pkcs15_pubkey_t *pubkey = NULL; - + *pcbData = 32*sizeof(CONTAINER_MAP_RECORD); *ppbData = pCardData->pfnCspAlloc(*pcbData); if(!*ppbData) { return SCARD_E_NO_MEMORY; } - + memset(*ppbData, 0, *pcbData); - + for(i = 0, p = (PCONTAINER_MAP_RECORD)*ppbData; \ i < vs->cert_count; i++,p++) { struct sc_pkcs15_cert_info *cert_info = (sc_pkcs15_cert_info_t *)vs->cert_objs[i]->data; sc_pkcs15_cert_t *cert = NULL; - + r = sc_pkcs15_read_certificate(vs->p15card, cert_info, &cert); logprintf(pCardData, 2, "sc_pkcs15_read_certificate return %d\n", r); if(r) @@ -834,15 +833,15 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, { struct sc_card *card = vs->p15card->card; char guid[MAX_CONTAINER_NAME_LEN + 1]; - + r = sc_pkcs15_get_guid(vs->p15card, vs->cert_objs[i], guid, sizeof(guid)); if (r) return r; logprintf(pCardData, 7, "Guid=%s\n", guid); - + mbstowcs(p->wszGuid, guid, MAX_CONTAINER_NAME_LEN + 1); - + p->bFlags += CONTAINER_MAP_VALID_CONTAINER; if(i == 0) { @@ -864,7 +863,7 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, return SCARD_S_SUCCESS; } - + if(sscanf(pszFileName, "ksc%d", &n) <= 0) { if(sscanf(pszFileName, "kxc%d", &n) <= 0) @@ -872,13 +871,13 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, n = -1; } } - + logprintf(pCardData, 7, "n = %d\n", n); - + if(n>=0 && ncert_count) { sc_pkcs15_cert_t *cert = NULL; - + r = sc_pkcs15_read_certificate(vs->p15card, \ (struct sc_pkcs15_cert_info *)(vs->cert_objs[n]->data), \ &cert); @@ -887,16 +886,16 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, { return SCARD_E_FILE_NOT_FOUND; } - + *pcbData = cert->data_len; *ppbData = pCardData->pfnCspAlloc(*pcbData); - + if(*ppbData == NULL) { logprintf(pCardData, 0, "memory error\n"); return SCARD_E_NO_MEMORY; } - + CopyMemory(*ppbData, cert->data, *pcbData); if(1) @@ -906,11 +905,11 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, } sc_pkcs15_free_certificate(cert); - + return SCARD_S_SUCCESS; } } - + logprintf(pCardData, 5, "File not found\n"); return SCARD_E_FILE_NOT_FOUND; } @@ -927,17 +926,17 @@ DWORD WINAPI CardWriteFile(__in PCARD_DATA pCardData, if(!pCardData) return SCARD_E_INVALID_PARAMETER; - + if(pszDirectoryName == NULL) { - if(strcmp(pszFileName, "cardcf") == 0) + if(strcmp(pszFileName, "cardcf") == 0) { logprintf(pCardData, 2, "write cardcf ok.\n"); loghex(pCardData, 2, pbData, cbData); /*TODO did it change */ return SCARD_S_SUCCESS; } } - + return SCARD_E_FILE_NOT_FOUND; } @@ -959,16 +958,16 @@ DWORD WINAPI CardEnumFiles(__in PCARD_DATA pCardData, { const char root_files[] = "cardapps\0cardcf\0cardid\0\0"; const char mscp_files[] = "kxc00\0kxc01\0cmapfile\0\0"; - + logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); logprintf(pCardData, 1, "CardEnumFiles\n"); - + if (!pCardData) return SCARD_E_INVALID_PARAMETER; if (!pmszFileNames) return SCARD_E_INVALID_PARAMETER; if (!pdwcbFileName) return SCARD_E_INVALID_PARAMETER; if (dwFlags) return SCARD_E_INVALID_PARAMETER; - if (!pszDirectoryName || !strlen(pszDirectoryName)) + if (!pszDirectoryName || !strlen(pszDirectoryName)) { DWORD sz = sizeof(root_files) - 1; LPSTR t = (LPSTR)(*pCardData->pfnCspAlloc)(sz); @@ -978,7 +977,7 @@ DWORD WINAPI CardEnumFiles(__in PCARD_DATA pCardData, *pdwcbFileName = sz; return SCARD_S_SUCCESS; } - if (strcmpi(pszDirectoryName,"mscp") == 0) + if (strcmpi(pszDirectoryName,"mscp") == 0) { DWORD sz = sizeof(mscp_files) - 1; LPSTR t = (LPSTR)(*pCardData->pfnCspAlloc)(sz); @@ -988,7 +987,7 @@ DWORD WINAPI CardEnumFiles(__in PCARD_DATA pCardData, *pdwcbFileName = sz; return SCARD_S_SUCCESS; } - + return SCARD_E_FILE_NOT_FOUND; } @@ -1007,7 +1006,7 @@ DWORD WINAPI CardQueryFreeSpace(__in PCARD_DATA pCardData, __in PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo) { VENDOR_SPECIFIC *vs; - + logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); logprintf(pCardData, 1, "CardQueryFreeSpace %X, dwFlags=%X, version=%X\n", \ pCardFreeSpaceInfo, dwFlags, pCardFreeSpaceInfo->dwVersion); @@ -1021,7 +1020,7 @@ DWORD WINAPI CardQueryFreeSpace(__in PCARD_DATA pCardData, pCardFreeSpaceInfo->dwVersion = CARD_FREE_SPACE_INFO_CURRENT_VERSION; pCardFreeSpaceInfo->dwBytesAvailable = -1; pCardFreeSpaceInfo->dwMaxKeyContainers = vs->cert_count; - + pCardFreeSpaceInfo->dwKeyContainersAvailable = vs->cert_count; /*TODO should this be 0 */ return SCARD_S_SUCCESS; @@ -1039,7 +1038,7 @@ DWORD WINAPI CardQueryKeySizes(__in PCARD_DATA pCardData, if (!pCardData) return SCARD_E_INVALID_PARAMETER; if (!pKeySizes) return SCARD_E_INVALID_PARAMETER; - + pKeySizes->dwVersion = CARD_KEY_SIZES_CURRENT_VERSION; pKeySizes->dwMinimumBitlen = 512; pKeySizes->dwDefaultBitlen = 1024; @@ -1083,16 +1082,16 @@ DWORD WINAPI CardRSADecrypt(__in PCARD_DATA pCardData, } if (!(pInfo->bContainerIndex < vs->cert_count)) - { + { return SCARD_E_INVALID_PARAMETER; } cert_info = (struct sc_pkcs15_cert_info *) \ (vs->cert_objs[pInfo->bContainerIndex]->data); - + for(i = 0; i < vs->prkey_count; i++) - { + { sc_pkcs15_object_t *obj = (sc_pkcs15_object_t *)vs->prkey_objs[i]; if(sc_pkcs15_compare_id(&((struct sc_pkcs15_prkey_info *) obj->data)->id, &(cert_info->id))) { @@ -1106,10 +1105,10 @@ DWORD WINAPI CardRSADecrypt(__in PCARD_DATA pCardData, logprintf(pCardData, 2, "CardRSADecrypt prkey not found\n"); return SCARD_E_INVALID_PARAMETER; } - + prkey_info = (sc_pkcs15_prkey_info_t*)(vs->pkey->data); - + /* input and output buffers are always the same size */ pbuf = pCardData->pfnCspAlloc(pInfo->cbData); if (!pbuf) { @@ -1124,14 +1123,14 @@ DWORD WINAPI CardRSADecrypt(__in PCARD_DATA pCardData, /*inversion donnees*/ for(ui = 0; ui < pInfo->cbData; ui++) pbuf[ui] = pInfo->pbData[pInfo->cbData-ui-1]; - r = sc_pkcs15_decipher(vs->p15card, vs->pkey, + r = sc_pkcs15_decipher(vs->p15card, vs->pkey, opt_crypt_flags, pbuf, pInfo->cbData, pbuf2, pInfo->cbData); logprintf(pCardData, 2, "sc_pkcs15_decipher return %d\n", r); if ( r != pInfo->cbData || r < 0) { logprintf(pCardData, 2, "sc_pkcs15_decipher erreur %s\n", \ sc_strerror(r)); } - + /*inversion donnees */ for(ui = 0; ui < pInfo->cbData; ui++) pInfo->pbData[ui] = pbuf2[pInfo->cbData-ui-1]; @@ -1151,7 +1150,7 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, BYTE dataToSign[0x200]; int r, opt_crypt_flags = 0, opt_hash_flags = 0; size_t dataToSignLen = sizeof(dataToSign); - + logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); logprintf(pCardData, 1, "CardSignData\n"); @@ -1162,7 +1161,7 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, "dwKeySpec=%u, dwSigningFlags=0x%08X, aiHashAlg=0x%08X\n", \ pInfo->dwVersion,pInfo->bContainerIndex ,pInfo->dwKeySpec, \ pInfo->dwSigningFlags, pInfo->aiHashAlg); - + logprintf(pCardData, 7, "pInfo->pbData(%i) ", pInfo->cbData); loghex(pCardData, 7, pInfo->pbData, pInfo->cbData); @@ -1173,50 +1172,50 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, check_reader_status(pCardData); vs->pkey = NULL; - + logprintf(pCardData, 2, "pInfo->dwVersion = %d\n", pInfo->dwVersion); if (dataToSignLen < pInfo->cbData) return SCARD_E_INSUFFICIENT_BUFFER; memcpy(dataToSign, pInfo->pbData, pInfo->cbData); dataToSignLen = pInfo->cbData; - if (CARD_PADDING_INFO_PRESENT & pInfo->dwSigningFlags) + if (CARD_PADDING_INFO_PRESENT & pInfo->dwSigningFlags) { BCRYPT_PKCS1_PADDING_INFO *pinf = (BCRYPT_PKCS1_PADDING_INFO *)pInfo->pPaddingInfo; - if (CARD_PADDING_PKCS1 != pInfo->dwPaddingType) + if (CARD_PADDING_PKCS1 != pInfo->dwPaddingType) { logprintf(pCardData, 0, "unsupported paddingtype\n"); return SCARD_E_UNSUPPORTED_FEATURE; } - if (!pinf->pszAlgId) + if (!pinf->pszAlgId) { /* hashAlg = CALG_SSL3_SHAMD5; */ logprintf(pCardData, 3, "Using CALG_SSL3_SHAMD5 hashAlg\n"); opt_hash_flags = SC_ALGORITHM_RSA_HASH_MD5_SHA1; } - else + else { - + if (wcscmp(pinf->pszAlgId, L"MD5") == 0) opt_hash_flags = SC_ALGORITHM_RSA_HASH_MD5; else if (wcscmp(pinf->pszAlgId, L"SHA1") == 0) opt_hash_flags = SC_ALGORITHM_RSA_HASH_SHA1; else if (wcscmp(pinf->pszAlgId, L"SHAMD5") == 0) opt_hash_flags = SC_ALGORITHM_RSA_HASH_MD5_SHA1; - else + else logprintf(pCardData, 0,"unknown AlgId %S\n",NULLWSTR(pinf->pszAlgId)); } } else { logprintf(pCardData, 3, "CARD_PADDING_INFO_PRESENT not set\n"); - - if (GET_ALG_CLASS(hashAlg) != ALG_CLASS_HASH) + + if (GET_ALG_CLASS(hashAlg) != ALG_CLASS_HASH) { logprintf(pCardData, 0, "bogus aiHashAlg\n"); return SCARD_E_INVALID_PARAMETER; } - if (hashAlg == CALG_MD5) + if (hashAlg == CALG_MD5) opt_hash_flags = SC_ALGORITHM_RSA_HASH_MD5; - else if (hashAlg == CALG_SHA1) + else if (hashAlg == CALG_SHA1) opt_hash_flags = SC_ALGORITHM_RSA_HASH_SHA1; else if (hashAlg == CALG_SSL3_SHAMD5) opt_hash_flags = SC_ALGORITHM_RSA_HASH_MD5_SHA1; @@ -1225,13 +1224,13 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, } /* From sc-minidriver_specs_v7.docx pp.76: - * 'The Base CSP/KSP performs the hashing operation on the data before passing it + * 'The Base CSP/KSP performs the hashing operation on the data before passing it * to CardSignData for signature.' - * So, the SC_ALGORITHM_RSA_HASH_* flags should not be passed to pkcs15 library + * So, the SC_ALGORITHM_RSA_HASH_* flags should not be passed to pkcs15 library * when calculating the signature . * * From sc-minidriver_specs_v7.docx pp.76: - * 'If the aiHashAlg member is nonzero, it specifies the hash algorithm’s object identifier (OID) + * 'If the aiHashAlg member is nonzero, it specifies the hash algorithm’s object identifier (OID) * that is encoded in the PKCS padding.' * So, the digest info has be included into the data to be signed. * */ @@ -1246,12 +1245,12 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, } } opt_crypt_flags = SC_ALGORITHM_RSA_PAD_PKCS1 | SC_ALGORITHM_RSA_HASH_NONE; - + if(!(pInfo->bContainerIndex < vs->cert_count)) { return SCARD_E_INVALID_PARAMETER; } - + cert_info = (struct sc_pkcs15_cert_info *) \ (vs->cert_objs[pInfo->bContainerIndex]->data); @@ -1263,31 +1262,31 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, pInfo->cbSignedData = prkey_info->modulus_length / 8; logprintf(pCardData, 3, "pInfo->cbSignedData = %d\n", pInfo->cbSignedData); - + if(!(pInfo->dwSigningFlags&CARD_BUFFER_SIZE_ONLY)) { int r,i; BYTE *pbuf = NULL; DWORD lg; - + lg = pInfo->cbSignedData; logprintf(pCardData, 3, "lg = %d\n", lg); pbuf = pCardData->pfnCspAlloc(lg); - if (!pbuf) + if (!pbuf) { return SCARD_E_NO_MEMORY; } - + logprintf(pCardData, 7, "Data to sign: "); loghex(pCardData, 7, dataToSign, dataToSignLen); pInfo->pbSignedData = pCardData->pfnCspAlloc(pInfo->cbSignedData); - if (!pInfo->pbSignedData) + if (!pInfo->pbSignedData) { pCardData->pfnCspFree(pbuf); return SCARD_E_NO_MEMORY; } - + r = sc_pkcs15_compute_signature(vs->p15card, vs->pkey, \ opt_crypt_flags, dataToSign, dataToSignLen, pbuf, lg); logprintf(pCardData, 2, "sc_pkcs15_compute_signature return %d\n", r); @@ -1298,7 +1297,7 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, } pInfo->cbSignedData = r; - + /*inversion donnees*/ for(i = 0; i < r; i++) pInfo->pbSignedData[i] = pbuf[r-i-1]; @@ -1309,9 +1308,9 @@ DWORD WINAPI CardSignData(__in PCARD_DATA pCardData, logprintf(pCardData, 7, "pInfo->pbSignedData "); loghex(pCardData, 7, pInfo->pbSignedData, pInfo->cbSignedData); - + } - + logprintf(pCardData, 3, "CardSignData, dwVersion=%u, name=%S, hScard=0x%08X," \ "hSCardCtx=0x%08X\n", pCardData->dwVersion, \ NULLWSTR(pCardData->pwszCardName),pCardData->hScard, \ @@ -1381,9 +1380,9 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData, logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); logprintf(pCardData, 1, "CardAuthenticateEx\n"); - + if (!pCardData) return SCARD_E_INVALID_PARAMETER; - + logprintf(pCardData, 2, "CardAuthenticateEx: PinId=%u, dwFlags=0x%08X, cbPinData=%u, Attempts %s\n", PinId,dwFlags,cbPinData,pcAttemptsRemaining ? "YES" : "NO"); @@ -1394,13 +1393,13 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData, if (dwFlags == CARD_AUTHENTICATE_GENERATE_SESSION_PIN || dwFlags == CARD_AUTHENTICATE_SESSION_PIN) return SCARD_E_UNSUPPORTED_FEATURE; - if (dwFlags && dwFlags != CARD_PIN_SILENT_CONTEXT) + if (dwFlags && dwFlags != CARD_PIN_SILENT_CONTEXT) return SCARD_E_INVALID_PARAMETER; if (NULL == pbPinData) return SCARD_E_INVALID_PARAMETER; - + if (PinId != ROLE_USER) return SCARD_E_INVALID_PARAMETER; - + r = get_pin_by_role(pCardData, ROLE_USER, &pin_obj); if (r != SCARD_S_SUCCESS) { @@ -1409,19 +1408,19 @@ DWORD WINAPI CardAuthenticateEx(__in PCARD_DATA pCardData, } r = sc_pkcs15_verify_pin(vs->p15card, pin_obj, (const u8 *) pbPinData, cbPinData); - if (r) + if (r) { logprintf(pCardData, 2, "PIN code verification failed: %s\n", sc_strerror(r)); - - if(pcAttemptsRemaining) + + if(pcAttemptsRemaining) { (*pcAttemptsRemaining) = -1; } return SCARD_W_WRONG_CHV; } - + logprintf(pCardData, 2, "Pin code correct.\n"); - + SET_PIN(vs->cardFiles.file_cardcf.bPinsFreshness, ROLE_USER); logprintf(pCardData, 7, "PinsFreshness = %d\n", vs->cardFiles.file_cardcf.bPinsFreshness); @@ -1453,9 +1452,9 @@ DWORD WINAPI CardDeauthenticateEx(__in PCARD_DATA pCardData, logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); logprintf(pCardData, 1, "CardDeauthenticateEx PinId=%d dwFlags=0x%08X\n",PinId, dwFlags); - + if (!pCardData) return SCARD_E_INVALID_PARAMETER; - + vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); check_reader_status(pCardData); @@ -1480,7 +1479,7 @@ DWORD WINAPI CardGetContainerProperty(__in PCARD_DATA pCardData, logprintf(pCardData, 1, "CardGetContainerProperty\n"); check_reader_status(pCardData); - + if (!pCardData) return SCARD_E_INVALID_PARAMETER; logprintf(pCardData, 2, "CardGetContainerProperty bContainerIndex=%u, wszProperty=%S," \ "cbData=%u, dwFlags=0x%08X\n",bContainerIndex,NULLWSTR(wszProperty),cbData,dwFlags); @@ -1494,13 +1493,13 @@ DWORD WINAPI CardGetContainerProperty(__in PCARD_DATA pCardData, PCONTAINER_INFO p = (PCONTAINER_INFO) pbData; if (pdwDataLen) *pdwDataLen = sizeof(*p); if (cbData >= sizeof(DWORD)) - if (p->dwVersion != CONTAINER_INFO_CURRENT_VERSION && + if (p->dwVersion != CONTAINER_INFO_CURRENT_VERSION && p->dwVersion != 0 ) return ERROR_REVISION_MISMATCH; if (cbData < sizeof(*p)) return ERROR_INSUFFICIENT_BUFFER; return CardGetContainerInfo(pCardData,bContainerIndex,0,p); } - - if (wcscmp(CCP_PIN_IDENTIFIER,wszProperty) == 0) + + if (wcscmp(CCP_PIN_IDENTIFIER,wszProperty) == 0) { PPIN_ID p = (PPIN_ID) pbData; if (pdwDataLen) *pdwDataLen = sizeof(*p); @@ -1509,7 +1508,7 @@ DWORD WINAPI CardGetContainerProperty(__in PCARD_DATA pCardData, logprintf(pCardData, 2,"Return Pin id %u\n",*p); return SCARD_S_SUCCESS; } - + return SCARD_E_INVALID_PARAMETER; } @@ -1542,7 +1541,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, if (!wszProperty) return SCARD_E_INVALID_PARAMETER; if (!pbData) return SCARD_E_INVALID_PARAMETER; if (!pdwDataLen) return SCARD_E_INVALID_PARAMETER; - + vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); check_reader_status(pCardData); @@ -1552,7 +1551,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, PCARD_FREE_SPACE_INFO pCardFreeSpaceInfo = (PCARD_FREE_SPACE_INFO )pbData; if (pdwDataLen) *pdwDataLen = sizeof(*pCardFreeSpaceInfo); if (cbData < sizeof(*pCardFreeSpaceInfo)) return SCARD_E_NO_MEMORY; - if (pCardFreeSpaceInfo->dwVersion > CARD_FREE_SPACE_INFO_CURRENT_VERSION ) + if (pCardFreeSpaceInfo->dwVersion > CARD_FREE_SPACE_INFO_CURRENT_VERSION ) return ERROR_REVISION_MISMATCH; pCardFreeSpaceInfo->dwVersion = CARD_FREE_SPACE_INFO_CURRENT_VERSION; @@ -1572,7 +1571,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, if (cbData < sizeof(*pCardCapabilities)) return ERROR_INSUFFICIENT_BUFFER; if (pCardCapabilities->dwVersion != CARD_CAPABILITIES_CURRENT_VERSION && pCardCapabilities->dwVersion != 0) return ERROR_REVISION_MISMATCH; - + pCardCapabilities->dwVersion = CARD_CAPABILITIES_CURRENT_VERSION; pCardCapabilities->fCertificateCompression = TRUE; pCardCapabilities->fKeyGen = FALSE; @@ -1589,16 +1588,16 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, if (cbData < sizeof(*pKeySizes)) return ERROR_INSUFFICIENT_BUFFER; if (pKeySizes->dwVersion != CARD_KEY_SIZES_CURRENT_VERSION && pKeySizes->dwVersion != 0) return ERROR_REVISION_MISMATCH; - + pKeySizes->dwVersion = CARD_KEY_SIZES_CURRENT_VERSION; pKeySizes->dwMinimumBitlen = 512; pKeySizes->dwDefaultBitlen = 1024; pKeySizes->dwMaximumBitlen = 16384; pKeySizes->dwIncrementalBitlen = 64; - + logprintf(pCardData, 7, "pKeySizes "); loghex(pCardData, 7, pbData, *pdwDataLen); - + return SCARD_S_SUCCESS; } if (wcscmp(CP_CARD_READ_ONLY,wszProperty) == 0) @@ -1634,7 +1633,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, loghex(pCardData, 7, pbData, *pdwDataLen); return SCARD_S_SUCCESS; } - if (wcscmp(CP_CARD_GUID,wszProperty) == 0) + if (wcscmp(CP_CARD_GUID,wszProperty) == 0) { if (pdwDataLen) *pdwDataLen = sizeof(vs->cardFiles.file_cardid); if (cbData < sizeof(vs->cardFiles.file_cardid)) return ERROR_INSUFFICIENT_BUFFER; @@ -1651,7 +1650,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, if (cbData < sizeof(vs->p15card->tokeninfo->serial_number)) return ERROR_INSUFFICIENT_BUFFER; CopyMemory(pbData,vs->p15card->tokeninfo->serial_number,sizeof(vs->p15card->tokeninfo->serial_number)); - + logprintf(pCardData, 7, "SerialNumber "); loghex(pCardData, 7, pbData, *pdwDataLen); return SCARD_S_SUCCESS; @@ -1664,7 +1663,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, if (p->dwVersion != PIN_INFO_CURRENT_VERSION) return ERROR_REVISION_MISMATCH; p->PinType = AlphaNumericPinType; p->dwFlags = 0; - switch (dwFlags) + switch (dwFlags) { case ROLE_USER: logprintf(pCardData, 2,"returning info on PIN ROLE_USER ( Auth ) [%u]\n",dwFlags); @@ -1673,7 +1672,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, p->PinCachePolicy.dwPinCachePolicyInfo = 0; p->PinCachePolicy.PinCachePolicyType = PinCacheNormal; p->dwChangePermission = 0; - p->dwUnblockPermission = 0; + p->dwUnblockPermission = 0; break; default: logprintf(pCardData, 0,"Invalid Pin number %u requested\n",dwFlags); @@ -1682,7 +1681,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, loghex(pCardData, 7, pbData, *pdwDataLen); - + return SCARD_S_SUCCESS; } if (wcscmp(CP_CARD_LIST_PINS,wszProperty) == 0) @@ -1693,7 +1692,7 @@ DWORD WINAPI CardGetProperty(__in PCARD_DATA pCardData, SET_PIN(*p, ROLE_USER); logprintf(pCardData, 7, "CARD_LIST_PINS "); loghex(pCardData, 7, pbData, *pdwDataLen); - + return SCARD_S_SUCCESS; } if (wcscmp(CP_CARD_AUTHENTICATED_STATE,wszProperty) == 0) @@ -1738,9 +1737,9 @@ DWORD WINAPI CardSetProperty(__in PCARD_DATA pCardData, { logprintf(pCardData, 1, "\nP:%d T:%d pCardData:%p ",GetCurrentProcessId(), GetCurrentThreadId(), pCardData); logprintf(pCardData, 1, "CardSetProperty\n"); - + if (!pCardData) return SCARD_E_INVALID_PARAMETER; - + logprintf(pCardData, 2, "CardSetProperty wszProperty=%S, cbDataLen=%u, dwFlags=%u",\ NULLWSTR(wszProperty),cbDataLen,dwFlags); @@ -1754,7 +1753,7 @@ DWORD WINAPI CardSetProperty(__in PCARD_DATA pCardData, if (wcscmp(CP_PIN_CONTEXT_STRING, wszProperty) == 0) return SCARD_S_SUCCESS; - if (wcscmp(CP_CARD_CACHE_MODE, wszProperty) == 0 || + if (wcscmp(CP_CARD_CACHE_MODE, wszProperty) == 0 || wcscmp(CP_SUPPORTS_WIN_X509_ENROLLMENT, wszProperty) == 0 || wcscmp(CP_CARD_GUID, wszProperty) == 0 || wcscmp(CP_CARD_SERIAL_NO, wszProperty) == 0) { @@ -1765,7 +1764,7 @@ DWORD WINAPI CardSetProperty(__in PCARD_DATA pCardData, if (!cbDataLen) return SCARD_E_INVALID_PARAMETER; if (wcscmp(CP_PARENT_WINDOW, wszProperty) == 0) { - if (cbDataLen != sizeof(DWORD)) + if (cbDataLen != sizeof(DWORD)) return SCARD_E_INVALID_PARAMETER; else { @@ -1787,12 +1786,12 @@ DWORD WINAPI CardAcquireContext(IN PCARD_DATA pCardData, __in DWORD dwFlags) VENDOR_SPECIFIC *vs; DWORD suppliedVersion = 0; u8 challenge[8]; - - if (!pCardData) + + if (!pCardData) return SCARD_E_INVALID_PARAMETER; - if (dwFlags) + if (dwFlags) return SCARD_E_INVALID_PARAMETER; - + suppliedVersion = pCardData->dwVersion; /* VENDOR SPECIFIC */ @@ -1811,19 +1810,19 @@ DWORD WINAPI CardAcquireContext(IN PCARD_DATA pCardData, __in DWORD dwFlags) vs->hScard = pCardData->hScard; vs->hSCardCtx = pCardData->hSCardCtx; - + /* The lowest supported version is 4. */ if (pCardData->dwVersion < MINIMUM_VERSION_SUPPORTED) { return (DWORD) ERROR_REVISION_MISMATCH; } - + if( pCardData->hScard == 0) { logprintf(pCardData, 0, "Invalide handle.\n"); return SCARD_E_INVALID_HANDLE; } - + logprintf(pCardData, 2, "request version pCardData->dwVersion = %d\n", pCardData->dwVersion); pCardData->dwVersion = min(pCardData->dwVersion, CURRENT_VERSION_SUPPORTED); @@ -1834,25 +1833,25 @@ DWORD WINAPI CardAcquireContext(IN PCARD_DATA pCardData, __in DWORD dwFlags) { int r; sc_context_param_t ctx_param; - + vs->ctx = NULL; - + logprintf(pCardData, 3, "create ctx\n"); - + memset(&ctx_param, 0, sizeof(ctx_param)); ctx_param.ver = 1; ctx_param.app_name = "cardmod"; - + r = sc_context_create(&(vs->ctx), &ctx_param); logprintf(pCardData, 3, "sc_context_create passed r = %d\n", r); - if (r) + if (r) { logprintf(pCardData, 0, "Failed to establish context: %s\n", \ sc_strerror(r)); return SCARD_F_UNKNOWN_ERROR; } } - + pCardData->pfnCardDeleteContext = CardDeleteContext; pCardData->pfnCardQueryCapabilities = CardQueryCapabilities; pCardData->pfnCardDeleteContainer = CardDeleteContainer; @@ -1879,10 +1878,10 @@ DWORD WINAPI CardAcquireContext(IN PCARD_DATA pCardData, __in DWORD dwFlags) pCardData->pfnCardSignData = CardSignData; pCardData->pfnCardRSADecrypt = CardRSADecrypt; pCardData->pfnCardConstructDHAgreement = CardConstructDHAgreement; - + associate_card(pCardData); - - logprintf(pCardData, 1, "Opensc init done.\n"); + + logprintf(pCardData, 1, "OpenSC init done.\n"); if(sc_get_challenge(vs->p15card->card, challenge, sizeof(challenge))) { @@ -1894,12 +1893,12 @@ DWORD WINAPI CardAcquireContext(IN PCARD_DATA pCardData, __in DWORD dwFlags) vs->cardFiles.file_cardcf.wContainersFreshness = challenge[0]*256+challenge[1]; vs->cardFiles.file_cardcf.wFilesFreshness = challenge[3]*256+challenge[4]; } - + if (suppliedVersion > 4) { - pCardData->pfnCardDeriveKey = CardDeriveKey; - pCardData->pfnCardDestroyDHAgreement = CardDestroyDHAgreement; - pCardData->pfnCspGetDHAgreement = CspGetDHAgreement; - + pCardData->pfnCardDeriveKey = CardDeriveKey; + pCardData->pfnCardDestroyDHAgreement = CardDestroyDHAgreement; + pCardData->pfnCspGetDHAgreement = CspGetDHAgreement; + if (suppliedVersion > 5 ) { pCardData->pfnCardGetChallengeEx = CardGetChallengeEx; pCardData->pfnCardAuthenticateEx = CardAuthenticateEx; @@ -1922,12 +1921,12 @@ static int associate_card(PCARD_DATA pCardData) BYTE empty_appdir[] = {1,'m','s','c','p',0,0,0,0}; BYTE empty_cardcf[6]={0,0,0,0,0,0}; BYTE empty_cardid[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; - + logprintf(pCardData, 1, "associate_card\n"); - vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); + vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); /* * set the addresses of the reader and card handles - * Our cardmod pcsc code will use these when we call sc_ctx_use_reader + * Our cardmod pcsc code will use these when we call sc_ctx_use_reader * We use the address of the handles as provided in the pCardData */ vs->hSCardCtx = pCardData->hSCardCtx; @@ -1940,7 +1939,7 @@ static int associate_card(PCARD_DATA pCardData) /* set the provided reader and card handles into ctx */ logprintf(pCardData, 5, "cardmod_use_handles %d\n", \ sc_ctx_use_reader(vs->ctx, &vs->hSCardCtx, &vs->hScard)); - + /* should be only one reader */ logprintf(pCardData, 5, "sc_ctx_get_reader_count(ctx): %d\n", \ sc_ctx_get_reader_count(vs->ctx)); @@ -1949,7 +1948,7 @@ static int associate_card(PCARD_DATA pCardData) if(vs->reader) { logprintf(pCardData, 3, "%s\n", NULLSTR(vs->reader->name)); - + r = sc_connect_card(vs->reader, &(vs->card)); logprintf(pCardData, 2, "sc_connect_card result = %d, %s\n", \ r, sc_strerror(r)); @@ -1969,9 +1968,9 @@ static int associate_card(PCARD_DATA pCardData) /* * We want a 16 byte unique serial number - * PKCS15 gives us a char string, that + * PKCS15 gives us a char string, that * appears to have been formated with %02x or %02X - * so as to make it printable. + * so as to make it printable. * So for now we will try and convert back to bin, * and use the last 32 bytes of the vs-p15card->tokeninfo->serial_number * TODO needs to be looked at closer @@ -1980,12 +1979,12 @@ static int associate_card(PCARD_DATA pCardData) if (vs->p15card->tokeninfo && vs->p15card->tokeninfo->serial_number) { size_t len1, len2; char * cserial; - + len1 = strlen(vs->p15card->tokeninfo->serial_number); cserial = vs->p15card->tokeninfo->serial_number; len2 = sizeof(vs->cardFiles.file_cardid) * 2; if ( len1 > len2) { - cserial += len1 - len2; + cserial += len1 - len2; len1 = len2; } len1 /= 2; @@ -1993,48 +1992,48 @@ static int associate_card(PCARD_DATA pCardData) logprintf(pCardData, 7, "serial number r=%d len1=%d len2=%d ",r, len1, len2); loghex(pCardData, 7, vs->cardFiles.file_cardid, sizeof(vs->cardFiles.file_cardid)); } - - + + r = sc_pkcs15_get_objects(vs->p15card, SC_PKCS15_TYPE_CERT_X509, \ vs->cert_objs, 32); - if (r < 0) + if (r < 0) { logprintf(pCardData, 0, "Certificate enumeration failed: %s\n", \ sc_strerror(r)); return SCARD_F_UNKNOWN_ERROR; } - + vs->cert_count = r; logprintf(pCardData, 2, "Found %d certificat(s) in the card.\n", \ vs->cert_count); - + r = sc_pkcs15_get_objects(vs->p15card, SC_PKCS15_TYPE_PRKEY_RSA, \ vs->prkey_objs, 32); - if (r < 0) + if (r < 0) { logprintf(pCardData, 0, "Private key enumeration failed: %s\n", \ sc_strerror(r)); return SCARD_F_UNKNOWN_ERROR; } - + vs->prkey_count = r; logprintf(pCardData, 2, "Found %d private key(s) in the card.\n", \ vs->prkey_count); r = sc_pkcs15_get_objects(vs->p15card, SC_PKCS15_TYPE_AUTH_PIN, \ vs->pin_objs, 8); - if (r < 0) + if (r < 0) { logprintf(pCardData, 2, "Pin object enumeration failed: %s\n", \ sc_strerror(r)); return SCARD_F_UNKNOWN_ERROR; } - + vs->pin_count = r; logprintf(pCardData, 2, "Found %d pin(s) in the card.\n", \ vs->pin_count); -#if 1 +#if 1 dump_objects(pCardData); #endif @@ -2044,15 +2043,15 @@ static int associate_card(PCARD_DATA pCardData) static int disassociate_card(PCARD_DATA pCardData) { - + VENDOR_SPECIFIC *vs; int i; vs = (VENDOR_SPECIFIC*)(pCardData->pvVendorSpecific); logprintf(pCardData, 1, "disassociate_card\n"); - + if(vs->pin != NULL) - { + { free(vs->pin); vs->pin = NULL; } @@ -2061,17 +2060,17 @@ static int disassociate_card(PCARD_DATA pCardData) vs->cert_objs[i] = NULL; } vs->cert_count = 0; - + for (i = 0; i < vs->prkey_count; i++) { vs->prkey_objs[i] = NULL; } vs->prkey_count = 0; - + for (i = 0; i < vs->pin_count; i++) { vs->pin_objs[i] = NULL; } vs->pin_count = 0; - + if(vs->p15card) { @@ -2105,7 +2104,7 @@ BOOL APIENTRY DllMain( HMODULE hModule, logprintf(NULL,8,"\n********** DllMain hModule=0x%08X reason=%d Reserved=%p P:%d T:%d\n", hModule, ul_reason_for_call, lpReserved, GetCurrentProcessId(), GetCurrentThreadId()); #endif - switch (ul_reason_for_call) + switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: #ifdef CARDMOD_LOW_LEVEL_DEBUG @@ -2128,3 +2127,4 @@ BOOL APIENTRY DllMain( HMODULE hModule, #ifdef _MANAGED #pragma managed(pop) #endif +#endif \ No newline at end of file diff --git a/src/cardmod/cardmod.exports b/src/minidriver/minidriver.exports similarity index 100% rename from src/cardmod/cardmod.exports rename to src/minidriver/minidriver.exports diff --git a/src/cardmod/cardmod.inf.in b/src/minidriver/opensc-minidriver.inf.in similarity index 94% rename from src/cardmod/cardmod.inf.in rename to src/minidriver/opensc-minidriver.inf.in index b1ca69c6..f58b4dfc 100644 --- a/src/cardmod/cardmod.inf.in +++ b/src/minidriver/opensc-minidriver.inf.in @@ -140,10 +140,9 @@ wow64_CopyFiles=10,syswow64 ; =================== Generic ================================== [Strings] -ProviderName ="Opensc" -MediaDescription="Opensc Smart Card Minidriver Installation Disk" -CardDeviceName="Opensc Minidriver for Smart Card" +ProviderName ="OpenSC" +MediaDescription="OpenSC Smart Card Minidriver Installation Disk" +CardDeviceName="OpenSC Minidriver" SmartCardName="SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Cev Westcos" SmartCardNameWOW64="SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\SmartCards\Cev Westcos" -SmartCardCardModule="opensc-cardmod32.dll" -SmartCardCardModule64="opensc-cardmod64.dll" +SmartCardCardModule="opensc-minidriver.dll" diff --git a/win32/Make.rules.mak b/win32/Make.rules.mak index a320f093..336ddcf4 100644 --- a/win32/Make.rules.mak +++ b/win32/Make.rules.mak @@ -1,7 +1,7 @@ OPENSC_FEATURES = pcsc -#Include support of minidriver 'cardmod' -MINIDRIVER_DEF = /DENABLE_CARDMOD +#Include support for minidriver +MINIDRIVER_DEF = /DENABLE_MINIDRIVER #Build MSI with the Windows Installer XML (WIX) toolkit, requires WIX >= 3.6 !IF "$(BUILD_ON)" == "WIN64" diff --git a/win32/OpenSC.wxs.in b/win32/OpenSC.wxs.in index 691cbb70..da122d3c 100644 --- a/win32/OpenSC.wxs.in +++ b/win32/OpenSC.wxs.in @@ -31,7 +31,7 @@ - +