📄 paypass_tcl.c
字号:
/*------------------------ 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_bDataBitsReceived,&g_bPicoReadStatus,&l_bRFReceiveEOF,&g_bBitsToReceive);
}
else
{
//SET LENGTH TO MAXIMUM PCD SIZE BECAUSE PICC WILL NEVER SEND MORE
l_iTCLFrameOutLength = g_TCLCard.f_iPCDMaximumInputFrameSize; // FP ERROR l_iTCLFrameOutLength is not 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_bDataBitsReceived,&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;
}
// 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_pcbtIWithChaining) ) )
{
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_iCurrentOutIndex], &l_wStatus);
}
// 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;
break;
case CST_pcbtRACK:
// R-ACK PCB RECEIVED
if ( (l_abTCLFrame[0] & 0x01) == (g_TCLCard.f_iBlockNumber & 0x01) )
{
if ( (l_ErrorType == TIME_OUT_ERROR) && (l_ePCBTypeInitial == CST_pcbtIWithChaining) )
{
l_ErrorType=0x00; //FP
}
}
// IF ( BLOCK NUMBER != PCD BLOCK NUMBER ) (Requirements 10.9)
if ( (l_abTCLFrame[0] & 0x01) != (g_TCLCard.f_iBlockNumber & 0x01) )
{
if((l_AddARetry==1)&& (l_ePCBTypeInitial==CST_pcbtINoChaining) && (l_eTransmitStep==CST_tcltsRNACK)) //TA401.14
{
l_iRetryCount++;
l_AddARetry=0;
}
// IF TIMEOUT ERROR WITH THE LAST I-BLOCK
if (l_ErrorType == TIME_OUT_ERROR)
{
// RETRANSMIT THE LAST I-BLOCK
// DECREMENT RETRY COUNT
l_iRetryCount2--;
if ( l_iRetryCount2 == 0 )
{
return PROTOCOL_ERROR;
}
// NEXT COMMAND TO RESEND (AFTER TIMEOUT)
l_eTransmitStep = l_eTransmitStepToResend;
l_ErrorType = 0;
//READY TO RESEND
break;
}
else //if not a timeout error
{
// BAD BLOCK NUMBER IN R-ACK
return PROTOCOL_ERROR;
} // end l_ErrorType == TIME_OUT_ERROR
}// end R-ACK with BLOCK NUMBER != PCD BLOCK NUMBER
// IF TIMEOUT ERROR WITH THE LAST I-BLOCK
if (l_ErrorType == TIME_OUT_ERROR)
{
// RETRANSMIT THE LAST I-BLOCK
// DECREMENT RETRY COUNT
l_iRetryCount2--;
if ( l_iRetryCount2 == 0 )
{
return PROTOCOL_ERROR;
}
// NEXT COMMAND TO RESEND (AFTER TIMEOUT)
l_eTransmitStep = l_eTransmitStepToResend;
l_ErrorType = 0;
//READY TO RESEND
break;
}
l_AddARetry=1;
// INCREASE INDEX(CURSOR) OF DATA TO SEND
l_iIndexDataIn += l_iDataInLength;
// SET CHAINING: INDEX OF LENGTH OF DATA TO SEND (MEAN ONE MORE PACKET HAS BEEN SENT CORRECTLY)
l_iDataInIndex++;
// CHECK IF CHAINING SHALL BE CONTINUED (Requirements 10.9)
// IF CURRENT PACKET NUMBER IS LOWER THAN THE NUMBER OF PACKET TO SEND
if (l_iDataInIndex <= (l_iDataInBlockCount - 1))
{
// SEND REMAINING DATA
l_eTransmitStep = CST_tcltsChaining ;
// NEXT BLOCK
g_TCLCard.f_iBlockNumber++;
}
else
{
// IF A RACK IS RECEIVED SO THAT IT WAS THE LAST I-BLOCK TO SEND
return PROTOCOL_ERROR;
}
break;
case CST_pcbtSWTX:
// SWTX PCB RECEIVED
/* DEBUG FP Pour TA 204*/
// GET S(WTX)[1] = INF
// SET WTX VALUE (THE 2 UPPER BITS SHOULD BE RESET TO ZERO)
p_pabDataIn[0] = l_abTCLFrame[1] & 0x3F;
// GET S(WTX)[1] = p_pabDataIn[0]
l_bWTX = p_pabDataIn[0];
// IF WTXM > 59 (60 to 63) --> WTXM = 59 =(0x3B) (Requirements 10.4)
if ( l_bWTX > 0x3B )
{
l_bWTX = 0x3B;
}
// TRANSMIT S(WTX)
l_eTransmitStep = CST_tcltsSWTX;
break;
case CST_pcbtDESELECT:
// DESELECT PCB RECEIVED
/* DEBUG FP */
if (l_eTransmitStep == CST_tcltsRACK)
{
return PROTOCOL_ERROR;
}
break;
case CST_pcbtError:
// ERROR CASE
l_iRetryCount--;
// CHECK IF RETRY COUNT ELLAPSED
if (l_iRetryCount == 0)
{
// END OF 2 RETRIES
return l_ErrorType;
}
// IF TIMEOUT ON A R-ACK
if ( (l_ErrorType == TIME_OUT_ERROR) && (l_eTransmitStep == CST_tcltsRACK) )
{
// RETRANSMIT A R-ACK
l_eTransmitStep = CST_tcltsRACK;
break;
}
// IF TIMEOUT ON A I-CHAINING
if ( (l_ErrorType == TIME_OUT_ERROR) && (l_ePCBTypeInitial == CST_pcbtIWithChaining) )
{
// TRANSMIT A R-NACK
l_eTransmitStep = CST_tcltsRNACK;
break;
}
// IF TIMEOUT ON A I-CHAINING AND ....
if ( (l_ErrorType == TIME_OUT_ERROR) && ((l_ePCBTypeInitial == CST_pcbtIWithChaining) || (l_eTransmitStepToResend == CST_tcltsChaining)) )
{
// TRANSMIT A R-ACK
l_eTransmitStep = CST_tcltsRACK;
break;
}
// Test TB 417 transmission error (CRC, Parity) in R-block with chaining
// IF TRANSMISSION ERROR RECEIVING A R-ACK AND INITIAL FRAME SENT WAS I-CHAINING BLOCK
if ( (l_ErrorType == TRANSMISSION_ERROR) && (l_abTCLFrame[0] & 0xF0 == 0xA0) && (l_ePCBTypeInitial == CST_pcbtIWithChaining) )
{
// TRANSMIT A R-NACK
l_eTransmitStep = CST_tcltsRNACK;
break;
}
// Test TB 410.0 transmission error (CRC, Parity) in I-block with chaining
// IF TRANSMISSION ERROR RECEIVING A I-CHAINING BLOCK
if ( (l_ErrorType == TRANSMISSION_ERROR) && (l_abTCLFrame[0] & 0xF0) == 0x10 )
{
// TRANSMIT A R-ACK
l_eTransmitStep = CST_tcltsRACK;
break;
}
// Test TA 403 Transmission error (CRC, Parity) in I-block no chaining
// IF TRANSMISSION ERROR RECEIVING A I-NO CHAINING
if ( (l_ErrorType == TRANSMISSION_ERROR)&&(l_abTCLFrame[0] & 0xF0) == 0x00 )
{
// TRANSMIT A R-NACK
l_eTransmitStep = CST_tcltsRNACK;
break;
}
// Test TA 410 Transmission error in I-block
// IF TRANSMISSION ERROR RECEIVING A I-BLOCK (CHAINING OR NOT)
if ( (l_ErrorType == TRANSMISSION_ERROR) && (l_abTCLFrame[0] & 0xE0) == 0x00 )
{
// TRANSMIT A R-ACK
l_eTransmitStep = CST_tcltsRACK;
break;
}
// IF TRANSMISSION ERROR OR TIMEOUT ON A I-BLOCK
// NEXT BLOCK IS A R-NACK
l_eTransmitStep = CST_tcltsRNACK;
break;
}
}
// ASSIGNE DATA OUT SIZE
if (l_iCurrentOutIndex == 0)
{
p_piDataOutLength = 0;
}
else
{
p_piDataOutLength[0] = l_iCurrentOutIndex;
}
// RETURN STATUS WORDS (SW1,SW2)
return l_wStatus;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -