Kartu pintar. Bagian 3. TLV

Halo Giktayms!

Pada bagian terakhir, kami melihat bagaimana komunikasi terjadi antara terminal dan kartu. Kami melihat format C-APDU dan R-APDU, tetapi kami tidak memperhatikan data apa yang terkandung dalam APDU ini. Pada bagian ini, kami akan mempertimbangkan format yang paling umum di mana informasi dikirim antara terminal dan kartu (dan sebaliknya). Semuanya milik satu keluarga - TLV.

TLV adalah singkatan dari T ag, L ength, V alue dan digunakan untuk menyusun informasi. Pada tingkat yang sangat abstrak, TLV dapat dianggap sebagai versi biner dari XML. Namun, apa itu Tag, Panjang, Nilai?

  • Tag : dikatakan jenis informasi apa di TLV. Tampilan dapat berupa, misalnya, garis atau angka sederhana, pengidentifikasi, atau bahkan struktur yang kompleks. Dalam beberapa perwujudan, Tag juga berisi meta-informasi tentang TLV.
  • Panjang : panjang, dalam byte, dari elemen Nilai.
  • Nilai : data yang terkandung dalam TLV

Setiap varian TLV memiliki aturan penyandian sendiri untuk setiap elemen. Selanjutnya, kita akan melihat opsi TLV yang paling umum. Saya ingin segera mencatat bahwa artikel ini terutama akan ditujukan untuk BER-TLV, karena ini adalah format yang paling luas, fleksibel dan kompleks. Opsi TLV lainnya hanya akan dipertimbangkan secara singkat.

BER-TLV


Jadi, kita berbicara tentang karakter utama dari artikel ini - BER-TLV. Ini adalah bagian dari standar ASN.1 dan digunakan tidak hanya di bidang kartu pintar.

Menandai

Byte pertama tag memiliki format berikut:
b8b7b6b5b4b3b2b1
KelasSebuah tipeMenandai

Kelas-kelas berikut ada:
b8b7Deskripsi
00Generik - Tipe data dasar, seperti data string atau angka. Jarang digunakan dalam kartu pintar.
01Diterapkan - jenis yang maknanya bervariasi tergantung pada aplikasi
10Context-sensitive - tipe yang artinya tergantung pada tipe komposit yang diberikan
11Pribadi - tipe yang artinya tergantung pada organisasi tertentu

Karena spesifikasi menggambarkan nilai penuh tag, mengingat nilai kelas benar-benar berlebihan. Kelas tidak mempengaruhi bagaimana tag akan diproses.

Yang paling menarik adalah bit 6. Ketika 1, maka TLV ini berisi TLV lainnya. Sebaliknya, jika nilainya 0, maka TLV berisi data sederhana atau data yang tidak terstruktur dalam format TLV.

Bit yang tersisa (5-1) biasanya hanya nomor tag. Namun, jika semuanya unit, maka nomor tag berlanjut pada byte kedua. Jika bit8 dari byte kedua adalah 1, maka angkanya berlanjut pada byte ketiga, dll. Dalam praktiknya, kartu pintar hanya menggunakan tag yang ditulis pada satu atau dua byte.

Panjangnya

Panjangnya bisa pasti dan tidak terbatas.

Panjang tidak terbatas ditulis pada satu byte dengan nilai 0x80. Metode ini hanya berlaku untuk TLVs komposit (mis. TLVs yang mengandung TLVs lainnya). Dalam hal ini, TLV harus mengandung TLV-NULL sebagai elemen terakhir, yang dikodekan sebagai "00 00". Metode serupa sering digunakan dalam standar yang lebih modern, tetapi, secara umum, itu tidak terlalu umum.

Panjang spesifik ditulis pada satu atau lebih byte.
Panjang dataCoding
0x00 <= x <= 0x7Fnilainya ditulis tidak berubah pada satu byte
0x80 <= x <= 0xFF0x81 dan nilai pada byte kedua
0x100 <= x <= 0xFFFF0x82 dan nilai pada byte kedua dan ketiga
0x10000 <= x <= 0xFFFFFF0x83 dan nilai pada tiga byte berikutnya
0x1000000 <= x <= 0xFFFFFFFF0x84 dan nilai pada empat byte berikutnya

Pada prinsipnya, tabel ini bisa dilanjutkan lebih lanjut. Namun, TLV besar tidak ditemukan di bidang kartu pintar. Panjang yang direkam pada lebih dari tiga byte (termasuk awalan 0x82), saya pribadi belum melihat. Nilai selalu ditulis dalam format Big Endian.

Harap dicatat bahwa dalam kartu pintar metode ini panjang rekaman sering digunakan bahkan di luar TLV (yaitu hanya LV), tetapi, sebagai suatu peraturan, dengan pengecualian bahwa nilai 0x80 juga dapat ditulis sebagaimana adanya, pada satu byte.

Nilai

Nilai dapat berupa urutan TLV atau hanya byte, artinya tergantung pada konteks dan aplikasi. Tidak dapat diterima untuk mencampur kedua jenis data dalam TLV yang sama. TLV yang terkandung dalam senyawa TLV dapat berupa apa saja - senyawa atau sederhana. Elemen ini hilang ketika panjang TLV adalah 0.

Contohnya

AID (Pengenal Aplikasi)
4F 08 A0 00 00 01 51 00 00 00

Tag 0x4F: TLV aplikasi sederhana, dalam contoh ini berisi 8 byte (nilainya adalah Application Identifier, mis. Pengenal aplikasi).

Keadaan siklus hidup
9F70 01 0F

Tag 0x9F70: TLV sensitif konteks sederhana, dalam contoh ini berisi 1 byte. Perhatikan bahwa pada byte pertama tag (9F), bit 5-1 adalah semua unit, sehingga tag berlanjut pada byte berikutnya.

Muat blok data file
C4 82 0x01 0x0c 01 ... 266 byte lainnya ... 0a

Tag 0xC4: TLV pribadi sederhana, dalam contoh ini, berisi 268 byte. Panjangnya ditulis dalam tiga byte, yang pertama adalah awalan 0x82.

Data terkait GlobalPlatform Registry
E3 11 4F 08 A0 00 00 01 51 00 00 00 9F70 01 0F C5 01 00

Tag 0xE3: TLV pribadi komposit yang mengandung TLV lain. Dalam contoh ini, hanya berisi TLV sederhana. Juga diizinkan bahwa suatu senyawa TLV atau campuran senyawa dan sederhana terkandung.

Secara teoritis, ini juga dapat ditulis sebagai
E3 80 4F 08 A0 00 00 01 51 00 00 00 9F70 01 0F C5 01 00 00 00

menggunakan panjang yang tidak terbatas. Namun dalam praktiknya, kartu hanya menerima (atau mengirim) panjang tidak terbatas ketika diizinkan oleh spesifikasi.

KOMPREHENSI-TLV


COMPREHENSION-TLV dijelaskan dalam standar ETSI TS 101 220. Panjangnya dikodekan dengan cara yang sama seperti untuk BER-TLV. Tag dikodekan menurut tabel berikut:

Pada satu byte (0x01 - 0x7E)
b8b7b6b5b4b3b2b1
CRMenandai

Pada tiga byte (0x0001 - 0x7FFF)
Byte 1Byte 2Byte 3
b8-b1b8b7b6b5b4b3b2b1b8-b1
0x7FCRMenandai


Akronim CR adalah kependekan dari Comprehension Required. Ketika bit ini adalah 1, maka penerima TLV harus mengembalikan kesalahan jika tidak mendukung TLV ini. Sebaliknya, jika itu adalah 0, maka penerima berhak untuk mengabaikan TLV jika tidak didukung.

Aplikasi utama COMPREHENSION-TLV adalah transfer parameter ke SIM-Toolkit (SIM-Toolkit digunakan, antara lain, untuk Menu-SIM di ponsel). Untuk meningkatkan kompatibilitas antara kartu dan ponsel, parameter opsional (mis., Parameter yang tanpanya Anda setidaknya dapat menjalankan perintah) dikirim dengan CR = 0.

SIMPLE-TLV


SIMPLE-TLV dijelaskan dalam ISO7816-4. Tidak seperti BER-TLV di SIMPLE-TLV, tag hanyalah angka antara 0x01 dan 0xFE, yang tidak mengandung informasi tentang kelas dan jenisnya. Panjangnya ditulis sebagai berikut:
Panjang dataCoding
0x00 <= x <= 0xFEnilainya ditulis tidak berubah pada satu byte
0xFF <= x <= 0xFFFF0xFF dan nilai pada byte kedua dan ketiga


DGI (Pengelompokan Pengelompokan Data)


DGI dijelaskan dalam Spesifikasi Kartu Platform Global dan Spesifikasi Bahasa Scripting Sistem GP. Tag selalu dikodekan pada dua byte dan tidak mengandung informasi meta apa pun. Panjangnya direkam dengan cara yang sama seperti untuk SIMPLE-TLV. DGI sering mengandung BER-TLVs, tetapi bisa sederhana.

COMPACT-TLV


COMPACT-TLV dijelaskan dalam ISO7816-4 dan digunakan secara eksklusif dalam ATR (Answer to Reset). Dalam format ini, tag dan panjangnya ditulis dalam byte yang sama. Tag ditulis dalam nibble yang lebih tua, dan panjangnya ditulis dalam minor.

Jadi kita telah sampai pada bagian akhir ini. Jika ada yang punya pertanyaan, Anda bisa menuliskannya di komentar. Bagian selanjutnya dari artikel ini adalah tentang JavaCard, dan setelah itu kita akan berbicara langsung tentang Platform Global.

Artikel selanjutnya


Bagian 1. Prinsip Operasi
Bagian 2. APDU

All Articles