Search in sources :

Example 1 with CardNotPresentException

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

the class AndroidCCIDConnection method transmit.

/**
 * {@inheritDoc}
 */
@Override
public ResponseApdu transmit(final CommandApdu command) throws ApduConnectionException {
    if (!isOpen()) {
        // $NON-NLS-1$
        throw new UnavailableReaderException("No existe dispositivo USB asignado a la conexion");
    }
    try {
        if (!this.ccidReader.isCardActive()) {
            if (!this.ccidReader.isCardPresent()) {
                // No hay tarjeta en el lector
                throw new CardNotPresentException();
            }
            // Hay tarjeta, pero no esta activa
            // $NON-NLS-1$ //$NON-NLS-2$
            Log.i("es.gob.jmulticard", "La tarjeta del lector no esta activa, se reiniciara");
            this.reset();
        }
        if (DEBUG) {
            // $NON-NLS-1$ //$NON-NLS-2$
            Log.d("es.gob.jmulticard", "APDU Enviada:\n" + HexUtils.hexify(command.getBytes(), true));
        }
        final ResponseApdu response;
        try {
            response = new ResponseApdu(this.ccidReader.transmit(command.getBytes()));
            if (DEBUG) {
                // $NON-NLS-1$ //$NON-NLS-2$
                Log.d("es.gob.jmulticard", "APDU Recibida:\n" + HexUtils.hexify(response.getBytes(), true));
            }
            // Solicitamos el resultado de la operacion si es necesario
            if (response.getStatusWord().getMsb() == TAG_RESPONSE_PENDING) {
                // Si ya se ha devuelto parte de los datos, los concatenamos al resultado
                if (response.getData().length > 0) {
                    final byte[] data = response.getData();
                    final byte[] additionalData = transmit(new GetResponseApduCommand((byte) 0x00, response.getStatusWord().getLsb())).getBytes();
                    final byte[] fullResponse = new byte[data.length + additionalData.length];
                    System.arraycopy(data, 0, fullResponse, 0, data.length);
                    System.arraycopy(additionalData, 0, fullResponse, data.length, additionalData.length);
                    return new ResponseApdu(fullResponse);
                }
                return transmit(new GetResponseApduCommand((byte) 0x00, response.getStatusWord().getLsb()));
            } else // (de eso se encargara la clase de conexion con canal seguro)
            if (response.getStatusWord().getMsb() == TAG_RESPONSE_INVALID_LENGTH && command.getCla() == (byte) 0x00) {
                command.setLe(response.getStatusWord().getLsb());
                return transmit(command);
            }
            return response;
        } catch (final UsbDeviceException e) {
            // $NON-NLS-1$
            throw new ApduConnectionException("Error enviando APDU: " + e, e);
        }
    } catch (final NotAvailableUSBDeviceException e) {
        // $NON-NLS-1$
        throw new UnavailableReaderException("No se puede acceder al dispositivo USB: " + e, e);
    }
}
Also used : UnavailableReaderException(es.gob.jmulticard.apdu.connection.UnavailableReaderException) UsbDeviceException(es.inteco.labs.android.usb.device.exception.UsbDeviceException) ResponseApdu(es.gob.jmulticard.apdu.ResponseApdu) GetResponseApduCommand(es.gob.jmulticard.apdu.iso7816four.GetResponseApduCommand) CardNotPresentException(es.gob.jmulticard.apdu.connection.CardNotPresentException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) NotAvailableUSBDeviceException(es.inteco.labs.android.usb.device.exception.NotAvailableUSBDeviceException)

Example 2 with CardNotPresentException

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

the class SmartcardIoConnection method open.

/**
 * {@inheritDoc}
 */
@Override
public void open() throws ApduConnectionException {
    // Desactivamos las respuestas automaticas para evitar los problemas con el canal seguro
    // $NON-NLS-1$ //$NON-NLS-2$
    System.setProperty("sun.security.smartcardio.t0GetResponse", "false");
    // $NON-NLS-1$ //$NON-NLS-2$
    System.setProperty("sun.security.smartcardio.t1GetResponse", "false");
    if (isExclusiveUse() && isOpen()) {
        throw new ApduConnectionOpenedInExclusiveModeException();
    }
    final List<CardTerminal> terminales;
    try {
        terminales = TerminalFactory.getDefault().terminals().list();
    } catch (final Exception e) {
        throw new NoReadersFoundException(// $NON-NLS-1$
        "No se han podido listar los lectores del sistema: " + e, // $NON-NLS-1$
        e);
    }
    try {
        if (terminales.size() < 1) {
            throw new NoReadersFoundException();
        }
        if (this.terminalNumber == -1) {
            final long[] cadsWithCard = getTerminals(true);
            if (cadsWithCard.length > 0) {
                this.terminalNumber = (int) cadsWithCard[0];
            } else {
                throw new ApduConnectionException(// $NON-NLS-1$
                "En el sistema no hay ningun terminal con tarjeta insertada");
            }
        }
        if (terminales.size() <= this.terminalNumber) {
            throw new ApduConnectionException(// $NON-NLS-1$
            "No se detecto el lector de tarjetas numero " + Integer.toString(this.terminalNumber));
        }
        this.card = terminales.get(this.terminalNumber).connect(this.protocol.toString());
    } catch (final javax.smartcardio.CardNotPresentException e) {
        throw new CardNotPresentException(e);
    } catch (final CardException e) {
        throw new ApduConnectionException(// $NON-NLS-1$ //$NON-NLS-2$
        "No se ha podido abrir la conexion con el lector de tarjetas numero " + Integer.toString(this.terminalNumber) + ": " + e, // $NON-NLS-1$ //$NON-NLS-2$
        e);
    }
    if (this.exclusive) {
        try {
            this.card.beginExclusive();
        } catch (final CardException e) {
            throw new ApduConnectionException(// $NON-NLS-1$ //$NON-NLS-2$
            "No se ha podido abrir la conexion exclusiva con el lector de tarjetas numero " + Integer.toString(this.terminalNumber) + ": " + e, // $NON-NLS-1$ //$NON-NLS-2$
            e);
        }
    }
    this.canal = this.card.getBasicChannel();
}
Also used : CardTerminal(javax.smartcardio.CardTerminal) CardException(javax.smartcardio.CardException) ApduConnectionOpenedInExclusiveModeException(es.gob.jmulticard.apdu.connection.ApduConnectionOpenedInExclusiveModeException) CardNotPresentException(es.gob.jmulticard.apdu.connection.CardNotPresentException) CardNotPresentException(es.gob.jmulticard.apdu.connection.CardNotPresentException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException) CardException(javax.smartcardio.CardException) ApduConnectionOpenedInExclusiveModeException(es.gob.jmulticard.apdu.connection.ApduConnectionOpenedInExclusiveModeException) NoReadersFoundException(es.gob.jmulticard.apdu.connection.NoReadersFoundException) LostChannelException(es.gob.jmulticard.apdu.connection.LostChannelException) NoReadersFoundException(es.gob.jmulticard.apdu.connection.NoReadersFoundException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException)

Example 3 with CardNotPresentException

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

the class DnieFactory method getDnie.

/**
 * Obtiene la clase de DNIe apropiada (seg&uacute;n su ATR).
 * @param conn Conexi&oacute;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)

Example 4 with CardNotPresentException

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

the class CardOS method connect.

/**
 * Conecta con el lector del sistema que tenga una CardOS insertada.
 * @param conn Conexi&oacute;n hacia la tarjeta.
 * @throws IOException Cuando hay errores de entrada / salida.
 */
private void connect(final ApduConnection conn) throws IOException {
    if (conn == null) {
        // $NON-NLS-1$
        throw new IllegalArgumentException("La conexion no puede ser nula");
    }
    // Siemens CardOS son T=1
    conn.setProtocol(ApduConnectionProtocol.T1);
    final long[] terminals = conn.getTerminals(false);
    if (terminals.length < 1) {
        throw new NoReadersFoundException();
    }
    byte[] responseAtr;
    Atr actualAtr;
    InvalidCardException invalidCardException = null;
    CardNotPresentException cardNotPresentException = null;
    ApduConnectionException apduConnectionException = null;
    for (final long terminal : terminals) {
        conn.setTerminal((int) terminal);
        try {
            responseAtr = conn.reset();
        } catch (final CardNotPresentException e) {
            cardNotPresentException = e;
            continue;
        } catch (final ApduConnectionException e) {
            apduConnectionException = e;
            continue;
        }
        actualAtr = new Atr(responseAtr, ATR_MASK);
        if (!ATR.equals(actualAtr)) {
            // La tarjeta encontrada no es una CardOS
            invalidCardException = new InvalidCardException(getCardName(), ATR, responseAtr);
            continue;
        }
        return;
    }
    if (invalidCardException != null) {
        throw invalidCardException;
    }
    if (cardNotPresentException != null) {
        throw cardNotPresentException;
    }
    if (apduConnectionException != null) {
        throw apduConnectionException;
    }
    // $NON-NLS-1$
    throw new ApduConnectionException("No se ha podido conectar con ningun lector de tarjetas");
}
Also used : CardNotPresentException(es.gob.jmulticard.apdu.connection.CardNotPresentException) NoReadersFoundException(es.gob.jmulticard.apdu.connection.NoReadersFoundException) Atr(es.gob.jmulticard.card.Atr) InvalidCardException(es.gob.jmulticard.card.InvalidCardException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException)

Example 5 with CardNotPresentException

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

the class TuiR5 method connect.

/**
 * Conecta con el lector del sistema que tenga una TUI insertada.
 * @param conn Conexi&oacute;n hacia la TUI
 * @throws IOException Cuando hay errores de entrada / salida.
 */
private void connect(final ApduConnection conn) throws IOException {
    if (conn == null) {
        // $NON-NLS-1$
        throw new IllegalArgumentException("La conexion no puede ser nula");
    }
    final long[] terminals = conn.getTerminals(false);
    if (terminals.length < 1) {
        throw new NoReadersFoundException();
    }
    byte[] responseAtr;
    Atr actualAtr;
    InvalidCardException invalidCardException = null;
    CardNotPresentException cardNotPresentException = null;
    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);
        if (!ATR.equals(actualAtr)) {
            // La tarjeta encontrada no es una TUI
            invalidCardException = new InvalidCardException(getCardName(), ATR, responseAtr);
            continue;
        }
        return;
    }
    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 : CardNotPresentException(es.gob.jmulticard.apdu.connection.CardNotPresentException) NoReadersFoundException(es.gob.jmulticard.apdu.connection.NoReadersFoundException) Atr(es.gob.jmulticard.card.Atr) InvalidCardException(es.gob.jmulticard.card.InvalidCardException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException)

Aggregations

ApduConnectionException (es.gob.jmulticard.apdu.connection.ApduConnectionException)5 CardNotPresentException (es.gob.jmulticard.apdu.connection.CardNotPresentException)5 NoReadersFoundException (es.gob.jmulticard.apdu.connection.NoReadersFoundException)4 Atr (es.gob.jmulticard.card.Atr)3 InvalidCardException (es.gob.jmulticard.card.InvalidCardException)3 ResponseApdu (es.gob.jmulticard.apdu.ResponseApdu)1 ApduConnectionOpenedInExclusiveModeException (es.gob.jmulticard.apdu.connection.ApduConnectionOpenedInExclusiveModeException)1 LostChannelException (es.gob.jmulticard.apdu.connection.LostChannelException)1 UnavailableReaderException (es.gob.jmulticard.apdu.connection.UnavailableReaderException)1 GetResponseApduCommand (es.gob.jmulticard.apdu.iso7816four.GetResponseApduCommand)1 PaceException (es.gob.jmulticard.card.pace.PaceException)1 NotAvailableUSBDeviceException (es.inteco.labs.android.usb.device.exception.NotAvailableUSBDeviceException)1 UsbDeviceException (es.inteco.labs.android.usb.device.exception.UsbDeviceException)1 CardException (javax.smartcardio.CardException)1 CardTerminal (javax.smartcardio.CardTerminal)1