Search in sources :

Example 1 with ApduConnectionException

use of es.gob.jmulticard.apdu.connection.ApduConnectionException 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 ApduConnectionException

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

the class Iso7816FourCard method readBinary.

/**
 * Lee un contenido binario del fichero actualmente seleccionado.
 * @param msbOffset Octeto más significativo del desplazamiento
 *                  (<i>offset</i>) hasta el punto de inicio de la lectura desde
 *        			el comienzo del fichero.
 * @param lsbOffset Octeto menos significativo del desplazamiento (<i>offset</i>)
 *                  hasta el punto de inicio de la lectura desde el comienzo del
 *                  fichero.
 * @param readLength Longitud de los datos a leer (en octetos).
 * @return APDU de respuesta.
 * @throws ApduConnectionException Si hay problemas en el env&iacute;o de la APDU.
 * @throws RequiredSecurityStateNotSatisfiedException Si la lectura requiere el cumplimiento
 *                        de una condici&oacute;n de seguridad y esta no se ha satisfecho.
 * @throws OffsetOutsideEfException Si el desplazamiento indicado o el tama&ntilde;o indicados
 *                                  para la lectura caen fuera de los l&iacute;mites del fichero.
 */
private ResponseApdu readBinary(final byte msbOffset, final byte lsbOffset, final byte readLength) throws ApduConnectionException, RequiredSecurityStateNotSatisfiedException, OffsetOutsideEfException {
    final CommandApdu apdu = new ReadBinaryApduCommand(getCla(), msbOffset, lsbOffset, readLength);
    final ResponseApdu res = getConnection().transmit(apdu);
    if (res.isOk()) {
        return res;
    }
    if (OFFSET_OUTSIDE_EF.equals(res.getStatusWord())) {
        throw new OffsetOutsideEfException(OFFSET_OUTSIDE_EF, apdu);
    }
    if (UNSATISFIED_SECURITY_STATE.equals(res.getStatusWord())) {
        throw new RequiredSecurityStateNotSatisfiedException(res.getStatusWord());
    }
    if (EOF_REACHED.equals(res.getStatusWord())) {
        // $NON-NLS-1$
        LOGGER.warning("Se ha alcanzado el final de fichero antes de poder leer los octetos indicados");
        return res;
    }
    // $NON-NLS-1$
    throw new ApduConnectionException("Respuesta invalida en la lectura de binario con el codigo: " + res.getStatusWord());
}
Also used : CommandApdu(es.gob.jmulticard.apdu.CommandApdu) ResponseApdu(es.gob.jmulticard.apdu.ResponseApdu) ReadBinaryApduCommand(es.gob.jmulticard.apdu.iso7816four.ReadBinaryApduCommand) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException)

Example 3 with ApduConnectionException

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

the class PaceConnection method transmit.

/**
 * {@inheritDoc}
 */
@Override
public ResponseApdu transmit(final CommandApdu command) throws ApduConnectionException {
    // Si es el comando para verificar el PIN se creara una instancia nueva de la clase
    // CommandApdu ya que la clase VerifyApduCommand no incluye la contrasena como parte
    // la APDU, sino en un attributo aparte
    final CommandApdu finalCommand = new CommandApdu(command.getCla(), command.getIns(), command.getP1(), command.getP2(), command.getData(), command.getLe());
    // Encriptacion de la APDU para su envio por el canal seguro
    CommandApdu protectedApdu = null;
    if (DEBUG) {
        // $NON-NLS-1$
        Logger.getLogger("es.gob.jmulticard").info(HexUtils.hexify(finalCommand.getBytes(), true));
    }
    try {
        protectedApdu = this.sm.wrap(finalCommand);
    } catch (final SecureMessagingException e) {
        // $NON-NLS-1$
        throw new ApduConnectionException("No ha sido posible cifrar un mensaje seguro con el canal PACE: " + e);
    }
    final ResponseApdu responseApdu = this.subConnection.transmit(protectedApdu);
    ResponseApdu decipherApdu = null;
    try {
        decipherApdu = this.sm.unwrap(responseApdu);
    } catch (final SecureMessagingException e1) {
        // $NON-NLS-1$
        throw new ApduConnectionException("No ha sido posible descifrar un mensaje seguro con el canal PACE: " + e1);
    }
    if (DEBUG) {
        // $NON-NLS-1$
        Logger.getLogger("es.gob.jmulticard").info(HexUtils.hexify(decipherApdu.getBytes(), true));
    }
    if (INVALID_CRYPTO_CHECKSUM.equals(decipherApdu.getStatusWord())) {
        throw new InvalidCryptographicChecksum();
    }
    // a enviar el comando indicando la longitud correcta
    if (decipherApdu.getStatusWord().getMsb() == MSB_INCORRECT_LE) {
        command.setLe(decipherApdu.getStatusWord().getLsb());
        return transmit(command);
    }
    return decipherApdu;
}
Also used : InvalidCryptographicChecksum(es.gob.jmulticard.apdu.connection.cwa14890.InvalidCryptographicChecksum) CommandApdu(es.gob.jmulticard.apdu.CommandApdu) SecureMessagingException(es.gob.jmulticard.de.tsenger.androsmex.iso7816.SecureMessagingException) ResponseApdu(es.gob.jmulticard.apdu.ResponseApdu) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException)

Example 4 with ApduConnectionException

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

the class Dnie method openSecureChannelIfNotAlreadyOpened.

/**
 * Establece y abre el canal seguro CWA-14890 si no lo estaba ya hecho.
 * @throws CryptoCardException Si hay problemas en el proceso.
 * @throws PinException Si el PIN usado para la apertura de canal no es v&aacute;lido o no se ha proporcionado
 * 						un PIN para validar.
 */
protected void openSecureChannelIfNotAlreadyOpened() throws CryptoCardException, PinException {
    // Abrimos el canal seguro si no lo esta ya
    if (!isSecurityChannelOpen()) {
        // Aunque el canal seguro estuviese cerrado, podria si estar enganchado
        if (!(getConnection() instanceof Cwa14890Connection)) {
            final ApduConnection secureConnection;
            secureConnection = new Cwa14890OneV1Connection(this, getConnection(), this.cryptoHelper, getCwa14890PublicConstants(), getCwa14890PrivateConstants());
            try {
                setConnection(secureConnection);
            } catch (final ApduConnectionException e) {
                // $NON-NLS-1$
                throw new CryptoCardException("Error en el establecimiento del canal seguro: " + e, e);
            }
        }
        try {
            verifyPin(getInternalPasswordCallback());
        } catch (final ApduConnectionException e) {
            // $NON-NLS-1$
            throw new CryptoCardException("Error en la apertura del canal seguro: " + e, e);
        }
    }
}
Also used : Cwa14890OneV1Connection(es.gob.jmulticard.apdu.connection.cwa14890.Cwa14890OneV1Connection) Cwa14890Connection(es.gob.jmulticard.apdu.connection.cwa14890.Cwa14890Connection) ApduConnection(es.gob.jmulticard.apdu.connection.ApduConnection) CryptoCardException(es.gob.jmulticard.card.CryptoCardException) ApduConnectionException(es.gob.jmulticard.apdu.connection.ApduConnectionException)

Example 5 with ApduConnectionException

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

the class Dnie method changePIN.

/**
 * Realiza la operaci&oacute;n de cambio de PIN. Necesita tener un canal administrativo abierto.
 * @param oldPin PIN actual.
 * @param newPin PIN nuevo.
 * @return APDU de respuesta de la operaci&oacute;n.
 * @throws CryptoCardException Cuando se produce un error en el cambio de PIN.
 * @throws PinException Si el PIN actual es incorrecto.
 * @throws AuthenticationModeLockedException Cuando el DNIe est&aacute; bloqueado.
 */
public byte[] changePIN(final String oldPin, final String newPin) throws CryptoCardException, PinException, AuthenticationModeLockedException {
    openSecureChannelIfNotAlreadyOpened();
    try {
        // Seleccion de directorio maestro
        selectMasterFile();
        // Seleccion de fichero de PIN por Id
        final byte[] pinFile = new byte[] { (byte) 0x00, (byte) 0x00 };
        selectFileById(pinFile);
        // Envio de APDU de cambio de PIN
        final CommandApdu apdu = new ChangePINApduCommand(oldPin.getBytes(), newPin.getBytes());
        final ResponseApdu res = getConnection().transmit(apdu);
        if (!res.isOk()) {
            throw new DnieCardException(// $NON-NLS-1$
            "Error en el establecimiento de las variables de entorno para el cambio de PIN", // $NON-NLS-1$
            res.getStatusWord());
        }
        return res.getData();
    } catch (final LostChannelException e) {
        // $NON-NLS-1$
        LOGGER.warning("Se ha perdido el canal seguro para cambiar el PIN, se procede a recuperarlo: " + e);
        try {
            getConnection().close();
            if (getConnection() instanceof Cwa14890Connection) {
                setConnection(((Cwa14890Connection) getConnection()).getSubConnection());
            }
            // se terminara provocando un desbordamiento de pila.
            return changePIN(oldPin, newPin);
        } catch (final Exception ex) {
            // $NON-NLS-1$
            throw new DnieCardException("No se pudo recuperar el canal seguro para firmar: " + ex, ex);
        }
    } catch (final ApduConnectionException e) {
        // $NON-NLS-1$
        throw new DnieCardException("Error en la transmision de comandos a la tarjeta: " + e, e);
    } catch (final Iso7816FourCardException e) {
        // $NON-NLS-1$
        throw new DnieCardException("No se pudo seleccionar el fichero de PIN de la tarjeta: " + e, e);
    }
}
Also used : LostChannelException(es.gob.jmulticard.apdu.connection.LostChannelException) Iso7816FourCardException(es.gob.jmulticard.card.iso7816four.Iso7816FourCardException) CommandApdu(es.gob.jmulticard.apdu.CommandApdu) Cwa14890Connection(es.gob.jmulticard.apdu.connection.cwa14890.Cwa14890Connection) ResponseApdu(es.gob.jmulticard.apdu.ResponseApdu) ChangePINApduCommand(es.gob.jmulticard.apdu.dnie.ChangePINApduCommand) 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)

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