根据树状的卡内文件结构,CPU卡内的文件分为3种类型:主文件MF、专用文件DF、基本文件EF。
1、主文件MF
在每一张卡片文件系统的文件树中都只存在着一个根文件,其他所有文件都是该文件的子文件。
这个文件也是整个卡片的入口,称为MF(Master File)。每一张卡片中有且只有一个MF。
MF也是文件系统中最重要的一个文件,对卡片的操作通常从选择MF开始。此外,由于MF的特殊性,通常将MF的标识符定义为3F00,这样,对于不同的卡片,通常都可以通过这一默认的标识符进行MF的选择操作。由于MF不存在父文件,在卡片的应用阶段又必须存在,所以在卡片的初始化阶段就必须首先建立MF。除此之外,MF的其他属性与DF完全类似。
2、专用文件DF
DF类似于PC文件系统中的目录文件,一般情况下,也可以将MF看作是特殊的DF。
如果把MF作为卡片的逻辑映射的话,一个DF往往可以看作是一类数据或者一个应用在卡内的映射。通常,同级的DF之间完全独立,COS能够确保它们之间的数据独立性和安全性;对于不同级的DF之间,包括具有父子关系的DF,在实际的应用阶段可以根据实际应用的定义实现隔绝或者托管的安全逻辑。
为了标识不同的DF,每一个DF具有一个同级DF下唯一的文件标识符和一个卡内全局唯一的应用标识符(AID)。
在实现上,文件标识符通常采用一个Word类型的整数来标识,而且其值为0x100的倍数,例如3F00、4F00、5F00等等。1F00和2F00通常保留作为系统特殊文件标识。应用标识符AID通常是一个有限长的二进制串,通常作为该DF对应的应用的简单描述。使用文件标识符和应用标识符都可以对当前文件子层DF文件进行检索,如果使用3F00使用文件标识符检索条件,则COS自动选择MF;如果卡片资源允许的话,COS也可以实现对卡内所有DF或者当前DF以下包含的所有子DF文件进行检索,这时一般采用AID作为检索条件。
可以将DF分为DDF和ADF两类。
(1)目录专用文件DDF
如果在一个DF下还包含子DF的话,也就是,在文件树中如果子结点不全部为叶子结点的话,这样的DF被称为DDF(Directory Definition File)。
一般的,DDF可以作为一组应用(DF)的集合,也可以作为一个复杂多层次应用的入口。
在多应用卡中,MF下通常包含了多个DF,这里的MF就是一个典型的DDF。为了维护管理DDF下所有的DF,在每一个DDF下一般可以包含一个系统文件(DIR文件),记录所有子DF的入口。
(2)应用专用文件ADF
如果在一个DF下不包含有其它的子DF的话,也就是,在文件树中如果所有的子结点全部都是叶子结点的话,这样的DF称为ADF(Application Definition File)。
一般的,ADF是一个应用在卡内的逻辑映射,ADF下包含的都是存数据文件,从卡外来看,一个ADF可以看作是一个只包含了文件控制信息和存数据对象的集合。
ADF下没有DF文件,所以也就不需要DIR文件。
从理论上说,只要卡片空间允许,在卡内可以建立无数多层的文件结构。但是,从卡片的实际应用来看,很少有应用会要求超过3层的DF结构,即MF、DDF、ADF;更一般的来看,如果卡片资源有限,应用目标明确的话,COS可以只支持两层的DF结构,即MF、ADF(MF是卡内唯一的DDF)。
COS对多层次DF结构的支持可以带来很大的应用灵活性,但是同时也会造成COS开发的复杂度大大提升。DF层次的选择和卡片面向的应用有很大的关系,可以根据不同的应用需求来进行选择。例如,在只支持单一应用的COS中,可以直接将MF作为ADF,不支持DDF;对于支持多应用的COS,通常可以选择两层的DF结构,MF下的每一个ADF对应一个独立的应用;对于卡片资源丰富,可以支持复杂应用模式,建立动态应用体系的卡片来说,可以选择实现3层甚至无限多层DF的模式。
3、基本数据文件EF
在文件树中,如果一个文件节点没有子节点,也就是说它本身是一个叶子节点的话,这样的文件称为EF(Elementary File,基本数据文件)。
EF是卡内数据的基本载体,根据不同的形式,EF文件可以分为不同的类型,COS根据EF的各种类型定义了不同的文件操作逻辑。
在卡内,EF都隶属于某一个DF,COS采用两种方式来标识EF。一个是EF的文件标识符FID,一般的,EF和其父DF的FID高字节相同,EF的FID低字节作为EF文件的扩展短文件标识符,称为eSFI,eSFI的低5位称为短文件标识符SFI,在同一个DF下,所有EF的SFI要求都不相同。二是EF的文件类型,在每一个EF的文件属性描述中都包含有文件类型标识,某些特殊类型的EF在同一DF下要求唯一。
对EF的选择方式和DF不同。对DF的操作一般要求事先进行显式的选择操作,被选的DF作为当前文件,接下来的所有文件操作都针对当前文件进行;对EF操作之前要求先选择其父DF作为当前文件,对EF的选择在具体的操作命令中隐式的进行。EF的选择方式有两种,一是通过SFI进行选择,SFI在当前DF下唯一;二是通过文件类型进行选择,主要针对一些系统文件的操作,例如个人密码PIN文件、对称密钥文件等,这些类型的文件在当前DF下也要求唯一存在。
下面我们来看看不同的EF及其操作模式。
(1)按数据结构分类
卡内保存的数据可以分为两类,一类是透明的流数据,具体的数据内容和格式在卡外进行解释,卡内解释为一个连续的二进制数据流;第二类是结构数据,数据以记录的形式存在,COS能够将数据解释为若干条二进制的记录流。根据所存储数据的结构不同,EF可以分为不同的类别,不同结构的EF对应了不同类型的操作。
a. 透明二进制文件
透明二进制文件是卡内所有文件的基础,卡片将数据作为一个字节流来进行处理,二进制文件的主要属性只有文件体的大小。
对二进制文件夹的操作包括文件数据的读、写两种模式。
数据的读写操作包括以下两种方式。
文件体全部数据的读写操作。
文件体某一区段数据的读写操作。在读写操作之前,必须给出要读写区段起始位置在文件体的偏移量和要读写区段的长度。
需要注意的是,对于区段读写需要严格检查区段是否超出了文件体的范围。
b. 定长记录文件
在定长记录文件中,文件体划分为n个等长的区段,每一个区段对应一条数据记录。
二进制文件的主要属性包括:所容纳的记录每一条的大小,能够容纳的总的记录条数。在实际的使用阶段,为了标识记录的有效性,还可以包括当前已经写入的记录的数目,为了进行记录逐一检索,还需要记录当前操作的记录序号等。
当前操作的记录序号由COS来进行自动维护,在文件第一次被选择时自动置为空,以后根据实际访问进行修改。
对定长记录文件的操作都以记录为对象进行,包括记录的读、写、添加3种模式。
记录的读写操作包括几种方式。
指定记录序号的记录读写操作,这一操作不改变当前操作记录序号。
相对当前记录位置的定位方式,包括当前记录的前一条、后一条记录等。如果当前记录号为空时,如果访问前一条记录的话,返回第一条记录,并置当前记录为第一条记录;如果访问后一条记录的话,返回最后一条记录,并置当前记录为最后一条记录。
相对全局记录位置的定位方式,例如第一条、最后一条记录等,这一操作将把该记录设置为当前记录。
在定长记录的操作过程中,需要严格检查记录号是否在文件包含的记录数的范围内,当前记录号对应的记录数据是否有效等。
记录的添加操作即在最后一条记录的后面添加新的记录。
如果逻辑上的最后一条记录不是物理上的最后一条,即其后还有空闲的记录空间,新的记录顺序添加在后面,同时将新的记录设为逻辑的“最后一条记录”。
如果逻辑上的最后一条记录是物理上的最后一条,即其后没有空闲的记录空间了,则添加操作失败,卡片返回相应的错误码。
c. 变长记录文件
变长记录文件和定长记录文件一样,文件体的数据区被划分为多个记录段,但是每个记录段的长度都不相同,卡片必须根据每一条记录的实际长度来进行定位。
变长记录文件的属性包括文件体的大小,也就是所有记录长度之和可能达到的最大值。此外,还有当前文件中包含的所有记录的总数。由于记录的长度都不确定,和定长记录文件中只保存每一条记录体内容不同的是,变长记录文件体中的每一条记录体中还必须包含该条记录的实际数据长度。同时,卡片还需要记录当前操作的记录序号等。
当前操作的记录序号由COS来进行自动维护,在文件第一次被选择时自动置为空,以后根据实际访问进行修改。
对变长记录文件的操作也以记录为对象进行,包括了记录的读、写、添加等操作。
对记录的读写操作包含了如下几种形式。
指定记录序号的记录读写操作,这一操作不改变当前操作记录号。
相对当前记录位置的定位方式,包括当前记录的前一条、后一条记录等。如果当前记录号为空时,如果访问前一条记录的话,返回第一条记录,并置当前记录为第一条记录;如果访问后一条记录的话,返回最后一条记录,并置当前记录为最后一条记录。
相对全局记录位置的定位方式,例如第一条、最后一条记录等,这一操作将把该记录设置为当前记录。
要注意的是,对变长记录的存储一般使用链式存储方式,对变长记录的写操作必须遵循的重要原则是:新的数据长度必须和原有数据长度等长,这也是进行写操作处理时要重点检查的内容。同时,还需要检查操作指定的记录号是否有效。
对记录的添加操作是在文件体最后一条记录的后面添加新的记录。新的记录添加成功以后将称为新的最后一条记录。
进行添加操作时,卡片需要重点检查此时文件体的剩余空间是否能够容纳该记录体,包括记录的实际数据长度和可能需要的长度等指示字节。
d. 环形定长记录文件
环形定长记录文件和定长记录文件类似,文件体被划分为多个等长的记录段,区别在于记录之间的关系。定长记录文件逻辑上的第一条和最后一条与物理意义上的基本相符,但是在环形定长文件中数据空间物理意义上的第一条记录和最后一条记录相连组成了一个记录环,逻辑上的第一条和最后一条记录表示的是最早添加和最新添加的记录项。
环形定长记录文件的属性包括所容纳的每一条记录的大小,能够容纳的记录数。还由于是一个环形的结构,需要记录逻辑第一和逻辑最后一条的记录位置。同时,卡片还需要记录当前操作的记录序号等。
当前操作的记录序号由COS来进行自动维护,在文件第一次被选择时自动置为空,以后根据实际访问进行修改。
对环形定长记录文件的操作也以记录为对象进行,包括了记录的读、写、添加等操作。
对记录的读写操作包含了如下几种形式。
指定记录序号的记录读写操作,这一操作不改变当前操作记录序号。
相对当前记录位置的定位方式,包括当前记录的前一条、后一条记录等。如果当前记录号为空时,如果访问前一条的话,返回第一条记录,并置当前记录为第一条记录;如果访问后一条记录的话,返回最后一条记录,并置当前记录为最后一条记录。
相对全局记录位置的定位方式,例如第一条、最后一条记录等,这一操作将把该记录设置为当前记录。
要特别注意的是,和定长记录文件不同在于,每一条记录都有下一条记录和上一条记录的概念,可以无限循环进行,此外,第一条、最后一条等都是逻辑概念,要和物理意义上的严格区分开。
对记录的添加操作是在文件体中逻辑上最后一条记录的后面添加新的记录。
如果在最初记录环还没有完全充满的时候,添加的新记录将占用一个空的位置,成为新的“最后一条”,逻辑上的第一条记录位置不变。
如果在记录环已经完全充满以后,可以设想,这时逻辑上的第一条和最后一条相邻,“第一条”是“最后一条”的“下一条记录”,“最后一条”是“第一条”的“上一条记录”,这时添加新记录的话,新记录将占用原“第一条记录”的空间,旧的记录内容被覆盖了。新的记录将成为“最后一条记录”,原“第一条记录”的下一条记录将成为新的“第一条记录”。
所以在进行添加操作时,卡片需要根据记录环的占用情况决定环的指示指针更新,和不定长记录文件的添加不一样的在于,环形记录文件可以无限次的进行添加操作。
当然,对于不同文件类型的操作模式还可以在此基础上进行扩展,或者对以上操作模式进行一定的简化,甚至只实现透明二进制文件一种文件类型等等,这个可以根据COS的实际需求来进行取舍。
(2)按文件用途分类
除了按照EF文件内数据结构来进行划分以外,还可以根据EF文件所存储数据的类型进行分类,也即按照文件的用途来分类。
a. DIR文件
DIR文件是DDF下用以记录其子DF的文件,通常为一个变长记录文件。
记录的每一项分别对应着一个子DF,一般包括DF的AID等信息。
应用终端可以通过读取DIR文件来得到卡内已存在的所有ADF,也即卡内存在的所有应用。
DIR文件在DDF下唯一存在,必须在创建子DF之前创建出来。
DIR文件可以作为记录文件进行读取,但是通常不允许外界的写文件操作。此外,一般不实现对DIR文件任何的显式操作,对DIR文件的维护工作由COS系统自动完成。
b. PIN文件
PIN文件是卡片中和卡片安全相关的文件,保存和DF相关的用户个人密码信息。
DF下的PIN文件可以根据应用的需求决定是否存在,如果存在的话在DF下唯一。PIN文件通常是一个定长记录文件。
记录的每一项分别对应了一条PIN记录,记录体通常是PIN的属性和内容等信息。每一个PIN文件能够容纳的PIN的数目可以根据COS的实现来定义,根据应用的具体情况,COS可以选择实现单一PIN或者能够支持多条PIN的模式。
PIN文件的内容是需要保密的重要信息,通常不允许进行读操作。
对PIN文件没有显式的选择过程,在与PIN相关的命令执行过程中由COS自动进行查找。
对PIN文件通常也没有显式的写文件操作,通常通过添加PIN、修改PIN、重装PIN等命令完成。
c. 对称KEY文件
对称KEY文件是卡片中和卡片安全相关的另一个重要文件,保存和DF相关的各种对称KEY信息。
DF下的KEY文件可以根据应用的需求决定是否存在,如果存在的话在DF下唯一存在。根据对称KEY文件中保存的KEY的类型,KEY文件可以选择采用一个定长记录文件或者变长记录文件,选用的类型由COS来决定。目前卡片安全体系中一般选用DES和3DES算法作为对称密钥体系的基础,所以可以选用定长记录文件。
记录的每一项分别对应了一条KEY记录,记录体通常是KEY的属性和内容等信息。每一个KEY文件通常能够容纳多条的KEY记录,容纳的条数和每一条KEY的作用都由DF对应的具体应用来决定。
需要特别注意的是,在目前的卡片安全体系中每一个DF都有一个必备的对称密钥,这个密钥通常不保存在对称KEY文件中。
KEY文件的内容是需要保密的重要信息,通常不允许进行读操作。
对KEY文件没有显式的选择过程,在与KEY相关的命令执行过程中由COS自动进行查找。
对KEY文件通常没有显式的写文件操作,通常通过写KEY、重装KEY等命令完成。
d. 非对称KEY文件
非对称KEY文件和PIN文件、对称KEY文件不同,一方面它是卡片中和卡片安全相关的一个重要文件,保存和DF安全相关的非对称KEY信息,另一方面它也可以作为卡片中的应用文件,具体的使用由应用来定义。
非对称KEY文件一般只在支持PKI体系的COS和应用中才存在。在每一个文件中一般只保存一对非对称KEY的信息,包括公钥和私钥两部分。通常选用透明二进制文件格式来存储,文件体的内容由COS解释。
对非对称KEY文件的选择过程,在与非对称相关的命令执行过程中指定,通过选择文件同时可以得到相关的非对称密钥对的信息。
在这个KEY文件中,私钥的信息是需要严格保密的,公钥的信息可以公开。所以,对文件的读操作要分层次进行控制,通常,对私钥的读取可以设置为禁止或者要求某些保护,对公钥的读取可以设置安全条件没有或者比较宽松。
对非对称KEY文件没有显式的写文件操作,通常通过写KEY命令来完成。
e. 应用自定义解释文件
除了以上这些系统解释的特殊文件类型外,应用还可以自定义一些特殊的文件类型,这些特殊文件的数据含义由应用自定义和自解释,COS只是将其作为透明二进制、定长记录、不定长记录、环形记录等文件类型来操作。
我们在开发涉及金融的应用支持中经常接触到两种特殊文件,一个是电子钱包文件,一个是电子存折文件,如果COS要支持金融应用,一般在COS中包含这两种特殊文件的定义。对这两类文件的操作完全通过应用命令来完成。
1、主文件MF
在每一张卡片文件系统的文件树中都只存在着一个根文件,其他所有文件都是该文件的子文件。
这个文件也是整个卡片的入口,称为MF(Master File)。每一张卡片中有且只有一个MF。
MF也是文件系统中最重要的一个文件,对卡片的操作通常从选择MF开始。此外,由于MF的特殊性,通常将MF的标识符定义为3F00,这样,对于不同的卡片,通常都可以通过这一默认的标识符进行MF的选择操作。由于MF不存在父文件,在卡片的应用阶段又必须存在,所以在卡片的初始化阶段就必须首先建立MF。除此之外,MF的其他属性与DF完全类似。
2、专用文件DF
DF类似于PC文件系统中的目录文件,一般情况下,也可以将MF看作是特殊的DF。
如果把MF作为卡片的逻辑映射的话,一个DF往往可以看作是一类数据或者一个应用在卡内的映射。通常,同级的DF之间完全独立,COS能够确保它们之间的数据独立性和安全性;对于不同级的DF之间,包括具有父子关系的DF,在实际的应用阶段可以根据实际应用的定义实现隔绝或者托管的安全逻辑。
为了标识不同的DF,每一个DF具有一个同级DF下唯一的文件标识符和一个卡内全局唯一的应用标识符(AID)。
在实现上,文件标识符通常采用一个Word类型的整数来标识,而且其值为0x100的倍数,例如3F00、4F00、5F00等等。1F00和2F00通常保留作为系统特殊文件标识。应用标识符AID通常是一个有限长的二进制串,通常作为该DF对应的应用的简单描述。使用文件标识符和应用标识符都可以对当前文件子层DF文件进行检索,如果使用3F00使用文件标识符检索条件,则COS自动选择MF;如果卡片资源允许的话,COS也可以实现对卡内所有DF或者当前DF以下包含的所有子DF文件进行检索,这时一般采用AID作为检索条件。
可以将DF分为DDF和ADF两类。
(1)目录专用文件DDF
如果在一个DF下还包含子DF的话,也就是,在文件树中如果子结点不全部为叶子结点的话,这样的DF被称为DDF(Directory Definition File)。
一般的,DDF可以作为一组应用(DF)的集合,也可以作为一个复杂多层次应用的入口。
在多应用卡中,MF下通常包含了多个DF,这里的MF就是一个典型的DDF。为了维护管理DDF下所有的DF,在每一个DDF下一般可以包含一个系统文件(DIR文件),记录所有子DF的入口。
(2)应用专用文件ADF
如果在一个DF下不包含有其它的子DF的话,也就是,在文件树中如果所有的子结点全部都是叶子结点的话,这样的DF称为ADF(Application Definition File)。
一般的,ADF是一个应用在卡内的逻辑映射,ADF下包含的都是存数据文件,从卡外来看,一个ADF可以看作是一个只包含了文件控制信息和存数据对象的集合。
ADF下没有DF文件,所以也就不需要DIR文件。
从理论上说,只要卡片空间允许,在卡内可以建立无数多层的文件结构。但是,从卡片的实际应用来看,很少有应用会要求超过3层的DF结构,即MF、DDF、ADF;更一般的来看,如果卡片资源有限,应用目标明确的话,COS可以只支持两层的DF结构,即MF、ADF(MF是卡内唯一的DDF)。
COS对多层次DF结构的支持可以带来很大的应用灵活性,但是同时也会造成COS开发的复杂度大大提升。DF层次的选择和卡片面向的应用有很大的关系,可以根据不同的应用需求来进行选择。例如,在只支持单一应用的COS中,可以直接将MF作为ADF,不支持DDF;对于支持多应用的COS,通常可以选择两层的DF结构,MF下的每一个ADF对应一个独立的应用;对于卡片资源丰富,可以支持复杂应用模式,建立动态应用体系的卡片来说,可以选择实现3层甚至无限多层DF的模式。
3、基本数据文件EF
在文件树中,如果一个文件节点没有子节点,也就是说它本身是一个叶子节点的话,这样的文件称为EF(Elementary File,基本数据文件)。
EF是卡内数据的基本载体,根据不同的形式,EF文件可以分为不同的类型,COS根据EF的各种类型定义了不同的文件操作逻辑。
在卡内,EF都隶属于某一个DF,COS采用两种方式来标识EF。一个是EF的文件标识符FID,一般的,EF和其父DF的FID高字节相同,EF的FID低字节作为EF文件的扩展短文件标识符,称为eSFI,eSFI的低5位称为短文件标识符SFI,在同一个DF下,所有EF的SFI要求都不相同。二是EF的文件类型,在每一个EF的文件属性描述中都包含有文件类型标识,某些特殊类型的EF在同一DF下要求唯一。
对EF的选择方式和DF不同。对DF的操作一般要求事先进行显式的选择操作,被选的DF作为当前文件,接下来的所有文件操作都针对当前文件进行;对EF操作之前要求先选择其父DF作为当前文件,对EF的选择在具体的操作命令中隐式的进行。EF的选择方式有两种,一是通过SFI进行选择,SFI在当前DF下唯一;二是通过文件类型进行选择,主要针对一些系统文件的操作,例如个人密码PIN文件、对称密钥文件等,这些类型的文件在当前DF下也要求唯一存在。
下面我们来看看不同的EF及其操作模式。
(1)按数据结构分类
卡内保存的数据可以分为两类,一类是透明的流数据,具体的数据内容和格式在卡外进行解释,卡内解释为一个连续的二进制数据流;第二类是结构数据,数据以记录的形式存在,COS能够将数据解释为若干条二进制的记录流。根据所存储数据的结构不同,EF可以分为不同的类别,不同结构的EF对应了不同类型的操作。
a. 透明二进制文件
透明二进制文件是卡内所有文件的基础,卡片将数据作为一个字节流来进行处理,二进制文件的主要属性只有文件体的大小。
对二进制文件夹的操作包括文件数据的读、写两种模式。
数据的读写操作包括以下两种方式。
文件体全部数据的读写操作。
文件体某一区段数据的读写操作。在读写操作之前,必须给出要读写区段起始位置在文件体的偏移量和要读写区段的长度。
需要注意的是,对于区段读写需要严格检查区段是否超出了文件体的范围。
b. 定长记录文件
在定长记录文件中,文件体划分为n个等长的区段,每一个区段对应一条数据记录。
二进制文件的主要属性包括:所容纳的记录每一条的大小,能够容纳的总的记录条数。在实际的使用阶段,为了标识记录的有效性,还可以包括当前已经写入的记录的数目,为了进行记录逐一检索,还需要记录当前操作的记录序号等。
当前操作的记录序号由COS来进行自动维护,在文件第一次被选择时自动置为空,以后根据实际访问进行修改。
对定长记录文件的操作都以记录为对象进行,包括记录的读、写、添加3种模式。
记录的读写操作包括几种方式。
指定记录序号的记录读写操作,这一操作不改变当前操作记录序号。
相对当前记录位置的定位方式,包括当前记录的前一条、后一条记录等。如果当前记录号为空时,如果访问前一条记录的话,返回第一条记录,并置当前记录为第一条记录;如果访问后一条记录的话,返回最后一条记录,并置当前记录为最后一条记录。
相对全局记录位置的定位方式,例如第一条、最后一条记录等,这一操作将把该记录设置为当前记录。
在定长记录的操作过程中,需要严格检查记录号是否在文件包含的记录数的范围内,当前记录号对应的记录数据是否有效等。
记录的添加操作即在最后一条记录的后面添加新的记录。
如果逻辑上的最后一条记录不是物理上的最后一条,即其后还有空闲的记录空间,新的记录顺序添加在后面,同时将新的记录设为逻辑的“最后一条记录”。
如果逻辑上的最后一条记录是物理上的最后一条,即其后没有空闲的记录空间了,则添加操作失败,卡片返回相应的错误码。
c. 变长记录文件
变长记录文件和定长记录文件一样,文件体的数据区被划分为多个记录段,但是每个记录段的长度都不相同,卡片必须根据每一条记录的实际长度来进行定位。
变长记录文件的属性包括文件体的大小,也就是所有记录长度之和可能达到的最大值。此外,还有当前文件中包含的所有记录的总数。由于记录的长度都不确定,和定长记录文件中只保存每一条记录体内容不同的是,变长记录文件体中的每一条记录体中还必须包含该条记录的实际数据长度。同时,卡片还需要记录当前操作的记录序号等。
当前操作的记录序号由COS来进行自动维护,在文件第一次被选择时自动置为空,以后根据实际访问进行修改。
对变长记录文件的操作也以记录为对象进行,包括了记录的读、写、添加等操作。
对记录的读写操作包含了如下几种形式。
指定记录序号的记录读写操作,这一操作不改变当前操作记录号。
相对当前记录位置的定位方式,包括当前记录的前一条、后一条记录等。如果当前记录号为空时,如果访问前一条记录的话,返回第一条记录,并置当前记录为第一条记录;如果访问后一条记录的话,返回最后一条记录,并置当前记录为最后一条记录。
相对全局记录位置的定位方式,例如第一条、最后一条记录等,这一操作将把该记录设置为当前记录。
要注意的是,对变长记录的存储一般使用链式存储方式,对变长记录的写操作必须遵循的重要原则是:新的数据长度必须和原有数据长度等长,这也是进行写操作处理时要重点检查的内容。同时,还需要检查操作指定的记录号是否有效。
对记录的添加操作是在文件体最后一条记录的后面添加新的记录。新的记录添加成功以后将称为新的最后一条记录。
进行添加操作时,卡片需要重点检查此时文件体的剩余空间是否能够容纳该记录体,包括记录的实际数据长度和可能需要的长度等指示字节。
d. 环形定长记录文件
环形定长记录文件和定长记录文件类似,文件体被划分为多个等长的记录段,区别在于记录之间的关系。定长记录文件逻辑上的第一条和最后一条与物理意义上的基本相符,但是在环形定长文件中数据空间物理意义上的第一条记录和最后一条记录相连组成了一个记录环,逻辑上的第一条和最后一条记录表示的是最早添加和最新添加的记录项。
环形定长记录文件的属性包括所容纳的每一条记录的大小,能够容纳的记录数。还由于是一个环形的结构,需要记录逻辑第一和逻辑最后一条的记录位置。同时,卡片还需要记录当前操作的记录序号等。
当前操作的记录序号由COS来进行自动维护,在文件第一次被选择时自动置为空,以后根据实际访问进行修改。
对环形定长记录文件的操作也以记录为对象进行,包括了记录的读、写、添加等操作。
对记录的读写操作包含了如下几种形式。
指定记录序号的记录读写操作,这一操作不改变当前操作记录序号。
相对当前记录位置的定位方式,包括当前记录的前一条、后一条记录等。如果当前记录号为空时,如果访问前一条的话,返回第一条记录,并置当前记录为第一条记录;如果访问后一条记录的话,返回最后一条记录,并置当前记录为最后一条记录。
相对全局记录位置的定位方式,例如第一条、最后一条记录等,这一操作将把该记录设置为当前记录。
要特别注意的是,和定长记录文件不同在于,每一条记录都有下一条记录和上一条记录的概念,可以无限循环进行,此外,第一条、最后一条等都是逻辑概念,要和物理意义上的严格区分开。
对记录的添加操作是在文件体中逻辑上最后一条记录的后面添加新的记录。
如果在最初记录环还没有完全充满的时候,添加的新记录将占用一个空的位置,成为新的“最后一条”,逻辑上的第一条记录位置不变。
如果在记录环已经完全充满以后,可以设想,这时逻辑上的第一条和最后一条相邻,“第一条”是“最后一条”的“下一条记录”,“最后一条”是“第一条”的“上一条记录”,这时添加新记录的话,新记录将占用原“第一条记录”的空间,旧的记录内容被覆盖了。新的记录将成为“最后一条记录”,原“第一条记录”的下一条记录将成为新的“第一条记录”。
所以在进行添加操作时,卡片需要根据记录环的占用情况决定环的指示指针更新,和不定长记录文件的添加不一样的在于,环形记录文件可以无限次的进行添加操作。
当然,对于不同文件类型的操作模式还可以在此基础上进行扩展,或者对以上操作模式进行一定的简化,甚至只实现透明二进制文件一种文件类型等等,这个可以根据COS的实际需求来进行取舍。
(2)按文件用途分类
除了按照EF文件内数据结构来进行划分以外,还可以根据EF文件所存储数据的类型进行分类,也即按照文件的用途来分类。
a. DIR文件
DIR文件是DDF下用以记录其子DF的文件,通常为一个变长记录文件。
记录的每一项分别对应着一个子DF,一般包括DF的AID等信息。
应用终端可以通过读取DIR文件来得到卡内已存在的所有ADF,也即卡内存在的所有应用。
DIR文件在DDF下唯一存在,必须在创建子DF之前创建出来。
DIR文件可以作为记录文件进行读取,但是通常不允许外界的写文件操作。此外,一般不实现对DIR文件任何的显式操作,对DIR文件的维护工作由COS系统自动完成。
b. PIN文件
PIN文件是卡片中和卡片安全相关的文件,保存和DF相关的用户个人密码信息。
DF下的PIN文件可以根据应用的需求决定是否存在,如果存在的话在DF下唯一。PIN文件通常是一个定长记录文件。
记录的每一项分别对应了一条PIN记录,记录体通常是PIN的属性和内容等信息。每一个PIN文件能够容纳的PIN的数目可以根据COS的实现来定义,根据应用的具体情况,COS可以选择实现单一PIN或者能够支持多条PIN的模式。
PIN文件的内容是需要保密的重要信息,通常不允许进行读操作。
对PIN文件没有显式的选择过程,在与PIN相关的命令执行过程中由COS自动进行查找。
对PIN文件通常也没有显式的写文件操作,通常通过添加PIN、修改PIN、重装PIN等命令完成。
c. 对称KEY文件
对称KEY文件是卡片中和卡片安全相关的另一个重要文件,保存和DF相关的各种对称KEY信息。
DF下的KEY文件可以根据应用的需求决定是否存在,如果存在的话在DF下唯一存在。根据对称KEY文件中保存的KEY的类型,KEY文件可以选择采用一个定长记录文件或者变长记录文件,选用的类型由COS来决定。目前卡片安全体系中一般选用DES和3DES算法作为对称密钥体系的基础,所以可以选用定长记录文件。
记录的每一项分别对应了一条KEY记录,记录体通常是KEY的属性和内容等信息。每一个KEY文件通常能够容纳多条的KEY记录,容纳的条数和每一条KEY的作用都由DF对应的具体应用来决定。
需要特别注意的是,在目前的卡片安全体系中每一个DF都有一个必备的对称密钥,这个密钥通常不保存在对称KEY文件中。
KEY文件的内容是需要保密的重要信息,通常不允许进行读操作。
对KEY文件没有显式的选择过程,在与KEY相关的命令执行过程中由COS自动进行查找。
对KEY文件通常没有显式的写文件操作,通常通过写KEY、重装KEY等命令完成。
d. 非对称KEY文件
非对称KEY文件和PIN文件、对称KEY文件不同,一方面它是卡片中和卡片安全相关的一个重要文件,保存和DF安全相关的非对称KEY信息,另一方面它也可以作为卡片中的应用文件,具体的使用由应用来定义。
非对称KEY文件一般只在支持PKI体系的COS和应用中才存在。在每一个文件中一般只保存一对非对称KEY的信息,包括公钥和私钥两部分。通常选用透明二进制文件格式来存储,文件体的内容由COS解释。
对非对称KEY文件的选择过程,在与非对称相关的命令执行过程中指定,通过选择文件同时可以得到相关的非对称密钥对的信息。
在这个KEY文件中,私钥的信息是需要严格保密的,公钥的信息可以公开。所以,对文件的读操作要分层次进行控制,通常,对私钥的读取可以设置为禁止或者要求某些保护,对公钥的读取可以设置安全条件没有或者比较宽松。
对非对称KEY文件没有显式的写文件操作,通常通过写KEY命令来完成。
e. 应用自定义解释文件
除了以上这些系统解释的特殊文件类型外,应用还可以自定义一些特殊的文件类型,这些特殊文件的数据含义由应用自定义和自解释,COS只是将其作为透明二进制、定长记录、不定长记录、环形记录等文件类型来操作。
我们在开发涉及金融的应用支持中经常接触到两种特殊文件,一个是电子钱包文件,一个是电子存折文件,如果COS要支持金融应用,一般在COS中包含这两种特殊文件的定义。对这两类文件的操作完全通过应用命令来完成。