【问题标题】:Sending signature data in response APDU - Java Card在响应 APDU 中发送签名数据 - Java Card
【发布时间】:2015-05-08 14:46:26
【问题描述】:

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

当我尝试在响应 APDU 中发送其他数据时,它可以正常工作。

apdu.setIncomingAndReceive();
Util.arrayCopyNonAtomic(MESSAGE, (short) 0, buffer, (short) 0, (short) MESSAGE.length);
apdu.setOutgoingAndSend((short) 0, (short) MESSAGE.length);

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

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;
    }
}

【问题讨论】:

    标签: digital-signature smartcard javacard apdu ecdsa


    【解决方案1】:

    这可能是signLen 大于 Ne 值(在 JavaCard 规范中错误地称为 Le)。顺便说一句,您还滥用Le 值来表示(short) MESSAGE.length。 Ne 表示预计回送的最大字节数。

    【讨论】:

    • 确实,我使用了Le 而不是(short) MESSAGE.length。我更新了代码。谢谢!我还认为这个问题与数据大小有关。现在我如何告诉卡响应(即签名)将大于 Ne 值,这就是我如何将 Ne 设置为 signLen 以便我可以正确获取响应 APDU? @Maarten Bodewes
    • 你不能,不是不问卡/你的申请。但大多数阅读器允许 Ne 为 256 字节(Le,Ne 的编码,则应为00)。由于 Ne 是 最大尺寸,对于任何需要响应数据的命令,您始终可以将 Le 设置为 00。
    • 现在可以使用了。在签名之前,我创建了一个作为输出缓冲区的数组,在签名之后,我将其内容复制到缓冲区。我不知道为什么缓冲区不能充当我的签名输出缓冲区。没关系。
    • 这应该是可能的,但没有更多的代码我无法判断。很高兴这对你有用...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多