Javacard securechannel.processSecurity(apdu)中出现错误0x6700

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

我想生成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
根据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);        
}