Index: src/ifdhandler.c =================================================================== --- src/ifdhandler.c (revision 2653) +++ src/ifdhandler.c (working copy) @@ -789,6 +789,10 @@ EXTERNAL RESPONSECODE IFDHSetProtocolPar /* store used protocol for use by the secure commands (verify/change PIN) */ ccid_desc->cardProtocol = Protocol; +#ifdef IFDHANDLERv2 + get_ccid_slot(reader_index)->SetParametersCalled = TRUE; +#endif + return IFD_SUCCESS; } /* IFDHSetProtocolParameters */ @@ -846,6 +850,10 @@ EXTERNAL RESPONSECODE IFDHPowerICC(DWORD if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; +#ifdef IFDHANDLERv2 + /* recall SetProtocolParameter next time */ + get_ccid_slot(reader_index) -> SetParametersCalled = FALSE; +#endif switch (Action) { case IFD_POWER_DOWN: @@ -868,8 +876,25 @@ EXTERNAL RESPONSECODE IFDHPowerICC(DWORD t1_release(&(get_ccid_slot(reader_index) -> t1)); break; - case IFD_POWER_UP: case IFD_RESET: +#ifdef FAKE_CARD_CHANGED + /* send the command */ + if (IFD_SUCCESS != CmdPowerOff(reader_index)) + { + DEBUG_CRITICAL("PowerDown failed"); + return_value = IFD_ERROR_POWER_ACTION; + goto end; + } + + /* clear T=1 context */ + t1_release(&(get_ccid_slot(reader_index) -> t1)); + + get_ccid_slot(reader_index)->FakeCardChanged = TRUE; + DEBUG_INFO("Card movement faked"); + break; +#endif + + case IFD_POWER_UP: nlength = sizeof(pcbuffer); if (CmdPowerOn(reader_index, &nlength, pcbuffer, PowerOnVoltage) != IFD_SUCCESS) @@ -950,6 +975,46 @@ EXTERNAL RESPONSECODE IFDHTransmitToICC( if (-1 == (reader_index = LunToReaderIndex(Lun))) return IFD_COMMUNICATION_ERROR; + /* Mac OS X (pre Leopard) pcsc-lite is too old (version 1.1.2) to call + * IFDHSetProtocolParameters() correctly. + * Some problem occurs when SCardConnect is used with default protocol + * parameters (SCARD_PROTOCOL_T0 or SCARD_PROTOCOL_T1). In this case + * the daemon do not call IFDHSetProtocolParameters(). So we decide, + * in this case only, to configure the smart card reader with the + * default protocol defined in ATR and without PPS. + */ + +#ifdef IFDHANDLERv2 + { + CcidDesc *ccid_slot; + + /* Get ccid params */ + ccid_slot = get_ccid_slot(reader_index); + + if(! ccid_slot->SetParametersCalled) + { + ATR_t atr; + int default_protocol; + + memset(&atr, 0, sizeof(atr)); + + /* Get ATR of the card */ + ATR_InitFromArray(&atr, ccid_slot->pcATRBuffer, + ccid_slot->nATRLength); + + ATR_GetDefaultProtocol(&atr, &default_protocol); + + DEBUG_INFO2("The default protocol is: T=%d", default_protocol); + + return_value = IFDHSetProtocolParameters(Lun, + (DWORD)(default_protocol+1), 0, 0, 0, 0); + + if (return_value != IFD_SUCCESS) + return return_value; + } + } +#endif + rx_length = *RxLength; return_value = CmdXfrBlock(reader_index, TxLength, TxBuffer, &rx_length, RxBuffer, SendPci.Protocol); @@ -962,9 +1027,11 @@ EXTERNAL RESPONSECODE IFDHTransmitToICC( } /* IFDHTransmitToICC */ -EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, - PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, DWORD RxLength, - PDWORD pdwBytesReturned) +#ifdef IFDHANDLERv2 + +EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, + PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, + PDWORD pdwBytesReturnedpdwBytesReturned) { /* * This function performs a data exchange with the reader (not the @@ -980,6 +1047,23 @@ EXTERNAL RESPONSECODE IFDHControl(DWORD * * Notes: RxLength should be zero on error. */ + DWORD dwControlCode; + + dwControlCode = *((uint32_t *)TxBuffer); + return IFDHControl_v3(Lun, dwControlCode, TxBuffer+sizeof(dwControlCode), + TxLength-sizeof(dwControlCode), RxBuffer, + *pdwBytesReturnedpdwBytesReturned, pdwBytesReturnedpdwBytesReturned); +} + +/* rename the real IFDHControl so we can use it in the old IFDHControl */ +#define IFDHControl IFDHControl_v3 + +#endif + +EXTERNAL RESPONSECODE IFDHControl(DWORD Lun, DWORD dwControlCode, + PUCHAR TxBuffer, DWORD TxLength, PUCHAR RxBuffer, DWORD RxLength, + PDWORD pdwBytesReturned) +{ RESPONSECODE return_value = IFD_COMMUNICATION_ERROR; int reader_index; @@ -1134,6 +1218,17 @@ EXTERNAL RESPONSECODE IFDHICCPresence(DW break; case CCID_ICC_PRESENT_INACTIVE: +#ifdef FAKE_CARD_CHANGED + if (get_ccid_slot(reader_index)->FakeCardChanged) + { + DEBUG_INFO("Card movement faked"); + + get_ccid_slot(reader_index)->FakeCardChanged = FALSE; + CcidSlots[reader_index].bPowerFlags = POWERFLAGS_RAZ; + return_value = IFD_ICC_NOT_PRESENT; + } + else +#endif if ((CcidSlots[reader_index].bPowerFlags == POWERFLAGS_RAZ) || (CcidSlots[reader_index].bPowerFlags & MASK_POWERFLAGS_PDWN)) /* the card was previously absent */ Index: src/commands.c =================================================================== --- src/commands.c (revision 2653) +++ src/commands.c (working copy) @@ -26,6 +26,8 @@ #include #include #include +/* do not redefine SCardControl_wrap() in reader.h */ +#define SKIP_SCARDCONTROL_WRAP #include #include "commands.h" Index: src/defs.h =================================================================== --- src/defs.h (revision 2653) +++ src/defs.h (working copy) @@ -37,6 +37,10 @@ typedef struct CCID_DESC * Card state */ UCHAR bPowerFlags; + UCHAR SetParametersCalled; +#ifdef FAKE_CARD_CHANGED + UCHAR FakeCardChanged; +#endif /* * T=1 Protocol context Index: MacOSX/winscard.h =================================================================== --- MacOSX/winscard.h (revision 0) +++ MacOSX/winscard.h (revision 0) @@ -0,0 +1,2 @@ +#include +#include Index: MacOSX/configure =================================================================== --- MacOSX/configure (revision 0) +++ MacOSX/configure (revision 0) @@ -0,0 +1,88 @@ +#! /bin/bash + +# to use +# ./MacOSX/configure +# make +# make install +# the driver is installed in /usr/libexec/SmartCardServices/drivers + +# to install two or more drivers: for each driver +# ./MacOSX/configure --enable-bundle=ifd-foobar.bundle --prefix=foobar +# rename the installed ifd-ccid.bundle to ifd-foobar.bundle + +# to disable pcscd automatic start edit /etc/mach_init.d/securityd.plist +# and add "-s off" after /usr/sbin/securityd + +# Colors +RED="\33[31m" +NORMAL="\33[0m" + +# run this script as ./MacOSX/configure to configure for Mac OS X +if [ ! -d MacOSX ] +then + echo -e $RED + echo "ERROR!" + echo "run ./MacOSX/configure from the source top directory" + echo -e $NORMAL + exit; +fi + +l=$(cat readers/supported_readers.txt | wc -l) +if [ $l -ne 1 ] +then + echo -e $RED + echo "ERROR!" + echo "The file readers/supported_readers.txt must contain only one line" + echo -e $NORMAL + exit +fi + +# we define PKG_CONFIG so that pkg-config is not used and PCSC_CFLAGS +# and PCSC_LIBS are used instead +PKG_CONFIG="foobar" + +# find pcsc-lite header files in MacOSX/ +PCSC_CFLAGS="-I$(pwd)/MacOSX" +PCSC_LIBS="-framework PCSC" + +# use libusb from OpenSC (universal binary) +LIBUSB_CFLAGS="-I/Library/OpenSC/include" +LIBUSB_LIBS="-L/Library/OpenSC/lib -lusb" + +# we are using ifd-handler API v2 (with old IFDHControl) +CFLAGS="$CFLAGS -DIFDHANDLERv2" + +# RESPONSECODE is already defined by PCSC/wintypes.h +# define needed here to compile examples/scardcontrol.c since config.h is +# not included +CFLAGS="$CFLAGS -DRESPONSECODE_DEFINED_IN_WINTYPES_H" + +# Build a Universal Binary +CFLAGS="$CFLAGS -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" +LDFLAGS="-arch i386 -arch ppc" +CONFIGURE_ARGS="--disable-dependency-tracking" + +# do not use pcscd debug feature +CONFIGURE_ARGS="$CONFIGURE_ARGS --disable-pcsclite" + +# simulate a card change when a reset is requested +CFLAGS="$CFLAGS -DFAKE_CARD_CHANGED" + +set -x +./configure \ + PKG_CONFIG="$PKG_CONFIG" \ + CFLAGS="$CFLAGS" \ + PCSC_CFLAGS="$PCSC_CFLAGS" \ + PCSC_LIBS="$PCSC_LIBS" \ + LIBUSB_CFLAGS="$LIBUSB_CFLAGS" \ + LIBUSB_LIBS="$LIBUSB_LIBS" \ + LDFLAGS="$LDFLAGS" \ + --enable-usbdropdir=/usr/libexec/SmartCardServices/drivers \ + $CONFIGURE_ARGS \ + "$@" + +cp MacOSX/create_Info_plist.pl src + +# force a regeneration of Info.plist +rm -f src/Info.plist + Property changes on: MacOSX/configure ___________________________________________________________________ Name: svn:executable + * Index: MacOSX/create_Info_plist.pl =================================================================== --- MacOSX/create_Info_plist.pl (revision 0) +++ MacOSX/create_Info_plist.pl (revision 0) @@ -0,0 +1,95 @@ +#!/usr/bin/perl + +# create_Info_plist.pl: generate Infor.plist from a template and a +# list of suported readers +# +# Copyright (C) 2007 Ludovic Rousseau +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# This version is designed for an old pcscd that does not support the +# extension for describing readers. +# only one reader must be present in supported_readers.txt + +use warnings; +use strict; + +my (@manuf, @product, @name); +my ($manuf, $product, $name); +my $ifdCapabilities; + +if ($#ARGV ne 2) +{ + print "usage: $0 supported_readers.txt Info.plist ifdCapabilities\n"; + exit; +} + +open IN, "< $ARGV[0]" or die "Can't open $ARGV[0]: $!"; +while () +{ + next if (m/^#/); + next if (m/^$/); + + chomp; + + die "Only one reader must be present in $ARGV[0]\n" if (defined($manuf)); + + ($manuf, $product, $name) = split /:/; + # print "m: $manuf, p: $product, n: $name\n"; + push @manuf, $manuf; + push @product, $product; + push @name, $name +} +close IN; + +map { $_ = "\t$_\n" } @manuf; +map { $_ = "\t$_\n" } @product; +map { $_ = "\t$_\n" } @name; + +$ifdCapabilities=$ARGV[2]; + +open IN, "< $ARGV[1]" or die "Can't open $ARGV[1]: $!"; + +while () +{ + # skip the array lines + next if (m/array/); + + if (m/MAGIC_VENDOR/) + { + print @manuf; + next; + } + if (m/MAGIC_PRODUCT/) + { + print @product; + next; + } + if (m/MAGIC_FRIENDLYNAME/) + { + print @name; + next; + } + if (m/MAGIC_IFDCAPABILITIES/) + { + s/MAGIC_IFDCAPABILITIES/$ifdCapabilities/; + print; + next; + } + print; +} + +close IN; + Property changes on: MacOSX/create_Info_plist.pl ___________________________________________________________________ Name: svn:executable + * Index: MacOSX/ifdhandler.h =================================================================== --- MacOSX/ifdhandler.h (revision 0) +++ MacOSX/ifdhandler.h (revision 0) @@ -0,0 +1 @@ +link ../../../PCSC/src/PCSC/ifdhandler.h \ No newline at end of file Property changes on: MacOSX/ifdhandler.h ___________________________________________________________________ Name: svn:special + * Index: MacOSX/reader.h =================================================================== --- MacOSX/reader.h (revision 0) +++ MacOSX/reader.h (revision 0) @@ -0,0 +1,251 @@ +/* + * MUSCLE SmartCard Development ( http://www.linuxnet.com ) + * + * Copyright (C) 1999-2005 + * David Corcoran + * Ludovic Rousseau + * + * $Id: old-SCardControl_patch.txt,v 1.3 2007-10-16 20:59:38 rousseau Exp $ + */ + +/** + * @file + * @brief This keeps a list of defines shared between the driver and the application + */ + +#ifndef __reader_h__ +#define __reader_h__ + +/* + * Tags for requesting card and reader attributes + */ + +#define SCARD_ATTR_VALUE(Class, Tag) ((((ULONG)(Class)) << 16) | ((ULONG)(Tag))) + +#define SCARD_CLASS_VENDOR_INFO 1 /**< Vendor information definitions */ +#define SCARD_CLASS_COMMUNICATIONS 2 /**< Communication definitions */ +#define SCARD_CLASS_PROTOCOL 3 /**< Protocol definitions */ +#define SCARD_CLASS_POWER_MGMT 4 /**< Power Management definitions */ +#define SCARD_CLASS_SECURITY 5 /**< Security Assurance definitions */ +#define SCARD_CLASS_MECHANICAL 6 /**< Mechanical characteristic definitions */ +#define SCARD_CLASS_VENDOR_DEFINED 7 /**< Vendor specific definitions */ +#define SCARD_CLASS_IFD_PROTOCOL 8 /**< Interface Device Protocol options */ +#define SCARD_CLASS_ICC_STATE 9 /**< ICC State specific definitions */ +#define SCARD_CLASS_SYSTEM 0x7fff /**< System-specific definitions */ + +#define SCARD_ATTR_VENDOR_NAME SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0100) +#define SCARD_ATTR_VENDOR_IFD_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0101) +#define SCARD_ATTR_VENDOR_IFD_VERSION SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0102) +#define SCARD_ATTR_VENDOR_IFD_SERIAL_NO SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_INFO, 0x0103) +#define SCARD_ATTR_CHANNEL_ID SCARD_ATTR_VALUE(SCARD_CLASS_COMMUNICATIONS, 0x0110) +#define SCARD_ATTR_ASYNC_PROTOCOL_TYPES SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0120) +#define SCARD_ATTR_DEFAULT_CLK SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0121) +#define SCARD_ATTR_MAX_CLK SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0122) +#define SCARD_ATTR_DEFAULT_DATA_RATE SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0123) +#define SCARD_ATTR_MAX_DATA_RATE SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0124) +#define SCARD_ATTR_MAX_IFSD SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0125) +#define SCARD_ATTR_SYNC_PROTOCOL_TYPES SCARD_ATTR_VALUE(SCARD_CLASS_PROTOCOL, 0x0126) +#define SCARD_ATTR_POWER_MGMT_SUPPORT SCARD_ATTR_VALUE(SCARD_CLASS_POWER_MGMT, 0x0131) +#define SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0140) +#define SCARD_ATTR_USER_AUTH_INPUT_DEVICE SCARD_ATTR_VALUE(SCARD_CLASS_SECURITY, 0x0142) +#define SCARD_ATTR_CHARACTERISTICS SCARD_ATTR_VALUE(SCARD_CLASS_MECHANICAL, 0x0150) + +#define SCARD_ATTR_CURRENT_PROTOCOL_TYPE SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0201) +#define SCARD_ATTR_CURRENT_CLK SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0202) +#define SCARD_ATTR_CURRENT_F SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0203) +#define SCARD_ATTR_CURRENT_D SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0204) +#define SCARD_ATTR_CURRENT_N SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0205) +#define SCARD_ATTR_CURRENT_W SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0206) +#define SCARD_ATTR_CURRENT_IFSC SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0207) +#define SCARD_ATTR_CURRENT_IFSD SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0208) +#define SCARD_ATTR_CURRENT_BWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x0209) +#define SCARD_ATTR_CURRENT_CWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020a) +#define SCARD_ATTR_CURRENT_EBC_ENCODING SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020b) +#define SCARD_ATTR_EXTENDED_BWT SCARD_ATTR_VALUE(SCARD_CLASS_IFD_PROTOCOL, 0x020c) + +#define SCARD_ATTR_ICC_PRESENCE SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0300) +#define SCARD_ATTR_ICC_INTERFACE_STATUS SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0301) +#define SCARD_ATTR_CURRENT_IO_STATE SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0302) +#define SCARD_ATTR_ATR_STRING SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0303) +#define SCARD_ATTR_ICC_TYPE_PER_ATR SCARD_ATTR_VALUE(SCARD_CLASS_ICC_STATE, 0x0304) + +#define SCARD_ATTR_ESC_RESET SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA000) +#define SCARD_ATTR_ESC_CANCEL SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA003) +#define SCARD_ATTR_ESC_AUTHREQUEST SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA005) +#define SCARD_ATTR_MAXINPUT SCARD_ATTR_VALUE(SCARD_CLASS_VENDOR_DEFINED, 0xA007) + +#define SCARD_ATTR_DEVICE_UNIT SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0001) +#define SCARD_ATTR_DEVICE_IN_USE SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0002) +#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0003) +#define SCARD_ATTR_DEVICE_SYSTEM_NAME_A SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0004) +#define SCARD_ATTR_DEVICE_FRIENDLY_NAME_W SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0005) +#define SCARD_ATTR_DEVICE_SYSTEM_NAME_W SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0006) +#define SCARD_ATTR_SUPRESS_T1_IFS_REQUEST SCARD_ATTR_VALUE(SCARD_CLASS_SYSTEM, 0x0007) + +#ifdef UNICODE +#define SCARD_ATTR_DEVICE_FRIENDLY_NAME SCARD_ATTR_DEVICE_FRIENDLY_NAME_W +#define SCARD_ATTR_DEVICE_SYSTEM_NAME SCARD_ATTR_DEVICE_SYSTEM_NAME_W +#else +#define SCARD_ATTR_DEVICE_FRIENDLY_NAME SCARD_ATTR_DEVICE_FRIENDLY_NAME_A +#define SCARD_ATTR_DEVICE_SYSTEM_NAME SCARD_ATTR_DEVICE_SYSTEM_NAME_A +#endif + +/** + * Provide source compatibility on different platforms + */ +#define SCARD_CTL_CODE(code) (0x42000000 + (code)) + +/** + * TeleTrust Class 2 reader tags + */ +#define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400) + +#define FEATURE_VERIFY_PIN_START 0x01 /**< OMNIKEY Proposal */ +#define FEATURE_VERIFY_PIN_FINISH 0x02 /**< OMNIKEY Proposal */ +#define FEATURE_MODIFY_PIN_START 0x03 /**< OMNIKEY Proposal */ +#define FEATURE_MODIFY_PIN_FINISH 0x04 /**< OMNIKEY Proposal */ +#define FEATURE_GET_KEY_PRESSED 0x05 /**< OMNIKEY Proposal */ +#define FEATURE_VERIFY_PIN_DIRECT 0x06 /**< USB CCID PIN Verify */ +#define FEATURE_MODIFY_PIN_DIRECT 0x07 /**< USB CCID PIN Modify */ +#define FEATURE_MCT_READERDIRECT 0x08 /**< KOBIL Proposal */ +#define FEATURE_MCT_UNIVERSAL 0x09 /**< KOBIL Proposal */ +#define FEATURE_IFD_PIN_PROP 0x0A /**< Gemplus Proposal */ +#define FEATURE_ABORT 0x0B /**< SCM Proposal */ + +/* structures used (but not defined) in PCSC Part 10 revision 2.01.02: + * "IFDs with Secure Pin Entry Capabilities" */ + +#include + +/* Set structure elements aligment on bytes + * http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html */ +#if defined(__APPLE__) | defined(sun) +#pragma pack(1) +#else +#pragma pack(push, 1) +#endif + +/** the structure must be 6-bytes long */ +typedef struct +{ + uint8_t tag; + uint8_t length; + uint32_t value; /**< This value is always in BIG ENDIAN format as documented in PCSC v2 part 10 ch 2.2 page 2. You can use ntohl() for example */ +} PCSC_TLV_STRUCTURE; + +/** the wLangId and wPINMaxExtraDigit are 16-bits long so are subject to byte + * ordering */ +#ifdef __BIG_ENDIAN__ +#define HOST_TO_CCID_16(x) ((((x) >> 8) & 0xFF) + ((x & 0xFF) << 8)) +#define HOST_TO_CCID_32(x) ((((x) >> 24) & 0xFF) + (((x) >> 8) & 0xFF00) + ((x & 0xFF00) << 8) + (((x) & 0xFF) << 24)) +#else +#define HOST_TO_CCID_16(x) (x) +#define HOST_TO_CCID_32(x) (x) +#endif + +/** structure used with \ref FEATURE_VERIFY_PIN_DIRECT */ +typedef struct +{ + uint8_t bTimerOut; /**< timeout is seconds (00 means use default timeout) */ + uint8_t bTimerOut2; /**< timeout in seconds after first key stroke */ + uint8_t bmFormatString; /**< formatting options */ + uint8_t bmPINBlockString; /**< bits 7-4 bit size of PIN length in APDU, + * bits 3-0 PIN block size in bytes after + * justification and formatting */ + uint8_t bmPINLengthFormat; /**< bits 7-5 RFU, + * bit 4 set if system units are bytes, clear if + * system units are bits, + * bits 3-0 PIN length position in system units */ + uint16_t wPINMaxExtraDigit; /**< 0xXXYY where XX is minimum PIN size in digits, + and YY is maximum PIN size in digits */ + uint8_t bEntryValidationCondition; /**< Conditions under which PIN entry should + * be considered complete */ + uint8_t bNumberMessage; /**< Number of messages to display for PIN verification */ + uint16_t wLangId; /**< Language for messages */ + uint8_t bMsgIndex; /**< Message index (should be 00) */ + uint8_t bTeoPrologue[3]; /**< T=1 block prologue field to use (fill with 00) */ + uint32_t ulDataLength; /**< length of Data to be sent to the ICC */ + uint8_t abData[1]; /**< Data to send to the ICC */ +} PIN_VERIFY_STRUCTURE; + +/** structure used with \ref FEATURE_MODIFY_PIN_DIRECT */ +typedef struct +{ + uint8_t bTimerOut; /**< timeout is seconds (00 means use default timeout) */ + uint8_t bTimerOut2; /**< timeout in seconds after first key stroke */ + uint8_t bmFormatString; /**< formatting options */ + uint8_t bmPINBlockString; /**< bits 7-4 bit size of PIN length in APDU, + * bits 3-0 PIN block size in bytes after + * justification and formatting */ + uint8_t bmPINLengthFormat; /**< bits 7-5 RFU, + * bit 4 set if system units are bytes, clear if + * system units are bits, + * bits 3-0 PIN length position in system units */ + uint8_t bInsertionOffsetOld; /**< Insertion position offset in bytes for + the current PIN */ + uint8_t bInsertionOffsetNew; /**< Insertion position offset in bytes for + the new PIN */ + uint16_t wPINMaxExtraDigit; + /**< 0xXXYY where XX is minimum PIN size in digits, + and YY is maximum PIN size in digits */ + uint8_t bConfirmPIN; /**< Flags governing need for confirmation of new PIN */ + uint8_t bEntryValidationCondition; /**< Conditions under which PIN entry should + * be considered complete */ + uint8_t bNumberMessage; /**< Number of messages to display for PIN verification*/ + uint16_t wLangId; /**< Language for messages */ + uint8_t bMsgIndex1; /**< index of 1st prompting message */ + uint8_t bMsgIndex2; /**< index of 2d prompting message */ + uint8_t bMsgIndex3; /**< index of 3d prompting message */ + uint8_t bTeoPrologue[3]; /**< T=1 block prologue field to use (fill with 00) */ + uint32_t ulDataLength; /**< length of Data to be sent to the ICC */ + uint8_t abData[1]; /**< Data to send to the ICC */ +} PIN_MODIFY_STRUCTURE; + +/* restore default structure elements alignment */ +#if defined(__APPLE__) | defined(sun) +#pragma pack() +#else +#pragma pack(pop) +#endif + +#ifdef __APPLE__ +/* hack to use a V3 SCardControl on a V2 pcsc-lite + * WARNING: do not use this file on Leopard (10.5) or above + */ + +int32_t SCardControl_wrap(int32_t hCard, uint32_t dwControlCode, + const unsigned char *TxBuffer, uint32_t TxLength, + unsigned char *RxBuffer, uint32_t RxLength, + uint32_t *pdwBytesReturned); + +#ifndef SKIP_SCARDCONTROL_WRAP +int32_t SCardControl_wrap(int32_t hCard, uint32_t dwControlCode, + const unsigned char *TxBuffer, uint32_t TxLength, + unsigned char *RxBuffer, uint32_t RxLength, + uint32_t *pdwBytesReturned) +{ + uint32_t ret; + unsigned char tmp[256]; + + /* if your application is using a bigger buffer just increase + * the size of tmp[] */ + if (sizeof(tmp) < TxLength+sizeof(dwControlCode)) + return SCARD_E_INSUFFICIENT_BUFFER; + + *((uint32_t *)tmp) = dwControlCode; + memcpy(tmp+sizeof(dwControlCode), TxBuffer, TxLength); + TxLength += sizeof(dwControlCode); + + ret = SCardControl(hCard, tmp, TxLength, RxBuffer, &RxLength); + *pdwBytesReturned = RxLength; + + return ret; +} +#endif + +#define SCardControl SCardControl_wrap + +#endif + +#endif + Index: MacOSX/wintypes.h =================================================================== --- MacOSX/wintypes.h (revision 0) +++ MacOSX/wintypes.h (revision 0) @@ -0,0 +1 @@ +#include Index: MacOSX/pcsclite.h =================================================================== --- MacOSX/pcsclite.h (revision 0) +++ MacOSX/pcsclite.h (revision 0) @@ -0,0 +1,2 @@ +#include +#include Index: MacOSX/debuglog.h =================================================================== --- MacOSX/debuglog.h (revision 0) +++ MacOSX/debuglog.h (revision 0) @@ -0,0 +1 @@ +link ../../../PCSC/src/PCSC/debuglog.h \ No newline at end of file Property changes on: MacOSX/debuglog.h ___________________________________________________________________ Name: svn:special + * Index: autogen.sh =================================================================== --- autogen.sh (revision 0) +++ autogen.sh (revision 0) @@ -0,0 +1,9 @@ +#! /bin/bash + +set -x + +aclocal +libtoolize --copy --force --automake +autoheader --force +autoconf --force +automake --add-missing --copy --force --foreign Property changes on: autogen.sh ___________________________________________________________________ Name: svn:executable + *