2015-12-29 10 views
5

Ich versuche, eine korrekt formatierte GET PROCESSING OPTIONS Befehl zu einer kontaktlosen EMV-Karte gesendet werden. This post war sehr hilfreich, aber ich muss nur ein wenig mehr Details wissen.Parsing PDOL für GET PROCESSING OPTIONS Befehl in EMV-Transaktion

Wenn die PDOL analysiert wird, ist es sicher anzunehmen, dass jedes Tag 2 Bytes lang ist, gefolgt von der Größe der Daten, die im Gegenzug erwartet werden?

Zum Beispiel kann die PDOL 9F66049F02069F37049F1A02 in gebrochen 9F66 04, 9F02 06 usw. mit jeweils 2-Byte-Tags und 1 Byte für die erwartete Länge des Datenwerts.

Ist es sicher anzunehmen, dass jedes Tag beim Parsen 2 Byte lang ist?

+0

Haben Sie das PDOL-Parsing abgeschlossen? – Olivarsham

+1

@Olivarsham Wir verwendeten nur 2 Bytes, da alle getesteten Karten nur 2-Byte-Tags für die PDOL verwendeten.Die Antwort von Michael Rolands unten half definitiv, die Länge eines Tags zu bestimmen ("Wenn das obere Bit des nächsten Tag-Bytes eins ist (Tag [i] & 0x080 == 0x080), besteht das Tag aus einem weiteren Byte. Dies wird für jedes nachfolgende Byte wiederholt ") Hier ist eine gute Ressource ist mehr zu erfahren über eine PDOL Parsen. http://www.openscdp.org/scripts/tutorial/emv/initiateapplicationprocess.html EMV-Transaktionen: http://www.openscdp.org/scripts/tutorial/emv/index.html –

+0

Einige der von uns getesteten Karten haben '9505',' 9A03', '9C01' Tags, die nur zwei Bytes haben. Sieht so aus, als müsste ich einen separaten Parser für PDOL schreiben. Trotzdem danke! – Olivarsham

Antwort

6

Nein, Sie können nicht erwarten, dass jedes Tag aus zwei Bytes besteht (obwohl die meisten Tags dies tun). Tag-Length-Value (TLV) -Strukturen in EMV folgen ASN.1-Codierregeln (Basic Encoding Rules, BER). Auch die folgenden Dokumente für weitere Informationen:

Letztere eine wirklich gute Einführung ist, die mir geholfen, begonnen.

A TLV Struktur (Datenobjekt) einen Tag-Wert besteht, ein Längenwert und eine Datennutzlast (Wert):

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

Die PDOL (und jede andere Datenobjektliste DOL) enthalten die Tag und der Länge Teil eines oder mehrerer solcher Datenobjekte. In ähnlicher Weise enthalten die PDOL-bezogenen Daten die Wertteile der in der PDOL referenzierten DOs. Sowohl der Tag als auch der Längenabschnitt können aus einem oder mehreren Bytes bestehen.

Für den Tag Teil, die Regeln über wie diese sind (für weitere Einzelheiten zu den oben genannten Referenzen sehen):

  • Wenn die unteren 5 Bits des ersten Tages Byte sind alle Einsen (tag[0] & 0x01F == 0x01F), dann der Das Tag besteht aus mindestens zwei Bytes. Wenn das obere Bit des nächsten Tag-Bytes eins ist (tag[i] & 0x080 == 0x080), dann besteht das Tag aus einem weiteren Byte. Dies wird für jedes nachfolgende Byte wiederholt.

Für die Länge Teil sind die Regeln wie folgt aus (für weitere Einzelheiten zu den oben genannten Referenzen sehen):

  • Wenn das obere Bit des Bytes ersten Länge Null (length[0] & 0x080 == 0), dann die Die verbleibenden sieben Bits codieren den Längenwert (length[0] & 0x07F).
  • Wenn das obere Bit des ersten Längenbytes eins ist (length[0] & 0x080 == 0x080), codieren die verbleibenden sieben Bits die Anzahl der verbleibenden Bytes des Längenabschnitts (length[0] & 0x07F). Die verbleibenden Bytes stellen den Längenwert als vorzeichenlose Ganzzahl mit MSB zuerst dar.
+1

Danke für diese Links auf ASN. Ich habe eine TLV decodiert für normale TLV-Datenobjekte, aber ich habe Probleme, es anzupassen, um nur zu markieren und Länge DOLs. Der 'Längenabschnitt' erfordert ein wenig mehr von mir. Danke für Ihre Hilfe. –