********************************************************************************
description: 有机会接触了一下7816 协议, 抛弃冗杂的文档,整理为简明的文档记录。
writer: hjjdebug
date: 2012-12-14
********************************************************************************
# 简明机卡通讯 --- 7816 t0 协议标准
********************************************************************************
甲:机卡通讯基础知识。
********************************************************************************
子: 返回应答状态字sw1, sw2 含义。
--------------------------------------------------------------------------------
SW1-SW2=’90’-’00’ 标志正常结束,
61 xx, 正常, sW2指示仍然有效的响应字节数
--------------------------------------------------------------------------------
当SW1的最高有效半字节等于6 时,SW1的含义是与应用无关的,定义如下五个值:
--------------------------------------------------------------------------------
62, 63 报警错误
‘62 00’ 没有信息被给出
‘62 81’ 返回数据的一部分可能被损坏
‘62 82’ 读出Le字节之前文件/记录已结束
‘62 83’ 选择的文件无效
‘62 84’ FCI未按照5.1.5格式化
‘63 00’ 没有信息被给出
‘63 81’ 通过最后写入来填满文件
‘63 CX’ 通过‘X’(值从0至15)提供的计数器 (正确的含义依赖于命令)
--------------------------------------------------------------------------------
64, 65 执行差错
‘65 00’ 没有信息被给出
‘65 81’ 存储器故障
--------------------------------------------------------------------------------
67 - 6f 校验差错。
‘6700’ —错误的长度
‘68XX’ —CLA的功能不被支持 (在SW2中进一步的限定见表16)
‘68 00’ 没有信息被给出
‘68 81’ 逻辑信道不被支持
‘68 82’ 安全报文不被支持
‘69XX’ —不允许的命令 (在SW2中进一步的限定见表17)
‘69 00’ 没有信息被给出
‘69 81’ 命令与文件结构不兼容
‘69 82’ 安全状态不被满足
‘69 83’ 认证方法被阻塞
‘69 84’ 引用的数据无效
‘69 85’ 使用的条件不被满足
‘69 86’ 命令不被允许(无当前EF)
‘69 87’ 期望的SM数据对象失踪
‘69 88’ SM数据对象不正确
‘6AXX’ —错误的参数P1 P2 (在SW2中进一步的限定见表18)
‘00’ 没有信息被给出
‘80’ 在数据字段中的不正确参数
‘81’ 功能不被支持
‘82’ 文件未找到
‘83’ 记录未找到
‘84’ 无足够的文件存储空间
‘85’ Lc与TLV结构不一致
‘86’ 不正确的参数P1—P2
‘87’ Lc与P1—P2不一致
‘88’ 引用的数据未找到
‘6B00’ —错误的参数P1 P2
‘6CXX’ —错误的长度Le:SW2指示准确的长度
‘6D00’ —指令代码不被支持或无效
‘6E00’ —类别不被支持
‘6F00’ —没有精确的诊断
--------------------------------------------------------------------------------
丑: 命令4字节首标: CLA, INS, P1, P2
CLA, 类别。通常是00 80 是安全报文处理
INS,指令。 (6x,9x 不会作为命令)
‘0E’ ERASE BINARY
‘20’ VERIFY
‘70’ MANAGE CHANNEL
‘82’ EXTERNAL AUTHENTICATE
‘84’ GET CHALLENGE
‘88’ INTERNAL AUTHENTICATE
‘A4’ SELECT FILE
‘BO’ READ BINARY
‘B2’ READ RECORD // 常用命令
p1, 记录号,00 为当前记录, p2. 进一步指明记录的地址。
‘CO’ GET RESPONSE // 获取数据
‘C2’ ENVELOPE
‘CA’ GET DATA
‘DO’ WRITE BINARY
‘D2’ WRITE RECORD
‘D6’ UPDATE BINARY
‘DA’ PUT DATA
‘DC’ UPDATE RECORD
‘E2’ APPEND RECORD
********************************************************************************
乙:理解机卡通讯的过程。 举例。
********************************************************************************
>> smart card. wCommandLen:121, 80 32 00 00 74 80 30 71 11 02 B2 66 1B 50 84 FD.....
### 我有一个数据0x74 个字节, 属于安全报文,帮忙解一下。
<< ret:1, wReplyLen:2,reply: 61 25
### 共解出 0x25 个字节 (即37 字节)
>> smart card. wCommandLen:5, 00 C0 00 00 25
### 那就拿来吧。
<< ret:1, wReplyLen:39,reply: 02 B2 84 03 00 01 02 B4 04 00 00 00 00 83 16 9F 66...
### 给你。(之所以是39, 37字节后跟状态字90 00)
>> smart card. wCommandLen:12, 00 B2 00 0E 07 00 01 14 00 02 02 B2
### 我要读当前记录的某某位置。
<< ret:1, wReplyLen:2,reply: 61 03
### 3 个字节
>> smart card. wCommandLen:5, 00 C0 00 00 03
### 拿来吧
<< ret:1, wReplyLen:5,reply: 00 00 09 90 00
### 给你
--------------------------------------------------------------------------------
>> smart card. wCommandLen:89, 80 32 00 00 54 81 30 51 01 02 B2 E4 32 50 84 FD
### 我有一个数据0x54 个字节, 属于安全报文,帮忙解一下。
<< ret:1, wReplyLen:2,reply: 6B 27
### 出错了, 我不认识
>> smart card. wCommandLen:12, 00 B2 00 0E 07 00 01 14 00 02 02 B2
### 我要读当前记录的某某位置。
<< ret:1, wReplyLen:2,reply: 61 03
### 3 个字节
>> smart card. wCommandLen:5, 00 C0 00 00 03
### 拿来吧
<< ret:1, wReplyLen:5,reply: 00 00 09 90 00
### 给你
--------------------------------------------------------------------------------