use of es.gob.jmulticard.card.pace.InvalidCanException 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);
}
Aggregations