Search in sources :

Example 1 with LoadDataApduCommand

use of es.gob.jmulticard.apdu.ceres.LoadDataApduCommand in project jmulticard by ctt-gob-es.

the class Ceres method loadData.

private void loadData(final int keyBitSize, final byte[] digestInfo) throws CryptoCardException {
    final byte[] paddedData;
    try {
        paddedData = CryptoHelper.addPkcs1PaddingForPrivateKeyOperation(digestInfo, keyBitSize);
    } catch (final Exception e1) {
        throw new CryptoCardException(// $NON-NLS-1$
        "Error realizando el relleno PKCS#1 de los datos a firmar: " + e1, // $NON-NLS-1$
        e1);
    }
    ResponseApdu res;
    // Si la clave es de 1024 la carga se puede hacer en una unica APDU
    if (keyBitSize < 2048) {
        try {
            res = sendArbitraryApdu(new LoadDataApduCommand(paddedData));
        } catch (final Exception e) {
            throw new CryptoCardException(// $NON-NLS-1$
            "Error enviando los datos a firmar a la tarjeta: " + e, // $NON-NLS-1$
            e);
        }
        if (!res.isOk()) {
            throw new CryptoCardException(// $NON-NLS-1$
            "No se han podido enviar los datos a firmar a la tarjeta. Respuesta: " + HexUtils.hexify(res.getBytes(), true));
        }
    } else // Pero si es de 2048 hacen falta dos APDU, envolviendo la APDU de carga de datos
    if (keyBitSize == 2048) {
        final byte[] envelopedLoadDataApdu = new byte[] { (byte) 0x90, (byte) 0x58, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00 };
        // La primera APDU carga 0xFF octetos (254)
        byte[] data = new byte[255];
        System.arraycopy(envelopedLoadDataApdu, 0, data, 0, envelopedLoadDataApdu.length);
        System.arraycopy(paddedData, 0, data, envelopedLoadDataApdu.length, 255 - envelopedLoadDataApdu.length);
        try {
            res = sendArbitraryApdu(new EnvelopeDataApduCommand(data));
        } catch (final Exception e) {
            throw new CryptoCardException(// $NON-NLS-1$
            "Error en el primer envio a la tarjeta de los datos a firmar: " + e, // $NON-NLS-1$
            e);
        }
        if (!res.isOk()) {
            throw new CryptoCardException(// $NON-NLS-1$
            "No se han podido enviar (primera tanda) los datos a firmar a la tarjeta. Respuesta: " + HexUtils.hexify(res.getBytes(), true));
        }
        // La segunda APDU es de 0x08 octetos (8)
        data = new byte[8];
        System.arraycopy(paddedData, 255 - envelopedLoadDataApdu.length, data, 0, 8);
        try {
            res = sendArbitraryApdu(new EnvelopeDataApduCommand(data));
        } catch (final Exception e) {
            throw new CryptoCardException(// $NON-NLS-1$
            "Error en el segundo envio a la tarjeta de los datos a firmar: " + e, // $NON-NLS-1$
            e);
        }
        if (!res.isOk()) {
            throw new CryptoCardException(// $NON-NLS-1$
            "No se han podido enviar (segunda tanda) los datos a firmar a la tarjeta. Respuesta: " + HexUtils.hexify(res.getBytes(), true));
        }
    } else {
        // $NON-NLS-1$
        throw new IllegalArgumentException("Solo se soportan claves de 2048 o menos bits");
    }
}
Also used : EnvelopeDataApduCommand(es.gob.jmulticard.apdu.iso7816eight.EnvelopeDataApduCommand) ResponseApdu(es.gob.jmulticard.apdu.ResponseApdu) CryptoCardException(es.gob.jmulticard.card.CryptoCardException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) UnsupportedCallbackException(javax.security.auth.callback.UnsupportedCallbackException) AuthenticationModeLockedException(es.gob.jmulticard.card.AuthenticationModeLockedException) FileNotFoundException(es.gob.jmulticard.card.iso7816four.FileNotFoundException) CryptoCardException(es.gob.jmulticard.card.CryptoCardException) InvalidCardException(es.gob.jmulticard.card.InvalidCardException) BadPinException(es.gob.jmulticard.card.BadPinException) IOException(java.io.IOException) CertificateException(java.security.cert.CertificateException) PinException(es.gob.jmulticard.card.PinException) TlvException(es.gob.jmulticard.asn1.TlvException) Iso7816FourCardException(es.gob.jmulticard.card.iso7816four.Iso7816FourCardException) Asn1Exception(es.gob.jmulticard.asn1.Asn1Exception) LoadDataApduCommand(es.gob.jmulticard.apdu.ceres.LoadDataApduCommand)

Aggregations

ResponseApdu (es.gob.jmulticard.apdu.ResponseApdu)1 LoadDataApduCommand (es.gob.jmulticard.apdu.ceres.LoadDataApduCommand)1 ApduConnectionException (es.gob.jmulticard.apdu.connection.ApduConnectionException)1 EnvelopeDataApduCommand (es.gob.jmulticard.apdu.iso7816eight.EnvelopeDataApduCommand)1 Asn1Exception (es.gob.jmulticard.asn1.Asn1Exception)1 TlvException (es.gob.jmulticard.asn1.TlvException)1 AuthenticationModeLockedException (es.gob.jmulticard.card.AuthenticationModeLockedException)1 BadPinException (es.gob.jmulticard.card.BadPinException)1 CryptoCardException (es.gob.jmulticard.card.CryptoCardException)1 InvalidCardException (es.gob.jmulticard.card.InvalidCardException)1 PinException (es.gob.jmulticard.card.PinException)1 FileNotFoundException (es.gob.jmulticard.card.iso7816four.FileNotFoundException)1 Iso7816FourCardException (es.gob.jmulticard.card.iso7816four.Iso7816FourCardException)1 IOException (java.io.IOException)1 CertificateException (java.security.cert.CertificateException)1 UnsupportedCallbackException (javax.security.auth.callback.UnsupportedCallbackException)1