Search in sources :

Example 6 with ApduConnectionException

use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.

the class Dnie method preloadCertificates.

/**
 * Carga el certificado de la CA intermedia y las localizaciones de los
 * certificados de firma y autenticación.
 * @throws ApduConnectionException Si hay problemas en la precarga.
 */
protected void preloadCertificates() throws ApduConnectionException {
    final Cdf cdf = new Cdf();
    try {
        selectMasterFile();
        final byte[] cdfBytes = selectFileByLocationAndRead(CDF_LOCATION);
        cdf.setDerValue(cdfBytes);
    } catch (final Exception e) {
        throw new ApduConnectionException(// $NON-NLS-1$
        "No se ha podido cargar el CDF de la tarjeta: " + e.toString(), // $NON-NLS-1$
        e);
    }
    for (int i = 0; i < cdf.getCertificateCount(); i++) {
        final String currentAlias = cdf.getCertificateAlias(i);
        if (CERT_ALIAS_AUTH.equals(currentAlias)) {
            this.authCertPath = new Location(cdf.getCertificatePath(i));
        } else if (CERT_ALIAS_SIGN.equals(currentAlias)) {
            this.signCertPath = new Location(cdf.getCertificatePath(i));
        } else if (CERT_ALIAS_CYPHER.equals(currentAlias)) {
            this.cyphCertPath = new Location(cdf.getCertificatePath(i));
        } else if (CERT_ALIAS_INTERMEDIATE_CA.equals(currentAlias)) {
            try {
                final byte[] intermediateCaCertEncoded = selectFileByLocationAndRead(new Location(cdf.getCertificatePath(i)));
                this.intermediateCaCert = CompressionUtils.getCertificateFromCompressedOrNotData(intermediateCaCertEncoded);
            } catch (final Exception e) {
                LOGGER.warning(// $NON-NLS-1$
                "No se ha podido cargar el certificado de la autoridad intermedia del CNP: " + e);
                this.intermediateCaCert = null;
            }
        } else {
            this.signAliasCertPath = new Location(cdf.getCertificatePath(i));
        }
    }
}
Also used : Cdf(es.gob.jmulticard.asn1.der.pkcs15.Cdf) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) UnsupportedCallbackException(javax.security.auth.callback.UnsupportedCallbackException) AuthenticationModeLockedException(es.gob.jmulticard.card.AuthenticationModeLockedException) BadPinException(es.gob.jmulticard.card.BadPinException) PinException(es.gob.jmulticard.card.PinException) Iso7816FourCardException(es.gob.jmulticard.card.iso7816four.Iso7816FourCardException) AccessControlException(java.security.AccessControlException) SecureChannelException(es.gob.jmulticard.apdu.connection.cwa14890.SecureChannelException) CryptoCardException(es.gob.jmulticard.card.CryptoCardException) LostChannelException(es.gob.jmulticard.apdu.connection.LostChannelException) CancelledOperationException(es.gob.jmulticard.CancelledOperationException) IOException(java.io.IOException) CertificateException(java.security.cert.CertificateException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) Location(es.gob.jmulticard.card.Location)

Example 7 with ApduConnectionException

use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.

the class Dnie method getPinRetriesLeft.

private int getPinRetriesLeft() throws PinException {
    final CommandApdu verifyCommandApdu = new RetriesLeftApduCommand();
    final ResponseApdu verifyResponse;
    try {
        verifyResponse = getConnection().transmit(verifyCommandApdu);
    } catch (final ApduConnectionException e) {
        throw new PinException(// $NON-NLS-1$
        "Error obteniendo el PIN del CallbackHandler: " + e);
    }
    return verifyResponse.getStatusWord().getLsb() - (byte) 0xC0;
}
Also used : CommandApdu(es.gob.jmulticard.apdu.CommandApdu) ResponseApdu(es.gob.jmulticard.apdu.ResponseApdu) BadPinException(es.gob.jmulticard.card.BadPinException) PinException(es.gob.jmulticard.card.PinException) RetriesLeftApduCommand(es.gob.jmulticard.apdu.dnie.RetriesLeftApduCommand) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException)

Example 8 with ApduConnectionException

use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.

the class Dnie method getInternalAuthenticateMessage.

/**
 * {@inheritDoc}
 */
@Override
public byte[] getInternalAuthenticateMessage(final byte[] randomIfd, final byte[] chrCCvIfd) throws ApduConnectionException {
    final CommandApdu apdu = new InternalAuthenticateApduCommand((byte) 0x00, randomIfd, chrCCvIfd);
    final ResponseApdu res = getConnection().transmit(apdu);
    if (res.isOk()) {
        return res.getData();
    }
    throw new ApduConnectionException(// $NON-NLS-1$
    "Respuesta invalida en la obtencion del mensaje de autenticacion interna con el codigo: " + res.getStatusWord());
}
Also used : CommandApdu(es.gob.jmulticard.apdu.CommandApdu) ResponseApdu(es.gob.jmulticard.apdu.ResponseApdu) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) InternalAuthenticateApduCommand(es.gob.jmulticard.apdu.iso7816four.InternalAuthenticateApduCommand)

Example 9 with ApduConnectionException

use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.

the class Dnie3 method openSecureChannelIfNotAlreadyOpened.

/**
 * Si no se hab&iacute;a hecho anteriormente, establece y abre el canal seguro de PIN CWA-14890,
 * solicita y comprueba el PIN e inmediatamente despu&eacute;s y, si la verificaci&oacute;n es correcta,
 * establece el canal de USUARIO CWA-14890.
 * Si falla alg&uacute;n punto del proceso, vuelve al modo inicial de conexi&oacute;n (sin canal seguro).
 * @throws CryptoCardException Si hay problemas en el proceso.
 * @throws PinException Si el PIN usado para la apertura de canal no es v&aacute;lido.
 */
@Override
protected void openSecureChannelIfNotAlreadyOpened() throws CryptoCardException, PinException {
    // Si el canal seguro esta ya abierto salimos sin hacer nada
    if (isSecurityChannelOpen()) {
        return;
    }
    // establecido pero cerrado
    try {
        setConnection(this.rawConnection);
    } catch (final ApduConnectionException e) {
        throw new CryptoCardException(// $NON-NLS-1$
        "Error en el establecimiento del canal inicial previo al seguro de PIN: " + e, // $NON-NLS-1$
        e);
    }
    // Establecemos el canal PIN y lo verificamos
    final ApduConnection pinSecureConnection = new Cwa14890OneV2Connection(this, getConnection(), getCryptoHelper(), new Dnie3PinCwa14890Constants(), new Dnie3PinCwa14890Constants());
    try {
        selectMasterFile();
    } catch (final Exception e) {
        throw new CryptoCardException(// $NON-NLS-1$
        "Error seleccionado el MF tras el establecimiento del canal seguro de PIN: " + e, // $NON-NLS-1$
        e);
    }
    try {
        setConnection(pinSecureConnection);
    } catch (final ApduConnectionException e) {
        throw new CryptoCardException(// $NON-NLS-1$
        "Error en el establecimiento del canal seguro de PIN: " + e, // $NON-NLS-1$
        e);
    }
    // $NON-NLS-1$
    LOGGER.info("Canal seguro de PIN para DNIe establecido");
    try {
        verifyPin(getInternalPasswordCallback());
    } catch (final ApduConnectionException e) {
        throw new CryptoCardException(// $NON-NLS-1$
        "Error en la verificacion de PIN: " + e, // $NON-NLS-1$
        e);
    }
    // Y establecemos ahora el canal de usuario
    final ApduConnection usrSecureConnection = new Cwa14890OneV2Connection(this, getConnection(), getCryptoHelper(), new Dnie3UsrCwa14890Constants(), new Dnie3UsrCwa14890Constants());
    try {
        selectMasterFile();
    } catch (final Exception e) {
        throw new CryptoCardException(// $NON-NLS-1$
        "Error seleccionado el MF tras el establecimiento del canal seguro de usuario: " + e, // $NON-NLS-1$
        e);
    }
    try {
        setConnection(usrSecureConnection);
    } catch (final ApduConnectionException e) {
        throw new CryptoCardException(// $NON-NLS-1$
        "Error en el establecimiento del canal seguro de usuario: " + e, // $NON-NLS-1$
        e);
    }
    // $NON-NLS-1$
    LOGGER.info("Canal seguro de Usuario para DNIe establecido");
}
Also used : Cwa14890OneV2Connection(es.gob.jmulticard.apdu.connection.cwa14890.Cwa14890OneV2Connection) CryptoCardException(es.gob.jmulticard.card.CryptoCardException) ApduConnection(es.gob.jmulticard.apdu.connection.ApduConnection) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) IOException(java.io.IOException) CryptoCardException(es.gob.jmulticard.card.CryptoCardException) PinException(es.gob.jmulticard.card.PinException) Iso7816FourCardException(es.gob.jmulticard.card.iso7816four.Iso7816FourCardException)

Example 10 with ApduConnectionException

use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.

the class DnieNFC method getPaceConnection.

private static ApduConnection getPaceConnection(final ApduConnection con, final CallbackHandler ch) throws ApduConnectionException, PaceException {
    // Primero obtenemos el CAN/MRZ
    Callback tic = new CustomTextInputCallback();
    SecureMessaging sm = null;
    boolean wrongInit = true;
    int counter = 0;
    paceInitValue = null;
    paceInitType = null;
    while (wrongInit) {
        // El contador permite hacer dos verificaciones del can por si en la primera no se hubiera reseteado la tarjeta
        if (paceInitValue == null || paceInitType == null || counter > 0) {
            try {
                ch.handle(new Callback[] { tic });
            } catch (final Exception e) {
                // $NON-NLS-1$
                throw new PaceException("Error obteniendo el CAN: " + e, e);
            }
            paceInitValue = ((CustomTextInputCallback) tic).getText();
            // Se obtiene el tipo de inicializador analizando el valor introducido.
            paceInitType = getPasswordType(paceInitValue);
            if (paceInitValue == null || paceInitValue.isEmpty() || paceInitType == null) {
                // $NON-NLS-1$
                throw new InvalidCanException("El CAN/MRZ no puede ser nulo ni vacio");
            }
        }
        try {
            final PaceInitializer paceInitializer;
            switch(paceInitType) {
                case MRZ:
                    paceInitializer = PaceInitializerMrz.deriveMrz(paceInitValue);
                    break;
                case CAN:
                    paceInitializer = new PaceInitializerCan(paceInitValue);
                    break;
                default:
                    throw new UnsupportedOperationException(// $NON-NLS-1$
                    "Tipo de inicializador PACE no soportado: " + paceInitType);
            }
            sm = PaceChannelHelper.openPaceChannel((byte) 0x00, paceInitializer, con, new JseCryptoHelper());
            // En caso de establecer correctamente el canal inicializamos el contador para que
            // siempre obtenga el can mediante el callback
            counter = 0;
            wrongInit = false;
        } catch (final PaceException e) {
            // $NON-NLS-1$
            Logger.getLogger("es.gob.jmulticard").warning(// $NON-NLS-1$
            "Error estableciendo canal PACE (probablemente por CAN/MRZ invalido): " + e);
            // Si el CAN/MRZ es incorrecto modificamos el mensaje del dialogo y volvemos a pedirlo
            wrongInit = true;
            tic = new CustomTextInputCallback();
            counter++;
        }
    }
    // Establecemos el canal PACE
    return new PaceConnection(con, new JseCryptoHelper(), sm);
}
Also used : SecureMessaging(es.gob.jmulticard.de.tsenger.androsmex.iso7816.SecureMessaging) PaceInitializerCan(es.gob.jmulticard.card.pace.PaceInitializerCan) PaceConnection(es.gob.jmulticard.card.pace.PaceConnection) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) InvalidCanException(es.gob.jmulticard.card.pace.InvalidCanException) CryptoCardException(es.gob.jmulticard.card.CryptoCardException) PaceException(es.gob.jmulticard.card.pace.PaceException) PinException(es.gob.jmulticard.card.PinException) PaceException(es.gob.jmulticard.card.pace.PaceException) InvalidCanException(es.gob.jmulticard.card.pace.InvalidCanException) PasswordCallback(javax.security.auth.callback.PasswordCallback) Callback(javax.security.auth.callback.Callback) PaceInitializer(es.gob.jmulticard.card.pace.PaceInitializer) JseCryptoHelper(es.gob.jmulticard.JseCryptoHelper)

Aggregations

ApduConnectionException (es.gob.jmulticard.apdu.connection.ApduConnectionException)38 ResponseApdu (es.gob.jmulticard.apdu.ResponseApdu)21 IOException (java.io.IOException)16 CommandApdu (es.gob.jmulticard.apdu.CommandApdu)14 PinException (es.gob.jmulticard.card.PinException)14 BadPinException (es.gob.jmulticard.card.BadPinException)13 CryptoCardException (es.gob.jmulticard.card.CryptoCardException)13 Iso7816FourCardException (es.gob.jmulticard.card.iso7816four.Iso7816FourCardException)12 CertificateException (java.security.cert.CertificateException)10 AuthenticationModeLockedException (es.gob.jmulticard.card.AuthenticationModeLockedException)9 CardNotPresentException (es.gob.jmulticard.apdu.connection.CardNotPresentException)7 LostChannelException (es.gob.jmulticard.apdu.connection.LostChannelException)7 InvalidCardException (es.gob.jmulticard.card.InvalidCardException)7 NoReadersFoundException (es.gob.jmulticard.apdu.connection.NoReadersFoundException)6 UnsupportedCallbackException (javax.security.auth.callback.UnsupportedCallbackException)6 ApduConnection (es.gob.jmulticard.apdu.connection.ApduConnection)5 Cwa14890Connection (es.gob.jmulticard.apdu.connection.cwa14890.Cwa14890Connection)5 TlvException (es.gob.jmulticard.asn1.TlvException)5 SecureChannelException (es.gob.jmulticard.apdu.connection.cwa14890.SecureChannelException)4 Asn1Exception (es.gob.jmulticard.asn1.Asn1Exception)4