Tuesday, December 29, 2009

Mengetahui ATR SmartCard dengan C Sharp


ATR kepanjangan dari Answer-To-Reset, merupakan data yang dikirim setelah berhasil melakukan koneksi ke Smartcard. Dengan mengetahui ATR nya, kita bisa tahu jenis dari smartcard yang sedang kita akses. Tetapi beberapa kali mencoba dengan C# kok tetap nggak dapat ATRnya ya ? .. perlu usaha lebih keras ? atau kurang tepat menggunakan fungsinya?

Berikut adalah daftar ATR dari beberapa Smartcard:

3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A
Philips MIFARE Standard (1 Kbytes EEPROM)
http://www.nxp.com/products/identification/mifare/classic/
RFID - ISO 14443 Type A - Transport for London Oyster
ACOS5/1k Mirfare

3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 02 00 00 00 00 69
Mifare card with 4k EEPROM

3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68
Contactless Mifare Ultralight

3B D0 A8 FF 81 F1 FB 24 00 1F C3 F4
Philips DESFire SAM

3B DE 18 FF 81 F1 FB 34 00 1F 07 44 45 53 46 69 72 65 53 41 4D 56 31 2E 30 D2
Mifare Desfire SAM Module

3B F7 91 00 FF 91 81 71 FE 40 00 41 20 00 11 77 81 80 40
Contactless Mifare DESFire

3B F8 18 00 00 81 31 FE 45 00 73 C8 40 00 00 90 00 80
NXP JCOP 31 V2.2 36K - S/C I/F

3B F9 18 00 00 81 31 FE 45 39 35 32 38 35 30 31 33 31 DA
JCOP31 / 72B1 V2.2 (4096 RSA key support)
Smartcard Dual Interface JCOP31 with 72KB EEPROM and V2.2 Java Card Open Platform

3B F9 18 00 00 81 31 FE 45 4A 43 4F 50 32 31 56 32 32 A9
NXP JCOP 21 V2.2 36K

3B F9 18 00 00 81 31 FE 45 4A 43 4F 50 33 31 56 32 32 A8
JCOP31 / 72B1 V2.2
Smartcard Dual Interface JCOP31 with 72KB EEPROM and V2.2 Java Card Open Platform

lebih banyak lagi, anda bisa melihat di sini

Beberapa kali mencoba untuk mendapatkan ATR dari smartcard yang ada, gagal. Tetapi akhirnya berhasil. Dan untuk solusi yang didapatkan adalah menggabungkan metode UnManage memory dari C#.
Anda bisa melengkapi program untuk smartcard sebelumnya dan menambahkan beberapa yang kurang dari rutin-rutin dibawah ini.

ATR berhasil diambil dengan menggunakan fungsi SCardStatus dari winscard dengan deklarasi import sebagai berikut:
[DllImport("winscard.dll")]
private static extern int SCardStatus(int hCard, string szReaderName, 
            out int pcchReaderLen,
            out int pdwState,
            out int pdwProtocol,
            IntPtr pbAtr,
            out int pcbAtrLen);


Sedangkan definisi dari fungsi yang mengambil ATR seperti dibawah ini:
private void btnConnect_Click(object sender, EventArgs e)
{
    int ret;
    String reader;
    int readerlen;
    int card_state;
    int card_protocol;
    IntPtr atrptr;
    byte[] card_atr;
    int card_atrlen;
    
    
    reader = listReaders.SelectedItem.ToString();
    ret = SCardConnect(hContext, reader, SCARD_SHARE_EXCLUSIVE, 
                       SCARD_PROTOCOL_T0 |SCARD_PROTOCOL_T1, out hCard,  
                       out ActiveProtocol);
    ret = SCardStatus(hCard, reader, out readerlen, out card_state, 
                       out card_protocol,  
                      IntPtr.Zero, out card_atrlen);
    atrptr = Marshal.AllocHGlobal(card_atrlen);
    ret = SCardStatus(hCard, reader, out readerlen, out card_state, 
                      out card_protocol, atrptr,  
                      out card_atrlen);

    card_atr = new byte[card_atrlen];
    Marshal.Copy(atrptr, card_atr, 0, card_atrlen);
    Marshal.FreeHGlobal(atrptr);    
}
ATR disimpan di variable card_atr

Ok, Selamat Mencoba!!!



1 comments:

Skyline College said...
This comment has been removed by a blog administrator.

Post a Comment