2015-04-16 2 views
1

Я работаю на 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); 

И показывать правильное значение !!

Может ли кто-то помочь решить эту проблему?

ответ

3

Этот тег не найден, потому что вы не ищите строку «5A», но для строки «\ x05 \ x0A» (символ символа ENQ + символ строки). Более того, мне интересно, действительно ли приведенный выше код компилируется, поскольку вы не указали аргумент обязательной длины на strncmp(). Вы можете попробовать что-то вроде

if(strncmp(Response_PPSE,"5A", 2)==0) 

вместо этого.

Однако вы должны понимать, что вы сканируете все данные ответа для значения 5A. Таким образом, поиск этого значения также может означать, что он был частью какого-либо другого TLV-тега данных поле, длина поле или даже часть многобайтового тег поле. Поэтому имеет смысл реализовать (или использовать существующий) парсер TLV для формата BER (Basic Encoding Rules).

+0

Можете ли вы дать мне некоторые идеи о существующих TLV Parser с использованием языка C? @Michael Roland –

+0

@SaraSara Нет, я не могу. –

+0

Ok Спасибо @Michael Roland –

0

Это нехороший подход к поиску определенного байта в необработанных байтовых потоках с использованием функций строк на первом месте.

Общий парсер TLV - очень простой алгоритм, и вы сделаете это через 30 минут или около того.

В общем псевдо-код для TLV синтаксического анализа, которые выглядят для конкретного тега будет что-то вроде этого:

index = 0 
while (byte[i] != 0x5A or EOF) 
{ 
    length = DecodeLength(byte[i+1]) 
    i += length + 2 // + 1 for L (length) byte itself, it might be encoded with 
        // 2 bytes so the function DecodeLength can return the number 
        // of bytes lenght has been encoded 
        // +1 for T (tag) byte 
} 

if(EOF) return tag_not_found 

return byte[i + 2], length // pointer to data for Tag '5A'and length of data 
Смежные вопросы