Attached is a patch to the cardmod code to do the following:
(1) Fix an uninitialized stricture by by using calloc
in stead of malloc. With out this it was having problems
with checking the status on the reader.
(2) Implement a change that this should work for Brian Thomas
that allows one to not detect the reader when creating
the sc_context. This uses the
SC_CONTEXT_PARAM_DONT_DETECT_READERS flag in the ctx_params
(The more I think about this, this should be the default
to not detect the readers during the sc_create_ctx, as
a flag on opensc.conf could control this instead.)
(2) Eliminate the storing of the SCARDCONTEXT and SCARDHANDLE
in the registry. Instead, cardmod.c will store them
in its VENDOR_SCPECIFIC structure, call sc_context_create
with the SC_CONTEXT_PARAM_DONT_DETECT_READERS flag set
in the ctx_params. It will then modify the ctx,
and then call sc_ctx_detect_readers that will call the
cardmod code in reader-pcsc.c that will use the SCARDCONTEXT
and SCARDHANDLE.
I can get this to work in Vista with certutil -SCinfo, but there
is some issue as is says it can not open the key. I think this
is an issue with using a 39 character key container name and a
constant for a serial number.
It does not work with login or runas. This may be the same issue
with after reading the certificate, it is not registering the
container so it can be used later.
The patch is against 0.12.0. and was built on Ubuntu.
I would hope Brian and François could look this over to see if it
should be committed.
--
Douglas E. Engert <[email protected]>
Argonne National Laboratory
9700 South Cass Avenue
Argonne, Illinois 60439
(630) 252-5444
--- ./src/cardmod/,cardmod.c Wed Dec 22 11:14:36 2010
+++ ./src/cardmod/cardmod.c Wed Jan 19 17:19:20 2011
@@ -77,6 +77,8 @@
CARD_CACHE_FILE_FORMAT file_cardcf;
BYTE file_cardid[16];
}cardFiles;
+ SCARDCONTEXT hSCardCtx;
+ SCARDHANDLE hScard;
}VENDOR_SPECIFIC;
@@ -1381,6 +1383,9 @@
"hScard=0x%08X, hSCardCtx=0x%08X\n",
pCardData->dwVersion, \
NULLWSTR(pCardData->pwszCardName),pCardData->hScard, \
pCardData->hSCardCtx);
+
+ vs->hScard = pCardData->hScard;
+ vs->hSCardCtx = pCardData->hSCardCtx;
/* The lowest supported version is 4. */
if (pCardData->dwVersion < MINIMUM_VERSION_SUPPORTED)
@@ -1413,29 +1418,10 @@
memset(&ctx_param, 0, sizeof(ctx_param));
ctx_param.ver = 1;
ctx_param.app_name = "cardmod";
+ /* we need to modify the context before detecting readers */
+ ctx_param.flags = SC_CONTEXT_PARAM_DONT_DETECT_READERS;
+
- if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\OpenSC
Project\\Opensc", 0, NULL, \
- REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &key, NULL)
== ERROR_SUCCESS)
- {
- if(RegSetValueEx(key, "pcsc_ctx", NULL, REG_DWORD,
&(pCardData->hSCardCtx), \
- sizeof(pCardData->hSCardCtx)) != ERROR_SUCCESS)
- {
- print_werror(pCardData, "RegSetValueEx
pcsc_ctx");
- return SCARD_F_UNKNOWN_ERROR;
- }
- if(RegSetValueEx(key, "pcsc_card", NULL, REG_DWORD,
&(pCardData->hScard), \
- sizeof(pCardData->hScard)) != ERROR_SUCCESS)
- {
- print_werror(pCardData, "RegSetValueEx
pcsc_card");
- return SCARD_F_UNKNOWN_ERROR;
- }
- RegCloseKey(key);
- }
- else
- {
- print_werror(pCardData, "RegCreateKeyEx");
- return SCARD_F_UNKNOWN_ERROR;
- }
r = sc_context_create(&(vs->ctx), &ctx_param);
logprintf(pCardData, 3, "sc_context_create passed r = %d\n", r);
@@ -1449,6 +1435,16 @@
{
int i;
+ /* set the addresses of the reader and card handles
+ * Our cardmod pcsc code will use these during the
detect_readers
+ * We use the address of the handles as stored in the vs
+ */
+ vs->ctx->phSCardCtx = &vs->hSCardCtx;
+ vs->ctx->phScard = &vs->hScard;
+
+ logprintf(pCardData, 5, "sc_ctx_detect_readers(ctx):
%d\n", \
+ sc_ctx_detect_readers(vs->ctx));
+
logprintf(pCardData, 5, "sc_ctx_get_reader_count(ctx):
%d\n", \
sc_ctx_get_reader_count(vs->ctx));
@@ -1663,7 +1659,11 @@
p = name + strlen(name) - 1;
while (isalnum(*p) || ('.' == *p) || ('_' ==
*p)) p--;
p++;
-
+
+/* the following doies not look correct, as it is trying to limit
+ * what applications can use cardmod.
+ */
+#if 0
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE\\OpenSC Project\\Opensc",\
NULL, KEY_READ, &key)==ERROR_SUCCESS)
{
@@ -1682,6 +1682,7 @@
RegCloseKey(key);
}
+#endif
if (*p == '\0') return FALSE;
if(!winlogon)
--- ./src/libopensc/,reader-pcsc.c Wed Dec 22 11:14:47 2010
+++ ./src/libopensc/reader-pcsc.c Wed Jan 19 16:57:54 2011
@@ -1674,37 +1674,8 @@
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Probing pcsc readers");
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\OpenSC
Project\\Opensc",\
- NULL, KEY_READ, &key)==ERROR_SUCCESS)
- {
- CHAR val[1024];
- DWORD type;
- LONG size = sizeof(val);
-
- if(RegQueryValueEx(key,"pcsc_ctx", NULL, &type,
- val, &size) == ERROR_SUCCESS)
- {
- if(type == REG_DWORD)
- {
- gpriv->pcsc_ctx = *(DWORD*)val;
- }
- }
-
- if(RegQueryValueEx(key,"pcsc_card", NULL, &type,
- val, &size) == ERROR_SUCCESS)
- {
- if(type == REG_DWORD)
- {
- card_handle = *(DWORD*)val;
- }
- }
-
- RegCloseKey(key);
- }
- else
- {
- sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "Unable to open registry key
Opensc");
- }
+ gpriv->pcsc_ctx = *(SCARDCONTEXT *)ctx->phSCardCtx;
+ card_handle = *(SCARDHANDLE *)ctx->phScard;
sc_debug(ctx, SC_LOG_DEBUG_NORMAL, "gpriv->pcsc_ctx = %X, card_handle =
%X", gpriv->pcsc_ctx, card_handle);
@@ -1727,7 +1698,7 @@
ret = SC_ERROR_OUT_OF_MEMORY;
goto err1;
}
- if ((priv = malloc(sizeof(struct pcsc_private_data))) == NULL) {
+ if ((priv = calloc(1, sizeof(struct pcsc_private_data))) ==
NULL) {
ret = SC_ERROR_OUT_OF_MEMORY;
goto err1;
}
--- ./src/libopensc/,ctx.c Wed Dec 22 11:14:47 2010
+++ ./src/libopensc/ctx.c Wed Jan 19 10:46:57 2011
@@ -659,7 +659,8 @@
free(opts.forced_card_driver);
}
del_drvs(&opts);
- sc_ctx_detect_readers(ctx);
+ if (parm == NULL || (parm->flags &
SC_CONTEXT_PARAM_DONT_DETECT_READERS) == 0)
+ sc_ctx_detect_readers(ctx);
*ctx_out = ctx;
return SC_SUCCESS;
}
--- ./src/libopensc/,opensc.h Wed Dec 22 11:14:47 2010
+++ ./src/libopensc/opensc.h Wed Jan 19 10:40:03 2011
@@ -609,6 +609,10 @@
void *mutex;
unsigned int magic;
+
+ /* Used by cardmod as BaseCSP will pass in the handles to use */
+ void * phSCardCtx;
+ void * phScard;
} sc_context_t;
/* APDU handling functions */
@@ -637,6 +641,8 @@
* in finding application-specific configuration data. Can be NULL.
*/
int sc_establish_context(sc_context_t **ctx, const char *app_name);
+
+#define SC_CONTEXT_PARAM_DONT_DETECT_READERS 0x00000001
/**
* @struct sc_context_t initialization parameters
_______________________________________________
opensc-devel mailing list
[email protected]
http://www.opensc-project.org/mailman/listinfo/opensc-devel