前几天去北京银联卡检测中心过检QPBOC的 L2测试。一开始挺顺利的,感觉蛮简单的。也不过如此。
但是后续有两个案例,死活不过。让我一度怀疑难道我的RSA算法有问题?还是说移植的RSA算法在我的机器上因字节长度和其他原因导致的?但是不应该啊,脱机认证,要么都过,要么都不过。怎么会唯独这两个案例不过呢?最后仔细读规范,分析透SDA和DDA认证的原理,总算解决啦。至此,L2的所有案例通过。总结下无论是SDA认证还是DDA认证,没什么难的,RSA计算和哈希校验的数据源搞清楚搞正确。字符串拼接来拼接去的,别拼接错了。比如有的公钥模数和公钥余项,两个拼起来才是完整的公钥。公钥模数可能在上一步的RSA计算的输出结果中,公钥余数存在于IC卡上,比如9F48标签。
其次是哈希校验。这部分,看规范中有详细的说明。每一步的哈希校验数据源不一样。中国银联IC卡规范 基础规范的第四部分(表9 由发卡行签名的 IC 卡公钥数据(即哈希算法的输入))和第二部分。Q/CUP 045.2的7.3.1
总结下过程:
动态数据认证采用了一个三层的公钥证书方案。每一个IC卡公钥由它的发卡行认证,而认证中心认
证发卡行公钥。这表明为了验证IC卡的签名,终端需要先通过验证两个证书来恢复和验证IC卡公钥,然
后用这个公钥来验证IC卡的动态签名。
第一步,用根CA公钥去解密发卡行证书。
卡上的标签90(发卡行公钥证书) 9F32(发卡行公钥模数) 92(发卡行公钥余数)
调用RSA算法,输入源为90的发卡行公钥证书,算法输出结果为:6A 02开头,BC结尾的格式。
这里面有解密出来的发卡行公钥。但是不完整,需要拼接,加上卡上的92标签中的数据,才是完整的发卡行公钥。
接下来验证哈希签名是否一致。哈希的数据源参照规范Q/CUP 045.2。02 62 ... +还原出的发卡行公钥+发卡行公钥余项+公钥指数。最后的一项为公钥指数。
第二步,用发卡行公钥还原IC卡证书。
卡上的9F46(IC卡公钥证书) 9F47(IC卡公钥指数) 9F48(IC卡公钥余数)
调用RSA算法,输入源为9F46的IC公钥证书,算法输出结果为:6A 04开头,BC结尾的格式。
这里面有解密出来的IC公钥。但是不完整,需要拼接,加上卡上的9F48标签中的数据,才是完整的IC卡公钥。
接下来验证哈希签名是否一致。哈希的数据源参照规范Q/CUP 045.2。04 62 ... +。。。。
第三步,DDA验证,用IC卡公钥去解密9F4B(签名的动态应用数据),
调用RSA算法,解密成功后的格式为6A 05 ... BC的格式。
接下来验证哈希签名。(注,每步中的验证签名的数据源不一样,具体参照规范Q/CUP 045.2)
第三步验证哈希的数据源为 05 62 ... +IC卡公钥+ PDOL+9F69
需要说明的是:
PBOC3.0规范中QPBOC部分,增加了fDDA01算法, 简单来讲,相比较00算法,加了几个tag用于签名,相对安全一些. 下面站在终端的角度详细说说.
首先,在9f66原来缺省的第四个字节的bit8, 要指明终端支持哪个算法, 1表示fDDA01, 0表示fDDA00算法.这个值很关键,因为在PDOL中要送给卡片,卡片要把这个值作为用哪个算法的其中一个决定因素.
如果卡片本身支持fDDA01算法, 且决定了用这个算法, 它会把内部的tag9f69(卡片认证相关数据)置为1,表明自己用这个算法,这个tag会在读数据阶段送给终端. 同时在计算签名时,卡片会把不可预知数(终端, tag 9f37)、授权金额、交易货币代码,连接上卡片ATC和卡片认证相关数据(tag 9f69)作为输入数据.
fDDA00算法时,DDA阶段, 终端计算hash值时,输入数据是:
从签名中恢复的部分数据(其中有ATC)+ 不可预知数
当终端从获取的9f69中确认卡片用的是fDDA01算法时,计算hash值时,输入数据是:
从签名中恢复的部分数据(其中有ATC)+ 不可预知数 +授权金额 +交易货币代码 + 卡片认证相关数据
后面的步骤都和PBOC2.0一样了.
如果第三步的哈希也验证通过,至此,DDA脱机验证完成。
这两个案例是:
案例1,CA公钥是1984长度,要能否正确处理卡上数据为1976长度的IC卡证书。
案例2,SFI在11-30文件中的,要能够脱机认证成功。
结果呢,我的测试结果是,案例1中,第二步用CA公钥还原出的发卡行公钥,证书格式应该为 6A 04 .....BC 才对。
但是还原出来的死活不对。郁闷了,跟正常的比,有啥区别呢,把参与RSA计算的DATA打印出来看了下,是 247字节(1976长度)。而正常的都是为偶数。
案例2,我这第二步能否正确还原出证书格式6A 04 ....BC ,但是 哈希校验时,不对。跟卡上的哈希对应不上。
不过,经过进一步分析,这两个问题总算解决了。案例二不过的原因是,对于SFI从11-30的文件,记录的TAG(70)和记录长度,都要用于脱机数据认证。
日志如下: