首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发送签名数据响应APDU - Java卡

发送签名数据响应APDU - Java卡
EN

Stack Overflow用户
提问于 2015-05-08 14:46:26
回答 1查看 1K关注 0票数 1

我想在我的Java卡上签名一些数据(消息字节数组),然后在响应APDU中返回签名。我的代码工作得很好(或者至少我认为它工作正常,并且返回了9000),没有行apdu.sendBytes(BAS,sSignLen),但是当我取消注释时,我会得到一个未知的错误(0xC000002B (未知错误))。

当我试图在响应APDU中发送其他数据时,它工作得完美无缺。

代码语言:javascript
复制
apdu.setIncomingAndReceive();
Util.arrayCopyNonAtomic(MESSAGE, (short) 0, buffer, (short) 0, (short) MESSAGE.length);
apdu.setOutgoingAndSend((short) 0, (short) MESSAGE.length);

这是我的密码。我做错了什么或者错过了什么?谢谢!

代码语言:javascript
复制
public class TestApplet extends Applet {

    ...

    private final static byte SIGN = (byte) 0x01;

    ...

    private final static byte[] MESSAGE = new byte[] { 'M', 'e', 's', 's', 'a', 'g', 'e' };

    final static short BAS = 0;

    public void process(APDU apdu) {
        if (this.selectingApplet())
            return;

        byte buffer[] = apdu.getBuffer();

        ...

        switch (buffer[ISO7816.OFFSET_INS]) {
        case SIGN:
            try {
                ECDSAKeyPair = Secp256k1Domain.getKeyPairParameter();
                ECDSAKeyPair.genKeyPair();

                ECDSAPublicKey = (ECPublicKey) ECDSAKeyPair.getPublic();
                ECDSAPrivateKey = (ECPrivateKey) ECDSAKeyPair.getPrivate();

                ECDSASignature = Signature.getInstance(Signature.ALG_ECDSA_SHA, false);

                short signLen = 0;

                byte[] signatureArray = new byte[70];

                ECDSASignature.init(ECDSAPrivateKey, Signature.MODE_SIGN);
                signLen = ECDSASignature.sign(MESSAGE, BAS, (short) MESSAGE.length, signatureArray, BAS);

                apdu.setIncomingAndReceive();
                Util.arrayCopyNonAtomic(signatureArray, (short) 0, buffer, (short) 0, (short) signatureArray.length);
                apdu.setOutgoingAndSend((short) 0, (short) signatureArray.length);
            } catch (CryptoException c) {
                short reason = c.getReason();
                ISOException.throwIt((short) ((short) (0x9C00) | reason));
            }

            break;

        ...

        return;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-08 17:40:16

可能是signLen大于Ne值(在JavaCard规范中不正确地称为Le )。顺便说一下,您还滥用Le值来表示(short) MESSAGE.length。Ne表示预期要发回的最大字节数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30126646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档