Desfire卡片基础命令调试

调试使用的卡片为desfire ev1 2k,使用第一代desfire卡片datasheet(D40手册),ISO 7816-4 APDU 封装原生DESFire命令。

desfire卡片3DES算法使用CBC模式加密/解密,卡片(PICC)总是执行DES加密(ek),读卡器(PCD)总是执行DES解密(dk)。

desfire卡片3DES算法使用CBC模式计算MAC,卡片(PICC)总是执行DES加密(ek),读卡器(PCD)执行DES加密(ek),取最后一组密文前4个字节作为MAC。

DESFire DES/3DES CBC加密/解密流程图(非标准CBC模式):

例:desfire卡片DES CBC解密,解密算法如下:
key:00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
原始数据:01 02 03 04 05 06 07 08 11 22 33 44 55 66 77 88 88 77 66 55 44 33 22 11

原始数据分成三组:
第一组:01 02 03 04 05 06 07 08
第二组:11 22 33 44 55 66 77 88
第三组:88 77 66 55 44 33 22 11

dk(第一组) = dk(01 02 03 04 05 06 07 08) = D9 16 AA 29 EF 0A 8F 6A
dk(第二组) = dk(dk(第一组) XOR 11 22 33 44 55 66 77 88) = dk(C834996DBA6CF8E2) = F3 70 33 AD 1C A0 6F A9
dk(第三组) = dk(dk(第二组) XOR 88 77 66 55 44 33 22 11) = dk(7B0755F858934DB8) = 14 A3 08 40 F5 24 35 E4

解密数据:D9 16 AA 29 EF 0A 8F 6A F3 70 33 AD 1C A0 6F A9 14 A3 08 40 F5 24 35 E4

安全、应用及文件相关功能的代码

文件类型代码

应用内的文件可为下列不同类型:

  • 标准数据文件(0x00)
  • 备份数据文件(0x01)
  • 带备份的值文件(0x02)
  • 带备份的线性记录文件(0x03)
  • 带备份的循环记录文件(0x04)
通信设置代码-加密模式

通信设置定义了PCD和PICC间通信的安全级别。通信设置始终适用于文件级别。

访问权限代码

每个应用中的每个文件都存储了4种不同的访问权限(每个文件2字节):

  • 读(Read)访问 (GetValue, Debit for Value files)
  • 写(Write)访问(GetValue, Debit, LimitedCredit for Value files)
  • 读&写(Read&Write)访问(GetValue, Debit, LimitedCredit, Credit for Value files)
  • 修改访问权限(ChangeAccessRights)

每种访问权限编码占用4位(半字节)。每半字节都连接到相关应用的密钥文件中的一个密钥。

半字节排列16中不同的编码。如果值设为0-13(最多14个密钥),即引用了应用内密钥文件中的特定密钥,前提是该密钥必须存在(不允许选择不存在的密钥)。

如果编码为14(0xE)就意味着“Free(自由)”访问。因此在选择相应的应用后,无论事先是否通过认 证,都授予相关的访问权限。

编码15(0xF)定义了“Free(自由)”访问的反义词,也就是“Deny(拒绝)”访问。因此,相应的访问权限始终被拒绝。(译者注:此编码也被称为“Never”。)

2字节参数的最高4位是获取读访问权限所必须知道的密钥的参考号(对于值文件是GetValue和Debit命令),接下来的4位是获取写访问权限的密钥编号(对于值文件是GetValue、Debit和LimitedCredit命令)。低字节的高半字节是获取读&写访问权限的密钥编号,在值文件中该权限允许完全访问(对于值文件是 GetValue、Debit、LimitedCredit和Credit命令;对于记录文件是ClearRecordFile命令)。为修改文件访问权限和连接到每个访问权限的密钥编号,需要使用最低半字节中的密钥参考号进行认证。

有读访问和读&写访问权限时可以读。有写访问和读&写访问权限时可以写。如果一个文件未经有效认证,但通过至少一项相关访问权限可自由访问(0xE),通信模式强制设为明文。如果“读”和“读&写”访问(或“写”和“读&写”访问)权限中的一个被设为0xE,另一个则不是0xE,在经有效认证的情况下通信采用MAC/加密,在无有效认证的情况下通信采用明文,第二种情况下,通信设置被PICC忽略。

状态和错误代码

安全相关命令

Authenticate(认证)

认证PICC主密钥:

PICC主密钥:00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF

Rdr: 90 0A 00 00 01 00 00
Tag: FE 28 37 5D 1D 17 08 AC [91 AF]

dk(RndB) = dk(FE 28 37 5D 1D 17 08 AC) = 41 5A 51 58 4E 87 38 14

RndB’ = 5A 51 58 4E 87 38 14 41

RndA = 01 02 03 04 05 06 07 08

dk(RndA+RndB’) = dk(01 02 03 04 05 06 07 08 5A 51 58 4E 87 38 14 41) = D9 16 AA 29 EF 0A 8F 6A EC 19 E2 FA A3 FC 1E 75

Rdr: 90 AF 00 00 10 D9 16 AA 29 EF 0A 8F 6A EC 19 E2 FA A3 FC 1E 75 00
Tag: B6 F3 1E E6 F9 98 C2 35 [91 00]

dk(RndA’) = dk(B6 F3 1E E6 F9 98 C2 35) = 02 03 04 05 06 07 08 01

session key = RndA高4字节+RndB高4字节+RndA低4字节+RndB低4字节 = 01 02 03 04 41 5A 51 58 05 06 07 08 4E 87 38 14

ChangeKeySettings(修改密钥设置)

该命令根据当前选中的AID修改主密钥设置。如果预先选择了AID 0x00,修改应用于PICC密钥设置。反之(AID≠0x00),则修改应用于当前选中应用的应用密钥设置。

修改PICC主密钥设置:

1111B = 0x0F

通过PICC主密钥认证,配置即可修改。 CreateApplication无需通过PICC主密钥认证, DeleteApplication要求通过PICC主密钥或应用主密钥认证。GetApplicationIDs和GetKeySettings命令无需通过PICC主密钥认证。PICC主密钥可修改。

原数据:0F 09 A9 00 00 00 00 00

使用session key 解密:06 80 18 59 BB FB 56 36

Rdr: 90 54 00 00 08 06 80 18 59 BB FB 56 36 00
Tag: [91 00] 未知状态代码

GetKeySettings(获取密钥设置)

GetKeySettings命令允许获取PICC和应用主密钥的设置。另外,该命令还返回所选应用能存
储的最大密钥数量。

该命令没有参数。根据主密钥设置,需要先通过主密钥认证。如果请求PICC主密钥设置(当前选择的AID=0x00),密钥数量返回为0x01,因为只有一个PICC主密钥。

获取PICC主密钥设置:

Rdr: 90 45 00 00 00
Tag: 0F 01 [91 00]

ChangeKey(修改密钥)

该命令允许修改PICC上存储的任何密钥。如果选中的AID为0x00,修改的是PICC主密钥,因此只有密钥编号0x00才是有效的(PICC上只有1个PICC主密钥)。其它情况(AID≠0x00),修改的是当前选中应用(由其AID代表)内指定编号的密钥。

该命令第一个参数是1字节的密钥编号,取值范围是0x00到(应用的密钥数量-1)。第二个参数是经过加密处理的新密钥信息(此处的“加密”指密码学运算,并非狭义的“加密”操作)。相关的密钥设置定义了是否允许修改密钥,以及在执行ChangeKey命令前需要通过哪个密钥进行认证。

  • 修改任何密钥【除主密钥和ChangeKey键(Key)外】,都需要通过ChangeKey(指定的密钥)认证。
  • 修改ChangeKey键(Key)或主密钥,需要通过主密钥认证。
  • 当用于认证的密钥编号与欲修改的密钥编号不同,且ChangeKey键(Key)被设为0xE以外的值,PCD需要通过如下方式生成“DES解密后的密钥数据”:

新密钥与当前密钥进行按位异或(XOR,16字节)。为异或后的数据计算CRC(2字节),并附在其后。 随后再附加新密钥的CRC(2字节)。在此之后,填充4字节0x00让数据长度达到8的倍数(总计24字 节)。最后对整个密钥数据字段进行DES/3DES解密操作(使用当前过程密钥)。三个密文块使用CBC发送模式连接。

  • 当用于认证的密钥编号与欲修改的密钥编号相同,或ChangeKey键(Key)被设为0xE,PCD需要通过如 下方式生成“DES解密后的密钥数据”:

计算新密钥的CRC(2字节)并附在其后。随后填充6字节0x00让数据长度达到8的倍数(总计24字节)。 最后对整个密钥数据字段进行DES/3DES解密操作(使用当前过程密钥)。三个密文块使用CBC发送模式连接。

  • 当ChangeKey键(Key)被设为0xF(“Never”),除主密钥外的全部密钥均被冻结,因此若尝试修改主密钥之外的密钥,ChangeKey命令将返回错误代码。

注:在成功修改用于达到当前认证状态的密钥后,认证会失效。后续操作需要使用新密钥认证。

修改PICC主密钥:

1、新密钥FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF,计算CRC16(ISO-IEC-14443-3-A)值为0xCB37,desfire卡片CRC16值低字节在前,值为0x37CB。

2、需要发送给PICC的原始数据为:FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 37 CB 00 00 00 00 00 00。

3、使用当前session key进行DES/3DES解密操作,解密后的数据为:4C 21 7A 58 3A D8 12 03 DC 29 DA A8 29 6A 43 0E 82 C9 D0 35 E5 9A 21 11。

4、发送解密后的数据:00 4C 21 7A 58 3A D8 12 03 DC 29 DA A8 29 6A 43 0E 82 C9 D0 35 E5 9A 21 11。

Rdr: 90 C4 00 00 19 00 4C 21 7A 58 3A D8 12 03 DC 29 DA A8 29 6A 43 0E 82 C9 D0 35 E5 9A 21 11 00
Tag: [91 00]

GetKeyVersion(获取密钥版本)

GetKeyVersion命令允许读出当前密钥的版本。如果选中的AID=0x00,该命令返回PICC主密钥版本,因此只有密钥编号=0x00才是有效的(PICC上只存在一个PICC主密钥)。在其他情况下(AID≠0x00),返回当前选中应用(由其AID表示)中的特定密钥编号的版本。

该命令唯一的参数是密钥编号(1字节)。该命令以无符号字节返回指定密钥的版本。要修改密钥版本,使用ChangeKey命令,执行该命令无需认证。

Rdr: 90 64 00 00 01 00 00
Tag: FF [91 00]

PICC级别命令

CreateApplication(建立应用)

CreateApplication命令允许在PICC上建立新应用。

应用通过应用标识符(AID)识别。AID是一个24位(3字节)长度的数字。 应用标识符0x00 00 00为PICC 自身保留。

根据PICC主密钥设置,可能需要先通过PICC主密钥认证。

该命令要求当前选中的AID是0x00 00 00(代表卡片级别)。

每张PICC最多可容纳28个应用。每应用都连接到最多由“14个不同的可被用户定义的访问密钥”的集合。要在应用中存储数据,必须在应用中建立“文件”,每应用中最多可创建16个大小和类型各异的文件。每个文件都有不同级别的访问权限,这些权限可以连接到应用的密钥。

24位AID是该命令的第一个参数。第二个参数是应用主密钥设置。最后一个参数“密钥数量“,定义了该应用中可以存储多少个密钥。所有密钥都以16个0x00初始化,因此它们都是单DES密钥。

注:强烈建议在发卡时使用命令ChangeKey对密钥进行个性化设置。

建立应用:

1、应用AID为0x112233,应用主密钥设置为0x09(修改任何密钥都需要使用应用主密钥进行认证、如通过应用主密钥认证,允许修改应用主密钥设置、只有通过应用主密钥认证才能建立/删除文件、执行GetFileIDs、GetFileSettings和GetKeySettings命令需要先通过应用主密钥认证、应用主密钥可以修改),密钥数量为0x0E。

2、向PICC发送数据:11 22 33 09 0E。

Rdr: 90 CA 00 00 05 11 22 33 09 0E 00
Tag: [91 00]

DeleteApplication(删除应用)

DeleteApplication命令允许永久禁用(Deactivate)PICC上的应用。

将要删除的应用程序由它的应用程序标识符 AID 表示,这是该命令的唯一参数。

根据PICC主密钥设置,需要先通过PICC主密钥或应用主密钥认证。

使用应用程序主密钥进行认证的,必须使用要删除的应用的主密钥。

AID分配已被删除,因此可以新建一个与被删除应用AID相同的新应用。然而,被删除的内存块(memory block)仅能通过FormatPICC命令擦除整个PICC的用户内存来恢复。

注:尽管PICC主密钥是全零的默认值,并且“建立/删除无需PICC主密钥”已被设置,但删除应用仍需要通 过PICC主密钥或相关应用主密钥认证。

注:如果当前选中的应用已被删除,该命令自动选择PICC级别,也就是AID=0x00 00 00。

删除AID=11 22 33的应用:

Rdr: 90 DA 00 00 03 11 22 33 00
Tag: [91 00]

GetApplicationIDs(获取应用标识符,AID)

GetApplicationIDs命令返回PICC上所有活跃(active)应用的应用标识符(AID)。

该命令不接受任何参数。根据PICC主密钥设置,执行该命令可能需要通过PICC主密钥认证。该命令要求当前选中的AID是0x00 00 00,也就代表是卡片级。

PICC发送一个包含全部已安装AID的序列作为应答。如果该序列不能放在一个帧中,PICC会设置额外的帧, 并将全部有后续的帧的状态字设为0xAF。

获取应用标识符:

Rdr: 90 6A 00 00 00
Tag: 11 22 33 [91 00]

SelectApplication(选择应用)

SelectApplication命令允许为进一步操作选择一个特定的应用。

该命令的参数是3字节的AID。如果参数为0x00 00 00,选中的是PICC级别,任何进一步的操作都与此级别有关(典型命令是 CreateApplication、DeleteApplication等)。如果指定的AID在PICC中的应用目录内被找到,则后续命令与该应用交互。正如Authentication命令的描述,每个SelectApplication命令都会使当前的认证状态失效。

选择应用:

Rdr: 90 5A 00 00 03 11 22 33 00
Tag: [91 00]

FormatPICC(格式化PICC)

该命令释放PICC的用户内存。

该命令无参数。FormatPICC命令在PICC上释放全部已分配的用户内存。全部应用都会被删除,这些应用中的文件也都会被删除。PICC主密钥和PICC主密钥设置保持为当前值,它们不受此命令的影响。该命令始终要求先通过PICC主密钥认证。

格式化PICC:

Rdr: 90 FC 00 00 00
Tag: [91 00]

GetVersion(获取版本)

GetVersion返回PICC的制造商相关数据。

该命令没有参数。

PICC返回3个含有制造商相关数据的帧:

第1帧:包含硬件相关信息:

​ byte1:制造商ID(0x04代表PHILIPS)

​ byte2:类型(此处为0x01)

​ byte3:子类型(此处为0x01)

​ byte4:主要版本

​ byte5:次要版本

​ byte6:存储空间*(此处为0x18 = 4096字节)

​ byte7:通信协议类型(此处为0x05,代表ISO 14443-2和-3)

第2帧:包含软件相关信息:

​ byte1:制造商ID(0x04代表PHILIPS)

​ byte2:类型(此处为0x01)

​ byte3:子类型(此处为0x01)

​ byte4:主要版本

​ byte5:次要版本

​ byte6:存储空间*(此处为0x18 = 4096字节)

​ byte7:通信协议类型(此处为0x05,代表ISO 14443-3和-4)

第3帧:返回唯一序列号、批次号、制造年分和星期:

​ byte1 to byte7:唯一序列号

​ byte8 to byte12:产品批号

​ byte13:制造星期(一年中的第几个星期)

​ byte14:制造年份

* 该字节高7位的值为n,表示卡片容量基于2^n(字节)。如果卡片容量正好为2^n,LSBit(最低位)设为0;如果卡片容量介于2^n和2^(n+1)之间,则LSBit设为1。4K DESFire卡高7位为“0001100”(2^12=4096),最低位为“0”。8K DESFire卡高7位为“0001101”(2^13=8192),最低位为“0”。

获取版本:

Rdr: 90 60 00 00 00
Tag: 04 01 01 01 00 16 05 [91 AF]

Rdr: 90 AF 00 00 00
Tag: 04 01 01 01 04 16 05 [91 AF]

Rdr: 90 AF 00 00 00
Tag: 04 40 64 FA 03 5C 80 B9 0C 18 41 30 04 18 [91 00]

应用级别命令

GetFileIDs(获取文件ID,FID)

GetFileIDs命令返回当前选中应用下的所有活动(Active)文件的文件标识符(FID)。

该命令没有参数。根据应用主密钥设置,可能需要先通过应用主密钥认证。每个文件标识符占用1字节,取值范围是0x00-0x0F。每个文件都有一个明确的标识符,因此不会出现重复的值。一个应用内的文件数量被限制为16个,因此应答始终可以放在一个数据帧内。

获取文件ID:

Rdr: 90 6F 00 00 00
Tag: 00 01 02 [91 00]

GetFileSettings(获取文件设置)

GetFileSettings命令允许获取指定文件的属性信息。该命令提供的信息取决于被请求文件的类型。

GetFileSettings命令有一个参数,就是当前选中应用内被请求文件的文件标识符。文件标识符的取值范围必须在0x00-0x0F之间。

根据应用主密钥设置,可能需要先通过应用主密钥认证。

在更新一个值文件的值后,却没有应用CommitTransaction命令,GetFileSettings命令将始终获取有限圈存值的旧的、未更改的限值。

返回消息的第一部分对于所有的文件类型均相同:

第一字节指示文件类型,下一字节提供了文件的通信设置信息(明文/MAC/加密),接下来的2字节信息是文件访问权限字段。

响应中的所有后续字节都具有特殊含义,具体取决于文件类型:

  • 标准数据文件和备份数据文件:一个3字节字段表示用户文件空间字节。
  • 值文件:前三个字段,每字段都是4字节。第一个字段为文件的“下限”(在建立文件时定义);第二个字段为文件的“上限”(在建立文件时定义);第三个字段为当前最大的“有限圈存”值。如果有限圈存功能没有启用,第三个字段全为零。最后的字节自成一个字段,表示是否允许对该文件使用 LimitedCredit命令(00为禁用,01为启用)。
  • 线性记录文件和循环记录文件:三个字段,每字段长3字节。第一个字段表示一条记录的空间(在建立文件时定义);第二字段表示记录文件的最大记录条目数量(在建立文件时定义);第三字段表示记录文件中当前拥有的记录数量,该数量等于记录文件中当前能读取的最大记录数量。
ChangeFileSettings(修改文件设置)

该命令修改现有文件的访问参数。

第一个1字节的参数,是当前应用中的文件标识符。下一个字节定义了新的通信设置。最后的2字节字段定义了新的访问权限。修改仅能在当前访问权限中的“修改访问权限”不为“Never”(0xF)时成功。为保证ChangeFileSettings命令来自前先前发起认证的同一方,有必要应用与ChangeKey命令大致相同的安全机制。

为3字节新设置计算CRC,并附在其后。经过修改的数据流现长度为5字节,在其后附加3字节0x00达到8字节长度,以满足DES/3DES操作的需求。最后在PCD端对数据完成DES/3DES解密。PICC可通过执行DES/3DES加密操作并检查明文的CRC,以核实收到数据的真实性。然而,如果“修改访问权限”的被设置为“Free”(0xE),则不需要安全机制,因此数据以明文形式发送(总共5字节长度)。

CreateStdDataFile(建立标准数据文件)

CreateStdDataFile命令用于在PICC上现有的应用内建立存储明文非格式化用户数据的文件。

该命令需要的第一个参数是新文件标识符,取值范围是0x00到0x0F。文件将在当前选中的应用内建立。不必按特殊的顺序在应用内建立文件。如果当前选中应用中已经存在指定的文件标识符,则会返回错误代码。接下来的一个字节定义了通信设置,随后一个2字节的字段定义了新文件的访问权限,最后一个3字节参数指定了文件的空间(字节)。

注:MF3 IC D40内部以32字节的倍数分配NV内存。因此建立文件命令的文件空间参数为0x00 00 01(1字 节空间)时,内部消耗的空间是0x00 00 20,也就是32字节。

建立标准数据文件:

文件标识符为0x00,明文通信0x00,文件访问权限0xEEEE,文件空间0x000020。

Rdr: 90 CD 00 00 07 00 00 EE EE 20 00 00 00
Tag: [91 00]

文件标识符0x01,明文MAC通信0x01,文件访问权限0x0000(验证应用主密钥),文件空间0x000020。

Rdr: 90 CD 00 00 07 01 01 00 00 20 00 00 00
Tag: [91 00]

文件标识符0x02,加密通信0x03,文件访问权限0x0000(验证应用主密钥),文件空间0x000020。

Rdr: 90 CD 00 00 07 02 03 00 00 20 00 00 00
Tag: [91 00]

CreateBackupDataFile(建立备份数据文件)

CreateBackupDataFile命令用于在PICC上的现有应用中建立存储明文非格式化用户数据的文件,该文件还支持集成的备份机制。

正如“备份数据文件”名称所暗示的那样,该类型的文件提供集成的备份机制。每个写命令都在该文件的独立镜像中完成。要验证对此类型文件的写访问,需要使用CommitTransaction命令进行确认,如果PCD未发送CommitTransaction命令,只有镜像被修改,原数据保持不变且有效。除文件标识符参数外,其余参数的格式均与CreateStdDataFile命令一致,只有应用中的前8个文件才支持集成的备份机制,因此文件标识符仅允许为0x00到0x07。因为镜像的缘故,备份数据文件对PICC上NV内存的开销,始终是同尺寸标准数据文件的二倍。

建立备份数据文件:

文件标识符为0x03,明文通信0x00,文件访问权限0xEEEE,文件空间0x000040。

Rdr: 90 CB 00 00 07 03 00 EE EE 40 00 00 00
Tag: [91 00]

CreateValueFile(建立值文件)

CreateValueFile命令用于在PICC上现有的应用中建立存储和操作32位有符号整数值的文件。

第一个参数长1字节,为在当前选中应用内建立的新文件的文件标识符,范围是0x00到0x07。接下来的一个字节定义了通信设置。后面的2字节字段定义了新文件的访问权限。下一个参数长度为4字节,是该文件的有效下限,下限标记出当前值的消费(Debit)计算不能越过的边界,该参数是4字节有符号整数,因此也可以为负值。后面还是4字节,对圈存(Credit)操作以相同的方式设置上限,该参数同为4字节有符号整数。上限必须大于等于下限,否则PICC会发送错误消息,并且不会建立文件。下一个参数也是4字节有符号整数,指定了值文件的初始值,上限和下限由PICC检查,如果不一致则不创建文件,并由PICC发送错误消息。最后一个字节用于激活有限圈存(LimitedCredit)功能,0x00表示禁用,0x01表示启用。值文件始终提供集成的备份机制。因此每次修改值的访问都需要使用CommitTransaction命令验证。

CreateLinearRecordFile(建立线性记录文件)

CreateLinearRecordFile命令用于在PICC上现有应用内建立适合结构数据多重存储(如顾客忠诚度计划)的文件。一旦文件完全被数据记录充满,除非进行清空,否则无法向该文件继续写入。

第一个参数长度为1字节,是在选中应用内欲新建文件的文件标识符,取值范围0x00-0x07。下一个字节定义了通信设置。接下来的2字节字段定义了新文件的访问权限。下一个3字节长度的参数,是一条记录的尺寸(字节),该参数的取值范围为0x00 00 01到0xFF FF FF。最后一个参数也是3字节长度,是记录的条目数,该参数的取值范围也是0x00 00 01到0xFF FF FF。因此整个文件在PICC NV内存中的尺寸为:记录尺寸*最大记录数量。线性记录文件总是提供集成的备份机制,因此每次添加记录访问都需要使用CommitTransaction命令进行验证。

建立线性记录文件:

文件标识符为0x05,明文通信0x00,文件访问权限0xEEEE,记录长度0x00 00 10,最大记录数量0x00 00 03。

Rdr: 90 C1 00 00 0A 05 00 EE EE 10 00 00 03 00 00 00
Tag: [91 00]

CreateCyclicRecordFile(建立循环记录文件)

CreateCyclicRecordFile命令用于在PICC上现有的应用内建立适用于结构树多重存储(例如交易记录)的文件。一旦文件完全被数据记录充满,PICC自动以最后一条写入的记录覆盖最早的一条。该操作对PCD完全透明。

首个参数的长度为1字节,取值范围是0x00到0x07,是在当前选中应用内欲新建文件的文件标识符。下一个字节定义了通信设置。接下来的2字节字段定义了新文件的访问权限。下一个3字节长度的参数,是一条记录的尺寸(字节),该参数的取值范围为0x00 00 01到0xFF FF FF。最后一个参数也是3字节长度,是记录的条目数,该参数的取值范围也是0x00 00 01到0xFF FF FF。因此整个文件在PICC NV内存中的尺寸为:记录尺寸*最大记录数量。循环记录文件总是提供集成的备份机制。因此每次添加记录访问都需要使用CommitTransaction命令进行验证。

注意:因为备份功能会占用一条记录,“最大记录数量”需要比应用所需的数量多1。

建立循环记录文件:

文件标识符为0x06,明文通信0x00,文件访问权限0xEEEE,记录长度0x00 00 10,最大记录数量0x00 00 03。

Rdr: 90 C0 00 00 0A 06 00 EE EE 10 00 00 03 00 00 00
Tag: [91 00]

DeleteFile(删除文件)

DeleteFile命令永久停用(deactivate)当前选中应用的文件目录内的一个文件。

该命令使用1个字节作为参数, 表示文件标识符,取值范围0x00到0x0F。该命令的操作使指定文件的“文件目录条目”失效,这就意味着该文件无法再访问。根据应用主密钥的设置,需要先通过应用主密钥认证。被删除文件占用的内存块并没有被释放,被删除文件的文件标识符可以被重新用于在应用内建立新文件。为释放内存块,整个PICC的用户NV内存都需要使用FormatPICC命令擦除。

测试删除文件:

1、建立一个标准数据文件,文件标识符0x08,明文通信0x00,文件访问权限0xEEEE,文件空间0x000020。

Rdr: 90 CD 00 00 07 08 00 EE EE 20 00 00 00
Tag: [91 00]

2、删除文件标识符0x08的标准数据文件。

Rdr: 90 DF 00 00 01 08 00
Tag: [91 00]

数据操作命令

ReadData(读数据)

ReadData命令允许从标准数据文件或备份数据文件中读数据。

第一个参数长度为1字节,定义欲读取文件的文件标识符。该参数的取值范围,对于标准数据文件为0x00到 0x0F,对于备份数据文件为0x00到0x07。

下一个参数长度为3字节,是读操作在文件中的起始位置(偏移量),该参数的取值范围是从0x00 00 00到 文件尺寸-1。

第三个参数的长度也是3字节,指定了要读取数据的字节数,该参数的范围从0x00 00 00到0xFF FF FF。

如果第三个参数设置为0x00 00 00,从偏移量开始的整个数据文件都会被读取。

如果字节数太多,无法用一帧发给PCD,PICC在发送下一帧给PCD之前,会等待状态字节为0xAF的状态帧。

如果备份数据文件在写入后并未执行CommitTransaction命令而进行读取,ReadData命令总会得到存储在PICC中过时且未经修改的数据。只有在执行CommitTransaction命令后,备份数据文件才 会被验证并且对ReadData命令“外部可见”。

读命令要求先通过“读”或“读&写”访问指定的密钥认证。

根据连接到文件的通信设置,PICC可以使用明文、MAC或加密方式发送数据,所有密码学操作均以CBC模式完成。

对于MAC和加密通信,需要对数据填充以达到8字节的倍数。在特定数据长度(命令参数“长度”≠0x00 00 00)的情况下,填充全部为0x00。

仅在加密通信并读取整个文件(命令参数“长度”=0x00 00 00)的情况下,填充的第一字节才为0x80,其余填充字节仍为0x00(根据ISO 9797-1)。

注:在MAC通信的情况下,填充字节仅作密码学用途,并不会在PCD和PICC间交换。

WriteData (写数据)

WriteData命令允许向标准数据文件和备份数据文件写入数据。

第一个参数长度为1字节,定义了要写入文件的文件标识符,取值范围对于标准数据文件是0x00到0x0F,对于备份数据文件是0x00到0x07。

下一个参数长度为3字节,是写操作在文件中的起始位置(偏移量)。该参数的取值范围是从0x00 00 00到 文件尺寸-1。

第三个参数的长度也是3字节,指定要写入数据的字节数。该参数的取值范围是从0x00 00 01到0xFF FF FF。

如果要发送的字节数过多,无法放在一帧中,PCD在发送下一帧给PICC前,会等待状态字为0xAF的状态帧。

写命令要求先通过“写”或“读&写”访问指定的密钥认证。

根据连接到文件的通信设置,PCD需要通过明文、MAC或加密方式发送数据。全部密码学操作均以CBC模式完成。

对于MAC和加密通信,需要对数据填充以达到8字节的倍数。填充全部为0x00。

如果WriteData对备份数据文件操作,需要使用CommitTransaction命令对写入的数据进行验证,AbortTransaction命令将使所有的修改失效。

如果数据写入到标准数据文件(没有集成备份机制),数据直接被编程到文件的可视NV内存。新数据对于后续的任何ReadData命令都是即刻生效的。

注:在MAC或加密通信的情况下,PICC通过数据帧末尾的MAC或CRC(包含必要的填充字节)对数据的有效性进行验证。若验证失败(MAC/CRC与数据不符、填充字节无效),PICC中止NV编程并返回完整性错误给PCD。由于完整性错误,任何事务,包括可能已经开始的事务,都将自动中止。

注:在写入标准数据文件时遇到完整性错误可能导致文件内容损坏。

注:在MAC通信的情况下,填充字节仅作密码学用途,并不会在PCD和PICC间交换。

写数据:

1、明文通信,文件标识符0x00的标准数据文件,写入16字节数据00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF。

Rdr: 90 3D 00 00 17 00 00 00 00 10 00 00 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00
Tag: [91 00]

2、明文MAC通信,文件标识符0x01的标准数据文件,写入16字节数据00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF。

session key:01 02 03 04 6F A4 90 D2

命令数据域(含填充字节0x00):01 00 00 00 10 00 00 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00。

计算MAC(ek操作):CDB2D445。

3、加密通信,文件标识符0x02的标准数据文件,写入16字节数据00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF。

session key:01 02 03 04 CF FE 9B 51

命令数据域(含CRC16和填充字节0x00):02 00 00 00 10 00 00 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 81 71 00 00 00 00 00 00 00。

加密后的数据域:36 DF 01 A3 59 BA 5B FB 28 64 28 F9 97 CB C5 02 46 49 98 6F B9 E4 C2 A5 6F 94 21 C9 17 78 08 86