⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 paypass_tcl.c

📁 读RF卡的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:


/*------------------------ 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 + -