CPU卡片FM1208(FMCOS)调试

FM1208卡片上电复位后,自动选择MF文件(类似DOS根目录),文件标识符3F 00。

一、文件结构

FMCOS IC卡的基本文件系统是由主文件MF、目录文件DF和基本文件EF组成。主文件MF在IC卡中唯一存在,在MF下可以有多个目录文件DF和基本文件EF,每一个DF可以存放多个基本文件EF和多个下级目录文件DF,包含下级目录的目录文件为DDF,不含下级目录的目录文件为ADF。目录文件DF的个数仅受EEPROM空间的限制。

1.1 MF文件

在FMCOS卡中,MF文件唯一存在,是卡片文件系统的根。它相当于DOS的根目录。IC卡复位后,卡片自动选择MF文件为当前文件。

1.2 DF文件

目录文件DF相当于DOS的目录,每个DDF下可建立一个目录文件,但不是强制的。任何一个DF在物理上和逻辑上都保持独立,都有自己的安全机制和应用数据,可以通过应用选择实现对其逻辑结构的访问。可以将单个DF文件以及其中一个或多个EF文件当作一个应用,也可以将多个DF以及其中多个EF文件当作一个应用,在使用IC卡时,用户可以根据不同的应用环境自行定义。

1.3 EF文件

基本EF文件用于存放用户数据或密钥,存放用户数据的文件称为工作基本文件,在满足一定的安全条件下用户可对文件进行相应的操作。存放密钥的文件称为内部基本文件,不可由外界读出,但当获得许可的权限时可在卡内进行相应的密码运算,在满足写的权限时可以修改密钥。
KEY文件为内部基本文件。KEY文件必须在MF/DF下最先被建立,且一个目录只能有一个KEY文件,KEY文件可存放多个口令密钥、外部认证密钥、DES运算密钥、每个密钥为一条TLV格式的记录。

  • 二进制文件:二进制文件为一个数据单元序列,数据以二进制为单位进行读写,其中的数据结构由应用者解释。
  • 定长记录文件:定长记录文件每条记录长度都相同,数据以记录为单位进行存储,记录长度最大为248个字节。
  • 循环记录文件:循环记录文件为具有固定长度记录的环行文件,每条记录都只有一个数据域,记录长度最大为248个字节。应用时只能顺序增加记录,当写记录时,当前写入的为第一条记录,则上一次写入的记录为第二条,以此类推,滚动写入。记录只能在文件头中所规定的范围内滚动写入,当写完最后一条记录时将覆盖最先写入的记录。
  • 钱包文件:钱包文件内部采用专用的结构,由COS维护,保存电子钱包、存折的余额、透支限额等信息。
  • 变长记录文件:变长记录文件的每条记录长度在写记录时是可变的,数据以记录为单位进行存储。更新记录时,新的记录长度必须与卡中的原有记录长度相同,否则本次更新无效。记录最大长度不能超过248字节。变长记录格式TLV如下:
TAG:标识 Length:数据长度 Val:L字节数据

二、文件空间结构

每个文件在EEPROM中存放的格式如下:

11字节文件头(文件类型,文件标识符,文件主体空间大小,权限,校验等)
文件主体

每个基本文件所占的EEPROM空间=文件头11字节+文件主体空间。
定长、普通钱包和循环记录文件的主体空间=记录个数x记录长度。
每个DF所占的EEPROM空间=DF头11字节+DF下所有文件的空间和+DF名称长度。
MF的空间=MF头11字节+MF下所有文件空间之和+MF名称长度(若不使用默认名称)。
MF空间不能超过EEPROM空间容量,若建立MF空间小于EEPROM空间,则剩余空间不可用。

三、文件访问方式

  • 主文件MF:复位后自动被选择,在任何一级子目录下可通过文件标识3F 00或MF名称来选择 MF。创建时默认名称为1PAY.SYS.DDF01。
  • 目录文件DF:通过文件标识符或目录名称选择目录文件DF。
  • 二进制文件:在满足读条件时可使用READ BINARY读取,在满足写条件时UPDATE BINARY更改二进制文件内容。
  • 定长记录文件:在满足读条件时可使用READ RECORD读指定记录,在满足写条件时使用 UPDATE RECORD更改指定记录。在满足追加条件时可使用APPEND RECORD在文件末尾追加一条记录。
  • 循环记录文件:在满足读条件时可使用READR ECORD读指定记录,在满足追加条件时可使用APPEND RECORD在文件开头追加一条记录,当记录写满后自动覆盖最早写的记录,最后一次写入的记录,其记录号总是1,上次写入的记录号是2,依次类推。
  • 钱包文件:在满足使用条件时可用GET BALANCE 读余额或在规定的密钥控制下完成圈存、圈提、消费、取现、修改透支限额。
  • 变长记录文件:在满足读条件时可使用READ RECORD读出指定记录,在满足写条件时可以使用UPDATE RECORD写一条新记录或更改已存在的记录,或用APPEND RECORD在文件末尾追加一条新记录。变长记录文件的格式为TLV格式,Tag为1字节记录标识,L为一字节记录数据域长度,V为L字节数据值。在执行UPDATE RECORD更改已存在的记录时,新写的整条记录长度必须和原来的整个记录长度相等,否则该命令不能成功执行。
  • KEY文件及其文件中的密钥:每个DF或MF下只能有一个KEY文件,且必须最先被建立,在任何情况下密钥数据均无法读出。当进入DF或MF时,若该目录下无KEY文件和其它文件,则在该目录下可任意建立文件和读写文件而不受文件访问权限的限制。一旦离开该目录再进入此目录时,将遵循文件的访问权限。在KEY文件中可以存放多个密钥,每个密钥为一条可变长的记录,记录的长度为密钥数据长度加 8。如 Triple DES密钥记录的长度为 24字节,Single DES 密钥记录的长度为16 字节。在满足 KEY 文件增加密钥的权限时可用 WRITE KEY 增加一条密钥记录,在满足某个密钥规定的更改权限时可使用WRITE KEY 更改密钥数据,在满足使用权限时才可使用相应的密钥进行认证或密码运算。密钥具有独立性,用于一种特定功能的加密/解密密钥不能被任何其它功能所使用,包括保存在IC卡中的密钥和用来产生、派生、传输这些密钥的密钥。
  • 口令密钥:在满足口令密钥的使用权限时,可用VERIFY核对口令,或PIN CHANGE/UNBLOCK更改并解锁口令,在核对口令通过之后,设置安全状态寄存器的值为该口令密钥规定的后续状态值。口令密钥中提供错误次数计数器,每次核对口令失败时错误次数计数器自动减一,当错误次数达到0时,口令密钥被自动锁住。
  • 解锁口令密钥:在满足使用权限时,可通过UNBLOCK 核对解锁口令而达到解锁因连续核对口令错误被封锁的口令密钥,同时修改新的口令。解锁口令锁死后无法再被解锁。
  • 外部认证密钥:在满足使用权限时可执行EXTERNAL AUTHENTICATE命令进行外部认证,在满足更改权限时可使用 WRITE KEY更改密钥。外部认证密钥锁死后无法被解锁。
  • DES运算密钥:DES运算密钥又分为DES加密密钥、DES解密密钥和MAC密钥。在满足使用权限时可执行加密、解密或生成 MAC 运算,在满足更改权限时可用 WRITE KEY 来修改密钥的内容。

四、文件类型及命令集

下表为 FMCOS命令适用的文件类型及命令集,水平方向表示FMCOS的文件类型,垂直方向表示 FMCOS 命令集:

说明:

表格中V表示命令可用于对应的文件类型,如第三行第三列为V表示用READ BINARY命令可读二进制文件,第三行第四列无V标识,表示定长记录文件不可用READ BINARY命令读取。

文件类型表示文件内部结构组织形式,用一个字节来表示,如某个文件类型为28H则表示该文件为二进制文件。文件类型在建立文件时规定。

五、文件标识符与文件名称

文件标识符是文件的标识代码,用2个字节来表示,在选择文件时只要指出该文件的标识代码,FMCOS 就可以找到相应文件,同一目录下的文件标识符必须是唯一的。MF的文件标识符是 3F00,默认文件名为1PAY.SYS.DDF01。

所有文件都可以通过文件标识符用SELECT命令进行选择,目录文件DF还可以通过目录名称进行选择。

短文件标识符选择可以通过READ BINARY、UPDATE BINARY命令的参数P1来实现文件的选择:若参数P1的高三位为100,则低5位为短的文件标识符。eg.若P1为81H即10000001,其中高三位为100,则所选的文件标识符为0001。

短文件标识符选择还可以通过READ RECORD、UPDATE RECORD、APPEND RECORD、DECREASE、INCREASE命令的参数P2来实现文件的选择:若P2的高五位不全为 0,低三位为 100,则高五位为短的文件标识符。eg.若P2为0CH即00001100,其中低三位为 100,所选的文件标识符为00001。

短文件标识符选择只能用五位来决定文件标识符,所以可选择的最大文件标识符为31。若文件需要用短文件标识符进行选择,则建立文件时就需将文件标识符取在1-31(00001-11111)之间。

选择文件后,只要文件存在,该文件就被置为当前文件,以后可以不用选择而直接对该当前文件进行操作。

六、FMCOS的安全体系

FMCOS的安全体系从概念上可以分为安全状态、安全属性、安全机制和密码算法。

6.1 安全状态

安全状态是指卡在当前所处的一种安全级别。FMCOS的根目录和应用目录分别具有16种不同的安全状态。FMCOS在卡内部用安全状态寄存器来表示安全级别:寄存器的值可以是0至F之间的某一值。
当前目录的安全状态寄存器的值在复位后或选择目录文件命令成功地被执行时被置为0,如选择下级子目录时被置为0,在当前目录下的口令核对或外部认证通过后该状态寄存器值发生变化。

6.2 安全属性

安全属性是指对某个文件进行某种操作时所必须满足的条件,也就是在进行某种操作时要求安全状态寄存器的值是什么。
安全属性又称访问权限,一种访问权限在建立该文件时用一个字节指定。FMCOS的访问权限有别于其它任何操作系统的访问权限,它用一个区间来严格限制其他非法访问者。
访问权限为0Y时表示要求 MF的安全状态寄存器的值大于等于Y。如某文件读的权限为05表示在对该文件进行读之前必须使MF的安全状态寄存器的值大于等于5。
访问权限为XY时(X不为0)表示要求当前目录的安全状态寄存器的值大于等于Y且小于等于 X。若 X=Y 表示要求当前目录的安全状态寄存器的值等于 X,若 X<Y表示不允许该操作。如某文件写的权限为53表示对该文件进行写之前必须使当前目录的安全状态寄存器的值为 3、4或5。
例:某文件读的权限为F0,写的权限为F1,代表可任意读取,写时必须满足当前目录的安全状态寄存器的值大于等于1。

6.3 安全机制

安全机制是指某种安全状态转移为另一种安全状态所采用的方法和手段。FMCOS通过核对口令和外部认证来改变安全状态寄存器的值。当在MF下时,认证通过之后同时改变MF和当前目录的安全状态寄存器的值,若不在MF下则认证通过之后只改变当前目录的安全状态寄存器值。
当建立口令或外部认证密钥时,参数的后续状态表示该口令核对成功或外部认证成功后,置当前目录的安全状态寄存器的值为后续状态。如某口令密钥的后续状态为01表示对口令核对成功后,当前目录的安全状态寄存器的值为1。当上电复位后或从父目录进入子目录或退回上级目录时,当前目录的安全状态寄存器的值均自动被置为0。
为更好的理解FMCOS的安全机制,下面举一例说明:
设卡中某目录下有一个二进制文件,定义读二进制文件的权限为F1,写二进制文件权限为F2。该目录下有一个口令密钥,口令核对通过之后的后续状态为1,卡中有一外部认证密钥,使用权限为11,外部认证通过之后后续状态为2。

6.4 密码算法

FMCOS 支持 Single DES、Triple DES。
在建立DES密钥时,若密钥长度为8字节则运算时使用SingleDES算法,若密钥长度为16字节则运算时使用Triple DES算法(MAC只能用Single DES 算法)。
运算时使用加密还是解密算法完全由密钥类型决定,如:用于加密的密钥不可用于解密或MAC运算,用于外部认证的密钥也不可用于内部认证。
FMCOS在使用DES算法时,若数据长度大于8字节时使用ECB模式,若数据长度不是8的倍数时在计算过程中自动在数据后补8000…00使其长度为8的倍数。如果数据为12233456788990A1B1,由于数据长度不是8的倍数,所以在计算过程中自动将数据改写为12233456788990A1B1800000000000 00 后再进行计算。
用DES算法作外部认证的过程如下:

七、命令与应答

7.1 命令与应答结构

CLA:指令类别
INS:指令类型的指令码
P1 P2:命令参数
Lc:数据域DATA长度,该长度不可超过136字节
DATA:数据域或应答数据域
Le:要求返回数据长度,Le为00表示返回卡中最大数据长度,该长度不可超过136字节
SW1 SW2:卡执行命令的返回代码(状态字)

7.2 状态字SW1、SW2的意义

任意一条命令的应答至少由一个状态字(2个字节)组成。状态字说明了命令处理的情况,即命令是否被正确执行,如果未被正确执行,原因是什么。

注意:
当SW1的高半字节为’9’,且低半字节不为’0’时,其含义依赖于相关应用。
当SW1的高半字节为’6’,且低半字节不为’0’时,其含义与应用无关。

八、安全报文传送

8.1 安全报文传送

卡与外界进行数据传输(卡接收命令,发送应答)时,若以明文方式传输,攻击者通过劫获这些数据,可以分析出卡的结构,掌握卡中的数据。同时,也可以对传输的数据进行篡改。
如何避免这个问题呢?方法就是采用安全报文传送。
安全报文传送的目的是保证数据的可靠性、完整性和对发送方的认证。安全报文传送有三种情况:

  • 线路保护:对传输的数据附加4字节MAC码,接收方收到后首先进行校验,只有校验正确的数据才予以接受,这样就防止了对传输数据的篡改。数据完整性和对发送方的认证通过使用MAC 来实现。

  • 线路加密:对传输的数据进行DES加密,这样传输的就是密文,攻击者即使获得数据没有意义,分析后也只能得到错误的结果。数据的可靠性通过对数据域的加密来得到保证。

  • 线路加密保护:对传输的数据进行DES加密后再附加4字节MAC码。

    [注]:至于采取哪种方法进行安全报文传送由用户根据实际情况来决定。应该指出,高安全性是以降低速度,增加实现难度来换取的,所以并不是安全性越高越好,而一定要根据具体的要求来确定。

8.2 如何实现安全报文传送

进制文件、定长记录文件、变长记录文件、循环文件、钱包文件都可以采用安全报文传送。如对上述文件进行安全报文传送,只需在建立文件时改变文件类型字节高两位即可:
最高位置1表示数据域附加4字节MAC,次高位置1表示对数据加密。
对于密钥也可以采用安全报文传送。如进行安全报文传送,只需在安装密钥时改变密钥类型字节高两位即可:
最高位置1表示数据域附加4字节MAC,次高位置1表示对数据加密。
例:建立文件时若需进行线路保护则将文件类型最高位置1,如二进制类型由28变为A8。
若需对密钥进行线路加密保护则将密钥类型的最高位及次高位均置1,如PIN 类型由 3A 变为 FA。
[注]:在对文件进行读写,或使用密钥(如核对、解锁、认证或更改密钥)时,若需采用安全报文传送,必须置 CLA 的后半字节为十六进制’4’。

8.3 MAC计算

MAC是使用命令的所有元素(包括命令头)产生的。MAC是命令数据域中最后一个数据元,它的长度为4个字节。
MAC 的计算步骤如下:

  • 终端向 IC 卡发出一个 GET CHALLENGE 命令,从 IC 卡取回 4字节随机数。将IC卡回送的4字节随机数后缀以’00000000’,所得到的结果作为初始值。

  • 按照顺序将以下数据连接在一起形成数据块:

    CLA,INS,P1,P2,Lc+4,DATA

    必须置 CLA 的后半字节为十六进制’4’。

    在命令的数据域中(如果存在)包含明文或加密的数据(例:如果要进行线路加密保护,加密后的数据块放在命令数据域中传输)

  • 将该数据块分成8字节为单位的数据块,标号为D1,D2,D3等。最后的数据块有可能是1-8个字节。

  • 如果最后的数据块长度是8字节的话,也必须在其后加上16进制数字’80 00 00 00 00 00 00 00’,转到第六步。

    如果最后的数据块长度不足8字节,则在其后加上16进制数字’80’,如果达到8字节长度,则转入第六步;否则在其后加上16进制数字’00’直到长度达到8字节为止。

  • 对这些数据块使用相应密钥进行加密。(密钥由FMCOS命令或中国金融IC卡专用命令所指定)
    如果该密钥长度为8字节,则依照图1的方式来产生MAC(根据在第三步中产生的数据块长度的不同,有可能在计算中会多于或少于三步)。

    如果该密钥长度为16字节,则依照图2的方式来产生 MAC(根据在第三步中产生的数据块长度的不同,有可能在计算中会多于或少于三步)。

  • 最终得到是从计算结果左侧取得的4字节长度的MAC。

[注]:图中的8字节密钥均相同,由FMCOS命令或中国金融IC卡专用命令所指定。

图8-1 用长度为8字节的密钥产生MAC的算法

图8-2 用长度为16字节的密钥产生MAC的算法

8.4 数据加密/解密的计算

8.4.1 数据加密计算

数据加密计算步骤如下:

  • 用 LD 表示明文数据的长度,在明文数据前加上LD产生新的数据块。

  • 将第一步中生成的数据块分解成8字节数据块,标号为D1,D2,D3,D4等等。最后一个数据块长度有可能不足8位。

  • 如果最后(或唯一)的数据块长度等于8字节,转入第四步;如果不足8字节,在右边添加16进制数字’80’,如果长度已达8字节,转入第四步;否则,在其右边添加16进制数字’00’直到长度达到8字节。

  • 对每一个数据块使用相应密钥进行加密。(密钥由FMCOS命令或中国金融IC卡专用命令所指定)
    如果该密钥长度为8字节,则依照图8-3的方式来加密数据块;

    如果该密钥长度为16字节,则依照图8-4的方式来加密数据块。

  • 计算结束后,所有加密后的数据块依照原顺序连接在一起(加密后的D1,加密后的 D2,等等)。并将结果数据块插入到命令数据域。

图8-3 用长度为8字节的密钥进行数据加密的算法

图8-4 用长度为16字节的密钥进行数据加密的算法

8.4.2 数据解密计算

数据解密计算步骤如下:

  • 将命令数据域块分解成8字节长的数据块,标号为D1,D2,D3,D4等等。
  • 对每一个数据块使用与数据加密相同的密钥进行解密。(密钥由FMCOS命令或中国金融 IC 卡专用命令所指定)

​ 如果该密钥长度为8字节,则依照图8-5的方式来解密数据块。

​ 如果该密钥长度为16字节,则依照图8-6的方式来解密数据块。

  • 计算结束后,所有解密后的数据块依照顺序(解密后的D1,解密后的D2,等等)链接在一起。数据块由 LD、明文数据、填充字符组成。
  • 因为 LD 表示明文数据长度,因此,它被用来恢复明文数据。

图8-5 用长度为8字节的密钥进行数据解密的算法

图8-6 用长度为16字节的密钥进行数据解密的算法

8.5 安全报文传送的命令情况

九、FM1208卡片调试

9.1 明文读写

9.1.1 二进制文件读写

1、选择MF目录文件

代码 备注
CLA 00
INS A4
P1 00 P1=00时,按文件标识符选择;P1=04时,按目录名选择。
P2 00
Lc 02 Lc为文件标识符或目录名的长度。
Data 3F 00 Data为文件标识符或目录名。
Le 00 固定为00

Rdr: 00 A4 00 00 02 3F 00 00
Tag: 6F 10 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 [90 00] 命令执行成功

2、在MF目录下面建立一个DF目录文件(文件标识符1F 00)

代码 备注
CLA 80
INS E0
P1 1F P1=文件标识符高字节
P2 00 P2=文件标识符低字节
Lc 0D Lc为数据长度
Data Data依次为文件类型、空间(2字节)、建立权限、擦除权限、应用文件ID(高3位为100表示ADF短文件标识符)、保留字(FFFF)、目录名(标准为5-16字节,但实际可少于5字节)
Le 不存在

Data:38 04 00 F0 F0 95 FF FF 11 22 33 44 55(空间为1024字节,建立权限F0,擦除权限F0,应用文件ID为95,目录名为1122334455)。

Rdr: 80 E0 1F 00 0D 38 04 00 F0 F0 95 FF FF 11 22 33 44 55
Tag: [90 00] 命令执行成功

3、在文件标识符为1F 00的目录下建立一个二进制文件(文件大小16字节,文件标识符为00 01),并写入数据00112233445566778899AABBCCDDEEFF

选择文件标识符为1F 00的目录文件:

Rdr: 00 A4 00 00 02 1F 00 00
Tag: 6F 07 84 05 11 22 33 44 55 [90 00] 命令执行成功

建立二进制文件:

代码 备注
CLA 80
INS E0
P1 00 P1=文件标识符高字节
P2 01 P2=文件标识符低字节
Lc 07
Data Data依次为文件类型、空间(2字节)读权限、写权限、保留字1(FF)、保留字2(FF=无线路保护读,读写都使用密钥00)
Le 不存在

Data:28 00 10 F0 F0 FF FF(空间为16字节,读权限F0,写权限F0)

Rdr: 80 E0 00 01 07 28 00 10 F0 F0 FF FF
Tag: [90 00] 命令执行成功

向文件标识符为00 01的二进制文件写入数据:

代码 备注
CLA 00
INS D6
P1 81 P1的最高位不为1,则P1P2为文件偏移量;P1的高3位为100,P1的低5位为短文件标识符,P2为偏移量。
P2 00
Lc 10 Lc为要写入的数据长度
Data 要写入的数据
Le 不存在

Data:00112233445566778899AABBCCDDEEFF

Rdr: 00 D6 81 00 10 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
Tag: [90 00] 命令执行成功

4、读取二进制文件

代码 备注
CLA 00
INS B0
P1 81 P1的最高位不为1,则P1P2为文件偏移量;P1的高3位为100,P1的低5位为短文件标识符,P2为偏移量。
P2 00
Lc 不存在
Data 不存在
Le 00 Le为要读取的长度,00表示读取至多256字节。

Rdr: 00 B0 81 00 00
Tag: 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF [90 00] 命令执行成功

9.1.2 定长记录文件读写

1、选择文件标识符为1F 00的DF目录文件

Rdr: 00 A4 00 00 02 1F 00 00
Tag: 6F 07 84 05 11 22 33 44 55 [90 00] 命令执行成功

2、建立定长记录文件(3条记录,每条记录16字节,文件标识符为00 02)

P1P2为文件标识符;Lc为数据长度;Data依次为文件类型、空间(2字节:第一字节为记录条数,第二字节为记录长度)、读权限、写权限、保留字1(FF)、保留字2(FF=无线路保护读,读写都使用密钥00)

Data:2A 03 10 F0 F0 FF FF

Rdr: 80 E0 00 02 07 2A 03 10 F0 F0 FF FF
Tag: [90 00] 命令执行成功

3、添加记录文件

P1固定为00;P2高5位为短文件标识符,00000表示当前文件,P2低3位固定为100;Lc为要写入的数据长度;Data为要写入的数据;

Data:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Rdr: 00 E2 00 14 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Tag: [90 00] 命令执行成功

Data:11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11

Rdr: 00 E2 00 14 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
Tag: [90 00] 命令执行成功

Data:22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22

Rdr: 00 E2 00 14 10 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
Tag: [90 00] 命令执行成功

4、读取记录文件

P1为记录号;P2的低3位始终为100;P2的高5位全为0表示当前文件,反之表示短文件标识符;Le为要读取的长度,00表示读取整条记录;

Rdr: 00 B2 01 14 00
Tag: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [90 00] 命令执行成功

Rdr: 00 B2 02 14 00
Tag: 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 [90 00] 命令执行成功

Rdr: 00 B2 03 14 00
Tag: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 [90 00] 命令执行成功

9.1.3 循环记录文件读写

1、选择文件标识符为1F 00的DF目录文件
Rdr: 00 A4 00 00 02 1F 00 00
Tag: 6F 07 84 05 11 22 33 44 55 [90 00] 命令执行成功

2、建立循环记录文件(3条记录,每条记录16字节)
P1P2为文件标识符;Lc为数据长度;Data依次为文件类型、空间(2字节:第一字节为记录总条数,第二字节为记录长度)、读权限、写权限、保留字1(FF)、保留字2(FF=无线路保护读,读写都使用密钥00)。
Data:2E 03 10 F0 F0 FF FF
Rdr: 80 E0 00 03 07 2E 03 10 F0 F0 FF FF
Tag: [90 00] 命令执行成功

3、添加记录文件
P1固定为00;P2高5位为短文件标识符,00000表示当前文件,P2低3位固定为100;Lc为要写入的数据长度;Data为要写入的数据;
Data:11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
Rdr: 00 E2 00 1C 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
Tag: [90 00] 命令执行成功

Data:22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
Rdr: 00 E2 00 1C 10 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
Tag: [90 00] 命令执行成功

Data:33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
Rdr: 00 E2 00 1C 10 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
Tag: [90 00] 命令执行成功

第四条记录覆盖最先添加的记录(11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11)
Data:55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
Rdr: 00 E2 00 1C 10 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55
Tag: [90 00] 命令执行成功

4、读循环记录文件
P1为记录号;P2的低3位始终为100,P2的高5位全为0表示当前文件,反之表示短文件标识符;Le为要读取的长度,00表示读取整条记录;
读第一条记录(循环记录文件最新的记录,记录号为01)
Rdr: 00 B2 01 1C 00
Tag: 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 55 [90 00] 命令执行成功

读第二条记录(记录号为02)
Rdr: 00 B2 02 1C 00
Tag: 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 [90 00] 命令执行成功

读第三条记录(记录号为03)
Rdr: 00 B2 03 1C 00
Tag: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 [90 00] 命令执行成功

9.2 线路保护读写

注:数据在FMCOS中都是明文存储

9.2.1 建立线路保护密钥

1、MF目录下面建立DF目录文件(文件标识符2F 00)
选择MF目录文件(文件标识符3F 00):
Rdr: 00 A4 00 00 02 3F 00 00
Tag: 6F 10 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 [90 00] 命令执行成功

建立DF目录文件(文件标识符2F 00):
Rdr: 80 E0 2F 00 0D 38 04 00 F0 F0 81 FF FF 11 22 33 44 55
Tag: [90 00] 命令执行成功

2、建立密钥文件:
P1P2为文件标识符;Lc为数据长度;Data依次为文件类型、空间(2字节)、短文件标识符(高3位为000表示DDF,为100表示ADF)、增加权限、保留字(FFFF)
Data:3F 00 80 81 FA FF FF
Rdr: 80 E0 00 01 07 3F 00 80 81 FA FF FF
Tag: [90 00] 命令执行成功

3、增加口令密钥(密钥为1122334455667788,使用权为F0,后续状态为AA):

选择MF目录文件(文件标识符3F 00):
Rdr: 00 A4 00 00 02 3F 00 00
Tag: 6F 10 84 0E 31 50 41 59 2E 53 59 53 2E 44 44 46 30 31 [90 00] 命令执行成功

选择DF目录文件(文件标识符2F 00):
Rdr: 00 A4 00 00 02 2F 00 00
Tag: 6F 0D 84 05 11 22 33 44 55 A5 04 9F 08 01 02 [90 00] 命令执行成功

选择密钥文件(文件标识符00 01):
Rdr: 00 A4 00 00 02 00 01 00
Tag: [90 00] 命令执行成功

增加口令密钥:
P1为01表示新增,为特定密钥类型表示更新;P2为密钥标识;Lc为数据长度;Data依次为密钥类型、使用权、保留字EF、后续状态、错误计数器、密钥(2-8字节);口令字符是奇数的,最后使用F占位
Data:3A F0 EF AA FF 11 22 33 44 55 66 77 88
Rdr: 80 D4 01 00 0D 3A F0 EF AA FF 11 22 33 44 55 66 77 88
Tag: [90 00] 命令执行成功

4、增加线路保护密钥(密钥为1111111111111111,使用权为FA,更改权为FA)

验证口令密钥(改变当前目录安全状态寄存器状态值为A):
P1固定为00;P2为口令密钥标识符;Lc为口令密钥长度(02-08);Data为输入的口令密钥
Rdr: 00 20 00 00 08 11 22 33 44 55 66 77 88
Tag: [90 00] 命令执行成功

增加线路保护密钥:
P1为01表示新增,为特定密钥类型表示更新;P2为密钥标识(建议为00);Lc为数据长度;Data依次为密钥类型、使用权、更改权、保留字FF、错误计数器、密钥(8或16字节)
Data:36 FA FA FF FF 11 11 11 11 11 11 11 11
Rdr: 80 D4 01 00 0D 36 FA FA FF FF 11 11 11 11 11 11 11 11
Tag: [90 00] 命令执行成功

9.2.2 线路保护读写(明文+MAC)

1、选择DF目录文件(文件标识符为2F 00)

Rdr: 00 A4 00 00 02 2F 00 00
Tag: 6F 0D 84 05 11 22 33 44 55 A5 04 9F 08 01 02 [90 00] 命令执行成功

2、验证口令密钥(置当前目录安全状态寄存器值为A)

Rdr: 00 20 00 00 08 11 22 33 44 55 66 77 88
Tag: [90 00] 命令执行成功

3、建立二进制文件(使用线路保护,文件标识符0003,大小16字节,使用密钥标识00的密钥)

Rdr: 80 E0 00 03 07 A8 00 10 FA FA FF 7F
Tag: [90 00] 命令执行成功

4、读写二进制文件(使用线路保护读写,使用密钥标识00的密钥)

4.1 取随机数:

Rdr: 00 84 00 00 04
Tag: 02 26 1E B8 [90 00] 命令执行成功

4.2 计算命令MAC:

命令:04 D6 83 00 14 FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00

MAC:D2 21 2D 94

4.3 写数据:

Rdr: 04 D6 83 00 14 FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00 D2 21 2D 94
Tag: [90 00] 命令执行成功

4.4 读数据:

Rdr: 04 B0 83 00 04 67 56 A4 D6 00
Tag: FF EE DD CC BB AA 99 88 77 66 55 44 33 22 11 00 A3 1F 3D 98 [90 00] 命令执行成功

9.2.3 线路加密读写(密文写,明文读)

1、选择DF目录文件(文件标识符为2F 00)

Rdr: 00 A4 00 00 02 2F 00 00
Tag: 6F 0D 84 05 11 22 33 44 55 A5 04 9F 08 01 02 [90 00] 命令执行成功

2、验证口令密钥(置当前目录安全状态寄存器值为A)

Rdr: 00 20 00 00 08 11 22 33 44 55 66 77 88
Tag: [90 00] 命令执行成功

3、建立二进制文件(使用线路加密,文件标识符0006,大小16字节,使用密钥标识00的密钥)

Rdr: 80 E0 00 06 07 68 00 10 FA FA FF FF
Tag: [90 00] 命令执行成功

4、读写二进制文件(使用线路加密读写,使用密钥标识00的密钥)

明文数据:00112233445566778899AABBCCDDEEFF

密文数据:FF 61 E5 88 2E CA C8 19 CD 5E 59 CB 9F 4F 80 3D 3D 0A 29 6C D8 36 CF AB

写二进制文件:

Rdr: 04 D6 86 00 18 FF 61 E5 88 2E CA C8 19 CD 5E 59 CB 9F 4F 80 3D 3D 0A 29 6C D8 36 CF AB
Tag: [90 00] 命令执行成功

读二进制文件:

Rdr: 00 B0 86 00 00
Tag: 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF [90 00] 命令执行成功

9.2.4 线路加密保护读写(密文+MAC)

1、选择DF目录文件(文件标识符为2F 00)

Rdr: 00 A4 00 00 02 2F 00 00
Tag: 6F 0D 84 05 11 22 33 44 55 A5 04 9F 08 01 02 [90 00] 命令执行成功

2、验证口令密钥(置当前目录安全状态寄存器值为A)

Rdr: 00 20 00 00 08 11 22 33 44 55 66 77 88
Tag: [90 00] 命令执行成功

3、建立二进制文件(使用线路加密保护,文件标识符0007,大小16字节,使用密钥标识00的密钥)

Rdr: 80 E0 00 07 07 E8 00 10 FA FA FF 7F
Tag: [90 00] 命令执行成功

4、读写二进制文件(使用线路加密保护读写,使用密钥标识00的密钥)

明文数据:00112233445566778899AABBCCDDEEFF

密文数据:FF 61 E5 88 2E CA C8 19 CD 5E 59 CB 9F 4F 80 3D 3D 0A 29 6C D8 36 CF AB

写二进制文件:

命令:04 D6 87 00 1C FF 61 E5 88 2E CA C8 19 CD 5E 59 CB 9F 4F 80 3D 3D 0A 29 6C D8 36 CF AB

MAC:A7 F1 EC B4

Rdr: 04 D6 87 00 1C FF 61 E5 88 2E CA C8 19 CD 5E 59 CB 9F 4F 80 3D 3D 0A 29 6C D8 36 CF AB A7 F1 EC B4
Tag: [90 00] 命令执行成功

读二进制文件:

Rdr: 04 B0 87 00 04 63 CC EF 47 00
Tag: FF 61 E5 88 2E CA C8 19 CD 5E 59 CB 9F 4F 80 3D 3D 0A 29 6C D8 36 CF AB EF B9 3E 28 [90 00] 命令执行成功