SPI通信流程
概述
SSN=0:将 SSN 置低;SSN=1:将 SSN 置高。
Len1代表长度的高字节,Len2 代表长度的低字节。
LRC1 的计算方法:对 CLA INS P1 P2 Len1 Len2 DATA 数据,每个字节的异 或值,再取反。
LRC2 的计算方法:对 SW1 SW2 Len1 Len2 DATA 数据,每个字节的异或值, 再取反。
Len1 Len2 代表 DATA 域的长度,不包括 LRC1 或 LRC2。
标识 | 最小值 | 最大值 | 推荐值 | 说明 |
Tcsl | 60us | 150us | 100us | SSN 拉低持续时间 |
Tcsd | 3us | 10us | 5us | 通讯结束,SSN 拉低持续时间 |
Tcsh | 10us | 50us | 10us | SSN 每次拉高持续时间 |
Tclk | 40ns | 66ns | 50ns | 对应 SPI 频率,16MHz-25MHz |
Tb | 1.5us | 10us | 3us | SPI有效通讯时间 |
Tq | 15us | 100us | 20us | 指令查询间隔时间 |
Ttq | 1s | 3s | 2s | 指令查询总时间 |
发送数据结构
发送数据的结构为:55 CLA INS P1 P2 Lc1 Lc2 DATA LRC1,其中:
55 为发送命令结构的命令头;
CLA 是命令类别;
INS 是命令类别中的指令代码;
P1、P2 是一个完成指令代码的参考符号;
Lc1 Lc2 是后续 DATA 的长度,不包含 LRC1,由两字节表示;
DATA 是由终端安全芯片来处理的输入数据;
LRC1 是发送数据的校验值,计算方法见SPI通信流程说明。
接收数据结构
接收数据的结构为:SW1 SW2 Len1 Len2 DATA LRC2,其中:
SW1 SW2 是指令执行完毕后,从主设备返回的状态字;
Len1 Len2 是后续 DATA 的长度,不包含 LRC2,由两字节表示;
DATA 是终端安全芯片处理数据完毕后,返回的输出数据;
LRC2 是接收数据的校验值,计算方法见SPI通信流程说明;
状态字节
SW1、SW2 构成接收数据的起始序列,起始序列在命令的起始指示芯片的状态。
SW1 SW2=‘9000 ’表示正常响应。
SW1 | SW2 | 说明 |
90 | 00 | 命令执行成功 |
67 | 00 | 错误的长度 |
69 | 00 | CLA 不符合文件属性要求 |
69 | 01 | 命令不接受, 无效状态 计数器不正确 |
69 | 07 | TIMER 超时 |
93 | 02 | MAC 无效 |
69 | 82 | 安全状态不被满足 会话未建立 |
69 | 84 | 引用的数据无效 |
69 | 85 | 使用的条件不被满足 |
69 | 89 | 验证 MAC 错误 |
69 | 8A | 使用的证书状态不被满足 |
6A | 80 | 不正确的数据域 |
6A | 81 | 功能不被支持 |
6A | 86 | 不正确的参数 P1~P2 |
6A | 90 | SPI 协议 LRC 校验错误 |
6D | 00 | 指令代码不被支持或无效 |
6E | 00 | CLA 类别不被支持 |
90 | 86 | 验签错误 |
90 | 88 | 产生密钥对错误 |
90 | 8A | 签名错误 |
数据重发机制
SPI传输层支持错误重发机制。当出现SPI 数据传输数据错时,允许重新发 送。支持错误重发次数为 3 次。
发送数据错误
主设备发送数据,如果终端安全芯片返回的错误码为 6A90,表明数据在传输 时出现错误,此时主设备可以重发指令。
接收数据错误
主设备收到数据后,需校验从终端安全芯片接收的 LRC 与接收数据计算的 LRC 是否一致,如果不一致,说明终端安全芯片数据在传输过程中出现错误,此 时主设备可以重新启动接收流程(将 SSN 置高,高电平保持时间至少 10us 以上, 再将 SSN 置低,保持MOSI置高(低),进入指令查询和接收流程。
终端安全芯片交互指令流程
主站与终端交互
获取 TESAM 信息
步骤 | 主站 | 终端和 TESAM | 备注 |
1 | 主站下发获取 TESAM 信息 命令 | ||
2 | 发送:803600FF0000 返回:000+LEN+Data1 | 批量获取终端安全芯片信息: Data1: ESAM 序列号(8B)、 ESAM 版本号(4B)、 对称密钥版本(16B)、 证书版本(主站证书版本号 (1B)+ 终 端 证 书 版 本 号 (1B))、 会话时效门限(4B)、 会话时效剩余时间(4B)、 当前计数器(ASCTR:单地址应用协商计数器(4B)、 ARCTR : 主 动 上 报 计 数 器 (4B)、 AGSEQ:应用广播通信序列号 (4B)、 终端证书序列号(16B)、 主站证书序列号(16B) | |
3 | 发送:803600P20000 返回:9000+LEN+ Data2 | 单项获取终端安全芯片信息 P2: 02:ESAM 序列号(8B)、 03:ESAM 版本号(4B)、 04:对称密钥版本(16B)、 05:证书版本(主站证书版 本号 (1B)+终端证书版本号 (1B) )、 06:会话时效门限(4B)、 07:会话时效剩余时间(4B)、 08:当前计数器 (ASCTR:单地址应用协商计 数器(4B)、 ARCTR : 主 动 上 报 计 数 器 (4B)、 AGSEQ:应用广播通信序列号 (4B)) 09:终端证书序列号(16B)、 0A:主站证书序列号(16B) 0B:终端证书 0C:主站证书 |
建立应用连接(主站与终端会话密钥协商)
步骤 | 主站 | 终端和 TESAM | 备注 |
1 | 主站建立应用连接下发终 端会话协商数据 ,包含 ucOutSessionInit 密文 2 和 ucOutSign 客户机签名 2 | ucOutSessionInit:32 字节 ucOutSign : N 字节 | |
2 | 发送:80020000+ Lc+ ucOutSessionInit+ucOu tSign 返回:9000+ Len+ ucSessionData+ucSign | Lc:ucOutSessionInit 长度 加上 ucOutSign 长度,2 字节 Len: 芯片返回数据长度,2字节 ucSessionData:服务器随机 数,48 字节 ucSign:服务器签名信 息, Len-48 字节 | |
3 | 终端上传 ucSessionData、ucSign | ||
4 | 主站获得 ucSessionData、 ucSign,进行校验 |
安全传输数据处理(主站到终端)
步骤 | 主站 | 终端和 TESAM | 备注 |
1 | 建立应用连接 | 终端数据抄读、广播操作可 不需要会话连接 | |
2 | 主站发送任务数据,包含 应用数据单元 Data,数据 验证信息 | 使用应用会话密钥对数据进 行计算 MAC Data: 明文应用数据单元或 者密文应用数据单元 数据验证信息: SID_MAC 或 RN 或 RN_MAC 或 SID SID:包含 4 字节安全标识+ 附加数据 AttachData | |
3 | 广播说明: 终端收到数据后判断广 播地址、安全标识的前 4 个字节是否正确 安全标识:8016480X | 当组地址或广播地址最后一 位有效位 为 1 时 X=1;为 2 时 X=2; 为 3 时 X=3;为 4 时 X=4; 为 5 时 X=5;为 6 时 X=6; 为 7 时 X=7;为 8 时 X=8; 为 9 时 X=9;为 0 或 A 时 X=A; | |
4 | 若数据验证信息为随机 数 RN,则跳第 5 步; 若 数 据 验 证 信 息 为 SID_MAC, 发送: 4 字节安全标识+ 附加数据 AttachData+Data+ MAC 返回:9000+LEN+Data2 若数据验证信息为 SID, 发送: 4 字节安全标识+ 附加数据 AttachData+Data 返回:9000+LEN+Data2 | SID:包含 4 字节安全标识+ 附加数据 AttachData | |
5 | 执行相应的应用层协议 处理 | 读取、设置(安全模式设置)、 操作 | |
6 | 组织数据返回帧 | 广播业务不需要返回帧给主 站 读取终端数据时,直接将组 织好的数据通过安全传输返 回主站,跳到第 8 步骤进行 验证 其他操作需要继续 | |
7 | 发 送 : 801C00+P2+Lc+ Data3 返回:9000+LEN+ Data4 | Data3:数据返回帧 Data4:包含应用数据单元和 数据验证信息 由终端按照下述规则组织各 个数据项。 P2 : 明文+MAC 方式:11 密文:96 密文+MAC:97 设置(安全模式设置)时, P2 : 密文+MAC:97 | |
8 | 主站验证,获得确认帧或 否认帧 |
应用层协议处理
读取(抄读终端)
步骤 | 主站/掌机 | 终端和 TESAM | 备注 |
1 | 根据 建立应用连接(主站与终端会话密钥协商)的第 2 步骤获得抄读随机数 RN | ||
2 | 发送: 800E4002+LC+Data1 返回:9000+0004+MAC | LC:Data1 长度,2 字节 Data1:RN+PlainData 备注:终端计算明文+MAC | |
3 | 根据 安全传输数据处理(主站到终端)的 6、7、8 步骤返回主站 |
操作(终端对称密钥更新)
步骤 | 主站 | 终端和 TESAM | 备注 |
1 | 根据 安全传输数据处理(主站到终端) 的 1、2、4 步骤获得 Data2,Data2 包含密钥密文(Endata1)、数据验证 码 SID_MAC(包含安全标识、附加数据 AttachData、 MAC) | ||
2 | 终端判断安全标识为812E0000 | ||
3 | 发送:安全标识+附加数 据AttachData+ Endata1+MAC 返回:9000+0000 | ||
4 | 根据 安全传输数据处理(主站到终端)的 6、7、8 步骤返回主站,返回帧中 P2 需为密文+MAC:97 |
操作(证书更新)
步骤 | 主站 | 终端和 TESAM | 备注 |
1 | 根据 安全传输数据处理(主站到终端)的 1、2、4 步骤获得 Data2,Data2 包含证书内容(Endata1)、安全标识 SID(包含安全标识和附加数据AttachData) | ||
2 | 终端判断安全标识为81300203 | ||
3 | 发送: 安全标识+附加数据 AttachData+ Endata1 返回:9000+0000 | ||
4 | 根据 安全传输数据处理(主站到终端) 的 6、7、8 步骤返回主站,返回帧中 P2 需为密文:96 或者密文+MAC:97 |
设置(更新会话时效门限、转加密初始化、置离线计数器)
步骤 | 主站 | 终端和 TESAM | 备注 |
1 | 根据 安全传输数据处理(主站到终端) 的 1、2、4 步骤获得 Data2 | Data2 包含数据更新信息,参 数内容 Data1 、数据验证码 SID(包含安全标识、附加数 据 AttachData) | |
2 | 发送: 安全标识+附加数据 AttachData+Data1 返回:9000+0000 | ||
3 | 根据 安全传输数据处理(主站到终端) 的 6、7、8 步骤返回主站 |
操作(处理转加任务数据和密钥包)
步骤 | 主站 | 终端和 TESAM | 备注 |
1 | 根据 安全传输数据处理(主站到终端) 的 1、2、4 步骤获得 Data2,Data2 包含密钥或任务密文(Endata1)、数 据验证码 SID_MAC(包含安全标识、附加数据 AttachData、 MAC) | ||
3 | 发送:安全标识+附加数据 AttachData+ Endata1+MAC 返回:9000+LEN+Endata2 | Endata2:处理后的任务密文 | |
4 | 根据 安全传输数据处理(主站到终端) 的 6、7、8 步骤返回主站,返回帧中 P2 需为密文+MAC:97 |
安全传输数据处理(终端到主站)
步骤 | 主站 | 终端和 TESAM | 备注 |
1 | 发送:80140103+LC+ Data1 返回:9000+LEN+Data2+ MAC1 | LC : Data1 长度,2 字节 Data1: 明文数据 Data2:12 字节随机数 RN_MAC:包含 12 字节随机数 Data2 和 4 字节 MAC | |
2 | 终端上传数据 | ||
3 | 主站对ucReportData进行验证,并保存数据,下发 应答帧 | ||
4 | 根据主站下发的应答帧 发送:安全标识+附加数 据 AttachData+ Data3+MAC2 返回:9000+Len+Data4 | Data3:接收主站下发应答帧 数据 Data4:明文数据 |
终端与电能表(20 版和物联版电能表)交互
读取信息(获取电能表 ESAM 信息)
步骤 | 终端和 TESAM | 电能表和 ESAM | 备注 |
1 | 下发获取 ESAM 信息命令 | ||
2 | 获取电能表安全芯片信 息 | 获取电能表安全芯片信息包 含: Data1: ESAM 版本号(5B)、ESAM 序列号(8B)、 保留(1B) 对称密钥版本(16B)、会话时效门限(4B)、 会话时效剩余时间1(4B)、当前计数器 (ASCTR:单地址应用协商计 数器(4B)、 AMRCTR: 电能表主动上报计 数器(4B) AGSEQ:应用广播通信序列号 (4B) AMTCTR: 终端与电表会话计 数器(4B)) ESAM 发行信息(40B)、 身份认证权限(1B)、 终端地址(8B)、 终端广播计数器(4B) |
建立应用连接(会话密钥协商)
步骤 | 终端和 TESAM | 电能表和 ESAM | 备注 |
1 | 发送:80720000+LC+ 密钥 包+AMTCTR+00 返回:9000+Len+ SessionData1+MAC1 | 需先参考 5.2.1 章节步骤获 取电能表 ESAM 相关信息,终 端从主站管理系统获取电能 表密钥数据; LC:后续数据长度,2 字节 AMTCTR:终端与电表会话计 数器 4 字节 密钥包:从主站获取 128 字 节。 | |
2 | 安全芯片验证 SessionData1 和 MAC1, 返回 SessionData2 和MAC2 | ||
3 | 电能表上传SessionData2、MAC2 | ||
4 | 发送:80740000+LC+ 密钥 包+ SessionData2+MAC2 返回:9000+Len+ 会话密 钥包 | LC:后续数据长度,2 字节 |
安全传送数据处理(终端到电能表)
步骤 | 终端和 TESAM | 电能表和 ESAM | 备注 |
1 | 会话协商 | 返回密钥包。 | |
2 | 终端发送任务数据,包含 应用数据单元 Data,数据 验证信息 | 使用应用会话密钥对数据进行加密 Data: 明文应用数据单元或 者密文应用数据单元 数据验证信息:RN 或 SID RN:使用 终端对电能表广播校时 章节 SID:包含 4 字节安全标识+ 附加数据 AttachData | |
3 | 发送:80760300+LC+会话 密钥条数+会话密钥包+任务数据密文 返回: 9000+LEN+SID+EnData+ MAC 组织数据域Data和数据验证信息 SID,下发。 | 下发数据计算密文+MAC LC:后续数据长度,2Byte 会话密钥条数:1Byte(会话 密钥包的字节数除以 32,16 进制) SID:6 字节 MAC:4 字节 | |
4 | 若数据验证信息为 SID_MAC, 发送:4 字节标识+附加数 据AttachData+Data+ MAC 返回:9000+Len+Data2 若数据验证信息为 SID, 发送:4 字节标识+附加数 据 AttachData+Data 返回:9000+Len+Data2 | 电能表解密密文 | |
5 | 业务处理 | 读取、设置参数、控制和广 播校时。广播校时不需要建 立应用连接。 | |
6 | 电能表按照规则组织各个数据项 Data3 电能表加密 Data3 返回Data4 | ||
7 | 发送:80780000+LC+会话 密钥包个数+会话密钥包 +80241100+LC1+明文数据 +MAC | 终端验证明文+MAC 会话密钥包个数:会话密钥 包的字节数除以 32 LC1:明文文数据和 MAC 的长 度,2 字节 | |
发送:80780000+LC+会话 密钥包个数+会话密钥包 +80241200+LC1+密文数据 返回:9000+LC1+明文 | 终端解密密文 会话密钥包个数:会话密钥 包的字节数除以 32 | ||
发送:80780000+LC+会话 密钥包个数+会话密钥包 +80241300+LC1+密文数据 +MAC | 终端解密密文并验证 MAC 会话密钥包个数:会话密钥 包的字节数除以 32 LC1:密文数据和 MAC 的长度, 2 字节 |
终端对电能表广播校时
步骤 | 终端和 TESAM | 电能表和 ESAM | 备注 |
1 | 发送:800400100000 返回:9000+LEN+Rand1 | 操 作 此 步 骤 之 前 先 按 照 5.2.1 步骤获取电能表应用 广播通信序列号(AGCTR); | |
2 | 发送:800A4808+LC+终端 地址+Rand1+AGCTR+Data 返回:9000+Len+Data1 | 广播数据加密。 终端地址:8 字节 从电能表 端读取 AGCTR : 电能表应用广播通信 序列号+1,4 字节从电能表端读取 Data:广播数据明文 Data1:广播数据密文 | |
发送:800E4808+LC+终端 地址+Rand1+801E400A+ LC1+Rand1+01+Data1 返回:9000+0004+MAC | 对密文计算 MAC LC:后续数据长度,2 字节 LC1:后续数据长度+4,2 字 节 | ||
3 | 组织密文应用数据单元 Data1 和数据验证信息 SID_MAC,下发到电能表 | 数据验证信息 SID_MAC(包 含标识、附加数据AttachData,数据 MAC) 标识:4 字节,固定 801E400A 附加数据:LC1+Rand1+01 | |
4 | 发送:标识+附加数据+ Data1+数据 MAC 返回:9000+Len+Data | 密文 MAC 方式广播数据处理 获得明文。 |
终端对电能表校时
步骤 | 终端和 TESAM | 电能表 | 备注 |
1 | 会话协商 | ||
2 | 发送:80760301+LC+会话密钥包个数+会话密钥包+LC1+Date+任务数据密文 返回:9000+LEN+SID+EnData+ MAC | 下发数据计算密文 LC:后续数据长度,2Byte 会话密钥包个数:会话密钥包的字节数除以 32 Date:校时时间 LC1:校时时间长度,1 字节 | |
组织数据域Data和数据验 证信息 SID 或 SID_MAC, 下发。 | 若数据验证信息为 SID_MAC, 发送:4 字节标识+附加数据 AttachData + 4 字节标识+ 附加数据 AttachData1 +Data+ MAC 若数据验证信息为SID, 发送:4 字节标识+附加数据 AttachData+Data | ||
3 | 执行操作 | ||
4 | 返回终端,根据 安全传送数据处理(终端到电能表)的 6、7 步骤验证 |
设置 ESAM 参数(终端地址、终端广播计数器)
步骤 | 终端和 TESAM | 电能表 | 备注 |
1 | 会话协商 | ||
2 | 发送:80D40300+LC+会话 密钥包个数+会话密钥包 +Endata1+MAC 返回:9000+LC1+Endata2 | 下发数据计算密文 LC:后续数据长度,2Byte 会话密钥包个数:会话密钥 包的字节数除以 32 Endata1:密文数据 | |
发送:80760301+LC+会话 密钥包个数+会话密钥包 +LC1+Endata2+任务数据密文 返回:9000+LEN+SID3+EnData3+ MAC | |||
组织数据验证信息 SID3 和数据密文 Endata3,下发 到电能表。 | 数据验证信息 SID3(包含标 识、附加数据 AttachData) 标识:4 字节, 附加数据:2 字节, | ||
3 | 执行操作 | ||
4 | 返回终端,根据 安全传送数据处理(终端到电能表)的 6、7 步骤验证 |
安全传输数据处理(电能表到终端)
终端和 TESAM | 电能表和 ESAM | 备注 | |
1 | 发送:80140103+LC+ Data1 返回:9000+LEN+Rand+AMRCTR+ 4 字节 MAC | 电能表计算明文+MAC LC : Data1 长度,2 字节 Data1: 明文数据 Rand:随机数 8 字节 AMRCTR:上报计数器 4 字节 RN_MAC,包含 12 字节 Data2 (Rand 和 AMRCTR)和 4 字节 MAC | |
2 | 组织数据上报终端 | ||
3 | 终端根据接收数据格式, | ||
4 | 发送: 800E4888+LC+电能 表表号+Rand+AMRCTR+AMRCTR`+Data1+MAC 返回:9000+0000 | 终端明文+MAC 方式验证上报 数据 AMRCTR` :AMRCTR 取反 4 字节 | |
5 | 发送: 800E4807+LC+电能 表表号+Data2+00000000+Data3 返回:9000+0004+MAC | 计算上报返回数据明文+MAC Data2:Rand+AMRCTR Data3:返回数据明文 | |
组织密文应用数据单元 Data5 和数据验证信息 SID_MAC,下发到电能表。 | 数据验证信息 SID_MAC(包含标识、附加数据 AttachData,MAC) 标识:4 字节,固定 800E4081 附加数据:Data5 的长度+4,两个字节 Data5:包含(Data2、 00000000 和 Data3) | ||
6 | 发送: 800A4807+LC+电能 表表号+ Data2+00000000+Data3 返回:9000+LEN+Data4 | 密文 | |
组织密文应用数据单元 Data5 和数据验证信息 SID,下发到电能表。 | 数据验证信息 SID(包含标 识、附加数据 AttachData) 标识:4 字节,固定 800C4001 附加数据:Data5 的长度,两个字节 Data5:包含(Data2、 00000000 和 Data4) | ||
7 | 发送: 80104807+LC+电能 表+ Data2+00000000+Data3 返回:9000+LEN+Data4+ MAC | 密文+MAC | |
组织密文应用数据单元 Data5 和数据验证信息 SID_MAC,下发到电能表。 | 数据验证信息 SID_MAC(包含标识、附加数据 AttachData,MAC) 标识:4 字节,固定 80124001 附加数据:Data5 的长度+4,两个字节 Data5:包含(Data2、 00000000 和 Data4) | ||
8 | 发送:标识+附加数据 +Data5+MAC 返回:9000+0000 | Data5 接收主站下发应答帧 数据 |
终端与电能表身份认证
步骤 | 终端和 TESAM | 电能表 | 备注 |
1 | 发送:800400080000 | 数据验证信息的RN 为Rand1 | |
返回:9000+LEN+Rand1 下发随机数到电能表,包 含应用数据单元 Data,数 据验证信息 | |||
2 | 电能表返回Rand1密文 1、 Rand2 、 表号和电能表 ESAM 序列号 | ||
3 | 发送:800808030010+ 表号+Rand1 返回:9000+0010+ Endata1 | 异或 Endata1,并与 Rand1 密 文 1 比较是否相同 | |
4 | 发送:800808040010+ DIV+Rand2 返回:9000+0010+ Endata2 | DIV 为 8 字节分散因子,测试 密钥下为 ESAM 序列号,正式 密钥下为电能表表号。 | |
5 | 异或 Endata2,下发电能表 | ||
6 | 电能表验证 Endata2 | ||
7 | 组织数据返回终端 | ||
8 | 接收返回数据 |
终端抄读电能表
步骤 | 终端和 TESAM | 电能表和 ESAM | 备注 |
1 | 发送:800400100000 返回:9000+LEN+Rand 下发随机数到电能表,包 含应用数据单元 Data,数 据验证信息 | 数据验证信息的RN 为Rand | |
2 | 电能表根据安全模式要 求对抄读数据 Data2 计算 MAC | 安全模式为明文+MAC | |
3 | 电能表组织数据报文返 回终端 | ||
4 | 终端根据接收数据验证 | ||
5 | 发送: 800E4887+LC+电能表表号+Rand+Data2+MAC 返回:9000+0000 | 终端明文+MAC 方式验证抄读 数据 |