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);
}
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ó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");
}
Aggregations