use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.
the class Dnie method preloadCertificates.
/**
* Carga el certificado de la CA intermedia y las localizaciones de los
* certificados de firma y autenticación.
* @throws ApduConnectionException Si hay problemas en la precarga.
*/
protected void preloadCertificates() throws ApduConnectionException {
final Cdf cdf = new Cdf();
try {
selectMasterFile();
final byte[] cdfBytes = selectFileByLocationAndRead(CDF_LOCATION);
cdf.setDerValue(cdfBytes);
} catch (final Exception e) {
throw new ApduConnectionException(// $NON-NLS-1$
"No se ha podido cargar el CDF de la tarjeta: " + e.toString(), // $NON-NLS-1$
e);
}
for (int i = 0; i < cdf.getCertificateCount(); i++) {
final String currentAlias = cdf.getCertificateAlias(i);
if (CERT_ALIAS_AUTH.equals(currentAlias)) {
this.authCertPath = new Location(cdf.getCertificatePath(i));
} else if (CERT_ALIAS_SIGN.equals(currentAlias)) {
this.signCertPath = new Location(cdf.getCertificatePath(i));
} else if (CERT_ALIAS_CYPHER.equals(currentAlias)) {
this.cyphCertPath = new Location(cdf.getCertificatePath(i));
} else if (CERT_ALIAS_INTERMEDIATE_CA.equals(currentAlias)) {
try {
final byte[] intermediateCaCertEncoded = selectFileByLocationAndRead(new Location(cdf.getCertificatePath(i)));
this.intermediateCaCert = CompressionUtils.getCertificateFromCompressedOrNotData(intermediateCaCertEncoded);
} catch (final Exception e) {
LOGGER.warning(// $NON-NLS-1$
"No se ha podido cargar el certificado de la autoridad intermedia del CNP: " + e);
this.intermediateCaCert = null;
}
} else {
this.signAliasCertPath = new Location(cdf.getCertificatePath(i));
}
}
}
use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.
the class Dnie method getPinRetriesLeft.
private int getPinRetriesLeft() throws PinException {
final CommandApdu verifyCommandApdu = new RetriesLeftApduCommand();
final ResponseApdu verifyResponse;
try {
verifyResponse = getConnection().transmit(verifyCommandApdu);
} catch (final ApduConnectionException e) {
throw new PinException(// $NON-NLS-1$
"Error obteniendo el PIN del CallbackHandler: " + e);
}
return verifyResponse.getStatusWord().getLsb() - (byte) 0xC0;
}
use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.
the class Dnie method getInternalAuthenticateMessage.
/**
* {@inheritDoc}
*/
@Override
public byte[] getInternalAuthenticateMessage(final byte[] randomIfd, final byte[] chrCCvIfd) throws ApduConnectionException {
final CommandApdu apdu = new InternalAuthenticateApduCommand((byte) 0x00, randomIfd, chrCCvIfd);
final ResponseApdu res = getConnection().transmit(apdu);
if (res.isOk()) {
return res.getData();
}
throw new ApduConnectionException(// $NON-NLS-1$
"Respuesta invalida en la obtencion del mensaje de autenticacion interna con el codigo: " + res.getStatusWord());
}
use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.
the class Dnie3 method openSecureChannelIfNotAlreadyOpened.
/**
* Si no se había hecho anteriormente, establece y abre el canal seguro de PIN CWA-14890,
* solicita y comprueba el PIN e inmediatamente después y, si la verificación es correcta,
* establece el canal de USUARIO CWA-14890.
* Si falla algún punto del proceso, vuelve al modo inicial de conexión (sin canal seguro).
* @throws CryptoCardException Si hay problemas en el proceso.
* @throws PinException Si el PIN usado para la apertura de canal no es válido.
*/
@Override
protected void openSecureChannelIfNotAlreadyOpened() throws CryptoCardException, PinException {
// Si el canal seguro esta ya abierto salimos sin hacer nada
if (isSecurityChannelOpen()) {
return;
}
// establecido pero cerrado
try {
setConnection(this.rawConnection);
} catch (final ApduConnectionException e) {
throw new CryptoCardException(// $NON-NLS-1$
"Error en el establecimiento del canal inicial previo al seguro de PIN: " + e, // $NON-NLS-1$
e);
}
// Establecemos el canal PIN y lo verificamos
final ApduConnection pinSecureConnection = new Cwa14890OneV2Connection(this, getConnection(), getCryptoHelper(), new Dnie3PinCwa14890Constants(), new Dnie3PinCwa14890Constants());
try {
selectMasterFile();
} catch (final Exception e) {
throw new CryptoCardException(// $NON-NLS-1$
"Error seleccionado el MF tras el establecimiento del canal seguro de PIN: " + e, // $NON-NLS-1$
e);
}
try {
setConnection(pinSecureConnection);
} catch (final ApduConnectionException e) {
throw new CryptoCardException(// $NON-NLS-1$
"Error en el establecimiento del canal seguro de PIN: " + e, // $NON-NLS-1$
e);
}
// $NON-NLS-1$
LOGGER.info("Canal seguro de PIN para DNIe establecido");
try {
verifyPin(getInternalPasswordCallback());
} catch (final ApduConnectionException e) {
throw new CryptoCardException(// $NON-NLS-1$
"Error en la verificacion de PIN: " + e, // $NON-NLS-1$
e);
}
// Y establecemos ahora el canal de usuario
final ApduConnection usrSecureConnection = new Cwa14890OneV2Connection(this, getConnection(), getCryptoHelper(), new Dnie3UsrCwa14890Constants(), new Dnie3UsrCwa14890Constants());
try {
selectMasterFile();
} catch (final Exception e) {
throw new CryptoCardException(// $NON-NLS-1$
"Error seleccionado el MF tras el establecimiento del canal seguro de usuario: " + e, // $NON-NLS-1$
e);
}
try {
setConnection(usrSecureConnection);
} catch (final ApduConnectionException e) {
throw new CryptoCardException(// $NON-NLS-1$
"Error en el establecimiento del canal seguro de usuario: " + e, // $NON-NLS-1$
e);
}
// $NON-NLS-1$
LOGGER.info("Canal seguro de Usuario para DNIe establecido");
}
use of es.gob.jmulticard.apdu.connection.ApduConnectionException 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