secureChannel.unwrap 函数 return 6982(不满足安全状态)
secureChannel.unwrap function return 6982(Security status not satisfied)
我想通过 org.globalplatform 包在我的小程序中使用安全消息传递。我在 C# 中有一个库,它实现了一些 globalplatform 命令。我可以在 CLR、MAC 和 ENC 模式下打开到卡的安全通道,我可以在提到的模式下在卡上加载和安装小程序。
我也成功地在我的小程序中打开安全通道和外部身份验证响应 9000。像这样:
case INS_INIT_UPDATE:
case INS_External_AUTHENTICATION:
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)
secureChannel = GPSystem.getSecureChannel();
short len = secureChannel.processSecurity(apdu);
apdu.setOutgoing();
apdu.setOutgoingLength(len);
apdu.sendBytes(ISO7816.OFFSET_CDATA, (short) len);
}
但是当我想在我的小程序中解包命令 apdu "which wraped by global platform c# library" 时,cardManager return 6982(安全状态不满足)。解包代码:
byte[] buf = apdu.getBuffer();
if (secureChannel.getSecurityLevel() < (SecureChannel.AUTHENTICATED))
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
short len = secureChannel.unwrap(buf, (short) 0, (short) buf.length);
安全通道 apdu 的踪迹:
Command APDU >> Class=00 Ins=A4 P1=04 P2=00 P3=09 Data=A00000030800001000
Response APDU << SW=611A
Command APDU >> Class=00 Ins=C0 P1=00 P2=00 P3=1A
Response APDU << SW=9000 Data=61174F06000010000100790D4F0BA00000030800001000010009
Command APDU >> Class=80 Ins=50 P1=00 P2=00 P3=08 Data=0101010101010101
Response APDU << SW=611C
Command APDU >> Class=00 Ins=C0 P1=00 P2=00 P3=1C
Response APDU << SW=9000 Data=4D0022840106A783224FFF01AF258B0267752E248D07854961DA9851
Command APDU >> Class=84 Ins=82 P1=01 P2=00 P3=10 Data=F6E5BC84DE83E5242E8B6C9CA0ECB741
Response APDU << SW=9000
Command APDU >> Class=04 Ins=20 P1=00 P2=80 P3=0E Data=3131313131315F34DCF6BE7EDD3A
Response APDU << SW=6982
Wrapping apdu command faild.
谁能帮帮我?
非常感谢,
莫森。
我认为你的展开命令指定了错误的长度。
尝试:
short len = secureChannel.unwrap(buf, (short) 0, (short)(ISO7816.OFFSET_CDATA + apdu.getIncomingLength()));
我想通过 org.globalplatform 包在我的小程序中使用安全消息传递。我在 C# 中有一个库,它实现了一些 globalplatform 命令。我可以在 CLR、MAC 和 ENC 模式下打开到卡的安全通道,我可以在提到的模式下在卡上加载和安装小程序。 我也成功地在我的小程序中打开安全通道和外部身份验证响应 9000。像这样:
case INS_INIT_UPDATE:
case INS_External_AUTHENTICATION:
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)
secureChannel = GPSystem.getSecureChannel();
short len = secureChannel.processSecurity(apdu);
apdu.setOutgoing();
apdu.setOutgoingLength(len);
apdu.sendBytes(ISO7816.OFFSET_CDATA, (short) len);
}
但是当我想在我的小程序中解包命令 apdu "which wraped by global platform c# library" 时,cardManager return 6982(安全状态不满足)。解包代码:
byte[] buf = apdu.getBuffer();
if (secureChannel.getSecurityLevel() < (SecureChannel.AUTHENTICATED))
ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED);
short len = secureChannel.unwrap(buf, (short) 0, (short) buf.length);
安全通道 apdu 的踪迹:
Command APDU >> Class=00 Ins=A4 P1=04 P2=00 P3=09 Data=A00000030800001000
Response APDU << SW=611A
Command APDU >> Class=00 Ins=C0 P1=00 P2=00 P3=1A
Response APDU << SW=9000 Data=61174F06000010000100790D4F0BA00000030800001000010009
Command APDU >> Class=80 Ins=50 P1=00 P2=00 P3=08 Data=0101010101010101
Response APDU << SW=611C
Command APDU >> Class=00 Ins=C0 P1=00 P2=00 P3=1C
Response APDU << SW=9000 Data=4D0022840106A783224FFF01AF258B0267752E248D07854961DA9851
Command APDU >> Class=84 Ins=82 P1=01 P2=00 P3=10 Data=F6E5BC84DE83E5242E8B6C9CA0ECB741
Response APDU << SW=9000
Command APDU >> Class=04 Ins=20 P1=00 P2=80 P3=0E Data=3131313131315F34DCF6BE7EDD3A
Response APDU << SW=6982
Wrapping apdu command faild.
谁能帮帮我? 非常感谢,
莫森。
我认为你的展开命令指定了错误的长度。
尝试:
short len = secureChannel.unwrap(buf, (short) 0, (short)(ISO7816.OFFSET_CDATA + apdu.getIncomingLength()));