Carte à puce. Partie 3. TLV

Bonjour Giktayms!

Dans la dernière partie, nous avons vu comment la communication se produit entre le terminal et la carte. Nous avons examiné les formats C-APDU et R-APDU, mais nous n'avons pas prêté attention aux données que contiennent ces APDU. Dans cette partie, nous considérerons les formats les plus courants dans lesquels les informations sont transmises entre le terminal et la carte (et vice versa). Tous appartiennent à une même famille - TLV.

TLV signifie T ag, L ength, V alue et est utilisé pour structurer l'information. À un niveau très abstrait, les TLV peuvent être considérés comme une version binaire de XML. Cependant, qu'est-ce que Tag, Length, Value?

  • Tag : il indique le type d'informations contenues dans le TLV. Une vue peut être, par exemple, une simple ligne ou un numéro, un identifiant ou même une structure complexe. Dans certains modes de réalisation, Tag contient également des méta-informations sur TLV.
  • Longueur : la longueur, en octets, de l'élément Value.
  • Valeur : données contenues dans TLV

Chaque variante TLV a ses propres règles de codage pour chaque élément. Ensuite, nous examinerons les options TLV les plus courantes. Je tiens à noter tout de suite que cet article sera principalement consacré au BER-TLV, car il s'agit du format le plus répandu, flexible et complexe. Les autres options TLV ne seront examinées que brièvement.

BER-TLV


Donc, nous parlons du personnage principal de cet article - BER-TLV. Cela fait partie de la norme ASN.1 et est utilisé non seulement dans le domaine des cartes à puce.

Étiquette

Le premier octet de la balise a le format suivant:
b8b7b6b5b4b3b2b1
ClasseUn typeÉtiquette

Les classes suivantes existent:
b8b7La description
00Générique - Types de données de base, tels que des données de chaîne ou des nombres. Rarement utilisé dans les cartes à puce.
01Appliqué - types dont la signification varie en fonction de l'application
10Sensible au contexte - types dont la signification dépend d'un type composite donné
11Privé - types dont la signification dépend d'une organisation spécifique

Étant donné que la spécification décrit la valeur complète de la balise, se souvenir de la valeur des classes est complètement superflu. La classe n'affecte pas la façon dont la balise sera traitée.

Le plus intéressant est le bit 6. Lorsqu'il vaut 1, ce TLV contient d'autres TLV. Si, au contraire, sa valeur est 0, alors le TLV contient des données simples ou des données qui ne sont pas structurées au format TLV.

Les bits restants (5-1) ne sont généralement que le numéro d'étiquette. Cependant, s'ils sont tous des unités, le numéro d'étiquette continue sur le deuxième octet. Si le bit8 du deuxième octet est égal à 1, le numéro continue sur le troisième octet, etc. En pratique, les cartes à puce n'utilisent que des balises écrites sur un ou deux octets.

Longueur

La longueur peut être définie et indéfinie.

Une longueur indéfinie est écrite sur un octet avec une valeur de 0x80. Cette méthode n'est valable que pour les TLV composites (c'est-à-dire les TLV contenant d'autres TLV). Dans ce cas, le TLV doit nécessairement contenir TLV-NULL comme dernier élément, qui est codé comme "00 00". Une méthode similaire est souvent utilisée dans les normes plus modernes, mais, en général, elle n'est pas très courante.

Une longueur spécifique est écrite sur un ou plusieurs octets.
Longueur des donnéesCodage
0x00 <= x <= 0x7Fla valeur est écrite inchangée sur un octet
0x80 <= x <= 0xFF0x81 et la valeur sur le deuxième octet
0x100 <= x <= 0xFFFF0x82 et la valeur sur les deuxième et troisième octets
0x10000 <= x <= 0xFFFFFF0x83 et valeur sur les trois octets suivants
0x1000000 <= x <= 0xFFFFFFFF0x84 et valeur sur les quatre octets suivants

En principe, ce tableau pourrait être poursuivi. Cependant, d'énormes TLV ne se trouvent pas dans le domaine des cartes à puce. La longueur enregistrée sur plus de trois octets (y compris le préfixe 0x82), personnellement, je ne l'ai pas vu. Les valeurs sont toujours écrites au format Big Endian.

Veuillez noter que dans les cartes à puce, cette méthode de longueur d'enregistrement est souvent utilisée même en dehors de TLV (c'est-à-dire uniquement LV), mais, en règle générale, à l'exception que la valeur 0x80 peut également être écrite telle quelle, sur un octet.

Valeur

La valeur peut être une séquence TLV ou simplement des octets, dont la signification dépend du contexte et de l'application. Il n'est pas acceptable de mélanger les deux types de données dans le même TLV. Les TLV contenus dans un TLV composé peuvent être de toute nature - composés ou simples. Cet élément est manquant lorsque la longueur du TLV est 0.

Exemples

AID (identifiant d'application)
4F 08 A0 00 00 01 51 00 00 00

Tag 0x4F: un TLV d'application simple, dans cet exemple contenant 8 octets (dont la valeur est Identifiant d'application, c'est-à-dire l'identifiant d'application).

État du cycle de vie
9F70 01 0F

Tag 0x9F70: un TLV contextuel simple, dans cet exemple contenant 1 octet. Notez que dans le premier octet de l'étiquette (9F), les bits 5-1 sont tous des unités, de sorte que l'étiquette continue sur l'octet suivant.

Charger le bloc de données du fichier
C4 82 0x01 0x0c 01 ... encore 266 octets ... 0a

Tag 0xC4: un TLV privé simple, dans cet exemple, contenant 268 octets. La longueur est écrite en trois octets, le premier étant le préfixe 0x82.

Données relatives au registre GlobalPlatform
E3 11 4F 08 A0 00 00 01 51 00 00 00 9F70 01 0F C5 01 00

Tag 0xE3: TLV privé composite contenant d'autres TLV. Dans cet exemple, seulement il contient des TLV simples. Il est également permis de contenir un TLV composé ou un mélange de composé et simple.

Théoriquement, cela pourrait aussi s'écrire
E3 80 4F 08 A0 00 00 01 51 00 00 00 9F70 01 0F C5 01 00 00 00

en utilisant une longueur indéfinie. En pratique, cependant, la carte n'accepte (ou n'envoie) qu'une longueur indéfinie lorsqu'elle est autorisée par la spécification.

COMPREHENSION-TLV


COMPREHENSION-TLV est décrit dans la norme ETSI TS 101 220. La longueur est codée de la même manière que pour le BER-TLV. La balise est codée selon les tableaux suivants:

sur un octet (0x01 - 0x7E)
b8b7b6b5b4b3b2b1
CRÉtiquette

Sur trois octets (0x0001 - 0x7FFF)
Octet 1Octet 2Octet 3
b8-b1b8b7b6b5b4b3b2b1b8-b1
0x7FCRÉtiquette


L'acronyme CR signifie Comprehension Required. Lorsque ce bit est à 1, le récepteur TLV doit renvoyer une erreur s'il ne prend pas en charge ce TLV. Si, au contraire, il est égal à 0, le récepteur a le droit d'ignorer le TLV s'il n'est pas pris en charge.

L'application principale de COMPREHENSION-TLV est le transfert de paramètres vers SIM-Toolkit (le SIM-Toolkit est utilisé, entre autres, pour le menu SIM dans les téléphones). Pour augmenter la compatibilité entre les cartes et les téléphones, les paramètres facultatifs (c'est-à-dire les paramètres sans lesquels vous pouvez au moins exécuter la commande) sont envoyés avec CR = 0.

SIMPLE-TLV


SIMPLE-TLV est décrit dans ISO7816-4. Contrairement au BER-TLV dans SIMPLE-TLV, une balise est simplement un nombre entre 0x01 et 0xFE qui ne contient pas d'informations de classe et de type. La longueur est écrite comme suit:
Longueur des donnéesCodage
0x00 <= x <= 0xFEla valeur est écrite inchangée sur un octet
0xFF <= x <= 0xFFFF0xFF et la valeur sur les deuxième et troisième octets


DGI (Data Grouping Identifier)


DGI est décrit dans les spécifications de la carte de plate-forme globale et la spécification du langage de script GP Systems. La balise est toujours codée sur deux octets et ne contient aucune méta-information. La longueur est enregistrée de la même manière que pour SIMPLE-TLV. Les DGI contiennent souvent des BER-TLV, mais peuvent être simples.

COMPACT-TLV


COMPACT-TLV est décrit dans ISO7816-4 et est utilisé exclusivement dans ATR (Answer to Reset). Dans ce format, la balise et la longueur sont écrites dans le même octet. La balise est écrite dans l'ancien quartet, et la longueur est écrite dans le mineur.

Nous sommes donc arrivés à la fin de cette partie. Si quelqu'un a des questions, vous pouvez les écrire dans les commentaires. La prochaine partie de l'article sera consacrée à JavaCard, puis nous parlerons directement de la plate-forme mondiale.

Le reste de l'article


Partie 1. Principes de fonctionnement
Partie 2. APDU

All Articles