📄 paypass_tcl.lst
字号:
}
g_bPayPassTimeoutValue = p_pStructReader->s_bRTimeoutUsed;
/*------------------------------------------------------------------------------------------------*/
#ifdef TTAL1
// Option for Host mode
if (g_sLog.enable)
{
// CONCATENATION BUFFER
sprintf(g_sLog.buffer,"C-APDU: ");
for (i=0;i<l_iTCLFrameInLength;i++)
{
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"%02x",l_abTCLFrame[i]);
}
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"\n");
v_fnSendToHostEcho(g_sLog.buffer);
}
#endif
/*------------------------------------------------------------------------------------------------*/
/*------------------------ SEND -----AND ----- RECEIVE--------------------------------------------*/
//TRANSMIT A FRAME AND RECEIVE A FRAME
if (l_iTCLFrameOutLength != -1)
{
v_fnSendBuffer(_SENDCRC,l_iTCLFrameInLength,0,&l_abTCLFrame[0],p_pStructReader);
l_wStatus = b_fnReceiveBuffer(_CHECKCRC,&l_abTCLFrame[0],p_pStructReader,&l_iTCLFrameOutLength,&g_bDat
-aBitsReceived,&g_bPicoReadStatus,&l_bRFReceiveEOF,&g_bBitsToReceive);
}
else
{
//SET LENGTH TO MAXIMUM PCD SIZE BECAUSE PICC WILL NEVER SEND MORE
ARM COMPILER V2.40e, Paypass_TCL 12/12/07 14:35:11 PAGE 16
l_iTCLFrameOutLength = g_TCLCard.f_iPCDMaximumInputFrameSize; // FP ERROR l_iTCLFrameOutLength is n
-ot use as a limit in b_fnReceiveBuffer call
v_fnSendBuffer(_SENDCRC,l_iTCLFrameInLength,0,&l_abTCLFrame[0],p_pStructReader);
l_wStatus = b_fnReceiveBuffer(_CHECKCRC,&l_abTCLFrame[0],p_pStructReader,&l_iTCLFrameOutLength,&g_bDat
-aBitsReceived,&g_bPicoReadStatus,&l_bRFReceiveEOF,&g_bBitsToReceive);
}
/*------------------------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------*/
/*------------------ERROR HANDLING ---------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------*/
/* Debug FP 20/02/07 FSD CHECK*/
// Si longueur de la trame recu > (PCD FSD-CRC) et si quelque chose a bien ete recu
if ( ((l_iTCLFrameOutLength > (g_TCLCard.f_iPCDMaximumInputFrameSize-2)) && (l_wStatus != ERR_NOCARD) )
-|| (l_wStatus == ERR_ISOB) ) //max = 256 - 2(CRC)=254
{
return PROTOCOL_ERROR;
}
// CHECK IF DATA RECEIVED
if (l_wStatus == ERR_NO_ERROR)
{
// IF FRAME SIZE > PCD FSD
if (l_iTCLFrameOutLength > (g_TCLCard.f_iPCDMaximumInputFrameSize-2))
{
return PROTOCOL_ERROR;
}
// Test TB 411.7
// IF (SENDING A COMMAND OR SENDING A CHAINING FRAME )
// AND PREVIOUS ONE SENT IS A CHAINING FRAME
// AND ( FRAME RECEIVED IS A S-BLOCK OR A I-CHAINING BLOCK )
if ( ( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining))
&& (l_ePCBTypeInitial == CST_pcbtIWithChaining )
&& (( l_abTCLFrame[0] == PCB_S ) || ( (l_abTCLFrame[0] & 0xF0) == PCB_I_WITH_CHAINING ) ) )
{
return PROTOCOL_ERROR;
}
//Test TA 404.6
// IF (SENDING A COMMAND OR SENDING A CHAINING FRAME )
// AND PREVIOUS ONE SENT IS A NOT CHAINING FRAME
// AND FRAME RECEIVED IS A S-BLOCK
if (( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining) )
&& ( l_ePCBTypeInitial == CST_pcbtINoChaining ) && ( l_abTCLFrame[0] == PCB_S ) )
{
return PROTOCOL_ERROR;
}
//Test TA 408.5
// IF (SENDING A COMMAND OR SENDING A CHAINING FRAME )
// AND PREVIOUS ONE SENT IS A CHAINING FRAME
// AND FRAME RECEIVED IS A S-BLOCK
if (( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining) )
&& ( l_ePCBTypeInitial == CST_pcbtIWithChaining ) && ( l_abTCLFrame[0] == PCB_S ) )
{
return PROTOCOL_ERROR;
}
ARM COMPILER V2.40e, Paypass_TCL 12/12/07 14:35:11 PAGE 17
// Test TA 408.4 and Test TA 408.5 FP
// IF SENDING A R-ACK
// AND RECEIVED FRAME SIZE=1 AND IS A S-BLOCK AND PREVIOUS ONE SENT IS A CHAINING FRAME
if ( ( l_eTransmitStep == CST_tcltsRACK )
&& ( ( l_iTCLFrameOutLength == 1 ) && ( l_abTCLFrame[0] == PCB_S ) && (l_ePCBTypeInitial == CST_pcb
-tIWithChaining) ) )
{
return PROTOCOL_ERROR;
}
// Test TA 408.2 and Test TA 408.3
// IF SENDING A COMMAND OR SENDING A CHAINING FRAME
// AND PREVIOUS ONE SENT IS A CHAINING FRAME
// AND Bit3 AND Bit4 OF THE PCD ARE DIFF TO 0
if ( ( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining) )
&& (l_ePCBTypeInitial == CST_pcbtIWithChaining) && ( (l_abTCLFrame[0] & 0x0C) != 0x00 ))
{
return PROTOCOL_ERROR;
}
//Test TA 404.6
// IF SENDING A COMMAND OR SENDING A CHAINING FRAME
// AND PREVIOUS ONE SENT IS A NOT CHAINING FRAME
// AND RECEIVED FRAME IS A R-ACK
// AND RECEIVED BLOCK NUMBER = READER BLOCK NUMBER
if (( (l_eTransmitStep == CST_tcltsCommand) || (l_eTransmitStep == CST_tcltsChaining) )
&& ( l_ePCBTypeInitial == CST_pcbtINoChaining ) && ( (l_abTCLFrame[0] & 0xF0) == 0xA0 )
&&( (l_abTCLFrame[0] & 0x01) == (g_TCLCard.f_iBlockNumber & 0x01)) )
{
return PROTOCOL_ERROR;
}
#ifdef TTAL1
// Option for Host mode
if (g_sLog.enable)
{
// BUFFER CONCATENATION (WITH VARIABLE LENGTH OF RESPONSE)
sprintf(g_sLog.buffer,"R-APDU: ");
for (i=0;i<l_iTCLFrameOutLength;i++)
{
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"%02x",l_abTCLFrame[i]);
}
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"\n");
v_fnSendToHostEcho(g_sLog.buffer);
}
#endif
// Requirements 10.9 (to notify a time-out: 10.4.4.4 )
// IF SENDING A R-NACK
// AND RECEIVED FRAME IS A R-ACK
// AND RECEIVED BLOCK NUMBER NOT EQUAL TO READER BLOCK NUMBER
if ( ( (l_abTCLFrame[0] & 0xF0)== 0xA0) && (l_eTransmitStep == CST_tcltsRNACK)
&& ((l_abTCLFrame[0] & 0x01) != (g_TCLCard.f_iBlockNumber & 0x01)))
{
// FRAME RECEIVED IS A R-ACK
l_ePCBType = CST_pcbtRACK ;
}
else
{
// RECEIVED FRAME TYPE EXTRACTION
l_ePCBType = b_fnTCLFrameExtract(&l_iTCLFrameOutLength, &l_abTCLFrame[0], &p_pabDataOut[l_iCurrentO
-utIndex], &l_wStatus);
}
ARM COMPILER V2.40e, Paypass_TCL 12/12/07 14:35:11 PAGE 18
// IF PROTOCOL ERROR IN DATA RECEIVED(Requirements 10.2) & BLOCK NUMBER ERROR (Requirements 10.9)
if (l_ePCBType == CST_pcbPROTOCOL_ERROR)
{
return PROTOCOL_ERROR;
}
// IF SENDING A CHAINING OR A NOT CHAINING FRAME (AND EVERYTHING'S OK)
// INCREASE CURSOR OF DATA RECEIVED
if ( (l_ePCBType == CST_pcbtINoChaining) || (l_ePCBType == CST_pcbtIWithChaining) )
{
l_iCurrentOutIndex += l_iTCLFrameOutLength;
}
}
else // if l_ErrorType != ERR_NO_ERROR
{
l_ePCBType = CST_pcbtError;
if (l_wStatus == ERR_NOCARD)
{
l_ErrorType = TIME_OUT_ERROR;
}
else
{
l_ErrorType = TRANSMISSION_ERROR;
}
}
/*------------------------------------------------------------------------------------------------*/
/*------------------PREPARE NEXT FRAME------------------------------------------------------------*/
/*------------------------------------------------------------------------------------------------*/
// CASE PCB TYPE
switch (l_ePCBType)
{
case CST_pcbtINoChaining:
// NO CHAINING PCB RECEIVED
// INCREMENT BLOCK COUNTER
g_TCLCard.f_iBlockNumber++;
// END OF APDU SENDING
l_eTransmitStep = CST_tcltsEnd;
break;
case CST_pcbtIWithChaining:
// CHAINING PCB RECEIVED
// RESET RETRY COUNT
l_iRetryCount = TCL_RETRY_COUNT;
// INCREMENT BLOCK COUNTER
g_TCLCard.f_iBlockNumber++;
// SEND RACK FOR GETTING THE DATA
l_eTransmitStep = CST_tcltsRACK;
ARM COMPILER V2.40e, Paypass_TCL 12/12/07 14:35:11 PAGE 19
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -