2013-10-10 19 views
6

Bir ISO/IEC 14443 Type A kartından bazı bilgileri okuyamaya çalışıyorum.Android NFC IsoDep dosya içeriğini oku

Android uygulaması NFC TagInfo ile kartı analiz ettikten sonra, uygulamanın (AID: 15845F) ihtiyacım olan belirli bir dosyaya (Dosya ID: 01) sahip olduğunu öğrendim.

Zaten karta bağlanmayı ve uygulamayı seçmeyi başardım.

String action = getIntent().getAction(); 
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) 
{ 
    Tag tagFromIntent = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    Log.i(TAG, Arrays.toString(tagFromIntent.getTechList())); 

    IsoDep isoDep = IsoDep.get(tagFromIntent); 
    try 
    { 
     isoDep.connect(); 

     byte[] SELECT = { 
      (byte) 0x00, // CLA = 00 (first interindustry command set) 
      (byte) 0xA4, // INS = A4 (SELECT) 
      (byte) 0x04, // P1 = 04 (select file by DF name) 
      (byte) 0x0C, // P2 = 0C (first or only file; no FCI) 
      (byte) 0x06, // Lc = 6 (data/AID has 6 bytes) 
      (byte) 0x31, (byte) 0x35,(byte) 0x38,(byte) 0x34,(byte) 0x35,(byte) 0x46 // AID = 15845F 
     }; 

     byte[] result = isoDep.transceive(SELECT); 
     Log.i(TAG, "SELECT: " + bin2hex(result)); 

     if (!(result[0] == (byte) 0x90 && result[1] == (byte) 0x00)) 
      throw new IOException("could not select application"); 

     byte[] GET_STRING = { 
      (byte) 0x00, // CLA Class 
      (byte) 0xB0, // INS Instruction 
      (byte) 0x00, // P1 Parameter 1 
      (byte) 0x00, // P2 Parameter 2 
      (byte) 0x04 // LE maximal number of bytes expected in result 
     }; 

     result = isoDep.transceive(GET_STRING); 
     Log.i(TAG, "GET_STRING: " + bin2hex(result)); 
    } 
} 

Ancak ikinci sorgum hata koduyla başarısız oluyor: 6A86 (Yanlış parametreler P1-P2). Zaten çok googled ve farklı belgeler (örneğin: http://bit.ly/180b6tB) bulundu, ama sadece anlayamadım, P1 ve P2 için doğru değerleri nasıl uygulayabilirim. NFC TagInfo kullanılarak kartın


DÜZENLEME

Etiket türü: ISO/IEC 14443-4 Akıllı Kart, Mifare DESFire EV1 (MF3ICD81)

SEÇ komutu kullanılan Kaynak kod aslında başarısız olmadı, ancak bunun yerine 9000 yanıt verdi. Bu yüzden her şeyin yolunda olduğunu düşündüm.

Sen NFC TagInfo DF-adları vb doğru değerleri sağlamadığını Verilen değer 0x313538343546 doğru mu ve bunu nasıl öğrendin?

Bana kısa tanımını sağlayabilir misiniz, istediğiniz verileri nasıl alabilirim? Doğru DF-isimlerini, AID'leri okumak için kullanabileceğim başka bir android uygulaması var mı? Temel olarak ONE uygulamasının ONE dosyasını almam gerekiyor. Gerekirse, NFC TagInfo ile toplanan bilgilerin bazı ekran görüntülerini de sağlayabilirdim.


(Önerilen gibi) komutları yeniden yazılabilir, ama 2

DÜZENLEME APDU sargı bunları muhafaza. Bu nedenle, biri uygulamasının ve diğeri dosyasının dosyasının seçimi için iki farklı komutu vardır.

private final byte[] NATIVE_SELECT_APP_COMMAND = new byte[] 
{ 
    (byte) 0x90, (byte) 0x5A, (byte) 0x00, (byte) 0x00, 3, // SELECT 
    (byte) 0x5F, (byte) 0x84, (byte) 0x15, (byte) 0x00  // APPLICATION ID 
}; 
private final byte[] NATIVE_SELECT_FILE_COMMAND = new byte[] 
{ 
    (byte) 0x90, (byte) 0xBD, (byte) 0x00, (byte) 0x00, 7, // READ 
    (byte) 0x01,           // FILE ID 
    (byte) 0x00, (byte) 0x00, (byte) 0x00,     // OFFSET 
    (byte) 0x00, (byte) 0x00, (byte) 0x00,     // LENGTH 
    (byte) 0x00 
}; 

yerli Mifire-DesFire komutları için bir öğretici arayışı başarılı olmadı, bu yüzden aşağıdaki öğretici sopa: http://noobstah.blogspot.de/2013/04/mifare-desfire-ev1-and-android.html

Bu öğretici bir kart doğrulama, ben özürlü sağlar ve ayrıca kullandığı Anlayışım için yerel komutları yürütmek için uygun bir yol olmayan transceive yöntemi? Yerel komutları yürütmek için hangi yöntem, hatta kod snippit'i kullanılır? Hangi Android Sınıfını kullanmalıyım?

Öğreticide sağlanan sınıfı yeniden yazdım ve pastebin'a yükledim. Sınıfı çalıştırdıktan sonra aşağıdaki sonuçları elde ettim.

Select APPLICATION: 9100 
Read DATA: 91AE 

Bu noktada oldukça sıkışıp kaldım ve sonra ne yapmam gerektiğini bilmiyorum. Aslında istediğim verileri almak için hata mıydı, yoksa sorgularda ne gibi değişiklikler yapmalıydım?

cevap

8

NFC TagInfo'dan aldığınız bilgiler ve kullanmaya çalıştığınız komutlar verildiğinde, kartın MIFARE DESFire EV1 olduğunu varsayalım. Doğru?

Seçim komutunuzla ilgili olarak: NFC TagInfo şu anda DESFire EV1 için ayarlanmış olan ISO komutunda kullanılan DF adı değerini okumaz. Bu nedenle, bu uygulama için kurulum DF-adı aslında 0x313538343546 olduğunu varsayalım, aksi takdirde SELECT komutu başarısız olmalıdır. Bununla birlikte, bu değerin hiçbir şekilde NFC TagInfo'da gösterilen DESFire AID'den elde edilemeyeceğini unutmayın. Aslında, DF-adı, uygulama oluşturma sırasında tanımlanan ayrı bir değerdir. (Bu, önceki DESFire sürümünden farklıdır.)

READ BINARY komutunuzla ilgili olarak: Kullandığınız komut daha önce bir dosya seçtiğinizi gösterir. Ancak, sadece uygulamayı seçtiniz.

byte[] READ_BINARY = { 
     (byte) 0x00, // CLA Class 
     (byte) 0xB0, // INS Instruction 
     (byte) 0x80, // P1 (indicate use of SFI) 
     (byte) 0x01, // P2 (SFI = 0x01) 
     (byte) 0x04 // LE maximal number of bytes expected in result 
}; 
Ancak

o DESFire (EV1) gelince, ben öneririz: Böylece, veri dosyası için bir SEÇ komutu veya İKİLİYİ_OKU komutu içinde kısa dosya kimliğini kullanmak gerekir ya ISO 7816-4 APDU'larını kullanmak yerine DESFire yerel komut setine (doğrudan veya sarılmış) yapışmayı tercih edersiniz.

Yerel komut kümesiyle MIFARE DESFire'ın tam işlevselliğini elde edersiniz. Komut sarma, yerel DESFire komutlarını ISO 7816-4 APDU yapısına yerleştirerek yapılır. sarma komut şuna benzer:

CMD DESFire komuta ve CMD-PARAM yerli
0x90 CMD 0x00 0x00 LEN CMD-PARAM 0x00 

komutları parametrelerdir. Yanıt şu şekildedir: Durum, yerel DESFire durum kodudır. DURUM 0xAF ise, bu komutu vererek kalan yanıt verilerini elde edebilirsiniz:

sizin durumunuzda Yani
0x90 0xAF 0x00 0x00 0x00 

, siz (uygulamanıza 0x15845F için seçkin bir uygulama komutu farklı bayt sırasını sorun olur!): Sonra

0x90 0x5A 0x00 0x00 3 0x5F 0x84 0x15 0x00 
    |SELECT|   |APPLICATION ID| 

, sen (tüm dosya veri dosyası 0x01 okumak istiyorum, başlar) ofset 0:

0x90 0xBD 0x00 0x00 7 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 
    |READ|   |FILE| OFFSET | LENGTH | 

nasıl ISO DF adları almanın ve sorunuzu İlişkin ISO Fıd'lerin uygulamanız için, aşağıdaki komutları deneyebilirsiniz:

seç usta uygulaması:

905A00000300000000 
Onların DF adları dahil

alın uygulamalar:

906D000000 

başvurunuzu seçin:

905A0000035F841500 

alın DESFire Fıd'lerin:

906F000000 

alın ISO Fıd'lerin:

9061000000 

Her zaman IsoDep nesnesinin transceive() yöntemini kullanabilirsiniz. IsoDep (yani ISO/IEC 14443-4) zaten kullanılır (yerel DESFire komutları, sarılmış yerel komutlar ve ISO 7816-4 komutları için).

Karttan (0xAE) alınan hata kodu bir kimlik doğrulama hatasını gösterir (daha fazla bilgi için bu veri sayfasına bakın: DESFire). Böylece, dosya sadece kimliği doğrulanmış okumaya izin verir (NFC TagInfo'da gösterilen erişim koşullarına bakın). Bu dosyayı okumak için, kimlik doğrulama prosedürünü uygulamanız gerekecektir.

+0

Hızlı yanıt için teşekkürler! Gönderiyi yeni düzenledim ve en altta ek bilgi var. – Vilius

+0

Yardımlarınız için teşekkürler, ancak hala takıldım ve yayınımı düzenledim ve daha fazla bilgi verdim. – Vilius

+0

Cevabı güncelledim. Maalesef, kimlik doğrulama prosedürünü uygulamanızda size yardımcı olamam. –

İlgili konular