智能卡。第3部分。TLV

你好,Giktayms!

最后一部分,我们了解了终端与卡之间的通信方式。我们研究了C-APDU和R-APDU格式,但没有注意这些APDU包含哪些数据。在这一部分中,我们将考虑在终端和卡之间传输信息的最常见格式(反之亦然)。他们都属于一个家庭-TLV。

TLV表示Ť AG,大号 ength,V ALUE和用于结构的信息。在非常抽象的层次上,TLV可以被视为XML的二进制版本。但是,什么是标签,长度,值?

  • 标签:它说明TLV中包含哪些信息。视图可以是例如简单的线或数字,标识符,甚至是复杂的结构。在一些实施例中,标签还包含关于TLV的元信息。
  • Length:Value元素的长度(以字节为单位)。
  • :TLV中包含的数据

每个TLV变体对每个元素都有自己的编码规则。接下来,我们将介绍最常见的TLV选项。我要立即指出,本文将主要针对BER-TLV,因为这是最广泛,灵活和复杂的格式。其他TLV选项仅作简要介绍。

误码率


因此,我们正在谈论本文的主要特征-BER-TLV。这是ASN.1标准的一部分,不仅用于智能卡领域。

标签

标签的第一个字节具有以下格式:
8877665544332211
一种标签

存在以下类:
8877描述
00通用-基本数据类型,例如字符串数据或数字。很少用于智能卡。
01个应用-含义因应用而异
1个0上下文相关-类型的含义取决于给定的复合类型
1个1个私人-类型的含义取决于特定的组织

由于规范描述了标签的完整值,因此记住类的值是完全多余的。该类不影响标签的处理方式。

最有趣的是位6。当它为1时,此TLV包含其他TLV。相反,如果其值为0,则TLV包含简单数据或非TLV格式的数据。

其余位(5-1)通常只是标签号。但是,如果它们都是单位,则标签号在第二个字节上继续。如果第二个字节的bit8为1,则数字在第三个字节上继续,依此类推。实际上,智能卡仅使用写在一个或两个字节上的标签。

长度

长度可以是确定的,也可以是不确定的。

将不确定的长度写在一个字节上,值为0x80。此方法仅对复合TLV(即包含其他TLV的TLV)有效。在这种情况下,TLV必须必须包含TLV-NULL作为最后一个元素,其编码为“ 00 00”。在更现代的标准中经常使用类似的方法,但是,总的来说,它不是很常见。

特定长度写在一个或多个字节上。
资料长度编码
0x00 <= x <= 0x7F该值不变地写在一个字节上
0x80 <= x <= 0xFF0x81和第二个字节上的值
0x100 <= x <= 0xFFFF0x82以及第二个和第三个字节上的值
0x10000 <= x <= 0xFFFFFF0x83及其后三个字节的值
0x1000000 <= x <= 0xFFFFFFFF0x84,接下来的四个字节中的值

原则上,该表可以继续。但是,在智能卡领域找不到巨大的TLV。记录的长度超过三个字节(包括前缀0x82),我个人没有看到。值始终以Big Endian格式编写。

请注意,在智能卡中,即使在TLV之外(即仅LV),也经常使用这种记录长度的方法,但通常,除了0x80值也可以原样写在一个字节上。


值可以是TLV序列,也可以是字节,其含义取决于上下文和应用程序。在同一TLV中混合两种类型的数据是不可接受的。化合物TLV中包含的TLV可以是任何种类-复合或简单。TLV的长度为0时缺少此元素。

例子

AID(应用程序标识符)
4F 08 A0 00 00 01 51 00 00 00

标签0x4F:一个简单的应用程序TLV,在此示例中包含8个字节(其值为应用程序标识符,即应用程序标识符)。

生命周期状态
9F70 01 0F

标签0x9F70:一个简单的上下文相关TLV,在此示例中包含1个字节。请注意,在标签(9F)的第一个字节中,位5-1都是单位,因此标签在下一个字节继续。

加载文件数据块
C4 82 0x01 0x0c 01 ...另266个字节... 0a

标记0xC4:在此示例中,一个简单的专用TLV,包含268个字节。长度写在三个字节中,第一个是前缀0x82。

GlobalPlatform Registry相关数据
E3 11 4F 08 A0 00 00 01 51 00 00 00 9F70 01 0F C5 01 00

标记0xE3:包含其他TLV的复合专用TLV。在此示例中,仅包含简单的TLV。也可以包含化合物TLV或化合物与简单的混合物。

从理论上讲,这也可以写成
E3 80 4F 08 A0 00 00 01 51 00 00 00 9F70 01 0F C5 01 00 00 00

使用不确定的长度。但是实际上,在规范允许的情况下,卡仅接受(或发送)不确定的长度。

理解TLV


ETSI TS 101 220标准中描述了COMPREHENSION-TLV,该长度的编码方式与BER-TLV相同。标签根据下表进行编码:

在一个字节上(0x01-0x7E)
8877665544332211
CR标签

在三个字节上(0x0001-0x7FFF)
字节1字节2字节3
b8-b18877665544332211b8-b1
0x7FCR标签


首字母缩写CR代表需要理解。当该位为1时,如果TLV接收器不支持此TLV,则它应返回错误。相反,如果该值为0,那么如果不支持TLV,则接收者有权忽略TLV。

COMPREHENSION-TLV的主要应用是将参数传输到SIM-Toolkit(其中SIM-Toolkit用于手机中的SIM-Menu)。为了提高卡和电话之间的兼容性,会在CR = 0时发送可选参数(即,您至少可以以某种方式执行命令的那些参数)。

简单TLV


SIMPLE-TLV在ISO7816-4中进行了描述。与SIMPLE-TLV中的BER-TLV不同,标记只是介于0x01和0xFE之间的数字,不包含类和类型信息。长度写为:
资料长度编码
0x00 <= x <= 0xFE该值不变地写在一个字节上
0xFF <= x <= 0xFFFF0xFF以及第二个和第三个字节上的值


DGI(数据分组标识符)


在全球平台卡规范和GP系统脚本语言规范中描述了DGI。标签始终编码为两个字节,并且不包含任何元信息。记录长度的方式与SIMPLE-TLV相同。DGI通常包含BER-TLV,但可能很简单。

紧凑型TLV


COMPACT-TLV在ISO7816-4中进行了描述,并且仅在ATR(复位响应)中使用。以这种格式,标签和长度被写在同一字节中。标签用较旧的半字节写,而长度用次要字节写。

因此,我们到了这一部分的结尾。如果有人有问题,可以在评论中写下。本文的下一部分将讨论JavaCard,之后我们将直接讨论Global Platform。

文章的其余部分


第1部分。工作原理
第2部分。APDU

All Articles