Add support for passthru cards to libcacard
v2 cover Add support for passthru cards to libcacard
This differs from v1 by:
* checkpatch review
* Patch series, instead of one patch
* Remove internal queue in favor of relying on thread safety of pcsclite
* Remove glib from configure
* Use glib thread and allocation functions
Jeremy White (4):
Add a configure check for libpcsclite, and an option to enable or
disable it.
Add a VCARD_DIRECT implemention to the libcacard smartcard support.
Enable support for passthru (e.g. direct to pcsc) smart cards in
the emul_options entry point in libcacard.
Remove the (broken) passthru option.
Makefile.objs | 5 + configure | 38 ++++ libcacard/capcsc.c | 488 +++++++++++++++++++++++++++++++++++++++++++ libcacard/capcsc.h | 18 ++ libcacard/libcacard.syms | 1 + libcacard/vcard.c | 2 +- libcacard/vcard.h | 2 +- libcacard/vcard_emul_nss.c | 29 ++- libcacard/vcard_emul_type.c | 3 +- libcacard/vscclient.c | 16 +- 10 files changed, 585 insertions(+), 17 deletions(-) create mode 100644 libcacard/capcsc.c create mode 100644 libcacard/capcsc.h
Signature · 1 line
1.7.10.4
PATCH v2 1/4 Add a configure check for libpcsclite, and an option to enable or disable it.
--- configure | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
configure +38 -0
@@ -307,6 +307,7 @@ trace_file="trace" spice="" rbd="" smartcard_nss="" +smartcard_pcsc="" libusb="" usb_redir="" glx=""
@@ -1042,6 +1043,10 @@ for opt do ;; --enable-smartcard-nss) smartcard_nss="yes" ;; + --disable-smartcard-pcsc) smartcard_pcsc="no" + ;; + --enable-smartcard-pcsc) smartcard_pcsc="yes" + ;; --disable-libusb) libusb="no" ;; --enable-libusb) libusb="yes"
@@ -1368,6 +1373,8 @@ Advanced options (experts only): --enable-libnfs enable nfs support --disable-smartcard-nss disable smartcard nss support --enable-smartcard-nss enable smartcard nss support + --disable-smartcard-pcsc disable smartcard pcsc passthru support + --enable-smartcard-pcsc enable smartcard pcsc passthru support --disable-libusb disable libusb (for usb passthrough) --enable-libusb enable libusb (for usb passthrough) --disable-usb-redir disable usb network redirection support
@@ -3674,6 +3681,30 @@ EOF fi fi +# check for pcsclite for smartcard passthru support +# TODO - Add support for Winscard +if test "$smartcard_pcsc" != "no"; then + cat > $TMPC << EOF +#include <winscard.h> +int main(void) { SCardEstablishContext(0, 0, 0, 0); return 0; } +EOF + pcsc_libs="$($pkg_config --libs libpcsclite 2>/dev/null)" + pcsc_cflags="$($pkg_config --cflags libpcsclite 2>/dev/null)" + test_cflags="$pcsc_cflags" + if test "$werror" = "yes"; then + test_cflags="-Werror $test_cflags" + fi + if test -n "$libtool" && + compile_prog "$test_cflags" "$pcsc_libs"; then + smartcard_pcsc="yes" + else + if test "$smartcard_pcsc" = "yes"; then + feature_not_found "pcsc" "Install libpcsclite" + fi + smartcard_pcsc="no" + fi +fi + # check for libusb if test "$libusb" != "no" ; then if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
@@ -4347,6 +4378,7 @@ fi echo "rbd support $rbd" echo "xfsctl support $xfs" echo "nss used $smartcard_nss" +echo "pcsc used $smartcard_pcsc" echo "libusb $libusb" echo "usb net redir $usb_redir" echo "GLX support $glx"
@@ -4703,6 +4735,12 @@ if test "$smartcard_nss" = "yes" ; then echo "NSS_CFLAGS=$nss_cflags" >> $config_host_mak fi +if test "$smartcard_pcsc" = "yes" ; then + echo "CONFIG_SMARTCARD_PCSC=y" >> $config_host_mak + echo "PCSC_LIBS=$pcsc_libs" >> $config_host_mak + echo "PCSC_CFLAGS=$pcsc_cflags" >> $config_host_mak +fi + if test "$libusb" = "yes" ; then echo "CONFIG_USB_LIBUSB=y" >> $config_host_mak fi
Signature · 1 line
1.7.10.4
PATCH v2 2/4 Add a VCARD_DIRECT implemention to the libcacard smartcard support.
In reply to Jeremy WhiteThis uses libpcsclite to provide direct communication with a smartcard.
--- Makefile.objs | 5 + libcacard/capcsc.c | 488 ++++++++++++++++++++++++++++++++++++++++++++++ libcacard/capcsc.h | 18 ++ libcacard/libcacard.syms | 1 + 4 files changed, 512 insertions(+) create mode 100644 libcacard/capcsc.c create mode 100644 libcacard/capcsc.h
Makefile.objs +5 -0
@@ -32,6 +32,11 @@ libcacard-y += libcacard/card_7816.o libcacard-y += libcacard/vcardt.o libcacard/vcard_emul_nss.o-cflags := $(NSS_CFLAGS) libcacard/vcard_emul_nss.o-libs := $(NSS_LIBS) +ifeq ($(CONFIG_SMARTCARD_PCSC),y) +libcacard-y += libcacard/capcsc.o +libcacard/capcsc.o-cflags := $(PCSC_CFLAGS) +libcacard/capcsc.o-libs := $(PCSC_LIBS) +endif ###################################################################### # Target independent part of system emulation. The long term path is to
libcacard/capcsc.c new file +488 -0
488 lines not on this page · raw message
libcacard/capcsc.h new file +18 -0
@@ -0,0 +1,18 @@ +/* +* This work is licensed under the terms of the GNU LGPL, version 2.1 or later. +* See the COPYING.LIB file in the top-level directory. +*/ +#ifndef CAPCSC_H +#define CAPCSC_H 1 + +#define CAPCSC_POLL_TIME 50/* ms - Time we will poll for */ +/* card change when a */ +/* reader is connected */ +#define CAPCSC_MAX_READERS 16 + +#define CAPCSC_APPLET "CAPCSC APPLET" + +int capcsc_init (void ); + + +#endif
libcacard/libcacard.syms +1 -0
@@ -1,5 +1,6 @@ cac_card_init cac_is_cac_card +capcsc_init vcard_add_applet vcard_apdu_delete vcard_apdu_new
Signature · 1 line
1.7.10.4
PATCH v2 3/4 Enable support for passthru (e.g. direct to pcsc) smart cards in the emul_options entry point in libcacard.
In reply to Jeremy White--- libcacard/vcard.c | 2 +- libcacard/vcard.h | 2 +- libcacard/vcard_emul_nss.c | 29 ++++++++++++++++++++++++++++- libcacard/vcard_emul_type.c | 3 ++- 4 files changed, 32 insertions(+), 4 deletions(-)
libcacard/vcard.c +1 -1
@@ -95,7 +95,7 @@ vcard_reset(VCard *card, VCardPower power)VCardApplet *vcard_new_applet (VCardProcessAPDU applet_process_function,VCardResetApplet applet_reset_function, -unsigned char *aid,int aid_len) +const unsigned char *aid,int aid_len) {VCardApplet *applet;
libcacard/vcard.h +1 -1
@@ -30,7 +30,7 @@ void vcard_reset(VCard *card, VCardPower power);*/ VCardApplet *vcard_new_applet (VCardProcessAPDU applet_process_function,VCardResetApplet applet_reset_function, -unsigned char *aid,int aid_len); +const unsigned char *aid,int aid_len);/* * destructor for a VCardApplet
libcacard/vcard_emul_nss.c +28 -1
@@ -25,6 +25,7 @@#include <prthread.h> #include <secerr.h> +#include "config-host.h" #include "qemu-common.h" #include "vcard.h"
@@ -34,6 +35,9 @@#include "vevent.h" #include "libcacard/vcardt_internal.h" +#if defined(CONFIG_SMARTCARD_PCSC ) +#include "capcsc.h" +#endif typedef enum {
@@ -892,6 +896,23 @@ vcard_emul_init(const VCardEmulOptions *options) options = &default_options; } +#if defined(CONFIG_SMARTCARD_PCSC ) +if (options->use_hw && options->hw_card_type ==VCARD_EMUL_PASSTHRU ) { +if (options->vreader_count >0 ) { +fprintf (stderr,"Error: you cannot use a soft card and " +"a passthru card simultaneously.\n" ); +return VCARD_EMUL_FAIL ; + } + +if (capcsc_init ()) { +fprintf (stderr,"Error initializing PCSC interface.\n" ); +return VCARD_EMUL_FAIL ; + } + +return VCARD_EMUL_OK ; + } +#endif +/* first initialize NSS */ if (options->nss_db) { rv =NSS_Init (options->nss_db);
@@ -1270,5 +1291,11 @@ vcard_emul_usage(void)"hw_type, and parameters of hw_param.\n" "\n" "If more one or more soft= parameters are specified, these readers will be\n" -"presented to the guest\n"); +"presented to the guest\n" +#if defined(CONFIG_SMARTCARD_PCSC ) +"\n" +"If a hw_type of PASSTHRU is given, a connection will be made to the hardware\n" +"using libpcscslite. Note that in that case, no soft cards are permitted.\n" +#endif +); }
libcacard/vcard_emul_type.c +2 -1
@@ -9,6 +9,7 @@*/ #include <strings.h> +#include "config-host.h" #include "vcardt.h" #include "vcard_emul_type.h" #include "cac.h"
@@ -48,7 +49,7 @@ VCardEmulType vcard_emul_type_from_string(const char *type_string)if (strcasecmp (type_string,"CAC" ) ==0 ) {return VCARD_EMUL_CAC ; } -#ifdef USE_PASSTHRU +#ifdef CONFIG_SMARTCARD_PCSC if (strcasecmp (type_string,"PASSTHRU" ) ==0 ) {return VCARD_EMUL_PASSTHRU ; }
Signature · 1 line
1.7.10.4
PATCH v2 4/4 Remove the (broken) passthru option.
In reply to Jeremy WhiteThat option can be achieved using -e "use_hw=yes hw_type=passthru"
--- libcacard/vscclient.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-)
libcacard/vscclient.c +3 -13
@@ -41,14 +41,8 @@ print_byte_array(static void print_usage (void ) { -printf ("vscclient [-c <certname> .. -e <emul_args> -d <level>%s] " -"<host> <port>\n" , -#ifdef USE_PASSTHRU -" -p" ); -printf (" -p use passthrough mode\n" ); -#else - ""); -#endif +printf ("vscclient [-c <certname> .. -e <emul_args> -d <level>] " +"<host> <port>\n" );vcard_emul_usage (); }
@@ -673,7 +667,7 @@ main( }#endif -while ((c =getopt (argc, argv,"c:e:pd:" )) !=-1 ) { +while ((c =getopt (argc, argv,"c:e:d:" )) !=-1 ) {switch (c) {case 'c' :if (cert_count >=MAX_CERTS ) {
@@ -685,10 +679,6 @@ main(case 'e' : emul_args = optarg;break ; -case 'p' : -print_usage (); -exit (4 ); -break ;case 'd' : verbose =get_id_from_string (optarg,1 );break ;
Signature · 1 line
1.7.10.4
Ping? Anything I can do to get review/motion on these patches?
Cheers,
Jeremy
Quoted 29 lines · Jeremy White
This differs from v1 by:
* checkpatch review
* Patch series, instead of one patch
* Remove internal queue in favor of relying on thread safety of pcsclite
* Remove glib from configure
* Use glib thread and allocation functionsJeremy White (4):
Add a configure check for libpcsclite, and an option to enable or
disable it.
Add aVCARD_DIRECTimplemention to the libcacard smartcard support.
Enable support for passthru (e.g. direct to pcsc) smart cards in
theemul_optionsentry point in libcacard.
Remove the (broken) passthru option.Makefile.objs | 5 + configure | 38 ++++ libcacard/capcsc.c | 488 +++++++++++++++++++++++++++++++++++++++++++ libcacard/capcsc.h | 18 ++ libcacard/libcacard.syms | 1 + libcacard/vcard.c | 2 +- libcacard/vcard.h | 2 +- libcacard/vcard_emul_nss.c | 29 ++- libcacard/vcard_emul_type.c | 3 +- libcacard/vscclient.c | 16 +- 10 files changed, 585 insertions(+), 17 deletions(-) create mode 100644 libcacard/capcsc.c create mode 100644 libcacard/capcsc.h