在响应APDU -JAVA卡中发送签名数据



我想在我的Java卡上签署一些数据(消息字节数组),然后在响应APDU中返回签名。我的代码工作正常(或者至少我认为确实如此,并且它返回9000),而没有行 apdu.sendbytes(bas,ssignlen),但是当我删除时,我会得到一个未知错误(0xc000002b(未知错误。))。

当我尝试在响应中发送其他数据时,它可以完美地工作。

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

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