mirror of https://gerrit.osmocom.org/simtrace2
CCID config, init, run
Switching to config 1 and 2 works, but to 3 and 4 usb_enum.py is hanging for some reason. Switching the USB config from Sniffer to CCID reader was not tested yet.
This commit is contained in:
parent
4ba4d2230b
commit
db7b1abd17
|
@ -0,0 +1,171 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "board.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal definitions
|
||||
*------------------------------------------------------------------------------*/
|
||||
/** Maximum ucSize in bytes of the smartcard answer to a command.*/
|
||||
#define MAX_ANSWER_SIZE 10
|
||||
|
||||
/** Maximum ATR ucSize in bytes.*/
|
||||
#define MAX_ATR_SIZE 55
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** ISO7816 pins */
|
||||
static const Pin pinsISO7816[] = {PINS_ISO7816};
|
||||
/** ISO7816 RST pin */
|
||||
static const Pin pinIso7816RstMC = PIN_ISO7816_RSTMC;
|
||||
static uint8_t sim_inserted = 0;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Optional smartcard detection
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef SMARTCARD_CONNECT_PIN
|
||||
|
||||
/** Smartcard detection pin.*/
|
||||
static const Pin pinSmartCard = SMARTCARD_CONNECT_PIN;
|
||||
|
||||
/**
|
||||
* PIO interrupt service routine. Checks if the smartcard has been connected
|
||||
* or disconnected.
|
||||
*/
|
||||
static void ISR_PioSmartCard( const Pin *pPin )
|
||||
{
|
||||
/* FIXME: why is pinSmartCard.pio->PIO_ISR the wrong number?
|
||||
printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);
|
||||
printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);
|
||||
Output:
|
||||
+++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10
|
||||
+++++ Mask: 0x100 = 1<<8
|
||||
*/
|
||||
// PA10 is DTXD, which is the debug uart transmit pin
|
||||
|
||||
printf("Interrupt!!\n\r");
|
||||
/* Check all pending interrupts */
|
||||
// FIXME: this if condition is not always true...
|
||||
// if ( (pinSmartCard.pio->PIO_ISR & pinSmartCard.mask) != 0 )
|
||||
{
|
||||
/* Check current level on pin */
|
||||
if ( PIO_Get( &pinSmartCard ) == 0 )
|
||||
{
|
||||
sim_inserted = 1;
|
||||
printf( "-I- Smartcard inserted\n\r" ) ;
|
||||
CCID_Insertion();
|
||||
}
|
||||
else
|
||||
{
|
||||
sim_inserted = 0;
|
||||
printf( "-I- Smartcard removed\n\r" ) ;
|
||||
CCID_Removal();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures the smartcard detection pin to trigger an interrupt.
|
||||
*/
|
||||
static void ConfigureCardDetection( void )
|
||||
{
|
||||
printf("+++++ Configure PIOs\n\r");
|
||||
PIO_Configure( &pinSmartCard, 1 ) ;
|
||||
NVIC_EnableIRQ( PIOA_IRQn );
|
||||
// FIXME: Do we need to set priority?: NVIC_SetPriority( PIOA_IRQn, 10);
|
||||
PIO_ConfigureIt( &pinSmartCard, ISR_PioSmartCard ) ;
|
||||
PIO_EnableIt( &pinSmartCard ) ;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* Dummy implementation.
|
||||
*/
|
||||
static void ConfigureCardDetection( void )
|
||||
{
|
||||
printf( "-I- Smartcard detection not supported.\n\r" ) ;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Initialization and run
|
||||
*-----------------------------------------------------------------------------*/
|
||||
extern const CCIDDriverConfigurationDescriptors *configDescCCID = &configurationDescriptorCCID;
|
||||
|
||||
void CCID_init( void )
|
||||
{
|
||||
// FIXME: do we want to print ATR?
|
||||
/* Initialize Atr buffer */
|
||||
memset( pAtr, 0, sizeof( pAtr ) ) ;
|
||||
|
||||
/* Configure IT on Smart Card */
|
||||
ConfigureCardDetection() ;
|
||||
|
||||
ISO7816_Init( pinIso7816RstMC ) ;
|
||||
|
||||
CCIDDriver_Initialize();
|
||||
|
||||
/* Read ATR */
|
||||
ISO7816_warm_reset() ;
|
||||
|
||||
ISO7816_Datablock_ATR( pAtr, &ucSize ) ;
|
||||
|
||||
/* Decode ATR and print it */
|
||||
ISO7816_Decode_ATR( pAtr ) ;
|
||||
|
||||
// We have our own USB initialization routine
|
||||
// CCIDDriver_Initialize();
|
||||
|
||||
// FIXME. what if smcard is not inserted?
|
||||
if(PIO_Get(&pinSmartCard) == 0) {
|
||||
printf("SIM card inserted\n\r");
|
||||
CCID_Insertion();
|
||||
}
|
||||
}
|
||||
|
||||
void CCID_run( void )
|
||||
{
|
||||
uint8_t pAtr[MAX_ATR_SIZE] ;
|
||||
uint8_t ucSize ;
|
||||
|
||||
CCID_SmartCardRequest();
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,388 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2008, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
/// \unit
|
||||
///
|
||||
/// !Purpose
|
||||
///
|
||||
/// Definition of methods for using a CCID device driver.
|
||||
///
|
||||
/// !Usage
|
||||
///
|
||||
/// -# CCIDDriver_Initialize
|
||||
/// -# CCID_Read
|
||||
/// -# CCID_Write
|
||||
/// -# CCID_SmartCardRequest
|
||||
/// -# CCID_Insertion
|
||||
/// -# CCID_Removal
|
||||
/// -# RDRtoPCHardwareError
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef CCID_DRIVER_H
|
||||
#define CCID_DRIVER_H
|
||||
|
||||
// FIXME: This is dirty! Typedef copied from USBD.h
|
||||
typedef void (*TransferCallback)(void *pArg,
|
||||
uint8_t status,
|
||||
uint32_t transferred,
|
||||
uint32_t remaining);
|
||||
|
||||
|
||||
|
||||
/// For reference, the absolute maximum block size
|
||||
/// for a TPDU T=0 block is 260 bytes (5 bytes command; 255 bytes data), or
|
||||
/// for a TPDU T=1 block is 259 bytes, or
|
||||
/// for a short APDU T=1 block is 261 bytes, or
|
||||
/// for an extended APDU T=1 block is 65544 bytes.
|
||||
#define ABDATA_SIZE 260
|
||||
|
||||
/// define protocol T=0
|
||||
#define PROTOCOL_TO 0
|
||||
/// define protocol T=1
|
||||
#define PROTOCOL_T1 1
|
||||
|
||||
/// define for dwFeatures see Table 5.1-1 Smart Card Device Class Descriptors
|
||||
/// No special characteristics
|
||||
#define CCID_FEATURES_NADA 0x00000000
|
||||
/// Automatic parameter configuration based on ATR data
|
||||
#define CCID_FEATURES_AUTO_PCONF 0x00000002
|
||||
/// Automatic activation of ICC on inserting
|
||||
#define CCID_FEATURES_AUTO_ACTIV 0x00000004
|
||||
/// Automatic ICC voltage selection
|
||||
#define CCID_FEATURES_AUTO_VOLT 0x00000008
|
||||
/// Automatic ICC clock frequency change according to active parameters provided
|
||||
/// by the Host or self determined
|
||||
#define CCID_FEATURES_AUTO_CLOCK 0x00000010
|
||||
/// Automatic baud rate change according to active parameters provided by the
|
||||
/// Host or self determined
|
||||
#define CCID_FEATURES_AUTO_BAUD 0x00000020
|
||||
/// Automatic parameters negotiation made by the CCID (use of warm or cold
|
||||
/// resets or PPS according to a manufacturer proprietary algorithm to select
|
||||
/// the communication parameters with the ICC)
|
||||
#define CCID_FEATURES_AUTO_PNEGO 0x00000040
|
||||
/// Automatic PPS made by the CCID according to the active parameters
|
||||
#define CCID_FEATURES_AUTO_PPS 0x00000080
|
||||
/// CCID can set ICC in clock stop mode
|
||||
#define CCID_FEATURES_ICCSTOP 0x00000100
|
||||
/// NAD value other than 00 accepted (T=1 protocol in use)
|
||||
#define CCID_FEATURES_NAD 0x00000200
|
||||
/// Automatic IFSD exchange as first exchange (T=1 protocol in use)
|
||||
#define CCID_FEATURES_AUTO_IFSD 0x00000400
|
||||
/// TPDU level exchanges with CCID
|
||||
#define CCID_FEATURES_EXC_TPDU 0x00010000
|
||||
/// Short APDU level exchange with CCID
|
||||
#define CCID_FEATURES_EXC_SAPDU 0x00020000
|
||||
/// Short and Extended APDU level exchange with CCID
|
||||
#define CCID_FEATURES_EXC_APDU 0x00040000
|
||||
/// USB Wake up signaling supported on card insertion and removal
|
||||
#define CCID_FEATURES_WAKEUP 0x00100000
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Types
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
/// Bulk CCID Message header structure
|
||||
typedef struct
|
||||
{
|
||||
unsigned char bMessageType;
|
||||
/// Message-specific data length
|
||||
unsigned long wLength;
|
||||
/// Identifies the slot number for this command
|
||||
unsigned char bSlot;
|
||||
/// Sequence number for command.
|
||||
unsigned char bSeq;
|
||||
/// Slot status register
|
||||
unsigned char bStatus;
|
||||
/// Slot error
|
||||
unsigned char bError;
|
||||
/// specific register
|
||||
unsigned char bSpecific;
|
||||
/// Data block sent to the CCID.
|
||||
unsigned char abData[ABDATA_SIZE];
|
||||
unsigned char bSizeToSend;
|
||||
} __attribute__ ((packed)) S_ccid_bulk_in_header;
|
||||
|
||||
/// 6.1 Bulk Transfers
|
||||
typedef struct
|
||||
{
|
||||
unsigned char bMessageType;
|
||||
/// Message-specific data length
|
||||
unsigned long wLength;
|
||||
/// Identifies the slot number for this command
|
||||
unsigned char bSlot;
|
||||
/// Sequence number for command.
|
||||
unsigned char bSeq;
|
||||
/// specific register
|
||||
unsigned char bSpecific_0;
|
||||
unsigned char bSpecific_1;
|
||||
unsigned char bSpecific_2;
|
||||
/// Application Protocol Data Unit
|
||||
unsigned char APDU[ABDATA_SIZE];
|
||||
} __attribute__ ((packed)) S_ccid_bulk_out_header;
|
||||
|
||||
|
||||
/// 6.1.11.2 PIN Verification Data Structure
|
||||
typedef struct
|
||||
{
|
||||
/// Number of seconds.
|
||||
unsigned char bTimerOut;
|
||||
/// Several parameters for the PIN format options
|
||||
unsigned char bmFormatString;
|
||||
/// Define the length of the PIN to present in the APDU command
|
||||
unsigned char bmPINBlockString;
|
||||
/// Allows the length PIN insertion in the APDU command
|
||||
unsigned char bmPINLengthFormat;
|
||||
/// Minimum PIN size in digit and Maximum PIN size in digit
|
||||
unsigned char wPINMaxExtraDigit;
|
||||
/// The value is a bit wise OR operation.
|
||||
unsigned char bEntryValidationCondition;
|
||||
/// Number of messages to display for the PIN modify command
|
||||
unsigned char bNumberMessage;
|
||||
/// Language used to display the messages.
|
||||
unsigned char wLangId;
|
||||
/// Message index in the Reader message table
|
||||
unsigned char bMsgIndex;
|
||||
/// T=1 I-block prologue field to use
|
||||
unsigned char bTeoPrologue[3];
|
||||
/// APDU to send to the ICC
|
||||
unsigned char abPINApdu[255];
|
||||
}__attribute__ ((packed)) S_ccid_PIN_Verification;
|
||||
|
||||
|
||||
/// 6.1.11.7 PIN Modification Data Structure
|
||||
typedef struct
|
||||
{
|
||||
/// Number of seconds. If 00h then CCID default value is used.
|
||||
unsigned char bTimeOut;
|
||||
/// Several parameters for the PIN format options (defined in § 6.1.11.4)
|
||||
unsigned char bmFormatString4;
|
||||
/// Define the length of the PIN to present in the APDU command
|
||||
unsigned char bmPINBlockString;
|
||||
/// Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6)
|
||||
unsigned char bmPinLengthFormat;
|
||||
/// Insertion position offset in byte for the current PIN
|
||||
unsigned char bInsertionOffsetOld;
|
||||
/// Insertion position offset in byte for the new PIN
|
||||
unsigned char bInsertionOffsetNew;
|
||||
/// XXYYh
|
||||
/// XX: Minimum PIN size in digit
|
||||
/// YY: Maximum PIN size in digit
|
||||
unsigned char wPINMaxExtraDigit;
|
||||
/// 00h,01h,02h,03h
|
||||
/// Indicates if a confirmation is requested before acceptance of a new PIN (meaning that the user has to enter this new PIN twice before it is accepted)
|
||||
/// Indicates if the current PIN must be entered and set in the same APDU field of not.
|
||||
unsigned char bConfirmPIN;
|
||||
/// The value is a bit wise OR operation.
|
||||
/// 01h Max size reached
|
||||
/// 02h Validation key pressed
|
||||
/// 04h Timeout occurred
|
||||
unsigned char bEntryValidationCondition;
|
||||
/// 00h,01h,02h,03h,or FFh
|
||||
/// Number of messages to display for the PIN modify command.
|
||||
unsigned char bNumberMessage;
|
||||
/// Language used to display the messages. The 16 bit
|
||||
unsigned char wLangId;
|
||||
/// Message index in the Reader message table (should be 00h or 01h).
|
||||
unsigned char bMsgIndex1;
|
||||
/// Message index in the Reader message table (should be 01h or 02h).
|
||||
unsigned char bMsgIndex2;
|
||||
/// Message index in the Reader message table (should be 02h).
|
||||
unsigned char bMsgIndex3;
|
||||
/// T=1 I-block prologue field to use. Significant only if protocol in use is T=1.
|
||||
unsigned char bTeoPrologue[3];
|
||||
/// Byte array APDU to send to the ICC
|
||||
unsigned char abPINApdu[255];
|
||||
}__attribute__ ((packed)) S_ccid_PIN_Modification;
|
||||
|
||||
/// Protocol Data Structure for Protocol T=0 (bProtocolNum=0, dwLength=00000005h)
|
||||
typedef struct
|
||||
{
|
||||
/// B7-4 – FI – Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// clock rate conversion factor
|
||||
/// B3-0 – DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// baud rate conversion factor
|
||||
unsigned char bmFindexDindex;
|
||||
/// For T=0 ,B0 – 0b, B7-2 – 000000b
|
||||
/// B1 – Convention used (b1=0 for direct, b1=1 for inverse)
|
||||
unsigned char bmTCCKST0; // 0 to 2
|
||||
/// Extra Guardtime between two characters. Add 0 to 254 etu to the normal
|
||||
/// guardtime of 12etu. FFh is the same as 00h.
|
||||
unsigned char bGuardTimeT0; // 0 to FF
|
||||
/// WI for T=0 used to define WWT
|
||||
unsigned char bWaitingIntegerT0; // 0 to FF
|
||||
/// ICC Clock Stop Support
|
||||
/// 00 = Stopping the Clock is not allowed
|
||||
/// 01 = Stop with Clock signal Low
|
||||
/// 02 = Stop with Clock signal High
|
||||
/// 03 = Stop with Clock either High or Low
|
||||
unsigned char bClockStop; // 0 to 3
|
||||
} __attribute__ ((packed)) S_ccid_protocol_t0;
|
||||
|
||||
|
||||
/// Protocol Data Structure for Protocol T=1 (bProtocolNum=1, dwLength=00000007h)
|
||||
typedef struct
|
||||
{
|
||||
/// B7-4 – FI – Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// clock rate conversion factor
|
||||
/// B3-0 – DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// baud rate conversion factor
|
||||
unsigned char bmFindexDindex;
|
||||
/// For T=1, B7-2 – 000100b
|
||||
/// B0 – Checksum type (b0=0 for LRC, b0=1 for CRC
|
||||
/// B1 – Convention used (b1=0 for direct, b1=1 for inverse)
|
||||
unsigned char bmTCCKST1; // 10h, 11h, 12h, 13h
|
||||
/// Extra Guardtime (0 to 254 etu between two characters).
|
||||
/// If value is FFh, then guardtime is reduced by 1.
|
||||
unsigned char bGuardTimeT1; // 0 to FF
|
||||
/// B7-4 = BWI
|
||||
/// B3-0 = CWI
|
||||
unsigned char bmWaitingIntegersT1; // 0 to 9
|
||||
/// ICC Clock Stop Support
|
||||
/// 00 = Stopping the Clock is not allowed
|
||||
/// 01 = Stop with Clock signal Low
|
||||
/// 02 = Stop with Clock signal High
|
||||
/// 03 = Stop with Clock either High or Low
|
||||
unsigned char bClockStop; // 0 to 3
|
||||
/// Size of negotiated IFSC
|
||||
unsigned char bIFSC; // 0 to FE
|
||||
/// Nad value used by CCID
|
||||
unsigned char bNadValue; // 0 to FF
|
||||
} __attribute__ ((packed)) S_ccid_protocol_t1;
|
||||
|
||||
|
||||
/// Identifies the length of type of subordinate descriptors of a CCID device
|
||||
/// Table 5.1-1 Smart Card Device Class descriptors
|
||||
typedef struct
|
||||
{
|
||||
/// Size of this descriptor, in bytes.
|
||||
unsigned char bLength;
|
||||
/// Functional Descriptor type
|
||||
unsigned char bDescriptorType;
|
||||
/// Integrated Circuit(s) Cards Interface Devices (CCID) Specification
|
||||
/// Release Number
|
||||
unsigned short bcdCCID;
|
||||
/// Index of the highest available slot. An USB-ICC is regarded as a single
|
||||
/// slot CCID.
|
||||
unsigned char bMaxSlotIndex;
|
||||
/// This value indicates what voltages the CCID can supply to its slots.
|
||||
/// It is a bitwise OR operation performed on the following values:
|
||||
/// - 01h 5.0V
|
||||
/// - 02h 3.0V
|
||||
/// - 04h 1.8V
|
||||
/// Other bits are RFU.
|
||||
unsigned char bVoltageSupport;
|
||||
/// RRRR –Upper Word- is RFU = 0000h
|
||||
/// PPPP –Lower Word- Encodes the supported protocol types. A ‘1’ in a given
|
||||
/// bit position indicates support for the associated ISO protocol.
|
||||
/// 0001h = Protocol T=0
|
||||
/// 0002h = Protocol T=1
|
||||
/// All other bits are reserved and must be set to zero. The field is
|
||||
/// intended to correspond to the PCSC specification definitions.
|
||||
unsigned long dwProtocols;
|
||||
/// Default ICC clock frequency in KHz. This is an integer value.
|
||||
unsigned long dwDefaultClock;
|
||||
/// Maximum supported ICC clock frequency in KHz. This is an integer value.
|
||||
unsigned long dwMaximumClock;
|
||||
/// The number of clock frequencies that are supported by the CCID. If the
|
||||
/// value is 00h, the supported clock frequencies are assumed to be the
|
||||
/// default clock frequency defined by dwDefaultClock and the maximum clock
|
||||
/// frequency defined by dwMaximumClock.
|
||||
unsigned char bNumClockSupported;
|
||||
/// Default ICC I/O data rate in bps. This is an integer value
|
||||
unsigned long dwDataRate;
|
||||
/// Maximum supported ICC I/O data rate in bps
|
||||
unsigned long dwMaxDataRate;
|
||||
/// The number of data rates that are supported by the CCID.
|
||||
unsigned char bNumDataRatesSupported;
|
||||
/// Indicates the maximum IFSD supported by CCID for protocol T=1.
|
||||
unsigned long dwMaxIFSD;
|
||||
/// - RRRR-Upper Word- is RFU = 0000h
|
||||
/// - PPPP-Lower Word- encodes the supported protocol types. A ‘1’ in a given
|
||||
/// bit position indicates support for the associated protocol.
|
||||
/// 0001h indicates support for the 2-wire protocol 1
|
||||
/// 0002h indicates support for the 3-wire protocol 1
|
||||
/// 0004h indicates support for the I2C protocol 1
|
||||
/// All other values are outside of this specification, and must be handled
|
||||
/// by vendor-supplied drivers.
|
||||
unsigned long dwSynchProtocols;
|
||||
/// The value is a bitwise OR operation performed on the following values:
|
||||
/// - 00000000h No special characteristics
|
||||
/// - 00000001h Card accept mechanism 2
|
||||
/// - 00000002h Card ejection mechanism 2
|
||||
/// - 00000004h Card capture mechanism 2
|
||||
/// - 00000008h Card lock/unlock mechanism
|
||||
unsigned long dwMechanical;
|
||||
/// This value indicates what intelligent features the CCID has.
|
||||
unsigned long dwFeatures;
|
||||
/// For extended APDU level the value shall be between 261 + 10 (header) and
|
||||
/// 65544 +10, otherwise the minimum value is the wMaxPacketSize of the
|
||||
/// Bulk-OUT endpoint.
|
||||
unsigned long dwMaxCCIDMessageLength;
|
||||
/// Significant only for CCID that offers an APDU level for exchanges.
|
||||
unsigned char bClassGetResponse;
|
||||
/// Significant only for CCID that offers an extended APDU level for exchanges.
|
||||
unsigned char bClassEnvelope;
|
||||
/// Number of lines and characters for the LCD display used to send messages for PIN entry.
|
||||
unsigned short wLcdLayout;
|
||||
/// This value indicates what PIN support features the CCID has.
|
||||
unsigned char bPINSupport;
|
||||
/// Maximum number of slots which can be simultaneously busy.
|
||||
unsigned char bMaxCCIDBusySlots;
|
||||
|
||||
} __attribute__ ((packed)) CCIDDescriptor;
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Exported functions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char RDRtoPCHardwareError( unsigned char bSlot,
|
||||
unsigned char bSeq,
|
||||
unsigned char bHardwareErrorCode );
|
||||
|
||||
/*
|
||||
#if !defined(NOAUTOCALLBACK)
|
||||
extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request);
|
||||
#endif
|
||||
*/
|
||||
extern void CCID_SmartCardRequest( void );
|
||||
extern void CCIDDriver_Initialize( void );
|
||||
extern unsigned char CCID_Read(void *pBuffer,
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void *pArgument);
|
||||
extern unsigned char CCID_Write(void *pBuffer,
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void *pArgument);
|
||||
extern unsigned char CCID_Insertion( void );
|
||||
extern unsigned char CCID_Removal( void );
|
||||
|
||||
#endif //#ifndef CCID_DRIVER_H
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2008, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Title: cciddriverdescriptors.h
|
||||
//
|
||||
// About: Purpose
|
||||
// Definitions of the descriptors required by the ccid device driver.
|
||||
// DWG_Smart-Card_CCID_Rev110.pdf
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#ifndef CCID_DRIVER_DESCRIPTORS_H
|
||||
#define CCID_DRIVER_DESCRIPTORS_H
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Constants: Endpoints
|
||||
// CCID_EPT_DATA_OUT endpoint data out bulk 1
|
||||
// CCID_EPT_DATA_IN endpoint data in bulk 2
|
||||
// CCID_EPT_NOTIFICATION endpoint data interupt 3
|
||||
//------------------------------------------------------------------------------
|
||||
#define CCID_EPT_DATA_OUT 1
|
||||
#define CCID_EPT_DATA_IN 2
|
||||
#define CCID_EPT_NOTIFICATION 3
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// USB-ICC protocol
|
||||
//------------------------------------------------------------------------------
|
||||
// CCID specification version 1.10
|
||||
#define CCID1_10 0x0110
|
||||
|
||||
#define SMART_CARD_DEVICE_CLASS 0x0B
|
||||
// Smart Card Device Class Descriptor Type
|
||||
#define CCID_DECRIPTOR_TYPE 0x21
|
||||
|
||||
// Table 5.3-1 Summary of CCID Class Specific Request
|
||||
#define CCIDGenericRequest_ABORT 0x01
|
||||
#define CCIDGenericRequest_GET_CLOCK_FREQUENCIES 0x02
|
||||
#define CCIDGenericRequest_GET_DATA_RATES 0x03
|
||||
|
||||
// 6.1 Command Pipe, Bulk-OUT Messages
|
||||
#define PC_TO_RDR_ICCPOWERON 0x62
|
||||
#define PC_TO_RDR_ICCPOWEROFF 0x63
|
||||
#define PC_TO_RDR_GETSLOTSTATUS 0x65
|
||||
#define PC_TO_RDR_XFRBLOCK 0x6F
|
||||
#define PC_TO_RDR_GETPARAMETERS 0x6C
|
||||
#define PC_TO_RDR_RESETPARAMETERS 0x6D
|
||||
#define PC_TO_RDR_SETPARAMETERS 0x61
|
||||
#define PC_TO_RDR_ESCAPE 0x6B
|
||||
#define PC_TO_RDR_ICCCLOCK 0x6E
|
||||
#define PC_TO_RDR_T0APDU 0x6A
|
||||
#define PC_TO_RDR_SECURE 0x69
|
||||
#define PC_TO_RDR_MECHANICAL 0x71
|
||||
#define PC_TO_RDR_ABORT 0x72
|
||||
#define PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY 0x73
|
||||
|
||||
// 6.2 Response Pipe, Bulk-IN Messages
|
||||
#define RDR_TO_PC_DATABLOCK 0x80
|
||||
#define RDR_TO_PC_SLOTSTATUS 0x81
|
||||
#define RDR_TO_PC_PARAMETERS 0x82
|
||||
#define RDR_TO_PC_ESCAPE 0x83
|
||||
#define RDR_TO_PC_DATARATEANDCLOCKFREQUENCY 0x84
|
||||
|
||||
// 6.3 Interrupt-IN Messages
|
||||
#define RDR_TO_PC_NOTIFYSLOTCHANGE 0x50
|
||||
#define RDR_TO_PC_HARDWAREERROR 0x51
|
||||
|
||||
// Table 6.2-2 Slot error register when bmCommandStatus = 1
|
||||
#define CMD_ABORTED 0xFF
|
||||
#define ICC_MUTE 0xFE
|
||||
#define XFR_PARITY_ERROR 0xFD
|
||||
#define XFR_OVERRUN 0xFC
|
||||
#define HW_ERROR 0xFB
|
||||
#define BAD_ATR_TS 0xF8
|
||||
#define BAD_ATR_TCK 0xF7
|
||||
#define ICC_PROTOCOL_NOT_SUPPORTED 0xF6
|
||||
#define ICC_CLASS_NOT_SUPPORTED 0xF5
|
||||
#define PROCEDURE_BYTE_CONFLICT 0xF4
|
||||
#define DEACTIVATED_PROTOCOL 0xF3
|
||||
#define BUSY_WITH_AUTO_SEQUENCE 0xF2
|
||||
#define PIN_TIMEOUT 0xF0
|
||||
#define PIN_CANCELLED 0xEF
|
||||
#define CMD_SLOT_BUSY 0xE0
|
||||
// User defined 0xC0 to 0x81
|
||||
// Reserved for futur use 0x80
|
||||
// not supported incorrect message parameter 0x7F to 0x01
|
||||
// Command not supported 0x00
|
||||
|
||||
// CCID rev 1.1, p.27
|
||||
#define VOLTS_AUTO 0x00
|
||||
#define VOLTS_5_0 0x01
|
||||
#define VOLTS_3_0 0x02
|
||||
#define VOLTS_1_8 0x03
|
||||
|
||||
// 6.3.1 RDR_to_PC_NotifySlotChange
|
||||
#define ICC_NOT_PRESENT 0x00
|
||||
#define ICC_PRESENT 0x01
|
||||
#define ICC_CHANGE 0x02
|
||||
#define ICC_INSERTED_EVENT 0x01
|
||||
//FIXME: #define ICC_INSERTED_EVENT ICC_PRESENT+ICC_CHANGE
|
||||
|
||||
// ICCD: Table 6.1-8 Bitmap for bStatus field
|
||||
#define ICC_BS_PRESENT_ACTIVATED 0x00 // USB-ICC is present and activated
|
||||
#define ICC_BS_PRESENT_NOTACTIVATED 0x01 // USB-ICC is present but not activated
|
||||
#define ICC_BS_NOTPRESENT 0x02 // USB-ICC is virtually not present
|
||||
#define ICC_BS_RFU 0x03 // RFU
|
||||
#define ICC_CS_NO_ERROR (0x00<<6) // Processed without error
|
||||
#define ICC_CS_FAILED (0x01<<6) // Failed, error condition given by bError
|
||||
#define ICC_CS_TIME_EXT (0x02<<6) // Time extension is requested
|
||||
#define ICC_CS_RFU (0x03<<6) // RFU
|
||||
|
||||
/*
|
||||
#define NO_ERROR 0x00
|
||||
#define NO_EXTRA_BYTES 0x00
|
||||
#define CCID_FLAG_INITIAL_VALUE 0x05
|
||||
#define CCID_EVENT_SIZE 0x02
|
||||
#define STATUS_MASK 0x41
|
||||
*/
|
||||
//------------------------------------------------------------------------------
|
||||
// Structures
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#endif //#ifndef CCID_DRIVER_DESCRIPTORS_H
|
||||
|
|
@ -15,15 +15,38 @@ typedef struct ring_buffer
|
|||
|
||||
|
||||
enum confNum {
|
||||
CFG_NUM_SNIFF = 1, CFG_NUM_PHONE, CFG_NUM_MITM, NUM_CONF
|
||||
CFG_NUM_SNIFF = 1, CFG_NUM_CCID, CFG_NUM_PHONE, CFG_NUM_MITM, NUM_CONF
|
||||
};
|
||||
|
||||
/// CCIDDriverConfiguration Descriptors
|
||||
/// List of descriptors that make up the configuration descriptors of a
|
||||
/// device using the CCID driver.
|
||||
typedef struct {
|
||||
|
||||
/// Configuration descriptor
|
||||
USBConfigurationDescriptor configuration;
|
||||
/// Interface descriptor
|
||||
USBInterfaceDescriptor interface;
|
||||
/// CCID descriptor
|
||||
CCIDDescriptor ccid;
|
||||
/// Bulk OUT endpoint descriptor
|
||||
USBEndpointDescriptor bulkOut;
|
||||
/// Bulk IN endpoint descriptor
|
||||
USBEndpointDescriptor bulkIn;
|
||||
/// Interrupt OUT endpoint descriptor
|
||||
USBEndpointDescriptor interruptIn;
|
||||
} __attribute__ ((packed)) CCIDDriverConfigurationDescriptors;
|
||||
|
||||
/* Helper functions */
|
||||
USBConfigurationDescriptor *getConfigDesc(uint8_t idx);
|
||||
|
||||
// FIXME: static function definitions
|
||||
extern uint32_t _ISO7816_GetChar( uint8_t *pCharToReceive );
|
||||
extern uint32_t _ISO7816_SendChar( uint8_t CharToSend );
|
||||
|
||||
/* Init functions */
|
||||
extern void Phone_Master_Init( void );
|
||||
extern void CCID_init( void );
|
||||
extern void Sniffer_Init( void );
|
||||
extern void MITM_init( void );
|
||||
|
||||
|
@ -32,7 +55,7 @@ extern void _ISO7816_Init( void );
|
|||
|
||||
/* Run functions */
|
||||
extern void Sniffer_run( void );
|
||||
// extern void CCID_run( void );
|
||||
extern void CCID_run( void );
|
||||
extern void Phone_run( void );
|
||||
extern void MITM_run( void );
|
||||
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
|
||||
#include "board.h"
|
||||
|
||||
#include <cciddriverdescriptors.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* USB String descriptors
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
@ -227,18 +229,112 @@ const SIMTraceDriverConfigurationDescriptorSniffer configurationDescriptorSniffe
|
|||
}
|
||||
};
|
||||
|
||||
/* FIXME: CCID descriptor: External C file */
|
||||
/*
|
||||
/// CCIDDriverConfiguration Descriptors
|
||||
/// List of descriptors that make up the configuration descriptors of a
|
||||
/// device using the CCID driver.
|
||||
typedef struct {
|
||||
|
||||
/// Configuration descriptor
|
||||
USBConfigurationDescriptor configuration;
|
||||
/// Interface descriptor
|
||||
USBInterfaceDescriptor interface;
|
||||
/// CCID descriptor
|
||||
CCIDDescriptor ccid;
|
||||
/// Bulk OUT endpoint descriptor
|
||||
USBEndpointDescriptor bulkOut;
|
||||
/// Bulk IN endpoint descriptor
|
||||
USBEndpointDescriptor bulkIn;
|
||||
/// Interrupt OUT endpoint descriptor
|
||||
USBEndpointDescriptor interruptIn;
|
||||
} __attribute__ ((packed)) CCIDDriverConfigurationDescriptorsCCID;
|
||||
} __attribute__ ((packed)) CCIDDriverConfigurationDescriptors;
|
||||
*/
|
||||
|
||||
const CCIDDriverConfigurationDescriptors configurationDescriptorCCID = {
|
||||
|
||||
// Standard USB configuration descriptor
|
||||
{
|
||||
sizeof(USBConfigurationDescriptor),
|
||||
USBGenericDescriptor_CONFIGURATION,
|
||||
sizeof(CCIDDriverConfigurationDescriptors),
|
||||
1, // One interface in this configuration
|
||||
CFG_NUM_CCID, // This is configuration #1
|
||||
CCID_CONF_STR, // associated string descriptor
|
||||
BOARD_USB_BMATTRIBUTES,
|
||||
USBConfigurationDescriptor_POWER(100)
|
||||
},
|
||||
// CCID interface descriptor
|
||||
// Table 4.3-1 Interface Descriptor
|
||||
// Interface descriptor
|
||||
{
|
||||
sizeof(USBInterfaceDescriptor),
|
||||
USBGenericDescriptor_INTERFACE,
|
||||
0, // Interface 0
|
||||
0, // No alternate settings
|
||||
3, // uses bulk-IN, bulk-OUT and interrupt IN
|
||||
SMART_CARD_DEVICE_CLASS,
|
||||
0, // Subclass code
|
||||
0, // bulk transfers optional interrupt-IN
|
||||
CCID_CONF_STR // associated string descriptor
|
||||
},
|
||||
{
|
||||
sizeof(CCIDDescriptor), // bLength: Size of this descriptor in bytes
|
||||
CCID_DECRIPTOR_TYPE, // bDescriptorType:Functional descriptor type
|
||||
CCID1_10, // bcdCCID: CCID version
|
||||
0, // bMaxSlotIndex: Value 0 indicates that one slot is supported
|
||||
VOLTS_5_0, // bVoltageSupport
|
||||
(1 << PROTOCOL_TO), // dwProtocols
|
||||
3580, // dwDefaultClock
|
||||
3580, // dwMaxClock
|
||||
0, // bNumClockSupported
|
||||
9600, // dwDataRate : 9600 bauds
|
||||
9600, // dwMaxDataRate : 9600 bauds
|
||||
0, // bNumDataRatesSupported
|
||||
0xfe, // dwMaxIFSD
|
||||
0, // dwSynchProtocols
|
||||
0, // dwMechanical
|
||||
//0x00010042, // dwFeatures: Short APDU level exchanges
|
||||
CCID_FEATURES_AUTO_CLOCK | CCID_FEATURES_AUTO_BAUD |
|
||||
CCID_FEATURES_AUTO_PCONF | CCID_FEATURES_AUTO_PNEGO | CCID_FEATURES_EXC_TPDU,
|
||||
0x0000010F, // dwMaxCCIDMessageLength: For extended APDU level the value shall be between 261 + 10
|
||||
0xFF, // bClassGetResponse: Echoes the class of the APDU
|
||||
0xFF, // bClassEnvelope: Echoes the class of the APDU
|
||||
0, // wLcdLayout: no LCD
|
||||
0, // bPINSupport: No PIN
|
||||
1 // bMaxCCIDBusySlot
|
||||
},
|
||||
// Bulk-OUT endpoint descriptor
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_OUT, CCID_EPT_DATA_OUT ),
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_DATA_OUT),
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0x00 // Does not apply to Bulk endpoints
|
||||
},
|
||||
// Bulk-IN endpoint descriptor
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, CCID_EPT_DATA_IN ),
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_DATA_IN),
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0x00 // Does not apply to Bulk endpoints
|
||||
},
|
||||
// Notification endpoint descriptor
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, CCID_EPT_NOTIFICATION ),
|
||||
USBEndpointDescriptor_INTERRUPT,
|
||||
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_NOTIFICATION),
|
||||
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
|
||||
0x10
|
||||
},
|
||||
};
|
||||
|
||||
const CCIDDriverConfigurationDescriptorsCCID configurationDescriptorCCID = { 0 };
|
||||
|
||||
/* SIM card emulator */
|
||||
typedef struct _SIMTraceDriverConfigurationDescriptorPhone {
|
||||
|
@ -450,16 +546,19 @@ const USBDeviceDescriptor deviceDescriptor = {
|
|||
0, /* No string descriptor for manufacturer */
|
||||
PRODUCT_STRING, /* Index of product string descriptor */
|
||||
0, /* No string descriptor for serial number */
|
||||
3 /* Device has 4 possible configurations */
|
||||
4 /* Device has 4 possible configurations */
|
||||
};
|
||||
|
||||
const USBConfigurationDescriptor *configurationDescriptorsArr[] = {
|
||||
&configurationDescriptorSniffer,
|
||||
//&configurationDescriptorCCID,
|
||||
&configurationDescriptorCCID,
|
||||
&configurationDescriptorPhone,
|
||||
&configurationDescriptorMITM,
|
||||
};
|
||||
|
||||
USBConfigurationDescriptor *getConfigDesc(uint8_t idx) {
|
||||
return configurationDescriptorsArr[idx];
|
||||
}
|
||||
|
||||
/* AT91SAM3S does only support full speed, but not high speed USB */
|
||||
const USBDDriverDescriptors driverDescriptors = {
|
||||
|
|
Loading…
Reference in New Issue