New upstream version 1.4.34

This commit is contained in:
Ludovic Rousseau 2021-01-24 14:17:48 +01:00
parent a0267df565
commit a7859a1fbd
29 changed files with 1198 additions and 221 deletions

982
ChangeLog

File diff suppressed because it is too large Load Diff

View File

@ -58,8 +58,8 @@ target directory to use.
configuring the driver for the serial reader configuring the driver for the serial reader
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You have to create or edit the file /etc/reader.conf. The file should You have to create a file in the /etc/reader.conf.d/ directory. The file
contain something like: should contain something like:
# Gemalto reader with serial communication # Gemalto reader with serial communication
# - n is the serial port to use n in [0..3] # - n is the serial port to use n in [0..3]
@ -90,6 +90,7 @@ DEVICENAME field. Supported values are:
- GemCoreSIMPro2 for IDBridge CR30 - GemCoreSIMPro2 for IDBridge CR30
- GemPCPinPad for GemPC PinPad - GemPCPinPad for GemPC PinPad
- GemPCTwin for GemPC Twin (default value) - GemPCTwin for GemPC Twin (default value)
- SEC1210 for Microchip SEC1210
You will then have something like: You will then have something like:
DEVICENAME /dev/ttyS0:GemPCPinPad DEVICENAME /dev/ttyS0:GemPCPinPad

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.16.2 from Makefile.am. # Makefile.in generated by automake 1.16.3 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2020 Free Software Foundation, Inc. # Copyright (C) 1994-2020 Free Software Foundation, Inc.
@ -202,6 +202,8 @@ am__relativize = \
GZIP_ENV = --best GZIP_ENV = --best
DIST_ARCHIVES = $(distdir).tar.bz2 DIST_ARCHIVES = $(distdir).tar.bz2
DIST_TARGETS = dist-bzip2 DIST_TARGETS = dist-bzip2
# Exists only to be overridden by the user if desired.
AM_DISTCHECK_DVI_TARGET = dvi
distuninstallcheck_listfiles = find . -type f -print distuninstallcheck_listfiles = find . -type f -print
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
@ -681,7 +683,7 @@ distcheck: dist
$(DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \
--srcdir=../.. --prefix="$$dc_install_base" \ --srcdir=../.. --prefix="$$dc_install_base" \
&& $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
&& $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \

View File

@ -117,6 +117,37 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
History: History:
======== ========
1.4.34 - 24 January 2021, Ludovic Rousseau
- Add support of
- ACS ACR1252IMP Reader
- ACS CryptoMate EVO
- Aktiv Rutoken SCR 3001 Reader
- Avtor KP-375BLE
- Avtor SC Reader KP382
- BIT4ID mLector AIR DI V3
- BIT4ID miniLector AIR NFC v3
- Bit4id Digital-DNA Key (ProductID 0x2354)
- Canokeys Canokey
- DESKO GmbH IDenty chrom
- DESKO GmbH PENTA Scanner
- FT Biopass CCID
- FT Biopass FIDO2
- FT Biopass KB CCID
- FT Biopass KB FIDO CCID
- Feitian BLE CCID Dongle
- Feitian R805
- Feitian vR504 Contactless Reader
- GoTrust Idem Key
- Identiv uTrust 3720 Contactless Reader
- Sunrex HP USB Business Slim Smartcard CCID Keyboard
- sysmocom - s.f.m.c. GmbH sysmoOCTSIM
- Fail if the requested protocol is not supported by reader
- Disable USB suspend for the AlcorMicro AU9520 reader
- Return "no smart card" if we get notified during a transmit
- Minor improvements reported by Maksim Ivanov
- Some other minor improvements
1.4.33 - 25 June 2020, Ludovic Rousseau 1.4.33 - 25 June 2020, Ludovic Rousseau
- Add support of - Add support of
- Genesys Logic CCID Card Reader (idProduct: 0x0771) - Genesys Logic CCID Card Reader (idProduct: 0x0771)

13
aclocal.m4 vendored
View File

@ -1,4 +1,4 @@
# generated automatically by aclocal 1.16.2 -*- Autoconf -*- # generated automatically by aclocal 1.16.3 -*- Autoconf -*-
# Copyright (C) 1996-2020 Free Software Foundation, Inc. # Copyright (C) 1996-2020 Free Software Foundation, Inc.
@ -311,7 +311,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.16' [am__api_version='1.16'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro. dnl require some minimum version. Point them to the right macro.
m4_if([$1], [1.16.2], [], m4_if([$1], [1.16.3], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
]) ])
@ -327,7 +327,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.16.2])dnl [AM_AUTOMAKE_VERSION([1.16.3])dnl
m4_ifndef([AC_AUTOCONF_VERSION], m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@ -1093,12 +1093,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN],
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
AC_REQUIRE_AUX_FILE([missing])dnl AC_REQUIRE_AUX_FILE([missing])dnl
if test x"${MISSING+set}" != xset; then if test x"${MISSING+set}" != xset; then
case $am_aux_dir in MISSING="\${SHELL} '$am_aux_dir/missing'"
*\ * | *\ *)
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
*)
MISSING="\${SHELL} $am_aux_dir/missing" ;;
esac
fi fi
# Use eval to expand $SHELL # Use eval to expand $SHELL
if eval "$MISSING --is-lightweight"; then if eval "$MISSING --is-lightweight"; then

31
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for ccid 1.4.33. # Generated by GNU Autoconf 2.69 for ccid 1.4.34.
# #
# #
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@ -587,8 +587,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='ccid' PACKAGE_NAME='ccid'
PACKAGE_TARNAME='ccid' PACKAGE_TARNAME='ccid'
PACKAGE_VERSION='1.4.33' PACKAGE_VERSION='1.4.34'
PACKAGE_STRING='ccid 1.4.33' PACKAGE_STRING='ccid 1.4.34'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' PACKAGE_URL=''
@ -1379,7 +1379,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures ccid 1.4.33 to adapt to many kinds of systems. \`configure' configures ccid 1.4.34 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1450,7 +1450,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of ccid 1.4.33:";; short | recursive ) echo "Configuration of ccid 1.4.34:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1597,7 +1597,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
ccid configure 1.4.33 ccid configure 1.4.34
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -2016,7 +2016,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by ccid $as_me 1.4.33, which was It was created by ccid $as_me 1.4.34, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -2570,12 +2570,7 @@ program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
am_aux_dir=`cd "$ac_aux_dir" && pwd` am_aux_dir=`cd "$ac_aux_dir" && pwd`
if test x"${MISSING+set}" != xset; then if test x"${MISSING+set}" != xset; then
case $am_aux_dir in MISSING="\${SHELL} '$am_aux_dir/missing'"
*\ * | *\ *)
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
*)
MISSING="\${SHELL} $am_aux_dir/missing" ;;
esac
fi fi
# Use eval to expand $SHELL # Use eval to expand $SHELL
if eval "$MISSING --is-lightweight"; then if eval "$MISSING --is-lightweight"; then
@ -2880,7 +2875,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='ccid' PACKAGE='ccid'
VERSION='1.4.33' VERSION='1.4.34'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -8392,11 +8387,11 @@ $as_echo "$lt_cv_ld_force_load" >&6; }
# to the OS version, if on x86, and 10.4, the deployment # to the OS version, if on x86, and 10.4, the deployment
# target defaults to 10.4. Don't you love it? # target defaults to 10.4. Don't you love it?
case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
10.0,*86*-darwin8*|10.0,*-darwin[91]*) 10.0,*86*-darwin8*|10.0,*-darwin[912]*)
_lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
10.[012][,.]*) 10.[012][,.]*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
10.*) 10.*|11.*)
_lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
esac esac
;; ;;
@ -14734,7 +14729,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by ccid $as_me 1.4.33, which was This file was extended by ccid $as_me 1.4.34, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -14800,7 +14795,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
ccid config.status 1.4.33 ccid config.status 1.4.34
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -4,7 +4,7 @@
# Require autoconf 2.61 # Require autoconf 2.61
AC_PREREQ([2.69]) AC_PREREQ([2.69])
AC_INIT([ccid],[1.4.33]) AC_INIT([ccid],[1.4.34])
AC_CONFIG_SRCDIR(src/ifdhandler.c) AC_CONFIG_SRCDIR(src/ifdhandler.c)
AC_CONFIG_AUX_DIR([.]) AC_CONFIG_AUX_DIR([.])
AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip subdir-objects foreign) AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip subdir-objects foreign)

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.16.2 from Makefile.am. # Makefile.in generated by automake 1.16.3 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2020 Free Software Foundation, Inc. # Copyright (C) 1994-2020 Free Software Foundation, Inc.

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.16.2 from Makefile.am. # Makefile.in generated by automake 1.16.3 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2020 Free Software Foundation, Inc. # Copyright (C) 1994-2020 Free Software Foundation, Inc.

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.16.2 from Makefile.am. # Makefile.in generated by automake 1.16.3 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2020 Free Software Foundation, Inc. # Copyright (C) 1994-2020 Free Software Foundation, Inc.

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.16.2 from Makefile.am. # Makefile.in generated by automake 1.16.3 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2020 Free Software Foundation, Inc. # Copyright (C) 1994-2020 Free Software Foundation, Inc.

View File

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# install - install a program, script, or datafile # install - install a program, script, or datafile
scriptversion=2018-03-11.20; # UTC scriptversion=2020-11-14.01; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was # This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the # later released in X11R6 (xc/config/util/install.sh) with the
@ -69,6 +69,11 @@ posix_mkdir=
# Desired mode of installed file. # Desired mode of installed file.
mode=0755 mode=0755
# Create dirs (including intermediate dirs) using mode 755.
# This is like GNU 'install' as of coreutils 8.32 (2020).
mkdir_umask=22
backupsuffix=
chgrpcmd= chgrpcmd=
chmodcmd=$chmodprog chmodcmd=$chmodprog
chowncmd= chowncmd=
@ -99,18 +104,28 @@ Options:
--version display version info and exit. --version display version info and exit.
-c (ignored) -c (ignored)
-C install only if different (preserve the last data modification time) -C install only if different (preserve data modification time)
-d create directories instead of installing files. -d create directories instead of installing files.
-g GROUP $chgrpprog installed files to GROUP. -g GROUP $chgrpprog installed files to GROUP.
-m MODE $chmodprog installed files to MODE. -m MODE $chmodprog installed files to MODE.
-o USER $chownprog installed files to USER. -o USER $chownprog installed files to USER.
-p pass -p to $cpprog.
-s $stripprog installed files. -s $stripprog installed files.
-S SUFFIX attempt to back up existing files, with suffix SUFFIX.
-t DIRECTORY install into DIRECTORY. -t DIRECTORY install into DIRECTORY.
-T report an error if DSTFILE is a directory. -T report an error if DSTFILE is a directory.
Environment variables override the default commands: Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
RMPROG STRIPPROG RMPROG STRIPPROG
By default, rm is invoked with -f; when overridden with RMPROG,
it's up to you to specify -f if you want it.
If -S is not specified, no backups are attempted.
Email bug reports to bug-automake@gnu.org.
Automake home page: https://www.gnu.org/software/automake/
" "
while test $# -ne 0; do while test $# -ne 0; do
@ -137,8 +152,13 @@ while test $# -ne 0; do
-o) chowncmd="$chownprog $2" -o) chowncmd="$chownprog $2"
shift;; shift;;
-p) cpprog="$cpprog -p";;
-s) stripcmd=$stripprog;; -s) stripcmd=$stripprog;;
-S) backupsuffix="$2"
shift;;
-t) -t)
is_target_a_directory=always is_target_a_directory=always
dst_arg=$2 dst_arg=$2
@ -255,6 +275,10 @@ do
dstdir=$dst dstdir=$dst
test -d "$dstdir" test -d "$dstdir"
dstdir_status=$? dstdir_status=$?
# Don't chown directories that already exist.
if test $dstdir_status = 0; then
chowncmd=""
fi
else else
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
@ -301,22 +325,6 @@ do
if test $dstdir_status != 0; then if test $dstdir_status != 0; then
case $posix_mkdir in case $posix_mkdir in
'') '')
# Create intermediate dirs using mode 755 as modified by the umask.
# This is like FreeBSD 'install' as of 1997-10-28.
umask=`umask`
case $stripcmd.$umask in
# Optimize common cases.
*[2367][2367]) mkdir_umask=$umask;;
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
*[0-7])
mkdir_umask=`expr $umask + 22 \
- $umask % 100 % 40 + $umask % 20 \
- $umask % 10 % 4 + $umask % 2
`;;
*) mkdir_umask=$umask,go-w;;
esac
# With -d, create the new directory with the user-specified mode. # With -d, create the new directory with the user-specified mode.
# Otherwise, rely on $mkdir_umask. # Otherwise, rely on $mkdir_umask.
if test -n "$dir_arg"; then if test -n "$dir_arg"; then
@ -326,52 +334,49 @@ do
fi fi
posix_mkdir=false posix_mkdir=false
case $umask in # The $RANDOM variable is not portable (e.g., dash). Use it
*[123567][0-7][0-7]) # here however when possible just to lower collision chance.
# POSIX mkdir -p sets u+wx bits regardless of umask, which tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
;;
*)
# Note that $RANDOM variable is not portable (e.g. dash); Use it
# here however when possible just to lower collision chance.
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 trap '
ret=$?
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
exit $ret
' 0
# Because "mkdir -p" follows existing symlinks and we likely work # Because "mkdir -p" follows existing symlinks and we likely work
# directly in world-writeable /tmp, make sure that the '$tmpdir' # directly in world-writeable /tmp, make sure that the '$tmpdir'
# directory is successfully created first before we actually test # directory is successfully created first before we actually test
# 'mkdir -p' feature. # 'mkdir -p'.
if (umask $mkdir_umask && if (umask $mkdir_umask &&
$mkdirprog $mkdir_mode "$tmpdir" && $mkdirprog $mkdir_mode "$tmpdir" &&
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
then then
if test -z "$dir_arg" || { if test -z "$dir_arg" || {
# Check for POSIX incompatibilities with -m. # Check for POSIX incompatibilities with -m.
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
# other-writable bit of parent directory when it shouldn't. # other-writable bit of parent directory when it shouldn't.
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
test_tmpdir="$tmpdir/a" test_tmpdir="$tmpdir/a"
ls_ld_tmpdir=`ls -ld "$test_tmpdir"` ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
case $ls_ld_tmpdir in case $ls_ld_tmpdir in
d????-?r-*) different_mode=700;; d????-?r-*) different_mode=700;;
d????-?--*) different_mode=755;; d????-?--*) different_mode=755;;
*) false;; *) false;;
esac && esac &&
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && { $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
} }
} }
then posix_mkdir=: then posix_mkdir=:
fi fi
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
else else
# Remove any dirs left behind by ancient mkdir implementations. # Remove any dirs left behind by ancient mkdir implementations.
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
fi fi
trap '' 0;; trap '' 0;;
esac;;
esac esac
if if
@ -382,7 +387,7 @@ do
then : then :
else else
# The umask is ridiculous, or mkdir does not conform to POSIX, # mkdir does not conform to POSIX,
# or it failed possibly due to a race condition. Create the # or it failed possibly due to a race condition. Create the
# directory the slow way, step by step, checking for races as we go. # directory the slow way, step by step, checking for races as we go.
@ -411,7 +416,7 @@ do
prefixes= prefixes=
else else
if $posix_mkdir; then if $posix_mkdir; then
(umask=$mkdir_umask && (umask $mkdir_umask &&
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
# Don't fail if two instances are running concurrently. # Don't fail if two instances are running concurrently.
test -d "$prefix" || exit 1 test -d "$prefix" || exit 1
@ -488,6 +493,13 @@ do
then then
rm -f "$dsttmp" rm -f "$dsttmp"
else else
# If $backupsuffix is set, and the file being installed
# already exists, attempt a backup. Don't worry if it fails,
# e.g., if mv doesn't support -f.
if test -n "$backupsuffix" && test -f "$dst"; then
$doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
fi
# Rename the file to the real destination. # Rename the file to the real destination.
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
@ -502,9 +514,9 @@ do
# file should still install successfully. # file should still install successfully.
{ {
test ! -f "$dst" || test ! -f "$dst" ||
$doit $rmcmd -f "$dst" 2>/dev/null || $doit $rmcmd "$dst" 2>/dev/null ||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
} || } ||
{ echo "$0: cannot unlink or rename $dst" >&2 { echo "$0: cannot unlink or rename $dst" >&2
(exit 1); exit 1 (exit 1); exit 1

4
ltmain.sh Normal file → Executable file
View File

@ -31,7 +31,7 @@
PROGRAM=libtool PROGRAM=libtool
PACKAGE=libtool PACKAGE=libtool
VERSION="2.4.6 Debian-2.4.6-14" VERSION="2.4.6 Debian-2.4.6-15"
package_revision=2.4.6 package_revision=2.4.6
@ -2141,7 +2141,7 @@ include the following information:
compiler: $LTCC compiler: $LTCC
compiler flags: $LTCFLAGS compiler flags: $LTCFLAGS
linker: $LD (gnu? $with_gnu_ld) linker: $LD (gnu? $with_gnu_ld)
version: $progname $scriptversion Debian-2.4.6-14 version: $progname $scriptversion Debian-2.4.6-15
automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q`

4
m4/libtool.m4 vendored
View File

@ -1071,11 +1071,11 @@ _LT_EOF
# to the OS version, if on x86, and 10.4, the deployment # to the OS version, if on x86, and 10.4, the deployment
# target defaults to 10.4. Don't you love it? # target defaults to 10.4. Don't you love it?
case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) 10.0,*86*-darwin8*|10.0,*-darwin[[912]]*)
_lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
10.[[012]][[,.]]*) 10.[[012]][[,.]]*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
10.*) 10.*|11.*)
_lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
esac esac
;; ;;

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.16.2 from Makefile.am. # Makefile.in generated by automake 1.16.3 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2020 Free Software Foundation, Inc. # Copyright (C) 1994-2020 Free Software Foundation, Inc.

View File

@ -1,6 +1,6 @@
# #
# List of readers supported by the CCID driver # List of readers supported by the CCID driver
# Generated: 2020-06-25 # Generated: 2021-01-20
# #
# DO NOT EDIT BY HAND # DO NOT EDIT BY HAND
@ -19,7 +19,6 @@
# Alcor Micro # Alcor Micro
0x058F:0x9520:Alcor Micro AU9520 0x058F:0x9520:Alcor Micro AU9520
0x058F:0x9540:Alcor Micro AU9560
# Athena # Athena
0x0DC3:0x1004:Athena ASE IIIe 0x0DC3:0x1004:Athena ASE IIIe
@ -135,6 +134,7 @@
0x072F:0x223B:ACS ACR1252 Dual Reader 0x072F:0x223B:ACS ACR1252 Dual Reader
0x072F:0x223E:ACS ACR1252 Reader 0x072F:0x223E:ACS ACR1252 Reader
0x072F:0x223F:ACS ACR1255U-J1 0x072F:0x223F:ACS ACR1255U-J1
0x072F:0x2259:ACS ACR1252IMP Reader
0x072F:0x8201:ACS APG8201 PINhandy 1 0x072F:0x8201:ACS APG8201 PINhandy 1
0x072F:0x8202:ACS APG8201 USB Reader 0x072F:0x8202:ACS APG8201 USB Reader
0x072F:0x8300:ACS ACR33 ICC Reader 0x072F:0x8300:ACS ACR33 ICC Reader
@ -142,6 +142,7 @@
0x072F:0xB000:ACS ACR3901U ICC Reader 0x072F:0xB000:ACS ACR3901U ICC Reader
0x072F:0xB100:ACS ACR39U ICC Reader 0x072F:0xB100:ACS ACR39U ICC Reader
0x072F:0xB106:ACS CryptoMate (T2) 0x072F:0xB106:ACS CryptoMate (T2)
0x072F:0xB112:ACS CryptoMate EVO
# AF Care # AF Care
0x1C34:0xAFC0:AF Care One 0x1C34:0xAFC0:AF Care One
@ -159,6 +160,7 @@
# Aktiv # Aktiv
0x0A89:0x0025:Aktiv Rutoken lite 0x0A89:0x0025:Aktiv Rutoken lite
0x0A89:0x0030:Aktiv Rutoken ECP 0x0A89:0x0030:Aktiv Rutoken ECP
0x0A89:0x0069:Aktiv Rutoken SCR 3001 Reader
0x0A89:0x0080:Aktiv PINPad Ex 0x0A89:0x0080:Aktiv PINPad Ex
0x0A89:0x0081:Aktiv PINPad In 0x0A89:0x0081:Aktiv PINPad In
0x0A89:0x0082:Aktiv Rutoken PINPad 2 0x0A89:0x0082:Aktiv Rutoken PINPad 2
@ -214,6 +216,8 @@
0x15CF:0x0019:Avtor SecureToken 0x15CF:0x0019:Avtor SecureToken
0x15CF:0x001D:Avtor SC Reader 371 0x15CF:0x001D:Avtor SC Reader 371
0x15CF:0x0020:Avtor SecureToken 0x15CF:0x0020:Avtor SecureToken
0x096E:0x0608:Avtor SC Reader KP382
0x096E:0x0624:Avtor KP-375BLE
# Axalto # Axalto
0x04E6:0x511C:Axalto Reflex USB v3 0x04E6:0x511C:Axalto Reflex USB v3
@ -231,6 +235,7 @@
0x25DD:0x2321:Bit4id CKey4 0x25DD:0x2321:Bit4id CKey4
0x25DD:0x2341:Bit4id tokenME FIPS v3 0x25DD:0x2341:Bit4id tokenME FIPS v3
0x25DD:0x2351:Bit4id Digital DNA Key 0x25DD:0x2351:Bit4id Digital DNA Key
0x25DD:0x2354:Bit4id Digital-DNA Key
0x25DD:0x2361:Bit4id Digital-DNA Key BT 0x25DD:0x2361:Bit4id Digital-DNA Key BT
0x25DD:0x2362:Bit4id Digital-DNA Key 0x25DD:0x2362:Bit4id Digital-DNA Key
0x25DD:0x2371:Bit4id TokenME EVO v2 0x25DD:0x2371:Bit4id TokenME EVO v2
@ -238,6 +243,10 @@
0x25DD:0x3211:Bit4id miniLector AIR EVO 0x25DD:0x3211:Bit4id miniLector AIR EVO
0x25DD:0xB001:Bit4id miniLector Blue 0x25DD:0xB001:Bit4id miniLector Blue
# BIT4ID
0x25DD:0x3403:BIT4ID miniLector AIR NFC v3
0x25DD:0x3503:BIT4ID mLector AIR DI V3
# Bluink Ltd. # Bluink Ltd.
0x2ABE:0x1003:Bluink Ltd. Bluink CCID 0x2ABE:0x1003:Bluink Ltd. Bluink CCID
@ -261,6 +270,9 @@
0x0783:0x0010:C3PO LTC32 0x0783:0x0010:C3PO LTC32
0x0783:0x0036:C3PO LTC36 0x0783:0x0036:C3PO LTC36
# Canokeys
0x20A0:0x42D4:Canokeys Canokey
# CASTLES # CASTLES
0x0CA6:0x00A0:CASTLES EZCCID Smart Card Reader 0x0CA6:0x00A0:CASTLES EZCCID Smart Card Reader
@ -302,6 +314,10 @@
# DC.Ltd # DC.Ltd
0x257B:0xC305:DC.Ltd DC4 5CCID READER 0x257B:0xC305:DC.Ltd DC4 5CCID READER
# DESKO GmbH
0x1AC2:0x0300:DESKO GmbH IDenty chrom
0x1AC2:0x0302:DESKO GmbH PENTA Scanner
# Doctolib # Doctolib
0x1C34:0xAFD0:Doctolib SR 0x1C34:0xAFD0:Doctolib SR
0x1C34:0xAFD1:Doctolib SR 0x1C34:0xAFD1:Doctolib SR
@ -325,20 +341,20 @@
# F-Secure Foundry # F-Secure Foundry
0x1209:0x2702:F-Secure Foundry USB Armory Mk II 0x1209:0x2702:F-Secure Foundry USB Armory Mk II
# Feitian
0x096E:0x060D:Feitian R502
0x096E:0x0621:Feitian BLE CCID Dongle
0x096E:0x0622:Feitian VR504 VHBR Contactless & Contact Card Reader
0x096E:0x0623:Feitian bR500
0x096E:0x0685:Feitian R805
0x096E:0x0807:Feitian ePass2003
0x096E:0x080F:Feitian eJAVA Token
# FEITIAN # FEITIAN
0x096E:0x0619:FEITIAN iR301 0x096E:0x0619:FEITIAN iR301
0x096E:0x061A:FEITIAN bR301 0x096E:0x061A:FEITIAN bR301
0x096E:0x061C:FEITIAN iR301 0x096E:0x061C:FEITIAN iR301
# Feitian
0x096E:0x0608:Feitian 502-CL
0x096E:0x060D:Feitian R502
0x096E:0x0622:Feitian VR504 VHBR Contactless & Contact Card Reader
0x096E:0x0623:Feitian bR500
0x096E:0x0624:Feitian bR301
0x096E:0x0807:Feitian ePass2003
0x096E:0x080F:Feitian eJAVA Token
# Feitian Technologies # Feitian Technologies
0x096E:0x0505:Feitian Technologies FT SCR310 0x096E:0x0505:Feitian Technologies FT SCR310
@ -351,6 +367,10 @@
0x096E:0x0855:FT CCID KB 0x096E:0x0855:FT CCID KB
0x096E:0x0856:FT U2F CCID 0x096E:0x0856:FT U2F CCID
0x096E:0x0859:FT CCID 0x096E:0x0859:FT CCID
0x096E:0x0867:FT Biopass FIDO2
0x096E:0x0868:FT Biopass KB FIDO CCID
0x096E:0x0869:FT Biopass KB CCID
0x096E:0x086C:FT Biopass CCID
# Fujitsu # Fujitsu
0x0BF8:0x1022:Fujitsu Keyboard KB100 SCR 0x0BF8:0x1022:Fujitsu Keyboard KB100 SCR
@ -407,6 +427,9 @@
# GoldKey Security # GoldKey Security
0x19C8:0x0012:GoldKey Security PIV Token 0x19C8:0x0012:GoldKey Security PIV Token
# GoTrust
0x32A3:0x3201:GoTrust Idem Key
# HDZB # HDZB
0x1677:0x0025:HDZB uKeyCI800-K18 0x1677:0x0025:HDZB uKeyCI800-K18
@ -448,6 +471,7 @@
0x0B81:0x0220:id3 Semiconductors CL1356A_HID 0x0B81:0x0220:id3 Semiconductors CL1356A_HID
# Identiv # Identiv
0x04E6:0x5612:Identiv uTrust 3720 Contactless Reader
0x04E6:0x5713:Identiv CLOUD 2980 F Smart Card Reader 0x04E6:0x5713:Identiv CLOUD 2980 F Smart Card Reader
0x04E6:0x5724:Identiv Identiv uTrust 4701 F Dual Interface Reader 0x04E6:0x5724:Identiv Identiv uTrust 4701 F Dual Interface Reader
0x04E6:0x5790:Identiv uTrust 3700 F CL Reader 0x04E6:0x5790:Identiv uTrust 3700 F CL Reader
@ -715,6 +739,9 @@
0x08DF:0x3117:Spyrus Inc WorkSafe Pro 0x08DF:0x3117:Spyrus Inc WorkSafe Pro
0x08DF:0x3201:Spyrus Inc PocketVault P-3X 0x08DF:0x3201:Spyrus Inc PocketVault P-3X
# Sunrex
0x05AF:0x605A:Sunrex HP USB Business Slim Smartcard CCID Keyboard
# Swissbit # Swissbit
0x1370:0x0901:Swissbit Secure USB PU-50n SE/PE 0x1370:0x0901:Swissbit Secure USB PU-50n SE/PE
@ -724,6 +751,9 @@
# Sysking # Sysking
0x0E6A:0x5083:Sysking MII136C 0x0E6A:0x5083:Sysking MII136C
# sysmocom - s.f.m.c. GmbH
0x1D50:0x6141:sysmocom - s.f.m.c. GmbH sysmoOCTSIM
# Teridian Semiconductors # Teridian Semiconductors
0x1862:0x0000:Teridian Semiconductors TSC12xxFV.09 0x1862:0x0000:Teridian Semiconductors TSC12xxFV.09
@ -812,6 +842,7 @@
# Aladdin # Aladdin
# Alcor Micro # Alcor Micro
0x058F:0x9540:Alcor Micro AU9540
# Athena # Athena
0x0DC3:0x100F:Athena IDProtect Flash 0x0DC3:0x100F:Athena IDProtect Flash
@ -966,6 +997,15 @@
#0x08E6:0x34C0:Gemalto Ezio Shield (Gemalto_Ezio_Shield.txt) #0x08E6:0x34C0:Gemalto Ezio Shield (Gemalto_Ezio_Shield.txt)
#0x08E6:0x34C0:Gemalto Ezio Shield Pro SC (Gemalto_Ezio_Shield_Pro_SC.txt) #0x08E6:0x34C0:Gemalto Ezio Shield Pro SC (Gemalto_Ezio_Shield_Pro_SC.txt)
#0x096E:0x0608:Avtor SC Reader KP382 (Avtor_SC_Reader_KP382.txt)
#0x096E:0x0608:Feitian 502-CL (Feitian_R502-CL.txt)
#0x096E:0x0622:Feitian VR504 VHBR Contactless & Contact Card Reader (Feitian_vR504.txt)
#0x096E:0x0622:Feitian vR504 Contactless Reader (Feitian_vR504_Contactless_Reader.txt)
#0x096E:0x0624:Avtor KP-375BLE (Avtor_KP-375BLE.txt)
#0x096E:0x0624:Feitian bR301 (Feitian_bR301_BLE.txt)
#0x0A5C:0x5802:Broadcom Corp 5880 (Broadcom_5880v3.txt) #0x0A5C:0x5802:Broadcom Corp 5880 (Broadcom_5880v3.txt)
#0x0A5C:0x5802:Broadcom Corp 5880 (Broadcom_5880v4.txt) #0x0A5C:0x5802:Broadcom Corp 5880 (Broadcom_5880v4.txt)

View File

@ -14,6 +14,10 @@ ATTRS{idVendor}=="0d46", ATTRS{idProduct}=="4081", RUN+="/usr/sbin/Kobil_mIDenti
# Keep USB autosuspend off for the C3PO LTC31 v1 SmartCard Reader # Keep USB autosuspend off for the C3PO LTC31 v1 SmartCard Reader
ATTR{idVendor}=="0783", ATTR{idProduct}=="0003", GOTO="pcscd_ccid_rules_end" ATTR{idVendor}=="0783", ATTR{idProduct}=="0003", GOTO="pcscd_ccid_rules_end"
# same USB autosuspend problem with the AlcorMicro AU9520
ATTR{idVendor}=="058f", ATTR{idProduct}=="9520", GOTO="pcscd_ccid_rules_end"
# set USB power management to auto. # set USB power management to auto.
ENV{ID_USB_INTERFACES}==":0b0000:", TEST=="power/control", ATTR{power/control}="auto" ENV{ID_USB_INTERFACES}==":0b0000:", TEST=="power/control", ATTR{power/control}="auto"

View File

@ -7,7 +7,7 @@
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>MAGIC_TARGET</string> <string>MAGIC_TARGET</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>org.debian.alioth.pcsclite.smartcardccid</string> <string>fr.apdu.ccid.smartcardccid</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
MAGIC_CLASS MAGIC_CLASS

View File

@ -1,4 +1,4 @@
# Makefile.in generated by automake 1.16.2 from Makefile.am. # Makefile.in generated by automake 1.16.3 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994-2020 Free Software Foundation, Inc. # Copyright (C) 1994-2020 Free Software Foundation, Inc.

View File

@ -698,13 +698,8 @@ void ccid_error(int log_level, int error, const char *file, int line,
text = var_text; text = var_text;
break; break;
} }
#ifdef USE_OS_LOG
(log_level);
os_log_error(OS_LOG_DEFAULT, "%s:%d:%s %s", file, line, function, text);
#else
log_msg(log_level, "%s:%d:%s %s", file, line, function, text); log_msg(log_level, "%s:%d:%s %s", file, line, function, text);
#endif #endif
#endif
} /* ccid_error */ } /* ccid_error */

View File

@ -92,6 +92,11 @@ typedef struct
*/ */
int cardProtocol; int cardProtocol;
/*
* Reader protocols
*/
int dwProtocols;
/* /*
* bInterfaceProtocol (CCID, ICCD-A, ICCD-B) * bInterfaceProtocol (CCID, ICCD-A, ICCD-B)
*/ */
@ -272,7 +277,7 @@ void ccid_error(int log_level, int error, const char *file, int line,
_ccid_descriptor *get_ccid_descriptor(unsigned int reader_index); _ccid_descriptor *get_ccid_descriptor(unsigned int reader_index);
/* convert a 4 byte integer in USB format into an int */ /* convert a 4 byte integer in USB format into an int */
#define dw2i(a, x) (unsigned int)((((((a[x+3] << 8) + a[x+2]) << 8) + a[x+1]) << 8) + a[x]) #define dw2i(a, x) (unsigned int)(((((((unsigned int)a[x+3] << 8) + (unsigned int)a[x+2]) << 8) + (unsigned int)a[x+1]) << 8) + (unsigned int)a[x])
/* all the data rates specified by ISO 7816-3 Fi/Di tables */ /* all the data rates specified by ISO 7816-3 Fi/Di tables */
#define ISO_DATA_RATES 10753, 14337, 15625, 17204, \ #define ISO_DATA_RATES 10753, 14337, 15625, 17204, \

View File

@ -621,6 +621,7 @@ static status_t set_ccid_descriptor(unsigned int reader_index,
serialDevice[reader_index].ccid.dwSlotStatus = IFD_ICC_PRESENT; serialDevice[reader_index].ccid.dwSlotStatus = IFD_ICC_PRESENT;
serialDevice[reader_index].ccid.bVoltageSupport = 0x07; /* 1.8V, 3V and 5V */ serialDevice[reader_index].ccid.bVoltageSupport = 0x07; /* 1.8V, 3V and 5V */
serialDevice[reader_index].ccid.gemalto_firmware_features = NULL; serialDevice[reader_index].ccid.gemalto_firmware_features = NULL;
serialDevice[reader_index].ccid.dwProtocols = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
#ifdef ENABLE_ZLP #ifdef ENABLE_ZLP
serialDevice[reader_index].ccid.zlp = FALSE; serialDevice[reader_index].ccid.zlp = FALSE;
#endif #endif

View File

@ -727,6 +727,7 @@ again:
usbDevice[reader_index].ccid.bVoltageSupport = device_descriptor[5]; usbDevice[reader_index].ccid.bVoltageSupport = device_descriptor[5];
usbDevice[reader_index].ccid.sIFD_serial_number = NULL; usbDevice[reader_index].ccid.sIFD_serial_number = NULL;
usbDevice[reader_index].ccid.gemalto_firmware_features = NULL; usbDevice[reader_index].ccid.gemalto_firmware_features = NULL;
usbDevice[reader_index].ccid.dwProtocols = dw2i(device_descriptor, 6);
#ifdef ENABLE_ZLP #ifdef ENABLE_ZLP
usbDevice[reader_index].ccid.zlp = FALSE; usbDevice[reader_index].ccid.zlp = FALSE;
#endif #endif
@ -908,7 +909,7 @@ read_again:
DEBUG_XXD(debug_header, buffer, *length); DEBUG_XXD(debug_header, buffer, *length);
#define BSEQ_OFFSET 6 #define BSEQ_OFFSET 6
if ((*length >= BSEQ_OFFSET) if ((*length >= BSEQ_OFFSET +1)
&& (buffer[BSEQ_OFFSET] < *ccid_descriptor->pbSeq -1)) && (buffer[BSEQ_OFFSET] < *ccid_descriptor->pbSeq -1))
{ {
duplicate_frame++; duplicate_frame++;
@ -1451,7 +1452,8 @@ static void *Multi_PollingProc(void *p_ext)
if (NULL == transfer) if (NULL == transfer)
{ {
rv = LIBUSB_ERROR_NO_MEM; rv = LIBUSB_ERROR_NO_MEM;
DEBUG_COMM2("libusb_alloc_transfer err %d", rv); DEBUG_COMM3("libusb_alloc_transfer err %d %s", rv,
libusb_error_name(rv));
break; break;
} }
@ -1467,7 +1469,8 @@ static void *Multi_PollingProc(void *p_ext)
if (rv) if (rv)
{ {
libusb_free_transfer(transfer); libusb_free_transfer(transfer);
DEBUG_COMM2("libusb_submit_transfer err %d", rv); DEBUG_COMM3("libusb_submit_transfer err %d %s", rv,
libusb_error_name(rv));
break; break;
} }
@ -1479,7 +1482,8 @@ static void *Multi_PollingProc(void *p_ext)
rv = libusb_handle_events_completed(ctx, &completed); rv = libusb_handle_events_completed(ctx, &completed);
if (rv < 0) if (rv < 0)
{ {
DEBUG_COMM2("libusb_handle_events err %d", rv); DEBUG_COMM3("libusb_handle_events err %d %s", rv,
libusb_error_name(rv));
if (rv == LIBUSB_ERROR_INTERRUPTED) if (rv == LIBUSB_ERROR_INTERRUPTED)
continue; continue;
@ -1579,9 +1583,10 @@ static void *Multi_PollingProc(void *p_ext)
if (rv < 0) if (rv < 0)
{ {
DEBUG_CRITICAL4("Multi_PollingProc (%d/%d): error %d", DEBUG_CRITICAL5("Multi_PollingProc (%d/%d): error %d %s",
usbDevice[msExt->reader_index].bus_number, usbDevice[msExt->reader_index].bus_number,
usbDevice[msExt->reader_index].device_address, rv); usbDevice[msExt->reader_index].device_address,
rv, libusb_error_name(rv));
} }
/* Wake up the slot threads so they will exit as well */ /* Wake up the slot threads so they will exit as well */

View File

@ -195,21 +195,24 @@ RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength,
check_again: check_again:
if ((1 == voltage) && !(bVoltageSupport & 1)) if ((1 == voltage) && !(bVoltageSupport & 1))
{ {
DEBUG_INFO1("5V requested but not support by reader"); DEBUG_INFO1("5V requested but not supported by reader");
voltage = 2; /* 3V */ voltage = 2; /* 3V */
} }
if ((2 == voltage) && !(bVoltageSupport & 2)) if ((2 == voltage) && !(bVoltageSupport & 2))
{ {
DEBUG_INFO1("3V requested but not support by reader"); DEBUG_INFO1("3V requested but not supported by reader");
voltage = 3; /* 1.8V */ voltage = 3; /* 1.8V */
} }
if ((3 == voltage) && !(bVoltageSupport & 4)) if ((3 == voltage) && !(bVoltageSupport & 4))
{ {
DEBUG_INFO1("1.8V requested but not support by reader"); DEBUG_INFO1("1.8V requested but not supported by reader");
voltage = 1; /* 5V */ voltage = 1; /* 5V */
goto check_again;
/* do not (infinite) loop if bVoltageSupport == 0 */
if (bVoltageSupport)
goto check_again;
} }
} }
init_voltage = voltage; init_voltage = voltage;
@ -232,7 +235,7 @@ again:
res = ReadPort(reader_index, nlength, buffer); res = ReadPort(reader_index, nlength, buffer);
CHECK_STATUS(res) CHECK_STATUS(res)
if (*nlength < STATUS_OFFSET+1) if (*nlength < CCID_RESPONSE_HEADER_SIZE)
{ {
DEBUG_CRITICAL2("Not enough data received: %d bytes", *nlength); DEBUG_CRITICAL2("Not enough data received: %d bytes", *nlength);
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;
@ -286,11 +289,12 @@ again:
/* extract the ATR */ /* extract the ATR */
atr_len = dw2i(buffer, 1); /* ATR length */ atr_len = dw2i(buffer, 1); /* ATR length */
if (atr_len > *nlength) if (atr_len > *nlength - 10)
atr_len = *nlength; atr_len = *nlength - 10;
else else
*nlength = atr_len; *nlength = atr_len;
/* the buffer length should be 10 + MAX_ATR_SIZE */
memmove(buffer, buffer+10, atr_len); memmove(buffer, buffer+10, atr_len);
return return_value; return return_value;
@ -994,7 +998,7 @@ time_request:
goto end; goto end;
} }
if (length_out < STATUS_OFFSET+1) if (length_out < CCID_RESPONSE_HEADER_SIZE)
{ {
free(cmd_out); free(cmd_out);
DEBUG_CRITICAL2("Not enough data received: %d bytes", length_out); DEBUG_CRITICAL2("Not enough data received: %d bytes", length_out);
@ -1109,7 +1113,7 @@ RESPONSECODE CmdPowerOff(unsigned int reader_index)
res = ReadPort(reader_index, &length, cmd); res = ReadPort(reader_index, &length, cmd);
CHECK_STATUS(res) CHECK_STATUS(res)
if (length < STATUS_OFFSET+1) if (length < CCID_RESPONSE_HEADER_SIZE)
{ {
DEBUG_CRITICAL2("Not enough data received: %d bytes", length); DEBUG_CRITICAL2("Not enough data received: %d bytes", length);
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;
@ -1182,7 +1186,7 @@ again_status:
if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol) if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol)
{ {
int r; int r;
unsigned char buffer_tmp[3]; unsigned char buffer_tmp[3] = {0, 2, 0};
/* SlotStatus */ /* SlotStatus */
r = ControlUSB(reader_index, 0xA1, 0x81, 0, buffer_tmp, r = ControlUSB(reader_index, 0xA1, 0x81, 0, buffer_tmp,
@ -1232,7 +1236,7 @@ again_status:
res = ReadPort(reader_index, &length, buffer); res = ReadPort(reader_index, &length, buffer);
CHECK_STATUS(res) CHECK_STATUS(res)
if (length < STATUS_OFFSET+1) if (length < CCID_RESPONSE_HEADER_SIZE)
{ {
DEBUG_CRITICAL2("Not enough data received: %d bytes", length); DEBUG_CRITICAL2("Not enough data received: %d bytes", length);
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;
@ -1370,7 +1374,8 @@ RESPONSECODE CCID_Transmit(unsigned int reader_index, unsigned int tx_length,
cmd[8] = rx_length & 0xFF; /* Expected length, in character mode only */ cmd[8] = rx_length & 0xFF; /* Expected length, in character mode only */
cmd[9] = (rx_length >> 8) & 0xFF; cmd[9] = (rx_length >> 8) & 0xFF;
memcpy(cmd+10, tx_buffer, tx_length); if (tx_buffer)
memcpy(cmd+10, tx_buffer, tx_length);
ret = WritePort(reader_index, 10+tx_length, cmd); ret = WritePort(reader_index, 10+tx_length, cmd);
CHECK_STATUS(ret) CHECK_STATUS(ret)
@ -1523,7 +1528,7 @@ time_request:
ccid_descriptor -> readTimeout = old_timeout; ccid_descriptor -> readTimeout = old_timeout;
CHECK_STATUS(ret) CHECK_STATUS(ret)
if (length < STATUS_OFFSET+1) if (length < CCID_RESPONSE_HEADER_SIZE)
{ {
DEBUG_CRITICAL2("Not enough data received: %d bytes", length); DEBUG_CRITICAL2("Not enough data received: %d bytes", length);
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;
@ -1553,6 +1558,12 @@ time_request:
case 0xFD: /* Parity error during exchange */ case 0xFD: /* Parity error during exchange */
return IFD_PARITY_ERROR; return IFD_PARITY_ERROR;
case 0xFE: /* Card absent or mute */
if (2 == (cmd[STATUS_OFFSET] & 0x02)) /* No ICC */
return IFD_ICC_NOT_PRESENT;
else
return IFD_COMMUNICATION_ERROR;
default: default:
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;
} }
@ -1595,7 +1606,8 @@ time_request:
return_value = IFD_COMMUNICATION_ERROR; return_value = IFD_COMMUNICATION_ERROR;
} }
else else
memcpy(rx_buffer, cmd+10, length); if (length)
memcpy(rx_buffer, cmd+10, length);
/* Extended case? /* Extended case?
* Only valid for RDR_to_PC_DataBlock frames */ * Only valid for RDR_to_PC_DataBlock frames */
@ -1852,6 +1864,9 @@ static RESPONSECODE T0ProcACK(unsigned int reader_index,
DEBUG_COMM2("Enter, is_rcv = %d", is_rcv); DEBUG_COMM2("Enter, is_rcv = %d", is_rcv);
if (proc_len > 0x20000)
return IFD_COMMUNICATION_ERROR;
if (is_rcv == 1) if (is_rcv == 1)
{ /* Receiving mode */ { /* Receiving mode */
unsigned int remain_len; unsigned int remain_len;
@ -1948,6 +1963,12 @@ static RESPONSECODE T0ProcACK(unsigned int reader_index,
if (return_value != IFD_SUCCESS) if (return_value != IFD_SUCCESS)
return return_value; return return_value;
if (proc_len > *snd_len)
{
DEBUG_CRITICAL("proc_len > snd_len");
return IFD_COMMUNICATION_ERROR;
}
*snd_len -= proc_len; *snd_len -= proc_len;
*snd_buf += proc_len; *snd_buf += proc_len;
} }
@ -2280,7 +2301,7 @@ RESPONSECODE SetParameters(unsigned int reader_index, char protocol,
res = ReadPort(reader_index, &length, cmd); res = ReadPort(reader_index, &length, cmd);
CHECK_STATUS(res) CHECK_STATUS(res)
if (length < STATUS_OFFSET+1) if (length < CCID_RESPONSE_HEADER_SIZE)
{ {
DEBUG_CRITICAL2("Not enough data received: %d bytes", length); DEBUG_CRITICAL2("Not enough data received: %d bytes", length);
return IFD_COMMUNICATION_ERROR; return IFD_COMMUNICATION_ERROR;

View File

@ -21,6 +21,7 @@
#define STATUS_OFFSET 7 #define STATUS_OFFSET 7
#define ERROR_OFFSET 8 #define ERROR_OFFSET 8
#define CHAIN_PARAMETER_OFFSET 9 #define CHAIN_PARAMETER_OFFSET 9
#define CCID_RESPONSE_HEADER_SIZE 10
RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength, RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength,
/*@out@*/ unsigned char buffer[], int voltage); /*@out@*/ unsigned char buffer[], int voltage);

View File

@ -140,6 +140,9 @@ static RESPONSECODE CreateChannelByNameOrChannel(DWORD Lun,
else else
CcidSlots[reader_index].readerName = strdup("no name"); CcidSlots[reader_index].readerName = strdup("no name");
/* init T=1 structure just in case */
t1_init(&CcidSlots[reader_index].t1, reader_index);
if (lpcDevice) if (lpcDevice)
ret = OpenPortByName(reader_index, lpcDevice); ret = OpenPortByName(reader_index, lpcDevice);
else else
@ -147,11 +150,16 @@ static RESPONSECODE CreateChannelByNameOrChannel(DWORD Lun,
if (ret != STATUS_SUCCESS) if (ret != STATUS_SUCCESS)
{ {
DEBUG_CRITICAL("failed");
if (STATUS_NO_SUCH_DEVICE == ret) if (STATUS_NO_SUCH_DEVICE == ret)
{
DEBUG_INFO1("failed");
return_value = IFD_NO_SUCH_DEVICE; return_value = IFD_NO_SUCH_DEVICE;
}
else else
{
DEBUG_CRITICAL("failed");
return_value = IFD_COMMUNICATION_ERROR; return_value = IFD_COMMUNICATION_ERROR;
}
goto error; goto error;
} }
@ -723,6 +731,14 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol,
goto end; goto end;
} }
/* check the protocol is supported by the reader */
if (!(Protocol & ccid_desc->dwProtocols))
{
DEBUG_CRITICAL2("Protocol T=" DWORD_D " not supported by reader",
Protocol - SCARD_PROTOCOL_T0);
return IFD_ERROR_NOT_SUPPORTED;
}
/* Get ATR of the card */ /* Get ATR of the card */
atr_ret = ATR_InitFromArray(&atr, ccid_slot->pcATRBuffer, atr_ret = ATR_InitFromArray(&atr, ccid_slot->pcATRBuffer,
ccid_slot->nATRLength); ccid_slot->nATRLength);
@ -943,7 +959,8 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol,
} }
/* Now we must set the reader parameters */ /* Now we must set the reader parameters */
(void)ATR_GetConvention(&atr, &convention); if (ATR_MALFORMED == ATR_GetConvention(&atr, &convention))
return IFD_COMMUNICATION_ERROR;
/* specific mode and implicit parameters? (b5 of TA2) */ /* specific mode and implicit parameters? (b5 of TA2) */
if (atr.ib[1][ATR_INTERFACE_BYTE_TA].present if (atr.ib[1][ATR_INTERFACE_BYTE_TA].present
@ -998,8 +1015,8 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol,
0x00, 0xFF, 0x81, 0x31, 0x80, 0x45, 0x00, 0x31, 0x00, 0xFF, 0x81, 0x31, 0x80, 0x45, 0x00, 0x31,
0xC1, 0x73, 0xC0, 0x01, 0x00, 0x00, 0x90, 0x00, 0xB1 }; 0xC1, 0x73, 0xC0, 0x01, 0x00, 0x00, 0x90, 0x00, 0xB1 };
if (0 == memcmp(ccid_slot->pcATRBuffer, openpgp_atr, if ((ccid_slot->nATRLength == sizeof openpgp_atr)
ccid_slot->nATRLength)) && (0 == memcmp(ccid_slot->pcATRBuffer, openpgp_atr, ccid_slot->nATRLength)))
/* change BWI from 4 to 7 to increase BWT from /* change BWI from 4 to 7 to increase BWT from
* 1.4s to 11s and avoid a timeout during on * 1.4s to 11s and avoid a timeout during on
* board key generation (bogus card) */ * board key generation (bogus card) */

View File

@ -10,7 +10,7 @@
#include <string.h> #include <string.h>
#endif #endif
#include <openct/buffer.h> #include "buffer.h"
void void
ct_buf_init(ct_buf_t *bp, void *mem, size_t len) ct_buf_init(ct_buf_t *bp, void *mem, size_t len)

View File

@ -409,7 +409,7 @@ static int ccid_parse_interface_descriptor(libusb_device_handle *handle,
{ {
int n; int n;
/* See CCID 3.7.2 page 25 */ /* See CCID 5.3.2 page 24 */
n = libusb_control_transfer(handle, n = libusb_control_transfer(handle,
0xA1, /* request type */ 0xA1, /* request type */
0x02, /* GET CLOCK FREQUENCIES */ 0x02, /* GET CLOCK FREQUENCIES */
@ -461,7 +461,7 @@ static int ccid_parse_interface_descriptor(libusb_device_handle *handle,
{ {
int n; int n;
/* See CCID 3.7.3 page 25 */ /* See CCID 5.3.3 page 24 */
n = libusb_control_transfer(handle, n = libusb_control_transfer(handle,
0xA1, /* request type */ 0xA1, /* request type */
0x03, /* GET DATA RATES */ 0x03, /* GET DATA RATES */

View File

@ -98,7 +98,9 @@ PPS_Match (BYTE * request, unsigned len_request, BYTE * confirm, unsigned len_co
return FALSE; return FALSE;
/* See if the card specifies other than default FI and D */ /* See if the card specifies other than default FI and D */
if ((PPS_HAS_PPS1 (confirm)) && (confirm[2] != request[2])) if ((PPS_HAS_PPS1 (confirm))
&& (len_confirm > 2)
&& (confirm[2] != request[2]))
return FALSE; return FALSE;
return TRUE; return TRUE;