2016-11-28 82 views
3

我想生成卡与终端之间的安全通道。这是我的代码:生成卡与终端之间的安全通道

final static byte INIT_UPDATE  = (byte) 0x50; 
    final static byte EXT_AUTHENTICATE = (byte) 0x82; 
    SecureChannel sc; 

    public void process(APDU apdu) throws ISOException { 
     if (selectingApplet()) { 
     return; 
     } 
     byte[] buffer = apdu.getBuffer(); 
     short inlength = 0; 

     try 
     { 
     switch (buffer[ISO7816.OFFSET_INS]) { 

     case INIT_UPDATE: 
      case EXT_AUTHENTICATE: 
        makeSecureChannel(apdu); 
       break; 
    } 
    catch (CryptoException e) 
    { 
      short r = e.getReason(); 
      ISOException.throwIt(r); 
     } 

}

private void makeSecureChannel(APDU apdu) 
{ 

    byte[] buf = apdu.getBuffer(); 
    byte cla = buf[ISO7816.OFFSET_CLA]; 
    byte ins = buf[ISO7816.OFFSET_INS]; 

    try 
    { 
    apdu.setIncomingAndReceive(); 
    if(ins == INIT_UPDATE) 
    { 
     sc = GPSystem.getSecureChannel();  
    } 

    short len = sc.processSecurity(apdu); 

    apdu.setOutgoing(); 
    apdu.setOutgoingLength(len); 
    apdu.sendBytes(ISO7816.OFFSET_CDATA, (short) len); 
    } 
    catch(APDUException ex1) 
    { 
     ISOException.throwIt(ex1.getReason()); 
    }  
} 

当我发送命令80 50 20 00 08 01 15 6A 2A F5 64 87 CF我得到错误6a88,当我发送命令00 50 20 00 08 01 15 6A 2A F5 64 87 CF我得到错误6e00。 每个人都可以帮助我吗?

+0

您可以将错误本地化为特定的代码行吗?你能调试吗?您确定您的卡支持此全球平台API调用吗? –

+0

您是否在发送APDU命令之前选择了您的小程序?你的钥匙版本是否设有钥匙== 0x20?如果不是,则用0x00替换0x20。 – Abraham

回答

2

状态字6E00不是很有趣。这意味着你发送了一个不正确的CLA(类)字节。这是因为INITIALIZE UPDATE没有在ISO 7816中定义,所以它是一个专有命令。专有命令必须设置其专有的位。所以类字节80是唯一正确的。

这样就让我们专注于INIT UPDATE的响应:6A886A88表示“未找到参考数据”。这可能意味着P1和P2引用的密钥不匹配。将P1和P2都设置为00以确保自动选择密钥(并且如果要在P1中显式选择密钥版本,请检查响应数据中的“密钥信息”)。