use of es.gob.jmulticard.card.Atr 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.card.Atr in project jmulticard by ctt-gob-es.
the class Ceres method checkAtr.
private static void checkAtr(final byte[] atrBytes) throws InvalidCardException {
Atr tmpAtr = new Atr(atrBytes, ATR_MASK_TC);
if (ATR_TC.equals(tmpAtr)) {
if (atrBytes[15] >= (byte) 0x04 && atrBytes[16] >= (byte) 0x30) {
throw new InvalidCardException(// $NON-NLS-1$
"Encontrada CERES en version " + HexUtils.hexify(new byte[] { atrBytes[15] }, false) + "." + // $NON-NLS-1$
HexUtils.hexify(new byte[] { atrBytes[16] }, false) + // $NON-NLS-1$
", pero las versiones iguales o superiores a la 04.30 no estan soportadas por este controlador");
}
return;
}
tmpAtr = new Atr(atrBytes, ATR_MASK_ST);
if (ATR_ST.equals(tmpAtr)) {
return;
}
tmpAtr = new Atr(atrBytes, ATR_MASK_SLE_FN19);
if (ATR_SLE_FN19.equals(tmpAtr)) {
return;
}
tmpAtr = new Atr(atrBytes, ATR_MASK_SLE_FN20);
if (ATR_SLE_FN20.equals(tmpAtr)) {
return;
}
// $NON-NLS-1$
throw new InvalidCardException("CERES", ATR_TC, atrBytes);
}
use of es.gob.jmulticard.card.Atr 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.card.Atr 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