Javacard securechannel.processSecurity(apdu)中出现错误0x6700
我想生成gp安全通道01。我的追踪是:Javacard securechannel.processSecurity(apdu)中出现错误0x6700,javacard,Javacard,我想生成gp安全通道01。我的追踪是: Send: 80 50 00 00 08 00 00 00 00 00 00 00 00 Recv: 00 00 00 00 00 00 00 00 00 00 FF 02 00 02 0E 5A 8F F4 57 DD 35 5C 49 A6 8B 15 E9 A5 9000 因此,我: Card challenge= 00 02 0E 5A 8F F4 57 DD Host challenge=00 00 00 00 00 00 00 00 根据S
Send: 80 50 00 00 08 00 00 00 00 00 00 00 00
Recv: 00 00 00 00 00 00 00 00 00 00 FF 02 00 02 0E 5A 8F F4 57 DD 35 5C 49 A6 8B 15 E9 A5 9000
因此,我:
Card challenge= 00 02 0E 5A 8F F4 57 DD
Host challenge=00 00 00 00 00 00 00 00
根据SPC01:
根据这一点和3Des在线
会话s_ENC=C72F032C8BAD55D4D2579295CCF0A6CA
现在:
但当我发送:
84820000083A485F8255FE90E
我在方法SDI指令行中有错误0x6700
短len=sc.processSecurity(apdu)
根据,外部认证命令必须包括主机密码和MAC。两者的长度都是8字节,因此,您的命令总共应该是16字节
如果你想自己实现这个MAC值的生成,你可以遵循GlobalPlatform规范中的描述。但是我建议你使用可用的开源实现。例如:是GlobalPlatform规范的Java实现,具有您需要的所有命令。您可以查看GlobalPlatformService类,在该类中可以找到安全通道协议的实现。GPDroid(github.com/mobilesec/secure element GPDroid)是Android上此项目的包装器。您的卡使用的是
SCP02
,而不是SCP01
给定对初始化更新
命令的响应:
00 00 00 00 00 00FF 0200 02 0E 5A 8F F4 57 DD 35 5C 49 A6 8B 15 E9 A5 9000
突出显示的部分是“关键信息”,其中包含:
- “密钥版本号”--在跟踪中
0xFF
- “安全通道协议标识符”--在跟踪中它是
表示0x02
SCP02
初始化更新
命令的章节)
因此,您需要根据SCP02
建立卡的安全通道
一些附加(随机)注释:
- 同时确保检查“卡识别数据”(标签
)中编码的'64'
安全通道参数“i”
- 您可能希望查看工具源代码中的方法和内部类
祝你好运 非常感谢,谢谢。打扰一下我读过gp规范,但不明白如何生成MAC?1-我应该为命令“8482010010”+“cardcahlenfe”+“800000”生成Mac。对吗?2-我可以使用哪些工具生成mac?我搜索了在线工具,但找不到。3-我下载了GPj,但我不知道如何使用它?我用pyaapdutool向卡发送命令,现在没有android应用对不起,我应该说我的真卡支持spc01。这篇文章是为一张虚拟卡写的。我应该使用spc011-不确定问题是什么,但如果你问是否需要为第二个命令生成MAC:那么,是的2和3-我不知道有任何工具只生成MAC,但你使用GPJ来实现这一点。在GlobalPlatformService类的方法“wrap”中,您还可以找到SCP1和SCP2 MAC计算的一个实现。GPJ还具有在命令行上使用它的功能。看看主要的方法,看看如何使用它。非常感谢亲爱的miho
Derivation data== 8F F4 57 DD 00 00 00 00 00 02 0E 5A 00 00 00 00
IV=0000000000000000
c_ENC: 404142434445464748494A4B4C4D4E4F
hot-auth_data = card challenge + host challenge + pad
host-auth= 00020E5A8FF457DD00000000000000008000000000000000
s_ENC=C72F032C8BAD55D4D2579295CCF0A6CA
IV=0000000000000000
===========
result= 93CC77E144488A031BFFCCC62EB3B5C233A485F8255FE90E
Host cryptogram= 33A485F8255FE90E
public void process(APDU apdu) throws ISOException {
if (selectingApplet()) {
return;
}
byte[] buffer = apdu.getBuffer();
switch (buffer[ISO7816.OFFSET_INS]) {
case ISO7816.INS_SELECT:
select();
return;
case INS_INIT_UPDATE:
case INS_EXT_AUTH:
SDInstruction(apdu);
break;
}
}
private void SDInstruction(APDU apdu)
{
byte[] buf = apdu.getBuffer();
byte cla = buf[ISO7816.OFFSET_CLA];
byte ins = buf[ISO7816.OFFSET_INS];
apdu.setIncomingAndReceive();
if(ins == INS_INIT_UPDATE)
sc = GPSystem.getSecureChannel();
short len = sc.processSecurity(apdu);
apdu.setOutgoing();
apdu.setOutgoingLength(len);
apdu.sendBytes(ISO7816.OFFSET_CDATA, (short) len);
}