Search in sources :

Example 1 with PaceException

use of es.gob.jmulticard.card.pace.PaceException 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)

Example 2 with PaceException

use of es.gob.jmulticard.card.pace.PaceException in project jmulticard by ctt-gob-es.

the class DnieFactory method getDnie.

/**
 * Obtiene la clase de DNIe apropiada (según su ATR).
 * @param conn Conexión con el lector de tarjetas.
 * @param pwc <i>PasswordCallback</i> para la obtenci&oacute;n del PIN.
 * @param cryptoHelper Clase de apoyo para operaciones criptogr&aacute;ficas.
 * @param ch Gestor de <i>callbacks</i> para la obtenci&oacute;n de datos adicionales por parte
 *           del titular del DNIe.
 * @param loadCertsAndKeys Si se indica <code>true</code>, se cargan las referencias a
 *                         las claves privadas y a los certificados, mientras que si se
 *                         indica <code>false</code>, no se cargan, permitiendo la
 *                         instanciaci&oacute;n de un DNIe sin capacidades de firma o
 *                         autenticaci&oacute;n con certificados.
 * @return Clase de DNIe apropiada (seg&uacute;n su ATR).
 * @throws InvalidCardException Si se ha detectado al menos una tarjeta, pero no es un DNIe.
 * @throws BurnedDnieCardException Si se ha detectado un DNIe con su memoria vol&aacute;til borrada.
 * @throws ApduConnectionException Si no se puede conectar con el lector de tarjetas.
 */
public static Dnie getDnie(final ApduConnection conn, final PasswordCallback pwc, final CryptoHelper cryptoHelper, final CallbackHandler ch, final boolean loadCertsAndKeys) throws InvalidCardException, BurnedDnieCardException, ApduConnectionException {
    if (conn == null) {
        throw new IllegalArgumentException(// $NON-NLS-1$
        "La conexion no puede ser nula");
    }
    byte[] responseAtr = new byte[] {};
    Atr actualAtr;
    InvalidCardException invalidCardException = null;
    CardNotPresentException cardNotPresentException = null;
    final long[] terminals = conn.getTerminals(false);
    if (terminals.length < 1) {
        throw new NoReadersFoundException();
    }
    for (final long terminal : terminals) {
        conn.setTerminal((int) terminal);
        try {
            responseAtr = conn.reset();
        } catch (final CardNotPresentException e) {
            cardNotPresentException = e;
            continue;
        }
        actualAtr = new Atr(responseAtr, ATR_MASK);
        final byte[] actualAtrBytes = actualAtr.getBytes();
        if (ATR_NFC.equals(actualAtr)) {
            try {
                // $NON-NLS-1$
                LOGGER.info("Detectado DNIe 3.0 por NFC");
                return new DnieNFC(conn, pwc, cryptoHelper, ch, loadCertsAndKeys);
            } catch (final PaceException e) {
                throw new ApduConnectionException(// $NON-NLS-1$
                "No se ha podido abrir el canal PACE: " + e);
            }
        } else if (ATR.equals(actualAtr)) {
            if (actualAtrBytes[15] == 0x04) {
                // $NON-NLS-1$
                LOGGER.info("Detectado DNIe 3.0");
                return new Dnie3(conn, pwc, cryptoHelper, ch, loadCertsAndKeys);
            }
            // $NON-NLS-1$
            LOGGER.info("Detectado DNIe 2.0");
            return new Dnie(conn, pwc, cryptoHelper, ch, loadCertsAndKeys);
        } else if (ATR_TIF.equals(actualAtr)) {
            // $NON-NLS-1$
            LOGGER.info("Detectada tarjeta TIF");
            // (no se aplica el parametro 'loadCertsAndKeys')
            return new Tif(conn, pwc, cryptoHelper, ch);
        } else {
            // en 90-00
            if (actualAtrBytes[actualAtrBytes.length - 1] == (byte) 0x81 && actualAtrBytes[actualAtrBytes.length - 2] == (byte) 0x65) {
                throw new BurnedDnieCardException(actualAtr);
            }
            // $NON-NLS-1$
            invalidCardException = new InvalidCardException("DNIe", ATR, responseAtr);
            continue;
        }
    }
    if (invalidCardException != null) {
        throw invalidCardException;
    }
    if (cardNotPresentException != null) {
        throw cardNotPresentException;
    }
    // $NON-NLS-1$
    throw new ApduConnectionException("No se ha podido conectar con ningun lector de tarjetas");
}
Also used : InvalidCardException(es.gob.jmulticard.card.InvalidCardException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) PaceException(es.gob.jmulticard.card.pace.PaceException) CardNotPresentException(es.gob.jmulticard.apdu.connection.CardNotPresentException) Atr(es.gob.jmulticard.card.Atr) NoReadersFoundException(es.gob.jmulticard.apdu.connection.NoReadersFoundException)

Aggregations

ApduConnectionException (es.gob.jmulticard.apdu.connection.ApduConnectionException)2 PaceException (es.gob.jmulticard.card.pace.PaceException)2 JseCryptoHelper (es.gob.jmulticard.JseCryptoHelper)1 CardNotPresentException (es.gob.jmulticard.apdu.connection.CardNotPresentException)1 NoReadersFoundException (es.gob.jmulticard.apdu.connection.NoReadersFoundException)1 Atr (es.gob.jmulticard.card.Atr)1 CryptoCardException (es.gob.jmulticard.card.CryptoCardException)1 InvalidCardException (es.gob.jmulticard.card.InvalidCardException)1 PinException (es.gob.jmulticard.card.PinException)1 InvalidCanException (es.gob.jmulticard.card.pace.InvalidCanException)1 PaceConnection (es.gob.jmulticard.card.pace.PaceConnection)1 PaceInitializer (es.gob.jmulticard.card.pace.PaceInitializer)1 PaceInitializerCan (es.gob.jmulticard.card.pace.PaceInitializerCan)1 SecureMessaging (es.gob.jmulticard.de.tsenger.androsmex.iso7816.SecureMessaging)1 Callback (javax.security.auth.callback.Callback)1 PasswordCallback (javax.security.auth.callback.PasswordCallback)1