2015-12-29 45 views
5

Próbuję zbudować poprawnie sformatowaną komendę GET PROCESSING OPTIONS, aby wysłać ją na bezstykową kartę EMV. This post był bardzo pomocny, ale muszę wiedzieć trochę więcej szczegółów.Parsowanie PDOL dla polecenia GET PROCESSING OPTIONS w transakcji EMV

Czy podczas analizowania PDOL można bezpiecznie założyć, że każdy znacznik ma długość 2 bajtów, a następnie wielkość oczekiwanych danych?

Przykładowo PDOL 9F66049F02069F37049F1A02 jest podzielony na 9F66 04, 9F02 06 itp każdego z 2 bajtów i znaczniki 1 bajt o oczekiwanej długości wartości danych.

Czy można bezpiecznie założyć, że każdy znacznik ma długość 2 bajtów podczas analizowania?

+0

czy ukończyłeś parsowanie PDOL? – Olivarsham

+1

@Olivarsham Skończyło się na używaniu 2 bajtów, ponieważ wszystkie testowane karty używały tylko 2 bajtowych znaczników dla PDOL.Odpowiedź Michaela Rolandsa poniżej zdecydowanie pomogła wiedzieć, jak określić długość znacznika ("Jeśli górny bit następnego bajtu znacznika jest jeden (znacznik [i] i 0x080 == 0x080), to znacznik składa się z jeszcze jednego bajtu. to powtarza się dla każdego kolejnego bajta ") Tutaj jest dobrym źródłem informacji, aby dowiedzieć się więcej na temat analizowania PDOL. http://www.openscdp.org/scripts/tutorial/emv/initiateapplicationprocess.html transakcji EMV: http://www.openscdp.org/scripts/tutorial/emv/index.html –

+0

Niektóre z testowanych przez nas kart mają znaczniki '9505',' 9A03', '9C01', które mają tylko dwa bajty. Wygląda na to, że muszę napisać osobny parser dla PDOL. W każdym razie, dzięki! – Olivarsham

Odpowiedz

6

Nie, nie można oczekiwać, że każdy znacznik składa się z dwóch bajtów (chociaż większość znaczników ma). Struktury wartości znaczników (TLV) w EMV są zgodne z regułami kodowania ASN.1 (podstawowe reguły kodowania, BER). Zobacz następujące dokumenty celu uzyskania dalszych informacji:

Ten ostatni jest bardzo dobrym wstępem, który pomógł mi się zaczyna.

wartości NDS konstrukcja (obiekt danych) składa się z wartości znacznika, wartość długości, a ładunek danych (wartości)

 
+-----------+-----------+-----------+ 
| Tag | Length | Value | 
| (N Bytes) | (M Bytes) | (L bytes) | 
+-----------+-----------+-----------+ 

PDOL (i inne listy obiektu danych DOL) zawiera znacznik i część długości jednego lub więcej takich obiektów danych. Podobnie, dane związane z PDOL zawierają wartości części DO wymienionych w PDOL. Zarówno tag, jak i część długości może składać się z jednego lub więcej bajtów.

Dla części znacznika, zasady są o tak (więcej szczegółów patrz powyższe referencje):

  • Jeśli dolne 5 bitów pierwszego znacznika bajcie są te (tag[0] & 0x01F == 0x01F), a następnie tag składa się z co najmniej dwóch bajtów.
  • Jeśli górny bit następnego bajtu jest jeden (tag[i] & 0x080 == 0x080), znacznik składa się z jeszcze jednego bajtu. Powtarza się to dla każdego kolejnego bajtu.

Na części długości, zasady są o tak (więcej szczegółów patrz powyższe referencje):

  • Jeżeli górna bit pierwszej długości bajtu wynosi zero (length[0] & 0x080 == 0), a następnie pozostałe siedem bitów koduje wartość długości (length[0] & 0x07F).
  • Jeśli górny bit pierwszego bajtu długości jest jeden (length[0] & 0x080 == 0x080), pozostałe siedem bitów koduje liczbę pozostałych bajtów części długości (length[0] & 0x07F). Pozostałe bajty reprezentują wartość długości jako niepodpisaną liczbę całkowitą z MSB jako pierwszą.
+1

Dzięki za te linki w ASN. Mam dekodowane wartości TLV dla zwykłych obiektów danych TLV, ale mam problem z dostosowaniem go do dostosowania do tagów i długości DOL-ów. "Część długa" wymaga nieco dalszego czytania z mojej strony. Dzięki za pomoc. –