TLV (Type Length Value / Tag Length Value) je način kodiranja podataka. Ovo kodiranje se često koristi kod pametnih kartica, pogotovo platnih ili EMV kartica. Kako su podaci na tim karticama sačuvani u određenim data grupama kao niz bajtova i imaju jako ograničen prostor. TLV kodiranje je tu idealno, ne mora se zauzimati fiksna dužina za podatke koji su promijenjive dužine, kao na primjer ime ili prezime osobe. Da skratim teoriju, jedan TLV izgleda ovako:
OC 09 64 72 61 67 61 6E 2E 62 61
Obični niz bajtova zapisan heksadecimalno. U ovom slučaju, prvi bajt [OC
] predstavlja oznaku (eng. tag) odnosno vrstu podataka u ovome TLV-u. Tag može zauzimati i više od jednog bajta, to zavisi od nacina kodiranja i po pravilu se moze utvrditi iz prvog bajta. Drugi bajt [09
] predstavlja dužinu (eng. length), to znači da nakon njega dolazi 9 bajtova [64 72 61 67 61 6E 2E 62 61
] koji predstavljaju vrijednost podataka (eng. value) za ovaj tag.
Moguće je upisati više TLV-ova, jedan do drugog, u jednu data grupu. Tako i u Value od jednog TLV-a se može nalaziti više drugih TLV-ova.
ASN.1 Primjer
ASN.1 (Abstract Syntax Notation One) je jezik za opisivanje strukture podataka. Neka su struktura i konkretan podatak definisani ovako:
ASN.1 struktura
Sequence
{
Name::= UTF8 String
Id::= Integer
Vegetarian::= Boolean OPTIONAL
Smoker::= [0] Boolean OPTIONAL
}
ASN.1 TLV tagovi
30 : Sequence
OC : UTF8 String
02 : Integer
01 : Boolean
ASN.1 podatak
Sequence
{
Name::= "dragan.ba"
Id::= "30"
Vegetarian::= "false"
Smoker::= "false"
}
Odgovarajući TLV za ovaj podatak bi izgledao ovako:
30 14
OC 09 64 72 61 67 61 6E 2E 62 61
02 01 1E
01 01 00
80 01 00
U ovom slučaju prvi bajt [30
] je tag koji po definiciji označava da se radi o sekvenci. Drugi bajt [14
] je dužina sekvence. Ako se čudite kako 14, polako objasniću.
U value polju se nalazi ta sekvenca TLV-ova. Prvi sa tagom OC
, po definiciji je to string/text dužine 09
bajtova. I stvarno kada se heksadecimalno 64 72 61 67 61 6E 2E 62 61
pretvori u ASCII dobijamo tekst “dragan.ba“. Naredni tag je 02
integer/broj, dužine 01
i vrijednosti 1E
što je decimalni broj 30. Tag 01
je boolean duzine 01
i vrijednosti 00
(false). Naredni tag je 80
i ima istu vrijednost kao i prethodni.
Za dužinu piše da je 14, ali treba obratiti pažnju da je 14 hexadecimalno = 20 decimalno, što znači da sekvenca ima 20 bajtova u Value polju. Da bi se podaci mogli pravilno parsirati dužina mora biti tačna, brza provjera:
[tag + length + data]
(OC) 1 + 1 + 9 = 11
(02) 1 + 1 + 1 = 3
(01) 1 + 1 + 1 = 3
(80) 1 + 1 + 1 = 3
-------------------
+ = 20
Sve ove konverzije možete jednostavno provjeriti sa ASCII, Hex, Decimal, Binary and Base64 converter.
Puno jednostavniji primjer
UPOZORENJE: Sljedeći tekst otkriva neke vještine koje se mogu zloupotrijebiti i koristiti u ilegalne svrhe. Nemojte biti kriminalci.
Pomoću čitača kartica i aplikacije koja može poslati APDU komande na karticu, poslao sam komandu: 00 A4 0400 07 A0000000041010 00
.
[ CLA:00
| INS:A4
| P1P2:0400
| Lc:07
| DATA:A0000000041010
| Le:00
]
Odgovor je: 6F1A8407A0000000041010A50F500A4D617374657243617264870101 9000
[ DATA: 6F1A8407A0000000041010A50F500A4D617374657243617264870101
| SW:9000
]
Nikakve koristi od ovoga, za one koji nikada nisu čuli za TLV. Za ostale idemo redom, 6F
je tag koji označava Application class – Primitive data object po pravilu kodiranja tagova. Naredni bajt 1A
je dužina, to je 26 decimalno, znači do kraja. Sada kada se sadržaj podataka pretvori u text dobijamo informacije o kakvoj se kartici radi.
BONUS: Ako ima neko da je dešifrovao ove hijeroglife u prvom redu ili ako nekoga zanima kako se ovo dešifruje, neka me kontaktira.
Čitaj dalje: Biometrijski pasoši (ePassports)