Android NFC IsoDep odczytać zawartość pliku

Próbuję odczytać informacje z karty ISO/IEC 14443 Type a.

Po przeanalizowaniu karty za pomocą aplikacji na Androida NFC TagInfo , dowiedziałem się, że aplikacja (pomoc: 15845F) ma konkretny plik (ID pliku: 01), którego potrzebuję.

Udało mi się już podłączyć do karty i wybrać aplikację.

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));
    }
}

Ale moje drugie zapytanie nie powiodło się z kodem błędu: 6A86 (nieprawidłowe parametry P1-P2). Ja już dużo googlowałem i znalazłem różne dokumentacje (na przykład: http://bit.ly/180b6tB ), ale po prostu nie mogłem zrozumieć, jak Mogę zaimplementować odpowiednie wartości dla P1 i P2 .


EDIT

Typ znacznika karty używając NFC TagInfo : karta inteligentna ISO / IEC 14443-4, Mifare DESFire EV1 (MF3ICD81)

Polecenie SELECT użyte w kodzie źródłowym nie zawiodło, ale zamiast tego zwróciło odpowiedź 9000. Dlatego założyłem, że wszystko działa. dobrze.

Wspomniałeś, że NFC TagInfonie dostarcza poprawnych wartości dla nazw DF itp. Czy wartość 0x313538343546 jest poprawna i jak się o tym dowiedziałeś?

Czy możesz podać mi krótki Opis, Jak mogę uzyskać dane, które chcę? Czy są jakieś inne aplikacje na Androida, których mogę użyć, aby odczytać odpowiednie nazwy DF, Pomoce itp.? W zasadzie potrzebuję jednego pliku z jednej aplikacji. Mogę również dostarczyć kilka zrzutów ekranu informacji zebranych za pomocą NFC TagInfo , w razie potrzeby.

EDIT 2

Przepisałem polecenia, ale (zgodnie z Twoją propozycją) trzymałem je w opakowaniu APDU. W związku z tym miałem dwie różne komendy, jedną do wyboru aplikacji , a drugą do wyboru pliku .

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
};

Wyszukiwanie samouczka dla natywnych poleceń Mifire-Desfire nie powiodło się, więc trzymam się poniższego samouczka: http://noobstah.blogspot.de/2013/04/mifare-desfire-ev1-and-android.html

Ten tutorial zawiera uwierzytelnianie kart, które wyłączyłem, a także używa metodytransceive , która dla mojego zrozumienia nie jest właściwym sposobem wykonywania natywnych poleceń? Która metoda, purhaps nawet code snippit, jest używana do wykonywania natywnych poleceń? Z której klasy Androida powinienem korzystać?

Przepisałem klasę podaną w tutorialu i wgrałem ją do pastebin . Po wykonaniu zajęć mam następujące wyniki.

Select APPLICATION: 9100
Read DATA: 91AE

W tym momencie jestem dość zablokowany i nie wiem, jakie kroki powinienem zrobić dalej. Czy rzeczywiście jest błąd, a raczej jakie zmiany w zapytaniach powinienem wykonać, aby uzyskać dane, które chcę?

Author: Michael Roland, 2013-10-10

1 answers

Biorąc pod uwagę informacje wydobyte z NFC TagInfo i polecenia, które próbujesz użyć, zakładam, że karta jest Mifare DESFire EV1. Zgadza się?

Regarding your selection command: NFC TagInfo nie odczytuje aktualnie wartości DF name używanej w ISO command set dla DESFire EV1. Tak więc, zakładam, że DF-name, który jest ustawiony dla tej aplikacji jest w rzeczywistości 0x313538343546, w przeciwnym razie polecenie SELECT powinno zawieść. Należy jednak pamiętać, że wartość ta w żaden sposób nie wynika z DESFire pomoc pokazane w NFC TagInfo! W rzeczywistości DF-name jest oddzielną wartością zdefiniowaną podczas tworzenia aplikacji. (Różni się to od poprzedniej wersji DESFire.)

Odnośnie polecenia READ BINARY: polecenie, którego użyłeś, sugerowałoby, że wcześniej wybrałeś plik. Jednak wybrałeś tylko aplikację. W związku z tym należy albo wydać polecenie SELECT dla pliku danych, albo użyć krótkiego identyfikatora pliku w poleceniu read BINARY:

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
};

Jednakże, gdy jeśli chodzi o DESFire (EV1) sugeruję raczej trzymać się natywnego zestawu poleceń DESFire (bezpośredniego lub zawiniętego) zamiast używać APDU ISO 7816-4.

Z natywnym zestawem poleceń, otrzymujesz pełną funkcjonalność Mifare DESFire. Owijanie poleceń odbywa się poprzez osadzenie natywnych poleceń DESFire w strukturze APDU ISO 7816-4. Polecenie zawijania wygląda tak:

0x90 CMD 0x00 0x00 LEN CMD-PARAM 0x00

Gdzie CMD jest natywnym poleceniem DESFire, a CMD-PARAM są parametrami poleceń. Odpowiedź jest:

[DATA] 0x91 STATUS

Gdzie status jest natywnym kodem statusu DESFire. Jeśli STATUS to 0xAF, możesz uzyskać pozostałe dane odpowiedzi, wydając to polecenie:

0x90 0xAF 0x00 0x00 0x00

Więc w Twoim przypadku, wydasz polecenie select aplikacji dla Twojej aplikacji 0x15845F (pamiętaj o innej kolejności bajtów!):

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

Następnie chcesz odczytać plik danych 0x01 (cały plik, zaczynając od offsetu 0):

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

Odnośnie pytania jak uzyskać nazwy ISO DF i ISO FID dla w swojej aplikacji możesz wypróbować następujące polecenia:

Wybierz główną aplikację:

905A00000300000000

Pobierz aplikacje zawierające ich nazwy DF:

906D000000

Wybierz swoją aplikację:

905A0000035F841500

Get Desfire FIDs:

906F000000

Pobierz FIDs ISO:

9061000000

Zawsze można użyć metody transceive () obiektu IsoDep. IsoDep (tj. ISO / IEC 14443-4) jest używany tak czy inaczej (dla natywnych poleceń DESFire, dla zawiniętych poleceń natywnych i dla ISO 7816-4 polecenia).

Kod błędu otrzymany z karty (0xAE) wskazuje na błąd uwierzytelniania (więcej informacji można znaleźć w tym arkuszu danych: DESFire ). Tak więc plik umożliwia uwierzytelnione tylko do odczytu(Patrz warunki dostępu pokazane w NFC TagInfo).

Tak więc, aby odczytać ten plik, musisz zaimplementować procedurę uwierzytelniania.

 8
Author: Michael Roland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-16 09:49:12