JCIDE模拟器签名验证正常,实体ACOSJ卡验证失败排查
ECDSA签名验签在实体ACOSJ卡上验证失败问题排查
背景
使用JCIDE开发JavaCard小程序,采用ACOSJ实体卡搭配pyAPDU进行测试。
问题现象
小程序支持ECDSA签名与验签功能,在JCIDE模拟器中测试完全正常:签名后返回数据、签名及W值,验签可成功通过;但加载到实体ACOSJ卡后,无论使用模拟器生成的签名还是实体卡自身生成的签名,验签均返回“未验证”结果(响应00 02)。
日志对比
JCIDE模拟器中,INS=11为签名指令,INS=12为验签指令,验签响应为00 01(验证通过);pyAPDU测试实体卡时,相同验签指令返回00 02(未验证)。
排查情况
- 已通过JCALgTest确认实体卡支持
ALG_ECDSA_SHA_256算法; - 模拟器生成的签名长度为72字节,实体卡生成的签名长度为70字节;且实体卡可验证模拟器生成的签名,推测实体卡签名代码生成的签名短2字节。
核心代码片段
// 签名处理逻辑 private void processSign(APDU apdu) throws ISOException { byte[] buf = apdu.getBuffer(); short dataLen = apdu.setIncomingAndReceive(); // 已完成EC密钥初始化 short sigLength = ecdsaPrivateKey.sign(buf, ISO7816.OFFSET_CDATA, dataLen, buf, (short)0); apdu.setOutgoingAndSend((short)0, sigLength); } // 验签处理逻辑 private void processVerify(APDU apdu) throws ISOException { byte[] buf = apdu.getBuffer(); short totalLen = apdu.setIncomingAndReceive(); // 拆分待验数据与签名(此处假设模拟器签名长度固定为72字节) short dataLength = (short)(totalLen - 72); boolean verifyResult = ecdsaPublicKey.verify(buf, ISO7816.OFFSET_CDATA, dataLength, buf, (short)(ISO7816.OFFSET_CDATA + dataLength), (short)72); buf[0] = verifyResult ? (byte)0x01 : (byte)0x02; apdu.setOutgoingAndSend((short)0, (short)1); }
内容的提问来源于stack exchange,提问作者LozCodes
相关产品推荐
相关产品推荐

