Я работаю на Mastercard PayPass сделок, я послал команду READ RECORD и получил результат:поиске Ключевые слова (TLV) с функцией C
70 81 AB 57 11 54 13 33 00 89 60 10 83 D2 51 22
20 01 23 40 91 72 5A 08 54 13 33 00 89 60 10 83
5F 24 03 25 12 31 5F 25 03 04 01 01 5F 28 02 00
56 5F 34 01 01 8C 21 9F 02 06 9F 03 06 9F 1A 02
95 05 5F 2A 02 9A 03 9C 01 9F 37 04 9F 35 01 9F
45 02 9F 4C 08 9F 34 03 8D 0C 91 0A 8A 02 95 05
9F 37 04 9F 4C 08 8E 0E 00 00 00 00 00 00 00 00
42 03 5E 03 1F 03 9F 07 02 FF 00 9F 08 02 00 02
9F 0D 05 00 00 00 00 00 9F 0E 05 00 08 00 60 00
9F 0F 05 00 00 00 00 00 9F 42 02 09 78 9F 4A 01
82 9F 14 01 00 9F 23 01 00 9F 13 02 00 00
Этот ответ содержит объекты данных TLV (без пробелов). Я преобразовал реакцию, как описано в следующем:
// Read Record 1 with SFI2
//---------------------------------SEND READ RECORD-------------------
inCtlsSendVAPDU(0x2C,0x03,(unsigned char *)"\x00\xB2\x01\x14\x00",5);
clrscr();
inRet = inCTLSRecv2(Response, 269);
LOG_HEX_PRINTF("Essai EMV4 Read record 1 EMV Paypass:",Response,inRet);
if(Response[14]==0x70)
{
sprintf(Response_PPSE,"%02X%02X",Response[12],Response[13]);//To retrieve length of received data
t1=hexToInt(Response_PPSE);// Convert length to integer
t11=t1-2;
i=14;
k=0;
//--------------------------- Converting data to be used later---------
while(i<t11+14)// 14 to escape the header+ command+ status+ length
{
sprintf(READ1+(2*k),"%02X",Response[i]);
i++;
k++;
}
Теперь я должен проверить, если этот ответ содержит обязательные теги:
- 5A - Применение Первичный номер счета (PAN)
- 5F24 - Дата истечения срока использования приложения
- 8C - Управление рисками карты данных Список объектов данных 1 (CDOL1)
- 8D - Управление данными о рисках карты данных Объект данных 2 (CDOL2)
Так что я попытался следующие действия, чтобы проверить на 5A теге (Application Номер первичного счета (PAN)):
i=0;
t11=2*t11;
while(i<=t11)
{
strncpy(Response_PPSE,READ1+i,2);
if(strncmp(Response_PPSE,"\x05\x0A")==0)
{
write_at("true",4,1,1);// Just to test on the terminal display
goto end;
}
else
i=i+2;
}
goto end;
Я не знаю, почему ничего не отображается на терминале, Условный блок не выполнен!
Я попытался напечатать 5A
тег вручную:
strncpy(Response_PPSE,READ1+44,2);
write_at(Response_PPSE,strlen(Response_PPSE),1,1);
И показывать правильное значение !!
Может ли кто-то помочь решить эту проблему?
Можете ли вы дать мне некоторые идеи о существующих TLV Parser с использованием языка C? @Michael Roland –
@SaraSara Нет, я не могу. –
Ok Спасибо @Michael Roland –