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);
}
}
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();
}
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ún su ATR).
* @param conn Conexión con el lector de tarjetas.
* @param pwc <i>PasswordCallback</i> para la obtención del PIN.
* @param cryptoHelper Clase de apoyo para operaciones criptográficas.
* @param ch Gestor de <i>callbacks</i> para la obtenció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ón de un DNIe sin capacidades de firma o
* autenticación con certificados.
* @return Clase de DNIe apropiada (segú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á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");
}
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ó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");
}
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ó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");
}
Aggregations