add cardmod a minidrivers for windows

git-svn-id: https://www.opensc-project.org/svnp/opensc/trunk@4001 c6295689-39f2-0310-b995-f0e70906c6a9
This commit is contained in:
flc 2010-02-05 13:05:25 +00:00
parent dc6bc0df4a
commit 0e03c6d5cf
15 changed files with 2961 additions and 2 deletions

View File

@ -339,6 +339,9 @@ AC_CHECK_HEADER(
)
CFLAGS="${saved_CFLAGS}"
dnl for minidriver basecsp
test -z "${CARDMOD}" && CARDMOD="no"
if test "${WIN32}" = "no"; then
dnl Special check for pthread support.
ACX_PTHREAD(
@ -350,6 +353,28 @@ if test "${WIN32}" = "no"; then
[AC_MSG_ERROR([POSIX thread support required])]
)
CC="${PTHREAD_CC}"
else
dnl win32 special test for minidriver
AC_CHECK_HEADER([cardmod.h])
if test "${ac_cv_header_cardmod_h}" != "yes"; then
saved_CFLAGS="${CFLAGS}"
CFLAGS="${CFLAGS} -Isrc/libopensc"
AC_MSG_CHECKING([secondary check for carmod.h presence])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#include <windows.h>
#include <internal-winscard.h>
#include <cardmod.h>
int main(int argc, char **argv) { return 0;}]])],
[CARDMOD="yes"],
[CARDMOD="no"])
AC_MSG_RESULT(["${CARDMOD}"])
CFLAGS="${saved_CFLAGS}"
else
CARDMOD="yes"
fi
if test "${CARDMOD}" = "yes"; then
AC_DEFINE([HAVE_CARDMOD_H], [], [card minidriver header])
fi
fi
AC_ARG_VAR([ZLIB_CFLAGS], [C compiler flags for zlib])
@ -666,6 +691,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([CARDMOD], [test "${CARDMOD}" = "yes"])
if test "${enable_pedantic}" = "yes"; then
enable_strict="yes";
@ -701,6 +727,7 @@ AC_CONFIG_FILES([
src/tests/Makefile
src/tests/regression/Makefile
src/tools/Makefile
src/cardmod/Makefile
win32/Makefile
win32/versioninfo.rc
])
@ -749,5 +776,7 @@ OPENCT_CFLAGS: ${OPENCT_CFLAGS}
OPENCT_LIBS: ${OPENCT_LIBS}
PCSC_CFLAGS: ${PCSC_CFLAGS}
CARDMOD: ${CARDMOD}
EOF

View File

@ -412,3 +412,13 @@ app tokend {
score = 10;
}
}
app cardmod {
#allow only cardmodule pcsc reader for minidriver
reader_drivers = cardmod;
reader_driver cardmod {
enable_pinpad = false;
}
}

View File

@ -3,4 +3,4 @@ EXTRA_DIST = Makefile.mak
# Order IS important
SUBDIRS = common include scconf pkcs15init libopensc pkcs11 \
tools tests openssh
tools tests openssh cardmod

View File

@ -2,7 +2,7 @@ TOPDIR = ..
!INCLUDE $(TOPDIR)\win32\Make.rules.mak
SUBDIRS = include common scconf pkcs15init libopensc pkcs11 tools tests
SUBDIRS = include common scconf pkcs15init libopensc pkcs11 tools tests cardmod
all::

30
src/cardmod/Makefile.am Normal file
View File

@ -0,0 +1,30 @@
include $(top_srcdir)/win32/ltrc.inc
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
EXTRA_DIST = Makefile.mak
lib_LTLIBRARIES =
INCLUDES = -I$(top_builddir)/src/include \
-I$(top_srcdir)/src/common \
-I$(top_srcdir)/src/libopensc
opensc_cardmod_la_SOURCES = cardmod.c cardmod.exports
opensc_cardmod_la_LIBADD = $(LTLIB_LIBS) \
$(top_builddir)/src/libopensc/libopensc.la
opensc_cardmod_la_LDFLAGS = $(AM_LDFLAGS) \
-export-symbols "$(srcdir)/cardmod.exports" \
-module -avoid-version -no-undefined
if CARDMOD
sbin_SCRIPTS = cardmod.inf cardmod-westcos.reg
lib_LTLIBRARIES += opensc-cardmod.la
opensc_cardmod_la_SOURCES += $(top_builddir)/win32/versioninfo.rc
opensc_cardmod_la_LIBADD += -lcrypt32
install-exec-hook:
mv "$(DESTDIR)$(libdir)/opensc-cardmod.dll" "$(DESTDIR)$(bindir)/"
else
dist_noinst_SCRIPTS = cardmod.inf cardmod-westcos.reg
endif

603
src/cardmod/Makefile.in Normal file
View File

@ -0,0 +1,603 @@
# Makefile.in generated by automake 1.10.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
# Required to build Windows resource file
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(am__dist_noinst_SCRIPTS_DIST) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(top_srcdir)/win32/ltrc.inc
@CARDMOD_TRUE@am__append_1 = opensc-cardmod.la
@CARDMOD_TRUE@am__append_2 = $(top_builddir)/win32/versioninfo.rc
@CARDMOD_TRUE@am__append_3 = -lcrypt32
subdir = src/cardmod
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(sbindir)"
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
am__DEPENDENCIES_1 =
opensc_cardmod_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(top_builddir)/src/libopensc/libopensc.la \
$(am__DEPENDENCIES_1)
am__opensc_cardmod_la_SOURCES_DIST = cardmod.c cardmod.exports \
$(top_builddir)/win32/versioninfo.rc
am__dirstamp = $(am__leading_dot)dirstamp
@CARDMOD_TRUE@am__objects_1 = $(top_builddir)/win32/versioninfo.lo
am_opensc_cardmod_la_OBJECTS = cardmod.lo $(am__objects_1)
opensc_cardmod_la_OBJECTS = $(am_opensc_cardmod_la_OBJECTS)
opensc_cardmod_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(opensc_cardmod_la_LDFLAGS) $(LDFLAGS) -o $@
@CARDMOD_TRUE@am_opensc_cardmod_la_rpath = -rpath $(libdir)
am__dist_noinst_SCRIPTS_DIST = cardmod.inf cardmod-westcos.reg
sbinSCRIPT_INSTALL = $(INSTALL_SCRIPT)
SCRIPTS = $(dist_noinst_SCRIPTS) $(sbin_SCRIPTS)
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
SOURCES = $(opensc_cardmod_la_SOURCES)
DIST_SOURCES = $(am__opensc_cardmod_la_SOURCES_DIST)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@
AR = @AR@
AS = @AS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFAULT_PCSC_PROVIDER = @DEFAULT_PCSC_PROVIDER@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DLLTOOL = @DLLTOOL@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
GREP = @GREP@
ICONV_CFLAGS = @ICONV_CFLAGS@
ICONV_LIBS = @ICONV_LIBS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LD = @LD@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIPO = @LIPO@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
LTLIB_CFLAGS = @LTLIB_CFLAGS@
LTLIB_LIBS = @LTLIB_LIBS@
MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OPENCT_CFLAGS = @OPENCT_CFLAGS@
OPENCT_LIBS = @OPENCT_LIBS@
OPENSC_LT_AGE = @OPENSC_LT_AGE@
OPENSC_LT_CURRENT = @OPENSC_LT_CURRENT@
OPENSC_LT_OLDEST = @OPENSC_LT_OLDEST@
OPENSC_LT_REVISION = @OPENSC_LT_REVISION@
OPENSC_VERSION_FIX = @OPENSC_VERSION_FIX@
OPENSC_VERSION_MAJOR = @OPENSC_VERSION_MAJOR@
OPENSC_VERSION_MINOR = @OPENSC_VERSION_MINOR@
OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
OPENSSL_LIBS = @OPENSSL_LIBS@
OPTIONAL_ICONV_CFLAGS = @OPTIONAL_ICONV_CFLAGS@
OPTIONAL_ICONV_LIBS = @OPTIONAL_ICONV_LIBS@
OPTIONAL_OPENCT_CFLAGS = @OPTIONAL_OPENCT_CFLAGS@
OPTIONAL_OPENCT_LIBS = @OPTIONAL_OPENCT_LIBS@
OPTIONAL_OPENSSL_CFLAGS = @OPTIONAL_OPENSSL_CFLAGS@
OPTIONAL_OPENSSL_LIBS = @OPTIONAL_OPENSSL_LIBS@
OPTIONAL_PCSC_CFLAGS = @OPTIONAL_PCSC_CFLAGS@
OPTIONAL_READLINE_CFLAGS = @OPTIONAL_READLINE_CFLAGS@
OPTIONAL_READLINE_LIBS = @OPTIONAL_READLINE_LIBS@
OPTIONAL_ZLIB_CFLAGS = @OPTIONAL_ZLIB_CFLAGS@
OPTIONAL_ZLIB_LIBS = @OPTIONAL_ZLIB_LIBS@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PCSC_CFLAGS = @PCSC_CFLAGS@
PCSC_LIBS = @PCSC_LIBS@
PKG_CONFIG = @PKG_CONFIG@
PTHREAD_CC = @PTHREAD_CC@
PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
PTHREAD_LIBS = @PTHREAD_LIBS@
RANLIB = @RANLIB@
RC = @RC@
READLINE_CFLAGS = @READLINE_CFLAGS@
READLINE_LIBS = @READLINE_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
SVN = @SVN@
TR = @TR@
VERSION = @VERSION@
WGET = @WGET@
WGET_OPTS = @WGET_OPTS@
WIN_LIBPREFIX = @WIN_LIBPREFIX@
XSLTPROC = @XSLTPROC@
ZLIB_CFLAGS = @ZLIB_CFLAGS@
ZLIB_LIBS = @ZLIB_LIBS@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
acx_pthread_config = @acx_pthread_config@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
openscincludedir = @openscincludedir@
pdfdir = @pdfdir@
pkcs11dir = @pkcs11dir@
pkgconfigdir = @pkgconfigdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
xslstylesheetsdir = @xslstylesheetsdir@
RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS)
LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE)
MAINTAINERCLEANFILES = $(srcdir)/Makefile.in
EXTRA_DIST = Makefile.mak
lib_LTLIBRARIES = $(am__append_1)
INCLUDES = -I$(top_builddir)/src/include \
-I$(top_srcdir)/src/common \
-I$(top_srcdir)/src/libopensc
opensc_cardmod_la_SOURCES = cardmod.c cardmod.exports $(am__append_2)
opensc_cardmod_la_LIBADD = $(LTLIB_LIBS) \
$(top_builddir)/src/libopensc/libopensc.la $(am__append_3)
opensc_cardmod_la_LDFLAGS = $(AM_LDFLAGS) \
-export-symbols "$(srcdir)/cardmod.exports" \
-module -avoid-version -no-undefined
@CARDMOD_TRUE@sbin_SCRIPTS = cardmod.inf cardmod-westcos.reg
@CARDMOD_FALSE@dist_noinst_SCRIPTS = cardmod.inf cardmod-westcos.reg
all: all-am
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj .rc
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/win32/ltrc.inc $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/cardmod/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu src/cardmod/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
f=$(am__strip_dir) \
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
else :; fi; \
done
uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
p=$(am__strip_dir) \
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
done
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
test "$$dir" != "$$p" || dir=.; \
echo "rm -f \"$${dir}/so_locations\""; \
rm -f "$${dir}/so_locations"; \
done
$(top_builddir)/win32/$(am__dirstamp):
@$(MKDIR_P) $(top_builddir)/win32
@: > $(top_builddir)/win32/$(am__dirstamp)
$(top_builddir)/win32/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) $(top_builddir)/win32/$(DEPDIR)
@: > $(top_builddir)/win32/$(DEPDIR)/$(am__dirstamp)
$(top_builddir)/win32/versioninfo.lo: \
$(top_builddir)/win32/$(am__dirstamp) \
$(top_builddir)/win32/$(DEPDIR)/$(am__dirstamp)
opensc-cardmod.la: $(opensc_cardmod_la_OBJECTS) $(opensc_cardmod_la_DEPENDENCIES)
$(opensc_cardmod_la_LINK) $(am_opensc_cardmod_la_rpath) $(opensc_cardmod_la_OBJECTS) $(opensc_cardmod_la_LIBADD) $(LIBS)
install-sbinSCRIPTS: $(sbin_SCRIPTS)
@$(NORMAL_INSTALL)
test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)"
@list='$(sbin_SCRIPTS)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
if test -f $$d$$p; then \
f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
echo " $(sbinSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(sbindir)/$$f'"; \
$(sbinSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(sbindir)/$$f"; \
else :; fi; \
done
uninstall-sbinSCRIPTS:
@$(NORMAL_UNINSTALL)
@list='$(sbin_SCRIPTS)'; for p in $$list; do \
f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
echo " rm -f '$(DESTDIR)$(sbindir)/$$f'"; \
rm -f "$(DESTDIR)$(sbindir)/$$f"; \
done
mostlyclean-compile:
-rm -f *.$(OBJEXT)
-rm -f $(top_builddir)/win32/versioninfo.$(OBJEXT)
-rm -f $(top_builddir)/win32/versioninfo.lo
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cardmod.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf $(top_builddir)/win32/.libs $(top_builddir)/win32/_libs
-rm -rf .libs _libs
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(LTLIBRARIES) $(SCRIPTS)
installdirs:
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(sbindir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test -z "$(top_builddir)/win32/$(DEPDIR)/$(am__dirstamp)" || rm -f $(top_builddir)/win32/$(DEPDIR)/$(am__dirstamp)
-test -z "$(top_builddir)/win32/$(am__dirstamp)" || rm -f $(top_builddir)/win32/$(am__dirstamp)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
@CARDMOD_FALSE@install-exec-hook:
clean: clean-am
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am:
install-dvi: install-dvi-am
install-exec-am: install-libLTLIBRARIES install-sbinSCRIPTS
@$(NORMAL_INSTALL)
$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
install-html: install-html-am
install-info: install-info-am
install-man:
install-pdf: install-pdf-am
install-ps: install-ps-am
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-libLTLIBRARIES uninstall-sbinSCRIPTS
.MAKE: install-am install-exec-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
clean-libLTLIBRARIES clean-libtool ctags distclean \
distclean-compile distclean-generic distclean-libtool \
distclean-tags distdir dvi dvi-am html html-am info info-am \
install install-am install-data install-data-am install-dvi \
install-dvi-am install-exec install-exec-am install-exec-hook \
install-html install-html-am install-info install-info-am \
install-libLTLIBRARIES install-man install-pdf install-pdf-am \
install-ps install-ps-am install-sbinSCRIPTS install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
tags uninstall uninstall-am uninstall-libLTLIBRARIES \
uninstall-sbinSCRIPTS
.rc.lo:
$(LTRCCOMPILE) -i "$<" -o "$@"
.rc.o:
$(RCCOMPILE) -i "$<" -o "$@"
@CARDMOD_TRUE@install-exec-hook:
@CARDMOD_TRUE@ mv "$(DESTDIR)$(libdir)/opensc-cardmod.dll" "$(DESTDIR)$(bindir)/"
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

12
src/cardmod/Makefile.mak Normal file
View File

@ -0,0 +1,12 @@
TOPDIR = ..\..
TARGET = opensc-cardmod.lib
OBJECTS = cardmod.obj
all: $(TARGET)
$(TARGET): $(OBJECTS)
lib /nologo /machine:ix86 /out:$(TARGET) $(OBJECTS)
!INCLUDE $(TOPDIR)\win32\Make.rules.mak

View File

@ -0,0 +1,8 @@
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\CEV WESTCOS]
"80000001"="opensc-cardmod.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"

1719
src/cardmod/cardmod.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
DllMain
CardAcquireContext

149
src/cardmod/cardmod.inf Normal file
View File

@ -0,0 +1,149 @@
[Version]
Signature="$Windows NT$"
Class=SmartCard
ClassGuid={990A2BD7-E738-46c7-B26F-1CF8FB9F1391}
Provider=%ProviderName%
CatalogFile=delta.cat
DriverVer=05/02/2010,0.0.1.3
[Manufacturer]
%ProviderName%=Minidriver,NTamd64,NTamd64.6.1,NTx86,NTx86.6.1
[Minidriver.NTamd64]
%CardDeviceName%=Minidriver64_Install,SCFILTER\CID_00640181010c829000
[Minidriver.NTx86]
%CardDeviceName%=Minidriver32_Install,SCFILTER\CID_00640181010c829000
[Minidriver.NTamd64.6.1]
%CardDeviceName%=Minidriver64_61_Install,SCFILTER\CID_00640181010c829000
[Minidriver.NTx86.6.1]
%CardDeviceName%=Minidriver32_61_Install,SCFILTER\CID_00640181010c829000
[DefaultInstall]
CopyFiles=x86_CopyFiles
AddReg=AddRegDefault
[DefaultInstall.ntamd64]
CopyFiles=amd64_CopyFiles
CopyFiles=wow64_CopyFiles
AddReg=AddRegWOW64
AddReg=AddRegDefault
[DefaultInstall.NTx86]
CopyFiles=x86_CopyFiles
AddReg=AddRegDefault
[DefaultInstall.ntamd64.6.1]
AddReg=AddRegWOW64
AddReg=AddRegDefault
[DefaultInstall.NTx86.6.1]
AddReg=AddRegDefault
[SourceDisksFiles]
%SmartCardCardModule%=1
%SmartCardCardModule64%=1
[SourceDisksNames]
1 = %MediaDescription%
[Minidriver64_Install.NT]
CopyFiles=amd64_CopyFiles
CopyFiles=wow64_CopyFiles
AddReg=AddRegWOW64
AddReg=AddRegDefault
[Minidriver64_61_Install.NT]
AddReg=AddRegWOW64
AddReg=AddRegDefault
Include=umpass.inf
Needs=UmPass
[Minidriver32_Install.NT]
CopyFiles=x86_CopyFiles
AddReg=AddRegDefault
[Minidriver32_61_Install.NT]
AddReg=AddRegDefault
Include=umpass.inf
Needs=UmPass
[Minidriver64_61_Install.NT.Services]
Include=umpass.inf
Needs=UmPass.Services
[Minidriver32_61_Install.NT.Services]
Include=umpass.inf
Needs=UmPass.Services
[Minidriver64_61_Install.NT.HW]
Include=umpass.inf
Needs=UmPass.HW
[Minidriver64_61_Install.NT.CoInstallers]
Include=umpass.inf
Needs=UmPass.CoInstallers
[Minidriver64_61_Install.NT.Interfaces]
Include=umpass.inf
Needs=UmPass.Interfaces
[Minidriver32_61_Install.NT.HW]
Include=umpass.inf
Needs=UmPass.HW
[Minidriver32_61_Install.NT.CoInstallers]
Include=umpass.inf
Needs=UmPass.CoInstallers
[Minidriver32_61_Install.NT.Interfaces]
Include=umpass.inf
Needs=UmPass.Interfaces
[amd64_CopyFiles]
;%SmartCardCardModule%,%SmartCardCardModule64%
[x86_CopyFiles]
;%SmartCardCardModule%
[wow64_CopyFiles]
;%SmartCardCardModule64%
[AddRegWOW64]
HKLM, %SmartCardNameWOW64%,"ATR",0x00000001,3f,69,00,00,00,64,01,00,00,00,80,90,00
HKLM, %SmartCardNameWOW64%,"ATRMask",0x00000001,ff,ff,ff,ff,ff,ff,ff,00,00,00,f0,ff,ff
HKLM, %SmartCardNameWOW64%,"Crypto Provider",0x00000000,"Microsoft Base Smart Card Crypto Provider"
HKLM, %SmartCardNameWOW64%,"Smart Card Key Storage Provider",0x00000000,"Microsoft Smart Card Key Storage Provider"
HKLM, %SmartCardNameWOW64%,"80000001",0x00000000,%SmartCardCardModule64%
[AddRegDefault]
HKLM, %SmartCardName%,"ATR",0x00000001,3f,69,00,00,00,64,01,00,00,00,80,90,00
HKLM, %SmartCardName%,"ATRMask",0x00000001,ff,ff,ff,ff,ff,ff,ff,00,00,00,f0,ff,ff
HKLM, %SmartCardName%,"Crypto Provider",0x00000000,"Microsoft Base Smart Card Crypto Provider"
HKLM, %SmartCardName%,"Smart Card Key Storage Provider",0x00000000,"Microsoft Smart Card Key Storage Provider"
HKLM, %SmartCardName%,"80000001",0x00000000,%SmartCardCardModule%
[DestinationDirs]
amd64_CopyFiles=10,system32
x86_CopyFiles=10,system32
wow64_CopyFiles=10,syswow64
; =================== Generic ==================================
[Strings]
ProviderName ="Opensc"
MediaDescription="Opensc Smart Card Minidriver Installation Disk"
CardDeviceName="Opensc Minidriver for Smart Card"
SmartCardName="SOFTWARE\Microsoft\Cryptography\Calais\SmartCards\Cev Westcos"
SmartCardNameWOW64="SOFTWARE\Wow6432Node\Microsoft\Cryptography\Calais\SmartCards\Cev Westcos"
SmartCardCardModule="opensc-cardmod.dll"
SmartCardCardModule64="opensc-cardmod64.dll"

View File

@ -95,6 +95,9 @@ static const struct _sc_driver_entry internal_card_drivers[] = {
static const struct _sc_driver_entry internal_reader_drivers[] = {
#ifdef ENABLE_PCSC
{ "pcsc", (void *(*)(void)) sc_get_pcsc_driver },
#ifdef HAVE_CARDMOD_H
{ "cardmod", (void *(*)(void)) sc_get_cardmod_driver },
#endif
#endif
#ifdef ENABLE_CTAPI
{ "ctapi", (void *(*)(void)) sc_get_ctapi_driver },

View File

@ -130,6 +130,8 @@ typedef LONG (PCSC_API *SCardTransmit_t)(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST
LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength);
typedef LONG (PCSC_API *SCardListReaders_t)(SCARDCONTEXT hContext, LPCSTR mszGroups,
LPSTR mszReaders, LPDWORD pcchReaders);
typedef LONG (PCSC_API *SCardGetAttrib_t)(SCARDHANDLE hCard, DWORD dwAttrId,\
LPBYTE pbAttr, LPDWORD pcbAttrLen);
/* Copied from pcsc-lite reader.h */

View File

@ -240,6 +240,7 @@ void sc_apdu_log(sc_context_t *ctx, const u8 *data, size_t len,
extern struct sc_reader_driver *sc_get_pcsc_driver(void);
extern struct sc_reader_driver *sc_get_ctapi_driver(void);
extern struct sc_reader_driver *sc_get_openct_driver(void);
extern struct sc_reader_driver *sc_get_cardmod_driver(void);
#ifdef __cplusplus
}

View File

@ -71,6 +71,7 @@ struct pcsc_global_private_data {
SCardControl_t SCardControl;
SCardTransmit_t SCardTransmit;
SCardListReaders_t SCardListReaders;
SCardGetAttrib_t SCardGetAttrib;
};
struct pcsc_private_data {
@ -1456,5 +1457,394 @@ struct sc_reader_driver * sc_get_pcsc_driver(void)
return &pcsc_drv;
}
/*
*
*/
#ifdef HAVE_CARDMOD_H
#define SCARD_CLASS_SYSTEM 0x7fff
#define SCARD_ATTR_VALUE(Class, Tag) ((((ULONG)(Class)) << 16) | ((ULONG)(Tag)))
#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003)
#define SCARD_ATTR_DEVICE_SYSTEM_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004)
static int cardmod_connect(sc_reader_t *reader)
{
DWORD active_proto, protocol;
SCARDHANDLE card_handle;
LONG rv;
struct pcsc_private_data *priv = GET_PRIV_DATA(reader);
int r;
r = refresh_attributes(reader);
if (r)
return r;
if (!(reader->flags & SC_READER_CARD_PRESENT))
return SC_ERROR_CARD_NOT_PRESENT;
return SC_SUCCESS;
}
static int cardmod_disconnect(sc_reader_t * reader)
{
struct pcsc_private_data *priv = GET_PRIV_DATA(reader);
reader->flags = 0;
return SC_SUCCESS;
}
static struct sc_reader_operations cardmod_ops;
static struct sc_reader_driver cardmod_drv = {
"PC/SC cardmod reader",
"cardmod",
&cardmod_ops,
0, 0, NULL
};
static int cardmod_init(sc_context_t *ctx, void **reader_data)
{
struct pcsc_global_private_data *gpriv;
scconf_block *conf_block = NULL;
int ret = SC_ERROR_INTERNAL;
*reader_data = NULL;
gpriv = (struct pcsc_global_private_data *) calloc(1, sizeof(struct pcsc_global_private_data));
if (gpriv == NULL) {
ret = SC_ERROR_OUT_OF_MEMORY;
goto out;
}
/* Defaults */
gpriv->enable_pinpad = 1;
conf_block = sc_get_conf_block(ctx, "reader_driver", "pcsc", 1);
if (conf_block) {
scconf_get_bool(conf_block, "enable_pinpad", gpriv->enable_pinpad);
}
sc_debug(ctx, "PC/SC options: enable_pinpad=%d", gpriv->enable_pinpad);
gpriv->dlhandle = lt_dlopen("winscard.dll");
if (gpriv->dlhandle == NULL) {
ret = SC_ERROR_CANNOT_LOAD_MODULE;
goto out;
}
gpriv->SCardStatus = (SCardStatus_t)lt_dlsym(gpriv->dlhandle, "SCardStatus");
gpriv->SCardGetStatusChange = (SCardGetStatusChange_t)lt_dlsym(gpriv->dlhandle, "SCardGetStatusChange");
gpriv->SCardTransmit = (SCardTransmit_t)lt_dlsym(gpriv->dlhandle, "SCardTransmit");
if (gpriv->SCardStatus == NULL)
gpriv->SCardStatus = (SCardStatus_t)lt_dlsym(gpriv->dlhandle, "SCardStatusA");
if (gpriv->SCardGetStatusChange == NULL)
gpriv->SCardGetStatusChange = (SCardGetStatusChange_t)lt_dlsym(gpriv->dlhandle, "SCardGetStatusChangeA");
gpriv->SCardGetAttrib = lt_dlsym(gpriv->dlhandle, "SCardGetAttrib");
/* If we have SCardGetAttrib it is correct API */
if (gpriv->SCardGetAttrib != NULL) {
if (gpriv->SCardControl == NULL) {
gpriv->SCardControl = (SCardControl_t)lt_dlsym(gpriv->dlhandle, "SCardControl");
}
}
else {
//gpriv->SCardControlOLD = (SCardControlOLD_t)lt_dlsym(gpriv->dlhandle, "SCardControl");
}
if (
gpriv->SCardStatus == NULL ||
gpriv->SCardGetStatusChange == NULL ||
gpriv->SCardControl == NULL ||
gpriv->SCardTransmit == NULL ||
gpriv->SCardGetAttrib == NULL) {
ret = SC_ERROR_CANNOT_LOAD_MODULE;
goto out;
}
*reader_data = gpriv;
gpriv = NULL;
ret = SC_SUCCESS;
out:
if (gpriv != NULL) {
if (gpriv->dlhandle != NULL)
lt_dlclose(gpriv->dlhandle);
free(gpriv);
}
return ret;
}
static int cardmod_finish(sc_context_t *ctx, void *prv_data)
{
struct pcsc_global_private_data *gpriv = (struct pcsc_global_private_data *) prv_data;
if (gpriv) {
if (gpriv->dlhandle != NULL)
lt_dlclose(gpriv->dlhandle);
free(gpriv);
}
return SC_SUCCESS;
}
static int cardmod_detect_readers(sc_context_t *ctx, void *prv_data)
{
SCARDHANDLE card_handle;
u8 feature_buf[256], rbuf[SC_MAX_APDU_BUFFER_SIZE];
PCSC_TLV_STRUCTURE *pcsc_tlv;
struct pcsc_global_private_data *gpriv = (struct pcsc_global_private_data *) prv_data;
LONG rv;
char reader_name[128];
DWORD rcount, feature_len, display_ioctl, reader_name_size = sizeof(reader_name);
int ret = SC_ERROR_INTERNAL;
HKEY key;
unsigned int i;
wchar_t b;
char *p;
SC_FUNC_CALLED(ctx, 3);
if (!gpriv) {
ret = SC_ERROR_NO_READERS_FOUND;
goto out;
}
sc_debug(ctx, "Probing pcsc readers");
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Opensccm",\
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, "Unable to open registry key Opensccm");
}
//gpriv->pcsc_ctx = pcsc_ctx;
//card_handle = pcsc_card;
sc_debug(ctx, "gpriv->pcsc_ctx = %X, card_handle = %X", gpriv->pcsc_ctx, card_handle);
if(gpriv->SCardGetAttrib(card_handle, SCARD_ATTR_DEVICE_SYSTEM_NAME_A, \
reader_name, &reader_name_size) == SCARD_S_SUCCESS)
{
sc_reader_t *reader = NULL;
struct pcsc_private_data *priv = NULL;
if(1)
{
char texte[2048];
sc_bin_to_hex(reader_name, reader_name_size, texte, sizeof(texte)-5, ':');
sc_debug(ctx, "lecteur name = %s\n%s\n", reader_name,texte);
}
if ((reader = (sc_reader_t *) calloc(1, sizeof(sc_reader_t))) == NULL) {
ret = SC_ERROR_OUT_OF_MEMORY;
goto err1;
}
if ((priv = (struct pcsc_private_data *) malloc(sizeof(struct pcsc_private_data))) == NULL) {
ret = SC_ERROR_OUT_OF_MEMORY;
goto err1;
}
reader->drv_data = priv;
reader->ops = &cardmod_ops;
reader->driver = &cardmod_drv;
if ((reader->name = strdup(reader_name)) == NULL) {
ret = SC_ERROR_OUT_OF_MEMORY;
goto err1;
}
priv->gpriv = gpriv;
reader->active_protocol = pcsc_proto_to_opensc(SCARD_PROTOCOL_T0); /* FIXME: detecte or set active protocol ??? */
if (_sc_add_reader(ctx, reader)) {
ret = SC_SUCCESS; /* silent ignore */
goto err1;
}
priv->pcsc_card = card_handle;
/* check for pinpad support */
if (gpriv->SCardControl != NULL)
{
sc_debug(ctx, "Requesting reader features ... ");
rv = gpriv->SCardControl(card_handle, CM_IOCTL_GET_FEATURE_REQUEST, NULL, 0, feature_buf, sizeof(feature_buf), &feature_len);
if (rv != SCARD_S_SUCCESS)
{
sc_debug(ctx, "SCardControl failed %08x", rv);
}
else
{
if ((feature_len % sizeof(PCSC_TLV_STRUCTURE)) != 0)
{
sc_debug(ctx, "Inconsistent TLV from reader!");
}
else
{
char *log_disabled = "but it's disabled in configuration file";
/* get the number of elements instead of the complete size */
feature_len /= sizeof(PCSC_TLV_STRUCTURE);
pcsc_tlv = (PCSC_TLV_STRUCTURE *)feature_buf;
for (i = 0; i < feature_len; i++)
{
sc_debug(ctx, "Reader feature %02x detected", pcsc_tlv[i].tag);
if (pcsc_tlv[i].tag == FEATURE_VERIFY_PIN_DIRECT)
{
priv->verify_ioctl = ntohl(pcsc_tlv[i].value);
}
else if (pcsc_tlv[i].tag == FEATURE_VERIFY_PIN_START)
{
priv->verify_ioctl_start = ntohl(pcsc_tlv[i].value);
}
else if (pcsc_tlv[i].tag == FEATURE_VERIFY_PIN_FINISH)
{
priv->verify_ioctl_finish = ntohl(pcsc_tlv[i].value);
}
else if (pcsc_tlv[i].tag == FEATURE_MODIFY_PIN_DIRECT)
{
priv->modify_ioctl = ntohl(pcsc_tlv[i].value);
}
else if (pcsc_tlv[i].tag == FEATURE_MODIFY_PIN_START)
{
priv->modify_ioctl_start = ntohl(pcsc_tlv[i].value);
}
else if (pcsc_tlv[i].tag == FEATURE_MODIFY_PIN_FINISH)
{
priv->modify_ioctl_finish = ntohl(pcsc_tlv[i].value);
}
else if (pcsc_tlv[i].tag == FEATURE_IFD_PIN_PROPERTIES)
{
display_ioctl = ntohl(pcsc_tlv[i].value);
}
else
{
sc_debug(ctx, "Reader feature %02x is not supported", pcsc_tlv[i].tag);
}
}
/* Set slot capabilities based on detected IOCTLs */
if (priv->verify_ioctl || (priv->verify_ioctl_start && priv->verify_ioctl_finish)) {
char *log_text = "Reader supports pinpad PIN verification";
if (priv->gpriv->enable_pinpad) {
sc_debug(ctx, log_text);
reader->capabilities |= SC_READER_CAP_PIN_PAD;
} else {
sc_debug(ctx, "%s %s", log_text, log_disabled);
}
}
if (priv->modify_ioctl || (priv->modify_ioctl_start && priv->modify_ioctl_finish)) {
char *log_text = "Reader supports pinpad PIN modification";
if (priv->gpriv->enable_pinpad) {
sc_debug(ctx, log_text);
reader->capabilities |= SC_READER_CAP_PIN_PAD;
} else {
sc_debug(ctx, "%s %s", log_text, log_disabled);
}
}
if (display_ioctl)
{
rcount = sizeof(rbuf);
rv = gpriv->SCardControl(card_handle, display_ioctl, NULL, 0, rbuf, sizeof(rbuf), &rcount);
if (rv == SCARD_S_SUCCESS)
{
if (rcount == sizeof(PIN_PROPERTIES_STRUCTURE))
{
PIN_PROPERTIES_STRUCTURE *caps = (PIN_PROPERTIES_STRUCTURE *)rbuf;
if (caps->wLcdLayout > 0)
{
sc_debug(ctx, "Reader has a display: %04X", caps->wLcdLayout);
reader->capabilities |= SC_READER_CAP_DISPLAY;
}
else
sc_debug(ctx, "Reader does not have a display.");
}
else
{
sc_debug(ctx, "Returned PIN properties structure has bad length (%d/%d)", rcount, sizeof(PIN_PROPERTIES_STRUCTURE));
}
}
}
}
}
}
refresh_attributes(reader);
ret = SC_SUCCESS;
goto out;
err1:
if (priv != NULL)
{
free(priv);
}
if (reader != NULL)
{
if (reader->name)
free(reader->name);
free(reader);
}
}
out:
SC_FUNC_RETURN(ctx, 3, ret);
}
struct sc_reader_driver * sc_get_cardmod_driver(void)
{
struct sc_reader_driver *pcsc_drv = sc_get_pcsc_driver();
cardmod_ops = *(pcsc_drv->ops);
cardmod_ops.init = cardmod_init;
cardmod_ops.finish = cardmod_finish;
cardmod_ops.detect_readers = cardmod_detect_readers;
//cardmod_ops.transmit = ;
cardmod_ops.detect_card_presence = NULL;
cardmod_ops.lock = NULL;
cardmod_ops.unlock = NULL;
cardmod_ops.release = NULL;
cardmod_ops.connect = cardmod_connect;
cardmod_ops.disconnect = cardmod_disconnect;
//cardmod_ops.perform_verify = ;
cardmod_ops.wait_for_event = NULL;
cardmod_ops.reset = NULL;
return &cardmod_drv;
}
#endif
#endif /* HAVE_PCSC */