mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 05:38:33 +03:00
The select command mostly works when the blue sysmocom SIM card is inserted,
but with the white SuperSIM we always get timeouts and invalid answers.
Furthermore the white card takes much longer to answer the requests than the
blue one.
So probably there is a timing issue.
Currently this is the simtrace output for select and reading IMSI, etc:
(pcscd must be running as welil, otherwise we get:
$ ./simtrace.py -S
Exception: Failed to establish context : Service not available.)
$ ./simtrace.py -S
Context established!
PCSC Readers: ['ATMEL AT91SO CCID Smart Card Reader [SIMtraceCCID] 00 00']
Using reader: ATMEL AT91SO CCID Smart Card Reader [SIMtraceCCID] 00 00
Connected with active protocol 1
Select: 0x6E 0x00
Command: 0x6D 0x00
Disconnected
Released context.
==> Expected answer for Select: 0x6D 0x00
(based on trying to execute this command with gemalto usb smart card reader)
The command works only every now and then
$ ./simtrace.py -b
pcsc: wait_for_card
Reading ...
Traceback (most recent call last):
File "./simtrace.py", line 105, in <module>
main()
File "./simtrace.py", line 66, in main
ccid.pySim_read()
File "/home/chrysh/ba_thesis/sysmocom_repo/usb_application/ccid.py", line 22, in pySim_read
(res, sw) = scc.read_binary(['3f00', '2fe2'])
File "/home/chrysh/code/src/pysim/pySim/commands.py", line 42, in read_binary
r = self.select_file(ef)
File "/home/chrysh/code/src/pysim/pySim/commands.py", line 35, in select_file
data, sw = self._tp.send_apdu_checksw("a0a4000002" + i)
File "/home/chrysh/code/src/pysim/pySim/transport/__init__.py", line 87, in send_apdu_checksw
raise RuntimeError("SW match failed ! Expected %s and got %s." % (sw.lower(), rv[1]))
RuntimeError: SW match failed ! Expected 9000 and got 9404.
==> Error code 9404 does not exist, which suggests that we actually have a timing issue when
communicating with the smart cart
212 lines
6.6 KiB
C
212 lines
6.6 KiB
C
/* ----------------------------------------------------------------------------
|
|
* 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};
|
|
/** Bus switch pins */
|
|
static const Pin pinsBus[] = {PINS_BUS_DEFAULT};
|
|
/* SIMcard power pin */
|
|
static const Pin pinsPower[] = {PWR_PINS};
|
|
/** 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
|
|
*-----------------------------------------------------------------------------*/
|
|
static const CCIDDriverConfigurationDescriptors *configDescCCID;
|
|
extern CCIDDriverConfigurationDescriptors configurationDescriptorCCID;
|
|
|
|
void CCID_init( void )
|
|
{
|
|
uint8_t pAtr[MAX_ATR_SIZE];
|
|
uint8_t ucSize ;
|
|
|
|
configDescCCID = &configurationDescriptorCCID;
|
|
|
|
// FIXME: do we want to print ATR?
|
|
/* Initialize Atr buffer */
|
|
memset( pAtr, 0, sizeof( pAtr ) ) ;
|
|
|
|
/* Configure IT on Smart Card */
|
|
ConfigureCardDetection() ;
|
|
|
|
// Configure ISO7816 driver
|
|
PIO_Configure(pinsISO7816, PIO_LISTSIZE(pinsISO7816));
|
|
PIO_Configure(pinsBus, PIO_LISTSIZE(pinsBus));
|
|
PIO_Configure(pinsPower, PIO_LISTSIZE(pinsPower));
|
|
|
|
/* power up the card */
|
|
// PIO_Set(&pinsPower[0]);
|
|
|
|
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();
|
|
}
|
|
}
|
|
|
|
/* FIXME: Remove this testcode */
|
|
void send_select_file() {
|
|
#define MAX_ANSWER_SIZE 10
|
|
static const uint8_t testCommand4[] = {0x00, 0xa4, 0x00, 0x00, 0x02, 0x3f, 0x00};
|
|
uint8_t pMessage[MAX_ANSWER_SIZE];
|
|
uint8_t ucSize ;
|
|
int i;
|
|
|
|
printf("Write msg\n\r");
|
|
ucSize = ISO7816_XfrBlockTPDU_T0( testCommand4, pMessage, sizeof( testCommand4 ) ) ;
|
|
// Output smartcard answer
|
|
if ( ucSize > 0 )
|
|
{
|
|
printf( "\n\rAnswer: " ) ;
|
|
for ( i=0 ; i < ucSize ; i++ )
|
|
{
|
|
printf( "0x%02X ", pMessage[i] ) ;
|
|
}
|
|
printf( "\n\r" ) ;
|
|
}
|
|
}
|
|
|
|
void CCID_run( void )
|
|
{
|
|
|
|
//if (USBD_Read(INT, pBuffer, dLength, fCallback, pArgument);
|
|
|
|
CCID_SmartCardRequest();
|
|
}
|