📄 paypass_ttal1_comm.c
字号:
g_abATQBResponse[9],
g_abATQBResponse[10],
g_abATQBResponse[11]);
}
}
else
{
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"No type B card\n");
}
v_fnSendToHostEcho(g_sLog.buffer);
v_fnSendToHostDone();
}
//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostHLTA
//-----------------------------------------------------------------------------
// Description : This function executes a HALT_A
//
// IN : - none -
// OUT : - none -
// RETURN : - none -
// Notes : - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostHLTA()
{
unsigned char l_abDataForPrintf[2];
StructReader myReaderStruct;
v_fnSendToHostEcho("->HLTA");
// LOAD ISO14443-A PROTOCOL
v_fnProtocolChange(ISOA_PROTOCOL,&g_abP6Config14443A_PayPass[0],g_bRFReceiveEOFA,&myReaderStruct);
// Host Mode active
g_sLog.enable = TRUE;
// Option for Host mode
if(g_sLog.enable)
{
// HALT_A COMMAND
l_abDataForPrintf[0] = _ISOA_HALT_0;
l_abDataForPrintf[1] = _ISOA_HALT_1;
sprintf(g_sLog.buffer,"HALT A Command: %02x%02x\n",l_abDataForPrintf[0],l_abDataForPrintf[1]);
}
// SEND HALT_A COMMAND
v_fnSendHALTA(&myReaderStruct);
// DISPLAY HALT_A CMD
v_fnSendToHostEcho(g_sLog.buffer);
// no response waiting from the PICC
v_fnSendToHostDone();
}
//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostHLTB
//-----------------------------------------------------------------------------
// Description : This function executes a HALTB
//
// IN : - none -
// OUT : - none -
// RETURN : - none -
// Notes : - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostHLTB()
{
StructReader myReaderStruct;
unsigned char l_bStatus;
unsigned long l_bFWT;
v_fnSendToHostEcho("->HLTB");
// LOAD ISO14443-B PROTOCOL
v_fnProtocolChange(ISOB_PROTOCOL,&g_abP6Config14443B_PayPass[0],g_bRFReceiveEOFB,&myReaderStruct);
// EXTRACT FWI FROM THE ATQB TO CALCULATE THE FWT FOR HALT_B CMD
l_bFWT = b_fnFWT_SFGTCalculate(_FWT,g_abATQBResponse[11],1);
l_bFWT += _PICOREAD_TIMEOUT_OFFSET_B;
// Host Mode active
g_sLog.enable = TRUE;
// Option for Host mode
if(g_sLog.enable)
{
sprintf(g_sLog.buffer,"HALT B Command: %02x%02x%02x%02x%02x\n",_ISOB_HALT,g_abATQBResponse[1],g_abATQBResponse[2],g_abATQBResponse[3],g_abATQBResponse[4]);
}
// TIMEOUT = "l_bFWT" CALCULATED WITH THE FWI OF ATQB
myReaderStruct.s_bRTimeoutUsed = l_bFWT;
// SEND HALT_B AND RECEIVE RESPONSE
l_bStatus = b_fnSendReceiveHALTB(&g_abATQBResponse[0],&myReaderStruct);
// CHECK ERROR
l_bStatus = b_fnPayPassAnticollisionErrorHandling(_ISOB_HALT, l_bStatus,&g_abATQBResponse[0],g_lDataBytesReceived);
// DISPLAY HALT_B CMD & RESPONSE
if (l_bStatus == ERR_NO_ERROR)
{
// HALT_B RESPONSE
sprintf(g_sLog.buffer + strlen(g_sLog.buffer),"HALT B Response: %02x --> Card B halted\n",g_abATQBResponse[0]);
}
else
{
sprintf(g_sLog.buffer,"Card B no halted\n");
}
v_fnSendToHostEcho(g_sLog.buffer);
v_fnSendToHostDone();
}
//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostRATS
//-----------------------------------------------------------------------------
// Description : This function executes the ACTIVATE_A
//
// IN : - none -
// OUT : - none -
// RETURN : - none -
// Notes : - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostRATS()
{
StructReader myReaderStruct;
unsigned char l_bStatus;
v_fnSendToHostEcho("->WUPA->RATS");
// LOAD ISO144443-A PROTOCOL
v_fnProtocolChange(ISOA_PROTOCOL,&g_abP6Config14443A_PayPass[0],g_bRFReceiveEOFA,&myReaderStruct);
// Host Mode active
g_sLog.enable = TRUE;
// ACTIVATE CARD A WITH THE MEMORIZED UID
l_bStatus = b_fnActivateA(&g_abATQAResponse[0],&g_abUID[0],&myReaderStruct);
// DISPLAY ERROR IF ACTIVATE_A NOT COMPLETED
if (l_bStatus != END_ACTIVATE_A)
{
sprintf(g_sLog.buffer,"Activate A failed\n");
}
v_fnSendToHostEcho(g_sLog.buffer);
v_fnSendToHostDone();
}
//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostATTRIB
//-----------------------------------------------------------------------------
// Description : This function executes the ACTIVATE_B
//
// IN : - none -
// OUT : - none -
// RETURN : - none -
// Notes : - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostATTRIB()
{
StructReader myReaderStruct;
unsigned char l_bStatus;
v_fnSendToHostEcho("->WUPB->ATTRIB");
// LOAD ISO14443-B PROTOCOL
v_fnProtocolChange(ISOB_PROTOCOL,&g_abP6Config14443B_PayPass[0],g_bRFReceiveEOFB,&myReaderStruct);
// Host Mode active
g_sLog.enable = TRUE;
l_bStatus = b_fnActivateB(&g_abATQBResponse[0],&myReaderStruct);
// DISPLAY ERROR IF ACTIVATE_B NOT COMPLETED
if (l_bStatus != END_ACTIVATE_B)
{
sprintf(g_sLog.buffer,"Activate B failed\n");
}
v_fnSendToHostEcho(g_sLog.buffer);
v_fnSendToHostDone();
}
//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostSendAPDU
//-----------------------------------------------------------------------------
// Description : Capture the APDU to send
// IN : - none -
// OUT : - none -
// RETURN : - none -
// Notes : - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostSendAPDU()
{
unsigned short i;
char l_cCMD; // Command from Host
char l_cCMD2; // Command from Host
i = 0;
g_bAPDULength = 0;
v_fnSendToHostEcho("\nCapture the C-APDU to send and push 'x' button to stop the capture,\n for example : '00a404000e325041592e5359532e444446303100x'");
// PREPARE THE C-APDU TO SEND
while(1)
{
// CAPTURE THE FIRST PART OF BYTE(MSB)
l_cCMD = getchar();
// STOP THE CAPTURE, END OF THE APDU
if (l_cCMD == 'x')
{
break;
}
// CAPTURE THE SECOND PART OF BYTE(LSB)
l_cCMD2 = getchar();
// TEST IF THE SECOND PART OF BYTE IS A NUMBER
if ((l_cCMD2 <= '9') && (l_cCMD2 >= '0'))
{
g_abAPDU_Data[i] = l_cCMD2 - 0x30;
}
else
{
// TEST IF THE SECOND PART IS LETTER(a->f)
if ((l_cCMD2 <= 'f') && (l_cCMD2 >= 'a'))
{
g_abAPDU_Data[i] = l_cCMD2 - 0x57;
}
else
{
// TEST IF THE SECOND PART IS LETTER(A->F)
if ((l_cCMD2 <= 'F') && (l_cCMD2 >= 'A'))
{
g_abAPDU_Data[i] = (l_cCMD2 - 0x37);
}
else
{
v_fnSendToHostEcho("Error, Retry Full Anticollision");
g_bAPDULength = 0;
v_fnSendToHostDone();
return;
}
}
}
// SAME TESTS WITH FIRST PART OF BYTE
if ((l_cCMD <= '9') && (l_cCMD >= '0'))
{
g_abAPDU_Data[i] |= (l_cCMD - 0x30) <<4;
}
else
{
if ((l_cCMD <= 'f') && (l_cCMD >= 'a'))
{
g_abAPDU_Data[i] |= (l_cCMD - 0x57) <<4;
}
else
{
if ((l_cCMD <= 'F') && (l_cCMD >= 'A'))
{
g_abAPDU_Data[i] |= (l_cCMD - 0x37) <<4;
}
else
{
v_fnSendToHostEcho("Error, Retry Full Anticollision");
g_bAPDULength = 0;
v_fnSendToHostDone();
return;
}
}
}
i++;
}
g_bAPDULength = i;
v_fnSendToHostDone();
}
//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostLoopBack
//-----------------------------------------------------------------------------
// Description : Execute the Loop-Back function: the full PayPass anticollision
//
// IN : - none -
// OUT : - none -
// RETURN : - none -
// Notes : - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostLoopBack()
{
StructReader myReaderStruct;
unsigned char l_bStatus;
// LOOP-BACK SELECTION
g_Anticollision_choice = 0;
// Option No-Host mode --> full anticollision
g_sLog.enable = FALSE;
// RESET FIELD
v_fnCS_reset();
v_fnSPI_SendByte(0x40);
v_fnCS_reset();
v_fnSPI_SendByte(0x42);
// ANTICOLLISION PayPass (with Loop-Back Function)
do
{
l_bStatus = b_fnPayPassAnticollision(&myReaderStruct);
if (l_bStatus == END_RESET)
{
sprintf(g_sLog.buffer,"Error in PayPass Anticollision\n");
sprintf(g_sLog.buffer,"------------------------------\n");
v_fnSendToHostEcho(g_sLog.buffer);
}
}
while(l_bStatus == END_RESET); // RESET LOOP
v_fnSendToHostDone();
}
//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostFullAnticollision
//-----------------------------------------------------------------------------
// Description : Execute the full anticollision PayPass and send different APDU
// captured by the host
// IN : - none -
// OUT : - none -
// RETURN : - none -
// Notes : - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostFullAnticollision()
{
StructReader myReaderStruct;
unsigned char l_bStatus;
// FULL ANTICOLLISION SELECTION
g_Anticollision_choice = 1;
// Option No-Host mode --> full anticollision
g_sLog.enable = FALSE;
// RESET FIELD
v_fnCS_reset();
v_fnSPI_SendByte(0x40);
v_fnCS_reset();
v_fnSPI_SendByte(0x42);
// FULL ANTICOLLISION PayPass
do
{
l_bStatus = b_fnPayPassAnticollision(&myReaderStruct);
if (l_bStatus == END_RESET)
{
g_sLog.enable = TRUE;
sprintf(g_sLog.buffer,"Error in PayPass Anticollision\n");
sprintf(g_sLog.buffer,"------------------------------\n");
v_fnSendToHostEcho(g_sLog.buffer);
g_sLog.enable = FALSE;
}
}
while(l_bStatus == END_RESET); // RESET LOOP
v_fnSendToHostDone();
}
//-----------------------------------------------------------------------------
// Function name : v_fnReceivedFromHostMX_Polling_Activate
//-----------------------------------------------------------------------------
// Description : Execute the Loop-Back function: the full PayPass anticollision
//
// IN : - none -
// OUT : - none -
// RETURN : - none -
// Notes : - none -
//-----------------------------------------------------------------------------
void v_fnReceivedFromHostMX_Polling_Activate()
{
StructReader myReaderStruct;
unsigned char l_bStatus;
unsigned char l_cCMD1; // INS
unsigned char l_cCMD2; // P1
unsigned char l_cCMD3; // P2
unsigned char l_cCMD4; // P3
l_cCMD1 = _getkey();
l_cCMD2 = _getkey();
l_cCMD3 = _getkey();
l_cCMD4 = _getkey();
// TO CONNECT THE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -