You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
根据GPC2.2.1-H.2 Structure of Card Recognition Data章节描述
Tag '64'. The OID {globalPlatform 4 scp i} identifies the Secure Channel Protocol of the Issuer Security Domain. "scp" identifies the Secure Channel Protocol identifier as defined in section 10.7 - Secure Channel Protocol Identifier. "i" identifies the eventual implementation options as defined in appendix D.1.1 - SCP01 Secure Channel for SCP01, appendix E.1.1 - SCP02 Secure Channel for SCP02 or appendix F.1.1 - SCP10 Secure Channel for SCP10
可以得知SCP02 i参数的值在Card Recognition Data的Tag '64'中
Card Recognition Data可以使用GET DATA指令获取到, 具体参考GPC2.2.1-11.3 GET DATA Command, 以我的测试卡为例,具体的APDU交互如下
>> 00A40400 10 A0000000660000000000000000000002 # SELECT SD
<< 6F188410A0000000660000000000000000000002A5049F6501FF 9000
>> 80CA0066 00 # GET DATA
<< 663D733B06072A864886FC6B01600B06092A864886FC6B020202630906072A864886FC6B03640B06092A864886FC6B040255640B06092A864886FC6B048000 9000
GET DATA响应中640B06092A864886FC6B040255就包含了SCP02 i参数
64 # Application tag 4
0B # LENGTH
06 # OID TAG
09 # OID LENGTH
2A864886FC6B040255# {globalPlatform 4 scp i}
参考GPC2.2.1-H.1 Data Values章节, 可对2A864886FC6B040255进一步解析
本文是自己学习SCP02(Secure Channel Protocol '02')的一次记录, 分析如何基于SCP02与安全域进行安全通信
测试环境
首先, 根据GPC2.2.1-E.1.1章节可知
所以与安全域建立SCP02通道前需要确定安全域的SCP02 i参数的值
根据GPC2.2.1-H.2 Structure of Card Recognition Data章节描述
可以得知SCP02 i参数的值在Card Recognition Data的Tag '64'中
Card Recognition Data可以使用GET DATA指令获取到, 具体参考GPC2.2.1-11.3 GET DATA Command, 以我的测试卡为例,具体的APDU交互如下
GET DATA响应中640B06092A864886FC6B040255就包含了SCP02 i参数
参考GPC2.2.1-H.1 Data Values章节, 可对2A864886FC6B040255进一步解析
因此我的测试卡的安全域的SCP02 i参数的值为0x55
每个位的含义见Table E-1: Values of Parameter "i"
可以看出我的卡使用了
根据GPC2.2.1-E1.2.1 Explicit Secure Channel Initiation的描述可知显式初始化SCP02安全通道由INITIALIZE UPDATE和EXTERNAL AUTHENTICATE两个指令完成, 初始化与安全域之间通道的流程如下
接下来通过实际APDU交互来分析这过程的细节, 首先执行SELECT和INITIALIZE UDPATE(详见E.5.1)指令
这里INITIALIZE UPDATE的Host challenge我随意赋值为1234567891234567
INITIALIZE UPDATE响应数据的各个字段表示如下
响应的Key information中的Key Version Number为20, 意味着我们需要用version为20的密钥来初始化通道, 这里version为20的3把密钥S-ENC,S-MAC和DEK都是已知的, 值为00112233445566778899aabbccddeeff
首先卡外实体需要验证Card cryptogram是否正确, 即上图中Verify card cryptogram这一步骤
Card Cryptogram的计算规则见GCP2.2.1-E.4.2 Authentication Cryptograms in Explicit Secure Channel Initiation及E.4.2.1 Card Authentication Cryptogram章节, 总结如下
除了S-ENC session key还未计算,其余数据都是已知的, 接下来查看S-ENC session key的计算规则, 在GPC2.2.1-E.4.1 DES Session Keys章节有对其进行描述,总结如下
到这一步已经可以计算出S-ENC session key,再进一步可以计算出Card cryptogram进行验证
以上面的实际APDU数据计算S-ENC session key
这里我直接用openssl工具进行计算,
得到S-ENC session key的值为9eac5b939b1d2a6643fd9d31498b4f5a, 接下来计算Card cryptogram
得到Card cryptogram为0d4ac851271c3c0d, 与INITIALIZE UPDATE Response的Card cryptogram一致, 因此对卡的校验通过
接下来执行EXTERNAL AUTHENTICATE命令(详见GPC2.2.1-E.5.2),需要计算Host cryptogram及命令的C-MAC
Host cryptogram的计算规则见GCP2.2.1-E.4.2 Authentication Cryptograms in Explicit Secure Channel Initiation及E.4.2.2 Host Authentication Cryptogram章节,与Card Cryptogram类似, 总结如下
到这里所有值已知,可以直接计算出Host Cryptogram
得到Host Cryptogram为fc5bf6c2f09036a4
C-MAC的计算规则见GPC2.2.1-E.4.4 APDU Command C-MAC Generation and Verification章节, 总结如下
需要特别注意的是由于C-MAC是APDU数据域的一部分, 会影响APDU指令的CLA及Lc,所以有两种方式来计算C-MAC
在GPC2.2.1-E.4.4对这两种方式有详细描述, 分别对应C-MAC Generation on Unmodified APDU及C-MAC Generation on Modified APDU
具体使用哪种方式取决于SCP02 i值的b2位,因为我的卡的SCP02 i值的b2位为0,所以使用的是C-MAC on modified APDU
首先计算S-MAC session key,具体参考GPC2.2.1-E.4.1,与前面计算S-ENC session key类似,变化部分为
以上面的实际APDU数据计算S-MAC session key
得到S-MAC session key为5bd6cd7b488a759d6b461d2c2951b947
接下来计算C-MAC,这里简单介绍下签名算法Single DES Plus Final Triple DES,更详细的请参考规范
比如待签名数据为n块块大小为8字节的数据,计算C-MAC过程如下
以本次测试的实际APDU为例, 添加C-MAC前的EXTERNAL AUTHENTICATE指令(Modified APDU)如下
84 82 01 00 10 fc5bf6c2f09036a4
进行DES Padding填充后数据为8482010010fc5bf6c2f09036a4800000
第一步,对前面n-1块数据进行DES加密, 因为待加密数据就16字节, 所以n为2
加密结果最后8字节为1b085b3ab00b0622
接下来进行第二步计算
得到C-MAC为a0305253a7003098
到这里EXTERNAL AUTHENTICATE指令就构造完成了,实际交互如下
到这里与安全域之间的SCP02通道就初始化完成了
完整的APDU交互命令如下
需要注意的是我在执行EXTERNAL AUTHENTICATE时指定Security level为C-MAC, 所以后续的APDU的C-MAC的计算需要使用上一条指令的C-MAC作为ICV, 且我的卡的安全域的SCP02 i值启用了ICV encryption for C-MAC session选项,需要参考E.3.4-ICV Encryption对ICV进行加密
参考:
The text was updated successfully, but these errors were encountered: