2015-12-29 20 views
5

Temassız bir EMV kartına gönderilmek üzere doğru biçimlendirilmiş bir GET PROCESSING OPTIONS komutu oluşturmaya çalışıyorum. This post çok yardımcı oldu ama biraz daha fazla ayrıntı bilmem gerek.EMV işleminde ALIŞTIRMA SEÇENEKLERI komutu için PDOL ayrıştırma

PDOL'u ayrıştırırken, her etiketin 2 bayt uzunluğunda olduğunu ve ardından beklenen veri boyutunun olduğunu varsaymak güvenli midir?

Örneğin, PDOL 9F66049F02069F37049F1A02 2 bayt etiketleri ve veri değerinin beklenen uzunluğu için 1 bayt vb 9F66 04, 9F02 06, her ayrılır.

Ayrıştırma sırasında her etiketin 2 bayt uzunluğunda olduğunu varsaymak güvenli midir?

+0

PDOL ayrıştırma işlemini tamamladınız mı? – Olivarsham

+1

@Olivarsham Test ettiğimiz kartların sadece PDOL için 2 baytlık etiket kullanmasıyla 2 baytlık bir kullanım sürdük.Michael Rolands'ın yanıtı kesinlikle bir etiketin uzunluğunu nasıl belirleyeceğimizi bilmemize yardımcı oldu ("Bir sonraki etiket baytının üst biti bir tane ise" (tag [i] & 0x080 == 0x080) ise, etiket bir tane daha bayttan oluşur. Bu sonraki her byte için tekrar edilir ") İşte bir PDOL ayrıştırma hakkında daha fazla bilgi edinmek için iyi bir kaynaktır. http://www.openscdp.org/scripts/tutorial/emv/initiateapplicationprocess.html EMV işlemlerinin: http://www.openscdp.org/scripts/tutorial/emv/index.html –

+0

Test ettiğimiz kartların bazıları yalnızca iki bayta sahip olan 9505, 9A03 ve 9C01 etiketlerine sahiptir. PDOL için ayrı bir ayrıştırıcı yazmam gerekiyor gibi görünüyor. Neyse, teşekkürler! – Olivarsham

cevap

6

Hayır, her etiketin iki bayt olmasını bekleyemezsiniz (çoğu etiketin yaptığı gibi). EMV'deki Tag-Length-Value (TLV) yapıları ASN.1 kodlama kurallarını (temel kodlama kuralları, BER) takip eder. Daha fazla bilgi için aşağıdaki belgeleri bakınız:

ikincisi beni başlarken yardımcı gerçekten iyi bir giriştir.

(veri nesnesi) bir etiket değeri, bir uzunluk değeri, ve bir veri yükü (değer) oluşur

bir TLV yapısı :

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

PDOL (ve herhangi bir başka veri nesnesi listesi, DOL) içeren etiket ve bir veya daha fazla böyle veri nesnesinin uzunluk kısmı. Benzer şekilde, PDOL ile ilgili veriler, PDOL'de başvurulan DO'lerin değer bölümlerini içerir. Her ikisi de, etiket ve uzunluk kısmı bir veya daha fazla bayttan oluşabilir. etiket kısmı için

, kurallar böyle üzeresiniz (daha fazla detay yukarıdaki referanslara bakınız):

  • ilk etiket byte alt 5 bitleri daha sonra, (tag[0] & 0x01F == 0x01F) Tüm olanlar ise etiketi en az iki bayttan oluşur.
  • Bir sonraki etiket baytının üst biti bir (tag[i] & 0x080 == 0x080) ise, etiket bir bayttan oluşur. Bu her bir sonraki bayt için tekrarlanır. uzunluk bölümü için

, kurallar, bu gibi ilgili olan (daha fazla ayrıntı bakınız yukarıdaki referanslar için) birinci uzunluk byte üst bit sıfır (length[0] & 0x080 == 0) ise

  • , daha sonra kalan yedi bit uzunluk değerini kodlar (length[0] & 0x07F).
  • İlk uzunluk baytının üst biti bir (length[0] & 0x080 == 0x080) ise, kalan yedi bit uzunluk bölümünün kalan bayt sayısını (length[0] & 0x07F) kodlar. Kalan baytlar, ilk önce MSB ile uzunluk değerini işaretsiz tamsayı olarak gösterir.
+1

ASN'deki linkler için teşekkürler. Düzenli TLV veri nesneleri için TLV kod çözücüm var, ancak DOL'leri etiketlemek ve uzunluğunu ayarlamak için uyarlamakta sorun yaşıyorum. 'Uzunluk bölümü', benim bölümümde biraz okuma gerektiriyor. Yardım ettiğin için teşekkür ederim. –