use of es.gob.jmulticard.apdu.connection.ApduConnectionException 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.ApduConnectionException in project jmulticard by ctt-gob-es.
the class Ceres 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, // $NON-NLS-1$
e);
}
return verifyResponse.getStatusWord().getLsb() - (byte) 0xC0;
}
use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.
the class Ceres method preload.
private void preload() throws ApduConnectionException, Iso7816FourCardException, IOException, CertificateException, Asn1Exception, TlvException {
// Nos vamos al raiz antes de nada
selectMasterFile();
// Leemos el CDF
final byte[] cdfBytes = selectFileByLocationAndRead(CDF_LOCATION);
// Cargamos el CDF
Pkcs15Cdf cdf = new CeresCdf();
try {
cdf.setDerValue(cdfBytes);
} catch (final Exception e) {
// Si ha fallado la inicializacion del CDF tipo CERES probamos con el CDF generico PKCS#15,
// presente en las nuevas tarjetas FNMT-CERES
cdf = new Cdf();
cdf.setDerValue(cdfBytes);
}
// Leemos los certificados segun las rutas del CDF
this.certs = new LinkedHashMap<>(cdf.getCertificateCount());
this.aliasByCertAndKeyId = new LinkedHashMap<>(cdf.getCertificateCount());
for (int i = 0; i < cdf.getCertificateCount(); i++) {
final Location l = new Location(// $NON-NLS-1$ //$NON-NLS-2$
cdf.getCertificatePath(i).replace("\\", "").trim());
X509Certificate cert;
try {
cert = CompressionUtils.getCertificateFromCompressedOrNotData(selectFileByLocationAndRead(l));
} catch (final IOException e) {
// $NON-NLS-1$
LOGGER.warning("No se ha encontrado un certificado referenciado, se pasa al siguiente: " + e);
continue;
}
// $NON-NLS-1$
final String alias = i + " " + cert.getSerialNumber();
this.aliasByCertAndKeyId.put(HexUtils.hexify(cdf.getCertificateId(i), false), alias);
this.certs.put(alias, cert);
}
// Leemos el PrKDF
final byte[] prkdfValue = selectFileByLocationAndRead(PRKDF_LOCATION);
// Establecemos el valor del PrKDF
Pkcs15PrKdf prkdf = new CeresPrKdf();
try {
prkdf.setDerValue(prkdfValue);
} catch (final Exception e) {
// Si no carga el estructura PrKDF especifica de CERES probamos con la
// generica PKCS#15, presente en las ultimas versiones de la tarjeta
prkdf = new PrKdf();
prkdf.setDerValue(prkdfValue);
}
this.keys = new LinkedHashMap<>();
for (int i = 0; i < prkdf.getKeyCount(); i++) {
final String alias = this.aliasByCertAndKeyId.get(HexUtils.hexify(prkdf.getKeyId(i), false));
if (alias != null) {
this.keys.put(alias, Byte.valueOf(prkdf.getKeyReference(i)));
}
}
// Sincronizamos claves y certificados
hideCertsWithoutKey();
}
use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.
the class StCard method verifyPin.
@Override
public void verifyPin(final PasswordCallback pinPc) throws ApduConnectionException, PinException {
if (pinPc == null) {
// $NON-NLS-1$
throw new BadPinException("No se ha establecido un PasswordCallback");
}
final CommandApdu chv = new VerifyApduCommand(CLA, pinPc);
final ResponseApdu verifyResponse = sendArbitraryApdu(chv);
if (!verifyResponse.isOk()) {
if (verifyResponse.getStatusWord().getMsb() == ERROR_PIN_SW1) {
throw new BadPinException(verifyResponse.getStatusWord().getLsb() - (byte) 0xC0);
}
throw new ApduConnectionException(// $NON-NLS-1$
"Error en el envio de la verificacion de PIN con respuesta: " + verifyResponse.getStatusWord());
}
}
use of es.gob.jmulticard.apdu.connection.ApduConnectionException in project jmulticard by ctt-gob-es.
the class CeresSc method signOperation.
@Override
protected byte[] signOperation(final byte[] data, final String algorithm, final PrivateKeyReference privateKeyReference) throws CryptoCardException, PinException {
openSecureChannelIfNotAlreadyOpened();
ResponseApdu res;
try {
CommandApdu apdu = new MseSetComputationApduCommand((byte) 0x00, ((DniePrivateKeyReference) privateKeyReference).getKeyPath().getLastFilePath(), null);
res = getConnection().transmit(apdu);
if (!res.isOk()) {
throw new DnieCardException(// $NON-NLS-1$
"Error en el establecimiento de las clave de firma con respuesta: " + res.getStatusWord(), // $NON-NLS-1$
res.getStatusWord());
}
final byte[] digestInfo;
try {
digestInfo = DigestInfo.encode(algorithm, data, this.cryptoHelper);
} catch (final IOException e) {
// $NON-NLS-1$
throw new DnieCardException("Error en el calculo del hash para firmar: " + e, e);
}
apdu = new PsoSignHashApduCommand((byte) 0x00, digestInfo);
res = getConnection().transmit(apdu);
if (!res.isOk()) {
throw new DnieCardException(// $NON-NLS-1$
"Error durante la operacion de firma con respuesta: " + res.getStatusWord(), // $NON-NLS-1$
res.getStatusWord());
}
} catch (final LostChannelException e) {
try {
getConnection().close();
if (getConnection() instanceof Cwa14890Connection) {
setConnection(((Cwa14890Connection) getConnection()).getSubConnection());
}
} catch (final Exception ex) {
// $NON-NLS-1$
throw new DnieCardException("No se pudo recuperar el canal seguro para firmar: " + ex, ex);
}
return signOperation(data, algorithm, privateKeyReference);
} catch (final ApduConnectionException e) {
// $NON-NLS-1$
throw new DnieCardException("Error en la transmision de comandos a la tarjeta: " + e, e);
}
return res.getData();
}
Aggregations