CPU卡内的文件类型
文章出处:http://www.singbon.com 作者:兴邦科技 人气: 发表时间:2011年01月31日
根据树状的卡内文件结构,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种模式。
记录的读写操作包括几种方式。
指定记录序号的记录读写操作,这一操作不改变当前操作记录序号。
相对当前记录位置的定位方式,包括当前记录的前一条、后一条记录等。如果当前记录号为空时,如果访问前一条记录的话,返回第一条记录,并置当前记录为第一条记录;如果访问后一条记录的话,返回最后一条记录,并置当前记录为最后一条记录。
相对全局记录位置的定位方式,例如第一条、最后一条记录等,这一操作将把该记录设置为当前记录。
在定长记录的操作过程中,需要严格检查记录号是否在文件包含的记录数的范围内,当前记录号对应的记录数据是否有效等。
记录的添加操作即在最后一条记录的后面添加新的记录。
如果逻辑上的最后一条记录不是物理上的最后一条,即其后还有空闲的记录空间,新的记录顺序添加在后面,同时将新的记录设为逻辑的“最后一条记录”。
如果逻辑上的最后一条记录是物理上的最后一条,即其后没有空闲的记录空间了,则添加操作失败,卡片返回相应的错误码。