Board logo

标题: CPU card 知识讲演 [打印本页]

作者: luoman    时间: 2010-8-5 08:40     标题: CPU card 知识讲演

CPU card 知识讲演

一:cpu card概念和综述。
1,什么是cpu card。
cpu card是ic card的一种,最初的ic card里面是一个存储芯片。没有cpu的相关功能的。只是一个存储的物理体。现在的cpu card等于是将一个cpu+memory的小系统集成在一个ic card里面了。所以,他不但具有一般存储ic card的全部功能,还具有一些智能的功能:如,密码访问,加密数据,等,这些安全措施是普通的ic card 无法提供的。所以,cpu card也叫智能卡。
cpu card内部有个cos(chip os芯片操作系统),用来完成数据存储等数据操作,和相应的数据加密等安全操作。cpu card(也就是内部的cos)一般都支持iso7816的国际标准,或者一些扩展标准。这样一个cpu card就可以在不同的读卡器上使用,在不同的应用场合实现部分兼容了。

2,cpu的应用。
cpu card作为智能卡,应用于一些安全要求比较高的地方。如:加油站,金融,会员卡等。当然随着一些应用的扩展和普及,其安全要求可能也会相应提高,所以,cpu card的应用可能会更多,更广。

二:cpu card的标准和协议。
1,一般cpu card的国际标准是ISO7816(1-4),当然也有些扩展的标准,也可以自己指定相应的标准,当然自己指定的标准只能自己使用,不具有通用性。

2,cpu card的协议有T=0,T =1两种国际通用标准,当然ISO7816支持0-15共16个协议,目前只有T=0,1被明确规定和广泛使用。

三:cpu card的技术参数和使用详解。
我们以一个T=0卡的使用过程来作解释。中间穿插了T=1的异同。

1,cpu card的触点。共有8个触点,according to ISO7816 standard,排列如下:
top view的时候,c1-c4 on the left,c5-c8 on the right。
Contact  Designation  Use  
C1      Vcc  Power connection through which operating power is supplied to the microprocessor chip in the card  
C2      RST  Reset line  to initiate its reset sequence of instructions  
C3      CLK  Clock signal line clock signal can be provided to the microprocessor chip.
C4      RFU  Reserved for future use  
C5      GND  Ground line providing common electrical ground between the IFD and the ICC  
C6      Vpp  Programming power connection used to program EEPROM of first generation ICCs.  
C7      I/O  Input/output line that provides a half-duplex communication channel  
C8      RFU  Reserved for future use  


2,卡的复位和card 的ATR(answer to reset)复位应答。
卡的复位分为两种:冷reset和热reset。
冷reset:是在卡插入卡座后,发生的。终端(就是card reader)先是给card提供电压(vcc),然后在提供clock(时钟),同时reset keep low level,在clock提供后,card要保证在clock提供后的200个周期内将IO set high(接收模式),终端也一样。再后,将card的reset pin set to high level,保持一段时间(40'000 - 45'000个周期)。cpu card在终端将reset set to high后的400-4'000个周期内送出ATR(复位应答),如果card没有在规定时间内送出ATR,终端将启动释放过程。

热复位:在vcc和CLock已经提供的情况下,终端将reset set to low,后面和冷复位一样了:)。

触点释放过程:终端将reset set to low,启动释放时序。然后将clk和io set to low,在card拔出卡座前,vcc set to low(就是断电)。

3,一个字符帧(有效数据一个字节)的传输实现.
          Start                          Parity            Next
            bit <----- 8 data bits -----> bit              Start bit
    Z  ____    ________________________________......______    __
            |  |  |  |  |  |  |  |  |  |  |                |  |
    I/O    |  |ba|bb|bc|bd|be|bf|bg|bh|bi|    Guardtime  |  |
            |___|__|__|__|__|__|__|__|__|__|                |___|_
    A      :  :                    :    :
            0  t1                  :    t10
            :                        :
            :<---- (n+/-0.2) etu --->:

每个字符有一个start bit(low)和8个data bit,和一个parity bit(偶校验bit),所以一个有10个bit。偶校验规则:偶校验bit+8个data bit,共9个bit,里面的“1”one个数为偶。10bit后,还有一个guard time,用来提供多余的时间处理数据和如果偶校验失败,提供错误提示的使用的。如果parity check err,则在parity bit后的0。5ETU开始将IO set to low,keep for 1-2 ETU,发送方则在parity bit后的1ETU开始check IO line状态。如果是high,就认为是对的;如果是low就重发(T=0,必须要重发,最多3次,3次后,就释放卡)。


4,ATR.
atr按照一下的顺序传送:初始字符TS,格式字符T0,接口字符TAi,TBi,TCi,TDi(i= 1,2··),历史字符T1,T2,··,TCK(校验字符)。


Reset
|
|    _________________________________________        _______  _________
|  |  |  |  |  |  |  |  |  |  |  |          |  |    |  |  |
'-->| TS| T0|TA1|TB1|TC1|TD1|TA2|TB2|TC2|TD2| ......... | T1| ... | TK|TCK|
    |___|___|___|___|___|___|___|___|___|___|_        _|___|_  _|__ |___|

    TS  : Initial character
    TO  : Format character
    TAi : Interface character [ codes FI,DI ]
    TBi : Interface character [ codes II,PI1 ]
    TCi : Interface character [ codes N ]
    TDi : Interface character [ codes Yi+1, T ]
    T1, ... , TK : Historical characters (max,15)
    TCK : Check character

        Figure 4 : General configuration of the Answer to Reset


(1),TS(初始字符),指示了正向协议和反向协议。对T=0,T=1都有效。
正向协议:就是data的高电平表示1,LSB first:)
反向协议:就是data的低电平表示1,MSB first:)

在复位应答的电平情况就是这样的:
Direct convention(正向协议) : (L)HHLHHHLL(H) 就是0x3B,
Inverse convention (反向协议): (L)HHLLLLLL(L) 就是0x3F,如果按照正向协议来看,就是0x03(我们就是这样处理的,不过,偶校验是错的,所以我们屏蔽了TS的偶校验:)。
作者: luoman    时间: 2010-8-5 08:41

(2),T0(格式字符),high nibble指示TA1,TB1,TC1,TD1的存在,low nibble指示历史字节的数目。
     ,----,----,----,----,----,----,----,----,
        | b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 |
        '----'----'----'----'----'----'----'----'
        :<------- Y1 ------>:<-------- K ------>:

        Y1 : indicator for the presence of the interface characters
                TA1 is transmitted when b5=1
                TB1 is transmitted when b6=1
                TC1 is transmitted when b7=1
                TD1 is transmitted when b8=1

        K : number of hitorical characters


(3),接口字符,
TAi,TBi,TCi:指示协议参数。
TDi:指示协议类型(T=0,1,或者其他)和是否 存在后续接口字符;


        ,----,----,----,----,----,----,----,----,
        | b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 |
        '----'----'----'----'----'----'----'----'
        :<------ Yi+1 ----->:<------- T ------->:

        Yi+1 : indicator for the presence of the interface characters
                TAi+1 is transmitted when b5=1
                TBi+1 is transmitted when b6=1
                TCi+1 is transmitted when b7=1
                TDi+1 is transmitted when b8=1

        T : Protocol type for subsequent transmission.

        Figure : Informations provided by TDi


TA1:high nibble是FI,low nibble是DI。具体如下。

Table 6: Clock rate conversion factor F
    -------

    ----------------------------------------------------------------------
            FI    |    0000      0001  0010  0011  0100  0101  0110  0111
    --------------+-------------------------------------------------------
            F      | Internal clk  372  558  744  1116  1488  1860  RFU
    --------------+-------------------------------------------------------
      fs (max) MHz |      -          5    6    8    12    16    20  -
    ----------------------------------------------------------------------

    ---------------------------------------------------------------
            FI    | 1000  1001  1010  1011  1100  1101  1110  1111
    --------------+------------------------------------------------
            F      |  RFU  512  768  1024  1536  2048  RFU  RFU
    --------------+------------------------------------------------
      fs (max) MHz |  -      5  7.5    10    15    20    -    -
    ---------------------------------------------------------------
      RFU : Reserved for Future Use

Table 7: Bit rate afjustment factor D
    -------

    -------------------------------------------------------
        DI | 0000  0001  0010  0011  0100  0101  0110  0111
    ------+------------------------------------------------
        D  |  RFU    1    2    4    8    16  RFU  RFU
    -------------------------------------------------------

    -------------------------------------------------------
        DI | 1000  1001  1010  1011  1100  1101  1110  1111
    ------+------------------------------------------------
        D  |  RFU  RFU  1/2  1/4  1/8  1/16  1/32  1/64
    -------------------------------------------------------
      RFU : Reserved for Future Use

规定:
在atr和pts期间的初始ETU = 372/fi;(fi为提供给卡的clock 频率);
其他的情况下的工作ETU = (1/D)(F/fs);fs为提供给卡的clock频率.


TB1: 编程电压和编程电流。现在已经不用了。不发送或者为0(表示不需要)。

TC1:表示增加到最小持续时间(12个ETU)的额外保护时间。取值范围:0x00-0xff;
当TC1 = 0x00-0xfe的时候,标准保护时间 = 12+TC1 = 12 - 266ETU;
当TC1 = 0xff的时候,有特殊意义。如果传输协议T = 0,则保护时间为12ETU;T=1,则保护时间为11ETU。

TDi:见开头。

TA2:TA2的存在与否表示IC卡是以特定模式还是交互模式工作。
TA2存在,特定模式。
一般不传送TA2(TA2不存在),交互模式。

TB2:IC卡的编程电压,取代前面的TB1的值。已经不需要了。现在一般都不支持,也不传送了。

TC2:T=0协议专用的接口字符。传送工作等待时间整数(waiting Time Integer,WI),确定card发送的任意一个字符startbit和card或者终端发送的前一个字符startbit之间的最大时间间隔。工作等待时间为:960*D*WI.

以后的接口字符都是T=1的专用接口字符,T=0下不传送。

TAi(i>2):cpu card可能接收的信息字段(information field)的最大长度。取值范围:1-254。T=1时,终端只接收16-254的值。

TBi(i>2):low nibble是cwi(character waiting integer)字符等待时间整数。用来计算CWT = (2~CWI+11)工作ETU;取值范围:0-5;
high nibble是bwi(block waiting integer)块等待时间整数。用来计算BWT = ((2~BWI)*960*(372D/F) + 11)工作ETU;取值范围:0-4;

TCi(i>2):b0表示使用的err detecting code,b0 = 0,使用lrc(纵向冗余校验,就是XOR校验),b0 = 1,使用CRC(循环冗余校验)。
作者: luoman    时间: 2010-8-5 08:42

(4):历史字节。
标准没有规定。根据使用自己定义。

(5):TCK。XOR校验字符。
从T0开始到TCK前一个字节(也就是历史字节的最后一个字节)的XOR的值应该等于TCK的值。

5,字符协议。
(1):命令头:命令由终端发出。包括5bytes,依次为:CLA,INS,P1,P2,和P3。
CLA:(class byte of command message)表示命令类别。
INS:(instruction)表示指令代码。
P1(parameter 1)和P2(parameter 2)表示命令的2个附加参数。
P3:根据不同的INS,P3指明了发送给cpu card的命令的字节长度(命令数据的长度)或者期待cpu card返回的数据的字节长度。

(2):过程字节。
cpu card接收到命令头后,向终端发送一个过程字节。过程字节向终端指明了下一步该作什么。其编码和终端行为的对应关系如下:
Byte | Value |  Result
  -----+-------+------------------------------------------------------------
      | INS  | VPP is idle. All remaining data bytes are transferred
      |      | subsequently.
      |      |
      | INS+1 | VPP is active. All remaining data bytes are transferred
      |      | subsequently.
  ACK  | ___  |
      | INS  | VPP is idle. Next data byte is transferred subsequently.
      | _____ |
      | INS+1 | VPP is active. Newt data byte is transferred subsequently.
  -----+-------+------------------------------------------------------------
  NULL | $60  | No futher action on VPP. The interface device waits for a
      |      | new procedure byte
  -----+-------+------------------------------------------------------------
  SW1  | SW1  | VPP is idle. The interface device waits for a SW2 byte

当终端收到sw1和sw2后,
如果过程字节是0x61,终端向card发送一个长度为sw2的值的GetResponse命令;
如果过程字节是0x6c,终端应立即向card重新发送前一个命令头,P3为sw2的值。
如果过程字节为0x6X(除了0x60,0x6c,0x061外),card向终端传送状态码和必要的数据(如果有的话),并等待下一个命令。

命令被成功执行后,返回0x90,0x00;


T=0时,命令的传送如下:
|ClA|INS|P1|P2|P3| 等待card返回的状态嘛,如果正确的话,接着发送|CMND DATA|,等待card返回数据。

T=1时,命令的传输就不一样了。T=1是面向block的协议,T=0是面向字节的协议。
T=1时的block 结构:
----------------------------------------------------------------------------
HEAD FIELD                          | DATA  FIELD        |尾field        |
----------------------------------------------------------------------------
NAD节点地址  |PCB协议控制字节|LEN长度|INF(APDU或控制信息)|EDC(错误校验码)|
----------------------------------------------------------------------------

※※head field:由3个字节组成。
*用于表示数据block的源地址和目的地址,以及提供vpp状态控制的节点地址。
*控制数据传输的协议控制字节。
*可选的数据field长度。
a,节点地址NAD(node address),b0-b2表示块的源地址(source address,SAD);b4-b6表示目的地址(destination address,DAD),b3和b7不使用,为0;
如果不使用节点地址,SAD和DAD都为0;
如果使用节点地址,从card收到的第一个块开始,就一直使用这个地址约定。

b,协议控制字节(PCB)。
有3种类型。
*传送APDU的信息块(I block)。
*用于传送确认ACK或者NAK(negetive ACK)的接收就绪块(R block)。
*用于交换信息的管理模块(S block)。

I block的PCB的编码
-----------------------------------------------------------------
BIT    |                含义
-----------------------------------------------------------------
B7      |0
-----------------------------------------------------------------
B6      |序列号,每个block 都有个序号,第一个为0,
    §以后为1,0,1,··
-----------------------------------------------------------------
B5      |链接(用于多个数据,当一个数据field无法传送所有的数据,
    |这个用于指示后面还有没有数据(也就是块)被传递。
------------------------------------------------------------------
B4-B0  |reserved
------------------------------------------------------------------

R block的PCB的编码
-----------------------------------------------------------------
BIT    |                含义
-----------------------------------------------------------------
B7      |1
-----------------------------------------------------------------
B6      |0
-----------------------------------------------------------------
B5      |0
------------------------------------------------------------------
B4      |序列号
-----------------------------------------------------------------
B3-B0  |0=容错;1=EDC错误;2=其他错误;其他,保留。
------------------------------------------------------------------


S block的PCB的编码
-----------------------------------------------------------------
BIT    |                含义
-----------------------------------------------------------------
B7      |1
-----------------------------------------------------------------
B6      |1
-----------------------------------------------------------------
B5      |0 = 请求;1 = 应答。
------------------------------------------------------------------
B4-B0  |0=再同步请求;1=信息field大小请求;
    |2=放弃请求;3=BWT扩展请求;
    |4=VPP错误;其他,保留。
------------------------------------------------------------------

c,长度(LEN),指明INF部分的长度,取值范围:1-254;


※※INF信息field,当出现在I block中时,他传送的是应用数据;当出现在S block中时,他传送的是控制信息。R block不会有INF信息域的。

※※尾域,包含的是EDC。如果EDC错误,block是无效的。LRC是一个byte。


特殊选项:
CWT:card 发送到终端的两个字符的startbit之间的最短时间间隔是11ETU,同一个块中,2个连续字符startbit的最大时间间隔不超过((2~CWI)+11)ETU。CWI(0-5),所以CWT(11-43)ETU;
BWT:终端发送给card的最后一个字符的startbit和card发送给终端的第一个字符的startbit之间的最大时间间隔BWT=((2~BWI)*960*(372D/F + 11);BWI(0-4),SO BWT(971-15371);

BGT:相反方向的2个连续块的startbit的最小时间间隔(块保护时间,Block Guard Time,BGT)为22ETU。

IFSD:information filed size for the terminal,终端能够接收的数据块的最大长度。缺省为32bytes。
作者: luoman    时间: 2010-8-5 08:43

※※容错操作;
atr后,第一个block只能是终端发送给card的,而且只能是一个I block或者S block。

如果终端不希望使用32bytes的IFSD的初始值,则应向card发送一个相应的S block。

card可以向终端发送一个S block,改变IFSC大小。

发送完后,就应该切换到接收状态。

在链接情况下,当收到的R block中的序列号与已确认的I block序列号不同,发送方认为I block已被确认。

S block总是配对使用的,一个S block请求对一个S block 应答块。

※※链接,如果发送的数据超过IFSC和IFSD的大小,就要将其分成几个连续的I block。
I block的链接由PCB的b5定义:
b5=0,表示链接的最后一个block;b5=1,表示后面还有后续的block。

如果接收方收到的数据大于IFSD的大小,应发送一个R block,b0-b3的值为2;

链接的构造:
终端向card;
block (1)
---------------------------
CLA INS P1 P2 | LC| DATA  DATA
-----------------------------------------------------
BLOCK(2)-BLOCK(N-1)
------------------------------------------------------
DATA  DATA
------------------------------------------------------
BLOCK(N)
------------------------------------------------------
DATA  DATA                                        |LC|
------------------------------------------------------


card回复终端;

BLOCK(12)-BLOCK(N-1)
------------------------------------------------------
DATA  DATA
------------------------------------------------------
BLOCK(N)
------------------------------------------------------
DATA  DATA                                  |SW1 SW2|
------------------------------------------------------

所以T=1时候,命令的执行是这样的:
Head field(nad+I pcb+length)+INF(CLA,INS,P1,P2,P3+CMND DATA)+尾域(EDC)。
card返回:
HEAD FIELD(NAD + I PCB+LENGTH) + INF (DATA + SW1 SW2)+尾域(EDC)。


发送完了命令头的5个命令字节后,开始接收card的返回数据,并判断做出响应处理;
//     normal mode too,but a little different;
            //如果收到的是命令的补码;      
              if(Response[0] == ~Cmnd[1])
            {
                while(2)
                {
                    if (Response[0] == Cmnd[1])    //判断是命令码嘛?是的话,发送剩余的命令data;
                    {
                        for (i = count; i < CmndLength; i++)
                        {
                            if (SendChar(Cmnd) != 0)
                            {
                                return 1;
                            }
                        }
                        
                        //接受card的返回数据;
                        for (i = 1; i < 35; i++)
                        {
                            if (RecChar(0x55) != 0)//返回不等于0,表示数据发送完毕;
                            {
                                RspLength = i;
                                //SendCharComm(0x28);
                                return 0;
                            }
                        }
                    }
                    
                    //返回是ins的补码,发送下一个命令byte;
                    if(SendChar(Cmnd[count]) != 0)
                    {
                        //SendCharComm(0x88);
                        SendCharComm(count);
                        return 1;
                    }
                    else        //发送命令字节成功;
                    {
                        count++;                //指向下一个命令字节;
                        if(count == CmndLength)    //发送完了嘛?
                        {
                            for (i = 1; i < 35; i++)     //发送完了,就接收card返回数据;
                            {
                                back = 0;
                                back = RecChar(0x55);
                                if (back != 0)
                                {
                                    RspLength = i;
                                    SendCharComm(0x11);
                                    break;
                                }
                                else
                                {
                                    Response = RecByte;
                                }
                            }
                            return 0;
                        }
                        else                    //指令没有发送完毕;
                        {
                            back = RecChar(0x55);    //接收card的返回字节;
                            if (back != 0)
                            {
                                return 1;
                            }
                            else
                            {
                                Response[0] = RecByte;     //保存返回,回到while(2)循环去判断;
                                
                            }
                                
                           
                        }
                        
                        
                    }
                }//end of while(2);
               
                /*               
                for (i = 5; i < CmndLength; i++)
                {
                    if (SendChar(Cmnd) != 0)
                    {
                    
                        SendCharComm(0x66);
                        SendCharComm(i);
                        return 1;
                    }
                }
               
                for (i = 1; i < 35; i++)
                {
                    back = 0;
                    back = RecChar(0x55);
                    if (back != 0)
                    {
                        RspLength = i;
                        SendCharComm(0x11);
                        break;
                    }
                    else
                    {
                        Response = RecByte;
                    }
                }
                return 0;            //    ok;
                */
               
               
            }




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0