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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You have to create or edit the file /etc/reader.conf. The file should
contain something like:
You have to create a file in the /etc/reader.conf.d/ directory. The file
should contain something like:
# Gemalto reader with serial communication
# - n is the serial port to use n in [0..3]
@ -90,6 +90,7 @@ DEVICENAME field. Supported values are:
- GemCoreSIMPro2 for IDBridge CR30
- GemPCPinPad for GemPC PinPad
- GemPCTwin for GemPC Twin (default value)
- SEC1210 for Microchip SEC1210
You will then have something like:
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@
# Copyright (C) 1994-2020 Free Software Foundation, Inc.
@ -202,6 +202,8 @@ am__relativize = \
GZIP_ENV = --best
DIST_ARCHIVES = $(distdir).tar.bz2
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
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
@ -681,7 +683,7 @@ distcheck: dist
$(DISTCHECK_CONFIGURE_FLAGS) \
--srcdir=../.. --prefix="$$dc_install_base" \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \

View File

@ -117,6 +117,37 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
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
- Add support of
- 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.
@ -311,7 +311,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.16'
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.
m4_if([$1], [1.16.2], [],
m4_if([$1], [1.16.3], [],
[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.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
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_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_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_AUX_FILE([missing])dnl
if test x"${MISSING+set}" != xset; then
case $am_aux_dir in
*\ * | *\ *)
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
*)
MISSING="\${SHELL} $am_aux_dir/missing" ;;
esac
MISSING="\${SHELL} '$am_aux_dir/missing'"
fi
# Use eval to expand $SHELL
if eval "$MISSING --is-lightweight"; then

31
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh
# 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.
@ -587,8 +587,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='ccid'
PACKAGE_TARNAME='ccid'
PACKAGE_VERSION='1.4.33'
PACKAGE_STRING='ccid 1.4.33'
PACKAGE_VERSION='1.4.34'
PACKAGE_STRING='ccid 1.4.34'
PACKAGE_BUGREPORT=''
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.
# This message is too long to be a string in the A/UX 3.1 sh.
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]...
@ -1450,7 +1450,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
short | recursive ) echo "Configuration of ccid 1.4.33:";;
short | recursive ) echo "Configuration of ccid 1.4.34:";;
esac
cat <<\_ACEOF
@ -1597,7 +1597,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
ccid configure 1.4.33
ccid configure 1.4.34
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@ -2016,7 +2016,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
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
$ $0 $@
@ -2570,12 +2570,7 @@ program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
am_aux_dir=`cd "$ac_aux_dir" && pwd`
if test x"${MISSING+set}" != xset; then
case $am_aux_dir in
*\ * | *\ *)
MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
*)
MISSING="\${SHELL} $am_aux_dir/missing" ;;
esac
MISSING="\${SHELL} '$am_aux_dir/missing'"
fi
# Use eval to expand $SHELL
if eval "$MISSING --is-lightweight"; then
@ -2880,7 +2875,7 @@ fi
# Define the identity of the package.
PACKAGE='ccid'
VERSION='1.4.33'
VERSION='1.4.34'
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
# target defaults to 10.4. Don't you love it?
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' ;;
10.[012][,.]*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
10.*)
10.*|11.*)
_lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
esac
;;
@ -14734,7 +14729,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
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
CONFIG_FILES = $CONFIG_FILES
@ -14800,7 +14795,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
ccid config.status 1.4.33
ccid config.status 1.4.34
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"

View File

@ -4,7 +4,7 @@
# Require autoconf 2.61
AC_PREREQ([2.69])
AC_INIT([ccid],[1.4.33])
AC_INIT([ccid],[1.4.34])
AC_CONFIG_SRCDIR(src/ifdhandler.c)
AC_CONFIG_AUX_DIR([.])
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@
# 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@
# 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@
# 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@
# Copyright (C) 1994-2020 Free Software Foundation, Inc.

View File

@ -1,7 +1,7 @@
#!/bin/sh
# 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
# later released in X11R6 (xc/config/util/install.sh) with the
@ -69,6 +69,11 @@ posix_mkdir=
# Desired mode of installed file.
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=
chmodcmd=$chmodprog
chowncmd=
@ -99,18 +104,28 @@ Options:
--version display version info and exit.
-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.
-g GROUP $chgrpprog installed files to GROUP.
-m MODE $chmodprog installed files to MODE.
-o USER $chownprog installed files to USER.
-p pass -p to $cpprog.
-s $stripprog installed files.
-S SUFFIX attempt to back up existing files, with suffix SUFFIX.
-t DIRECTORY install into DIRECTORY.
-T report an error if DSTFILE is a directory.
Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
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
@ -137,8 +152,13 @@ while test $# -ne 0; do
-o) chowncmd="$chownprog $2"
shift;;
-p) cpprog="$cpprog -p";;
-s) stripcmd=$stripprog;;
-S) backupsuffix="$2"
shift;;
-t)
is_target_a_directory=always
dst_arg=$2
@ -255,6 +275,10 @@ do
dstdir=$dst
test -d "$dstdir"
dstdir_status=$?
# Don't chown directories that already exist.
if test $dstdir_status = 0; then
chowncmd=""
fi
else
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
@ -301,22 +325,6 @@ do
if test $dstdir_status != 0; then
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.
# Otherwise, rely on $mkdir_umask.
if test -n "$dir_arg"; then
@ -326,52 +334,49 @@ do
fi
posix_mkdir=false
case $umask in
*[123567][0-7][0-7])
# POSIX mkdir -p sets u+wx bits regardless of umask, which
# 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-$$
# The $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
# directly in world-writeable /tmp, make sure that the '$tmpdir'
# directory is successfully created first before we actually test
# 'mkdir -p' feature.
if (umask $mkdir_umask &&
$mkdirprog $mkdir_mode "$tmpdir" &&
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
then
if test -z "$dir_arg" || {
# Check for POSIX incompatibilities with -m.
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
# other-writable bit of parent directory when it shouldn't.
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
test_tmpdir="$tmpdir/a"
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
case $ls_ld_tmpdir in
d????-?r-*) different_mode=700;;
d????-?--*) different_mode=755;;
*) false;;
esac &&
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
}
}
then posix_mkdir=:
fi
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
else
# Remove any dirs left behind by ancient mkdir implementations.
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
fi
trap '' 0;;
esac;;
# Because "mkdir -p" follows existing symlinks and we likely work
# directly in world-writeable /tmp, make sure that the '$tmpdir'
# directory is successfully created first before we actually test
# 'mkdir -p'.
if (umask $mkdir_umask &&
$mkdirprog $mkdir_mode "$tmpdir" &&
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
then
if test -z "$dir_arg" || {
# Check for POSIX incompatibilities with -m.
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
# other-writable bit of parent directory when it shouldn't.
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
test_tmpdir="$tmpdir/a"
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
case $ls_ld_tmpdir in
d????-?r-*) different_mode=700;;
d????-?--*) different_mode=755;;
*) false;;
esac &&
$mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
}
}
then posix_mkdir=:
fi
rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
else
# Remove any dirs left behind by ancient mkdir implementations.
rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
fi
trap '' 0;;
esac
if
@ -382,7 +387,7 @@ do
then :
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
# directory the slow way, step by step, checking for races as we go.
@ -411,7 +416,7 @@ do
prefixes=
else
if $posix_mkdir; then
(umask=$mkdir_umask &&
(umask $mkdir_umask &&
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
# Don't fail if two instances are running concurrently.
test -d "$prefix" || exit 1
@ -488,6 +493,13 @@ do
then
rm -f "$dsttmp"
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.
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
@ -502,9 +514,9 @@ do
# file should still install successfully.
{
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 $rmcmd -f "$rmtmp" 2>/dev/null; :; }
{ $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
} ||
{ echo "$0: cannot unlink or rename $dst" >&2
(exit 1); exit 1

4
ltmain.sh Normal file → Executable file
View File

@ -31,7 +31,7 @@
PROGRAM=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
@ -2141,7 +2141,7 @@ include the following information:
compiler: $LTCC
compiler flags: $LTCFLAGS
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`
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
# target defaults to 10.4. Don't you love it?
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' ;;
10.[[012]][[,.]]*)
_lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
10.*)
10.*|11.*)
_lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
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@
# Copyright (C) 1994-2020 Free Software Foundation, Inc.

View File

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

View File

@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>MAGIC_TARGET</string>
<key>CFBundleIdentifier</key>
<string>org.debian.alioth.pcsclite.smartcardccid</string>
<string>fr.apdu.ccid.smartcardccid</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
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@
# 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;
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);
#endif
#endif
} /* ccid_error */

View File

@ -92,6 +92,11 @@ typedef struct
*/
int cardProtocol;
/*
* Reader protocols
*/
int dwProtocols;
/*
* 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);
/* 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 */
#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.bVoltageSupport = 0x07; /* 1.8V, 3V and 5V */
serialDevice[reader_index].ccid.gemalto_firmware_features = NULL;
serialDevice[reader_index].ccid.dwProtocols = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
#ifdef ENABLE_ZLP
serialDevice[reader_index].ccid.zlp = FALSE;
#endif

View File

@ -727,6 +727,7 @@ again:
usbDevice[reader_index].ccid.bVoltageSupport = device_descriptor[5];
usbDevice[reader_index].ccid.sIFD_serial_number = NULL;
usbDevice[reader_index].ccid.gemalto_firmware_features = NULL;
usbDevice[reader_index].ccid.dwProtocols = dw2i(device_descriptor, 6);
#ifdef ENABLE_ZLP
usbDevice[reader_index].ccid.zlp = FALSE;
#endif
@ -908,7 +909,7 @@ read_again:
DEBUG_XXD(debug_header, buffer, *length);
#define BSEQ_OFFSET 6
if ((*length >= BSEQ_OFFSET)
if ((*length >= BSEQ_OFFSET +1)
&& (buffer[BSEQ_OFFSET] < *ccid_descriptor->pbSeq -1))
{
duplicate_frame++;
@ -1451,7 +1452,8 @@ static void *Multi_PollingProc(void *p_ext)
if (NULL == transfer)
{
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;
}
@ -1467,7 +1469,8 @@ static void *Multi_PollingProc(void *p_ext)
if (rv)
{
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;
}
@ -1479,7 +1482,8 @@ static void *Multi_PollingProc(void *p_ext)
rv = libusb_handle_events_completed(ctx, &completed);
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)
continue;
@ -1579,9 +1583,10 @@ static void *Multi_PollingProc(void *p_ext)
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].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 */

View File

@ -195,21 +195,24 @@ RESPONSECODE CmdPowerOn(unsigned int reader_index, unsigned int * nlength,
check_again:
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 */
}
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 */
}
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 */
goto check_again;
/* do not (infinite) loop if bVoltageSupport == 0 */
if (bVoltageSupport)
goto check_again;
}
}
init_voltage = voltage;
@ -232,7 +235,7 @@ again:
res = ReadPort(reader_index, nlength, buffer);
CHECK_STATUS(res)
if (*nlength < STATUS_OFFSET+1)
if (*nlength < CCID_RESPONSE_HEADER_SIZE)
{
DEBUG_CRITICAL2("Not enough data received: %d bytes", *nlength);
return IFD_COMMUNICATION_ERROR;
@ -286,11 +289,12 @@ again:
/* extract the ATR */
atr_len = dw2i(buffer, 1); /* ATR length */
if (atr_len > *nlength)
atr_len = *nlength;
if (atr_len > *nlength - 10)
atr_len = *nlength - 10;
else
*nlength = atr_len;
/* the buffer length should be 10 + MAX_ATR_SIZE */
memmove(buffer, buffer+10, atr_len);
return return_value;
@ -994,7 +998,7 @@ time_request:
goto end;
}
if (length_out < STATUS_OFFSET+1)
if (length_out < CCID_RESPONSE_HEADER_SIZE)
{
free(cmd_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);
CHECK_STATUS(res)
if (length < STATUS_OFFSET+1)
if (length < CCID_RESPONSE_HEADER_SIZE)
{
DEBUG_CRITICAL2("Not enough data received: %d bytes", length);
return IFD_COMMUNICATION_ERROR;
@ -1182,7 +1186,7 @@ again_status:
if (PROTOCOL_ICCD_B == ccid_descriptor->bInterfaceProtocol)
{
int r;
unsigned char buffer_tmp[3];
unsigned char buffer_tmp[3] = {0, 2, 0};
/* SlotStatus */
r = ControlUSB(reader_index, 0xA1, 0x81, 0, buffer_tmp,
@ -1232,7 +1236,7 @@ again_status:
res = ReadPort(reader_index, &length, buffer);
CHECK_STATUS(res)
if (length < STATUS_OFFSET+1)
if (length < CCID_RESPONSE_HEADER_SIZE)
{
DEBUG_CRITICAL2("Not enough data received: %d bytes", length);
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[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);
CHECK_STATUS(ret)
@ -1523,7 +1528,7 @@ time_request:
ccid_descriptor -> readTimeout = old_timeout;
CHECK_STATUS(ret)
if (length < STATUS_OFFSET+1)
if (length < CCID_RESPONSE_HEADER_SIZE)
{
DEBUG_CRITICAL2("Not enough data received: %d bytes", length);
return IFD_COMMUNICATION_ERROR;
@ -1553,6 +1558,12 @@ time_request:
case 0xFD: /* Parity error during exchange */
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:
return IFD_COMMUNICATION_ERROR;
}
@ -1595,7 +1606,8 @@ time_request:
return_value = IFD_COMMUNICATION_ERROR;
}
else
memcpy(rx_buffer, cmd+10, length);
if (length)
memcpy(rx_buffer, cmd+10, length);
/* Extended case?
* 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);
if (proc_len > 0x20000)
return IFD_COMMUNICATION_ERROR;
if (is_rcv == 1)
{ /* Receiving mode */
unsigned int remain_len;
@ -1948,6 +1963,12 @@ static RESPONSECODE T0ProcACK(unsigned int reader_index,
if (return_value != IFD_SUCCESS)
return return_value;
if (proc_len > *snd_len)
{
DEBUG_CRITICAL("proc_len > snd_len");
return IFD_COMMUNICATION_ERROR;
}
*snd_len -= proc_len;
*snd_buf += proc_len;
}
@ -2280,7 +2301,7 @@ RESPONSECODE SetParameters(unsigned int reader_index, char protocol,
res = ReadPort(reader_index, &length, cmd);
CHECK_STATUS(res)
if (length < STATUS_OFFSET+1)
if (length < CCID_RESPONSE_HEADER_SIZE)
{
DEBUG_CRITICAL2("Not enough data received: %d bytes", length);
return IFD_COMMUNICATION_ERROR;

View File

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

View File

@ -140,6 +140,9 @@ static RESPONSECODE CreateChannelByNameOrChannel(DWORD Lun,
else
CcidSlots[reader_index].readerName = strdup("no name");
/* init T=1 structure just in case */
t1_init(&CcidSlots[reader_index].t1, reader_index);
if (lpcDevice)
ret = OpenPortByName(reader_index, lpcDevice);
else
@ -147,11 +150,16 @@ static RESPONSECODE CreateChannelByNameOrChannel(DWORD Lun,
if (ret != STATUS_SUCCESS)
{
DEBUG_CRITICAL("failed");
if (STATUS_NO_SUCH_DEVICE == ret)
{
DEBUG_INFO1("failed");
return_value = IFD_NO_SUCH_DEVICE;
}
else
{
DEBUG_CRITICAL("failed");
return_value = IFD_COMMUNICATION_ERROR;
}
goto error;
}
@ -723,6 +731,14 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol,
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 */
atr_ret = ATR_InitFromArray(&atr, ccid_slot->pcATRBuffer,
ccid_slot->nATRLength);
@ -943,7 +959,8 @@ EXTERNAL RESPONSECODE IFDHSetProtocolParameters(DWORD Lun, DWORD Protocol,
}
/* 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) */
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,
0xC1, 0x73, 0xC0, 0x01, 0x00, 0x00, 0x90, 0x00, 0xB1 };
if (0 == memcmp(ccid_slot->pcATRBuffer, openpgp_atr,
ccid_slot->nATRLength))
if ((ccid_slot->nATRLength == sizeof openpgp_atr)
&& (0 == memcmp(ccid_slot->pcATRBuffer, openpgp_atr, ccid_slot->nATRLength)))
/* change BWI from 4 to 7 to increase BWT from
* 1.4s to 11s and avoid a timeout during on
* board key generation (bogus card) */

View File

@ -10,7 +10,7 @@
#include <string.h>
#endif
#include <openct/buffer.h>
#include "buffer.h"
void
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;
/* See CCID 3.7.2 page 25 */
/* See CCID 5.3.2 page 24 */
n = libusb_control_transfer(handle,
0xA1, /* request type */
0x02, /* GET CLOCK FREQUENCIES */
@ -461,7 +461,7 @@ static int ccid_parse_interface_descriptor(libusb_device_handle *handle,
{
int n;
/* See CCID 3.7.3 page 25 */
/* See CCID 5.3.3 page 24 */
n = libusb_control_transfer(handle,
0xA1, /* request type */
0x03, /* GET DATA RATES */

View File

@ -98,7 +98,9 @@ PPS_Match (BYTE * request, unsigned len_request, BYTE * confirm, unsigned len_co
return FALSE;
/* 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 TRUE;