2017-03-14 21:47:13 +00:00
|
|
|
/*
|
|
|
|
* MUSCLE SmartCard Development ( http://pcsclite.alioth.debian.org/pcsclite.html )
|
|
|
|
*
|
|
|
|
* Copyright (C) 1999-2003
|
|
|
|
* David Corcoran <corcoran@musclecard.com>
|
|
|
|
* Copyright (C) 2002-2009
|
|
|
|
* Ludovic Rousseau <ludovic.rousseau@free.fr>
|
|
|
|
*
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
|
|
modification, are permitted provided that the following conditions
|
|
|
|
are met:
|
|
|
|
1. Redistributions of source code must retain the above copyright
|
|
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
notice, this list of conditions and the following disclaimer in the
|
|
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
3. The name of the author may not be used to endorse or promote products
|
|
|
|
derived from this software without specific prior written permission.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
|
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
|
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
|
|
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
|
|
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
2008-03-06 16:06:59 +00:00
|
|
|
#ifndef __INTERNAL_WINSCARD_H
|
|
|
|
#define __INTERNAL_WINSCARD_H
|
|
|
|
|
|
|
|
/* Mostly copied from pcsc-lite, this is the minimum required */
|
|
|
|
|
|
|
|
#if defined(HAVE_INTTYPES_H)
|
|
|
|
#include <inttypes.h>
|
|
|
|
#elif defined(HAVE_STDINT_H)
|
|
|
|
#include <stdint.h>
|
|
|
|
#elif defined(_MSC_VER)
|
|
|
|
typedef unsigned __int32 uint32_t;
|
|
|
|
typedef unsigned __int16 uint16_t;
|
|
|
|
typedef unsigned __int8 uint8_t;
|
|
|
|
#else
|
|
|
|
#warning no uint32_t type available, please contact opensc-devel@opensc-project.org
|
|
|
|
#endif
|
|
|
|
|
2008-10-27 19:16:28 +00:00
|
|
|
#ifdef HAVE_WINSCARD_H
|
|
|
|
#include <winscard.h>
|
2008-12-11 09:18:09 +00:00
|
|
|
#ifdef __APPLE__
|
|
|
|
#include <wintypes.h>
|
|
|
|
#endif
|
2015-03-28 09:00:47 +00:00
|
|
|
// allow unicode built where SCARD_READERSTATE is defined as SCARD_READERSTATEW and SCardGetStatusChange renamed to SCardGetStatusChangeW
|
2015-09-09 12:51:09 +00:00
|
|
|
#ifdef _WIN32
|
2015-03-28 09:00:47 +00:00
|
|
|
#ifdef UNICODE
|
|
|
|
#define SCARD_READERSTATE SCARD_READERSTATEA
|
|
|
|
#undef SCardGetStatusChange
|
|
|
|
#endif
|
|
|
|
#endif
|
2008-10-27 19:16:28 +00:00
|
|
|
#else
|
|
|
|
/* mingw32 does not have winscard.h */
|
|
|
|
|
2010-08-13 09:27:38 +00:00
|
|
|
#define MAX_ATR_SIZE 33 /**< Maximum ATR size */
|
|
|
|
|
2008-03-06 16:06:59 +00:00
|
|
|
#define SCARD_PROTOCOL_T0 0x0001 /**< T=0 active protocol. */
|
|
|
|
#define SCARD_PROTOCOL_T1 0x0002 /**< T=1 active protocol. */
|
|
|
|
#define SCARD_PROTOCOL_RAW 0x0004 /**< Raw active protocol. */
|
|
|
|
|
|
|
|
#define SCARD_STATE_UNAWARE 0x0000 /**< App wants status */
|
|
|
|
#define SCARD_STATE_IGNORE 0x0001 /**< Ignore this reader */
|
|
|
|
#define SCARD_STATE_CHANGED 0x0002 /**< State has changed */
|
2010-01-24 15:25:08 +00:00
|
|
|
#define SCARD_STATE_UNKNOWN 0x0004 /**< Reader unknown */
|
2010-10-06 07:10:44 +00:00
|
|
|
#define SCARD_STATE_UNAVAILABLE 0x0008 /**< Status unavailable */
|
2008-03-06 16:06:59 +00:00
|
|
|
#define SCARD_STATE_EMPTY 0x0010 /**< Card removed */
|
|
|
|
#define SCARD_STATE_PRESENT 0x0020 /**< Card inserted */
|
2010-10-06 07:10:44 +00:00
|
|
|
#define SCARD_STATE_EXCLUSIVE 0x0080 /**< Exclusive Mode */
|
|
|
|
#define SCARD_STATE_INUSE 0x0100 /**< Shared Mode */
|
|
|
|
#define SCARD_STATE_MUTE 0x0200 /**< Unresponsive card */
|
|
|
|
#define SCARD_STATE_UNPOWERED 0x0400 /**< Unpowered card */
|
|
|
|
|
2008-03-06 16:06:59 +00:00
|
|
|
|
|
|
|
#define SCARD_SHARE_EXCLUSIVE 0x0001 /**< Exclusive mode only */
|
|
|
|
#define SCARD_SHARE_SHARED 0x0002 /**< Shared mode only */
|
2009-09-14 09:48:56 +00:00
|
|
|
#define SCARD_SHARE_DIRECT 0x0003 /**< Raw mode only */
|
2008-03-06 16:06:59 +00:00
|
|
|
|
|
|
|
#define SCARD_LEAVE_CARD 0x0000 /**< Do nothing on close */
|
|
|
|
#define SCARD_RESET_CARD 0x0001 /**< Reset on close */
|
|
|
|
#define SCARD_UNPOWER_CARD 0x0002 /**< Power down on close */
|
|
|
|
|
|
|
|
#define SCARD_SCOPE_USER 0x0000 /**< Scope in user space */
|
|
|
|
|
2008-10-26 14:48:47 +00:00
|
|
|
#ifndef SCARD_S_SUCCESS /* conflict in mingw-w64 */
|
2008-03-06 16:06:59 +00:00
|
|
|
#define SCARD_S_SUCCESS 0x00000000 /**< No error was encountered. */
|
2010-01-10 18:44:02 +00:00
|
|
|
#define SCARD_E_CANCELLED 0x80100002 /**< The action was cancelled by an SCardCancel request. */
|
2008-04-29 17:01:19 +00:00
|
|
|
#define SCARD_E_INVALID_HANDLE 0x80100003 /**< The supplied handle was invalid. */
|
2008-03-06 16:06:59 +00:00
|
|
|
#define SCARD_E_TIMEOUT 0x8010000A /**< The user-specified timeout value has expired. */
|
|
|
|
#define SCARD_E_SHARING_VIOLATION 0x8010000B /**< The smart card cannot be accessed because of other connections outstanding. */
|
2009-09-14 09:03:33 +00:00
|
|
|
#define SCARD_E_NO_SMARTCARD 0x8010000C /**< The operation requires a smart card, but no smart card is currently in the device. */
|
|
|
|
#define SCARD_E_PROTO_MISMATCH 0x8010000F /**< The requested protocols are incompatible with the protocol currently in use with the smart card. */
|
2008-03-06 16:06:59 +00:00
|
|
|
#define SCARD_E_NOT_TRANSACTED 0x80100016 /**< An attempt was made to end a non-existent transaction. */
|
2008-04-29 17:01:19 +00:00
|
|
|
#define SCARD_E_READER_UNAVAILABLE 0x80100017 /**< The specified reader is not currently available for use. */
|
2009-01-20 08:45:12 +00:00
|
|
|
#define SCARD_E_NO_SERVICE 0x8010001D /**< The Smart card resource manager is not running. */
|
2008-03-06 16:06:59 +00:00
|
|
|
#define SCARD_E_NO_READERS_AVAILABLE 0x8010002E /**< Cannot find a smart card reader. */
|
|
|
|
#define SCARD_W_UNRESPONSIVE_CARD 0x80100066 /**< The smart card is not responding to a reset. */
|
|
|
|
#define SCARD_W_UNPOWERED_CARD 0x80100067 /**< Power has been removed from the smart card, so that further communication is not possible. */
|
|
|
|
#define SCARD_W_RESET_CARD 0x80100068 /**< The smart card has been reset, so any shared state information is invalid. */
|
|
|
|
#define SCARD_W_REMOVED_CARD 0x80100069 /**< The smart card has been removed, so further communication is not possible. */
|
2008-10-26 14:48:47 +00:00
|
|
|
#endif
|
2008-03-06 16:06:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
typedef const BYTE *LPCBYTE;
|
|
|
|
typedef long SCARDCONTEXT; /**< \p hContext returned by SCardEstablishContext() */
|
|
|
|
typedef SCARDCONTEXT *PSCARDCONTEXT;
|
|
|
|
typedef SCARDCONTEXT *LPSCARDCONTEXT;
|
|
|
|
typedef long SCARDHANDLE; /**< \p hCard returned by SCardConnect() */
|
|
|
|
typedef SCARDHANDLE *PSCARDHANDLE;
|
|
|
|
typedef SCARDHANDLE *LPSCARDHANDLE;
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
const char *szReader;
|
|
|
|
void *pvUserData;
|
|
|
|
unsigned long dwCurrentState;
|
|
|
|
unsigned long dwEventState;
|
|
|
|
unsigned long cbAtr;
|
|
|
|
unsigned char rgbAtr[MAX_ATR_SIZE];
|
|
|
|
}
|
2010-08-16 08:59:05 +00:00
|
|
|
SCARD_READERSTATE, *LPSCARD_READERSTATE;
|
2008-03-06 16:06:59 +00:00
|
|
|
|
|
|
|
typedef struct _SCARD_IO_REQUEST
|
|
|
|
{
|
|
|
|
unsigned long dwProtocol; /* Protocol identifier */
|
|
|
|
unsigned long cbPciLength; /* Protocol Control Inf Length */
|
|
|
|
}
|
|
|
|
SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
|
|
|
|
|
2008-10-27 19:16:28 +00:00
|
|
|
typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST;
|
|
|
|
|
|
|
|
#endif /* HAVE_SCARD_H */
|
2008-04-04 16:46:50 +00:00
|
|
|
|
|
|
|
#if defined(_WIN32)
|
|
|
|
#define PCSC_API WINAPI
|
|
|
|
#elif defined(USE_CYGWIN)
|
|
|
|
#define PCSC_API __stdcall
|
|
|
|
#else
|
|
|
|
#define PCSC_API
|
|
|
|
#endif
|
|
|
|
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardEstablishContext_t)(DWORD dwScope, LPCVOID pvReserved1,
|
2008-03-06 16:06:59 +00:00
|
|
|
LPCVOID pvReserved2, LPSCARDCONTEXT phContext);
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardReleaseContext_t)(SCARDCONTEXT hContext);
|
|
|
|
typedef LONG (PCSC_API *SCardConnect_t)(SCARDCONTEXT hContext, LPCSTR szReader, DWORD dwShareMode,
|
2008-03-06 16:06:59 +00:00
|
|
|
DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol);
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardReconnect_t)(SCARDHANDLE hCard, DWORD dwShareMode, DWORD dwPreferredProtocols,
|
2008-03-06 16:06:59 +00:00
|
|
|
DWORD dwInitialization, LPDWORD pdwActiveProtocol);
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardDisconnect_t)(SCARDHANDLE hCard, DWORD dwDisposition);
|
|
|
|
typedef LONG (PCSC_API *SCardBeginTransaction_t)(SCARDHANDLE hCard);
|
|
|
|
typedef LONG (PCSC_API *SCardEndTransaction_t)(SCARDHANDLE hCard, DWORD dwDisposition);
|
|
|
|
typedef LONG (PCSC_API *SCardStatus_t)(SCARDHANDLE hCard, LPSTR mszReaderNames, LPDWORD pcchReaderLen,
|
2008-03-06 16:06:59 +00:00
|
|
|
LPDWORD pdwState, LPDWORD pdwProtocol, LPBYTE pbAtr, LPDWORD pcbAtrLen);
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardGetStatusChange_t)(SCARDCONTEXT hContext, DWORD dwTimeout,
|
2010-08-16 09:33:56 +00:00
|
|
|
SCARD_READERSTATE *rgReaderStates, DWORD cReaders);
|
2010-01-10 18:44:02 +00:00
|
|
|
typedef LONG (PCSC_API *SCardCancel_t)(SCARDCONTEXT hContext);
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardControlOLD_t)(SCARDHANDLE hCard, LPCVOID pbSendBuffer, DWORD cbSendLength,
|
2008-03-06 16:06:59 +00:00
|
|
|
LPVOID pbRecvBuffer, LPDWORD lpBytesReturned);
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardControl_t)(SCARDHANDLE hCard, DWORD dwControlCode, LPCVOID pbSendBuffer,
|
2008-03-06 16:06:59 +00:00
|
|
|
DWORD cbSendLength, LPVOID pbRecvBuffer, DWORD cbRecvLength,
|
|
|
|
LPDWORD lpBytesReturned);
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardTransmit_t)(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci,
|
2008-03-06 16:06:59 +00:00
|
|
|
LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci,
|
|
|
|
LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength);
|
2008-04-04 06:05:38 +00:00
|
|
|
typedef LONG (PCSC_API *SCardListReaders_t)(SCARDCONTEXT hContext, LPCSTR mszGroups,
|
2008-03-06 16:06:59 +00:00
|
|
|
LPSTR mszReaders, LPDWORD pcchReaders);
|
2010-02-05 13:05:25 +00:00
|
|
|
typedef LONG (PCSC_API *SCardGetAttrib_t)(SCARDHANDLE hCard, DWORD dwAttrId,\
|
|
|
|
LPBYTE pbAttr, LPDWORD pcbAttrLen);
|
2008-03-06 16:06:59 +00:00
|
|
|
|
|
|
|
/* Copied from pcsc-lite reader.h */
|
|
|
|
|
2008-10-27 19:16:28 +00:00
|
|
|
#ifndef SCARD_CTL_CODE
|
2009-03-07 21:55:40 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
#include <winioctl.h>
|
|
|
|
#define SCARD_CTL_CODE(code) CTL_CODE(FILE_DEVICE_SMARTCARD,(code),METHOD_BUFFERED,FILE_ANY_ACCESS)
|
|
|
|
#else
|
2008-10-27 19:16:28 +00:00
|
|
|
#define SCARD_CTL_CODE(code) (0x42000000 + (code))
|
|
|
|
#endif
|
2009-03-07 21:55:40 +00:00
|
|
|
#endif
|
2008-10-27 19:16:28 +00:00
|
|
|
|
2008-03-06 16:06:59 +00:00
|
|
|
/**
|
2009-03-21 11:09:12 +00:00
|
|
|
* PC/SC v2.02.05 part 10 reader tags
|
2008-03-06 16:06:59 +00:00
|
|
|
*/
|
|
|
|
#define CM_IOCTL_GET_FEATURE_REQUEST SCARD_CTL_CODE(3400)
|
|
|
|
|
2009-03-21 11:09:12 +00:00
|
|
|
#define FEATURE_VERIFY_PIN_START 0x01
|
|
|
|
#define FEATURE_VERIFY_PIN_FINISH 0x02
|
|
|
|
#define FEATURE_MODIFY_PIN_START 0x03
|
|
|
|
#define FEATURE_MODIFY_PIN_FINISH 0x04
|
|
|
|
#define FEATURE_GET_KEY_PRESSED 0x05
|
|
|
|
#define FEATURE_VERIFY_PIN_DIRECT 0x06
|
|
|
|
#define FEATURE_MODIFY_PIN_DIRECT 0x07
|
|
|
|
#define FEATURE_MCT_READERDIRECT 0x08
|
|
|
|
#define FEATURE_MCT_UNIVERSAL 0x09
|
|
|
|
#define FEATURE_IFD_PIN_PROPERTIES 0x0A
|
|
|
|
#define FEATURE_ABORT 0x0B
|
|
|
|
#define FEATURE_SET_SPE_MESSAGE 0x0C
|
|
|
|
#define FEATURE_VERIFY_PIN_DIRECT_APP_ID 0x0D
|
|
|
|
#define FEATURE_MODIFY_PIN_DIRECT_APP_ID 0x0E
|
|
|
|
#define FEATURE_WRITE_DISPLAY 0x0F
|
|
|
|
#define FEATURE_GET_KEY 0x10
|
|
|
|
#define FEATURE_IFD_DISPLAY_PROPERTIES 0x11
|
2010-07-26 13:16:37 +00:00
|
|
|
#define FEATURE_GET_TLV_PROPERTIES 0x12
|
|
|
|
#define FEATURE_CCID_ESC_COMMAND 0x13
|
2012-02-20 11:47:58 +00:00
|
|
|
#define FEATURE_EXECUTE_PACE 0x20
|
|
|
|
|
|
|
|
#define PACE_FUNCTION_GetReaderPACECapabilities 0x01
|
|
|
|
#define PACE_FUNCTION_EstablishPACEChannel 0x02
|
|
|
|
#define PACE_FUNCTION_DestroyPACEChannel 0x03
|
|
|
|
|
|
|
|
#define PACE_CAPABILITY_eSign 0x10
|
|
|
|
#define PACE_CAPABILITY_eID 0x20
|
|
|
|
#define PACE_CAPABILITY_generic 0x40
|
|
|
|
#define PACE_CAPABILITY_DestroyPACEChannel 0x80
|
2008-03-06 16:06:59 +00:00
|
|
|
|
2011-06-12 18:36:43 +00:00
|
|
|
/* properties returned by FEATURE_GET_TLV_PROPERTIES */
|
|
|
|
#define PCSCv2_PART10_PROPERTY_wLcdLayout 1
|
|
|
|
#define PCSCv2_PART10_PROPERTY_bEntryValidationCondition 2
|
|
|
|
#define PCSCv2_PART10_PROPERTY_bTimeOut2 3
|
|
|
|
#define PCSCv2_PART10_PROPERTY_wLcdMaxCharacters 4
|
|
|
|
#define PCSCv2_PART10_PROPERTY_wLcdMaxLines 5
|
|
|
|
#define PCSCv2_PART10_PROPERTY_bMinPINSize 6
|
|
|
|
#define PCSCv2_PART10_PROPERTY_bMaxPINSize 7
|
|
|
|
#define PCSCv2_PART10_PROPERTY_sFirmwareID 8
|
|
|
|
#define PCSCv2_PART10_PROPERTY_bPPDUSupport 9
|
2015-07-28 07:49:44 +00:00
|
|
|
#define PCSCv2_PART10_PROPERTY_dwMaxAPDUDataSize 10
|
2015-08-11 22:22:20 +00:00
|
|
|
#define PCSCv2_PART10_PROPERTY_wIdVendor 11
|
|
|
|
#define PCSCv2_PART10_PROPERTY_wIdProduct 12
|
2011-06-12 18:36:43 +00:00
|
|
|
|
2010-07-26 13:16:37 +00:00
|
|
|
/* structures used (but not defined) in PCSC Part 10:
|
2008-03-06 16:06:59 +00:00
|
|
|
* "IFDs with Secure Pin Entry Capabilities" */
|
|
|
|
|
|
|
|
/* Set structure elements aligment on bytes
|
|
|
|
* http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html */
|
2010-07-30 07:09:15 +00:00
|
|
|
#if defined(__APPLE__) || defined(sun)
|
2008-03-06 16:06:59 +00:00
|
|
|
#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 */
|
|
|
|
#define HOST_TO_CCID_16(x) (x)
|
|
|
|
#define HOST_TO_CCID_32(x) (x)
|
|
|
|
|
|
|
|
/** 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 */
|
2013-05-27 10:45:31 +00:00
|
|
|
uint8_t abData
|
|
|
|
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
|
|
|
|
[] /* valid C99 code */
|
|
|
|
#else
|
|
|
|
[0] /* non-standard, but usually working code */
|
|
|
|
#endif
|
|
|
|
; /**< Data to send to the ICC */
|
2008-03-06 16:06:59 +00:00
|
|
|
} 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 */
|
2013-05-27 10:45:31 +00:00
|
|
|
uint8_t abData
|
|
|
|
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
|
|
|
|
[] /* valid C99 code */
|
|
|
|
#else
|
|
|
|
[0] /* non-standard, but usually working code */
|
|
|
|
#endif
|
|
|
|
; /**< Data to send to the ICC */
|
2008-03-06 16:06:59 +00:00
|
|
|
} PIN_MODIFY_STRUCTURE;
|
|
|
|
|
2010-07-26 13:16:37 +00:00
|
|
|
/* PIN_PROPERTIES as defined (in/up to?) PC/SC 2.02.05 */
|
|
|
|
/* This only makes sense with old Windows drivers. To be removed some time in the future. */
|
|
|
|
#define PIN_PROPERTIES_v5
|
2009-03-21 11:09:12 +00:00
|
|
|
typedef struct {
|
|
|
|
uint16_t wLcdLayout; /**< display characteristics */
|
|
|
|
uint16_t wLcdMaxCharacters;
|
|
|
|
uint16_t wLcdMaxLines;
|
|
|
|
uint8_t bEntryValidationCondition;
|
|
|
|
uint8_t bTimeOut2;
|
2010-07-26 13:16:37 +00:00
|
|
|
} PIN_PROPERTIES_STRUCTURE_v5;
|
|
|
|
|
|
|
|
/* PIN_PROPERTIES as defined in PC/SC 2.02.06 and later */
|
|
|
|
typedef struct {
|
|
|
|
uint16_t wLcdLayout; /**< display characteristics */
|
|
|
|
uint8_t bEntryValidationCondition;
|
|
|
|
uint8_t bTimeOut2;
|
2009-03-21 11:09:12 +00:00
|
|
|
} PIN_PROPERTIES_STRUCTURE;
|
|
|
|
|
2008-03-06 16:06:59 +00:00
|
|
|
/* restore default structure elements alignment */
|
2010-07-30 07:09:15 +00:00
|
|
|
#if defined(__APPLE__) || defined(sun)
|
2008-03-06 16:06:59 +00:00
|
|
|
#pragma pack()
|
|
|
|
#else
|
|
|
|
#pragma pack(pop)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif
|