use of es.gob.jmulticard.apdu.connection.ApduConnection in project jmulticard by ctt-gob-es.
the class CeresSc method openSecureChannelIfNotAlreadyOpened.
/**
* Establece y abre el canal seguro CWA-14890 si no lo estaba ya hecho.
* @throws CryptoCardException Si hay problemas en el proceso.
* @throws PinException Si el PIN usado para la apertura de canal no es válido o no se ha proporcionado
* un PIN para validar.
*/
@Override
protected void openSecureChannelIfNotAlreadyOpened() throws CryptoCardException, PinException {
// Abrimos el canal seguro si no lo esta ya
if (!isSecurityChannelOpen()) {
// Aunque el canal seguro estuviese cerrado, podria si estar enganchado
if (!(getConnection() instanceof Cwa14890Connection)) {
final ApduConnection secureConnection;
secureConnection = new Cwa14890OneV2Connection(this, getConnection(), this.cryptoHelper, getCwa14890PublicConstants(), getCwa14890PrivateConstants());
try {
setConnection(secureConnection);
} catch (final ApduConnectionException e) {
// $NON-NLS-1$
throw new CryptoCardException("Error en el establecimiento del canal seguro: " + e, e);
}
}
try {
verifyPin(getInternalPasswordCallback());
} catch (final ApduConnectionException e) {
// $NON-NLS-1$
throw new CryptoCardException("Error en la apertura del canal seguro: " + e, e);
}
}
}
use of es.gob.jmulticard.apdu.connection.ApduConnection in project jmulticard by ctt-gob-es.
the class TestPaceDnie method main.
/**
* Main.
* @param args No se usa.
* @throws Exception En cualquier error.
*/
public static void main(final String[] args) throws Exception {
final ApduConnection conn = new SmartcardIoConnection();
// $NON-NLS-1$
final CachePasswordCallback cpc = new CachePasswordCallback("password".toCharArray());
final Dnie dni = DnieFactory.getDnie(conn, cpc, new JseCryptoHelper(), null);
// $NON-NLS-1$
System.out.println("Canal PACE abierto");
// $NON-NLS-1$ //$NON-NLS-2$
dni.changePIN("password", "1234512345");
// $NON-NLS-1$
System.out.println("Se ha realizado el cambio de PIN correctamente");
}
use of es.gob.jmulticard.apdu.connection.ApduConnection in project jmulticard by ctt-gob-es.
the class Cwa14890OneV1Connection method open.
/**
* Abre el canal seguro con la tarjeta. La conexión se reiniciará previamente
* a la apertura del canal.
*/
@Override
public void open() throws ApduConnectionException {
final ApduConnection conn = this.subConnection;
conn.open();
// Obtenemos el numero de serie de la tarjeta.
// IMPORTANTE: Esta operacion debe realizarse antes del inicio del proceso de autenticacion
final byte[] serial = getPaddedSerial();
try {
this.card.verifyCaIntermediateIcc();
this.card.verifyIcc();
} catch (final SecurityException e) {
conn.close();
throw new IllegalStateException(// $NON-NLS-1$
"Condicion de seguridad no satisfecha en la validacion de los certificados CWA-14890: " + e);
} catch (final CertificateException e) {
conn.close();
throw new IllegalStateException(// $NON-NLS-1$
"No se han podido tratar los certificados CWA-14890: " + e);
} catch (final IOException e) {
conn.close();
throw new IllegalStateException(// $NON-NLS-1$
"No se han podido validar los certificados CWA-14890: " + e);
}
// Clave publica del certificado de componente de la tarjeta. Necesario para autenticacion interna
// y externa
final RSAPublicKey iccPublicKey;
try {
iccPublicKey = (RSAPublicKey) this.cryptoHelper.generateCertificate(this.card.getIccCertEncoded()).getPublicKey();
} catch (final CertificateException e) {
conn.close();
throw new ApduConnectionException(// $NON-NLS-1$
"No se pudo obtener la clave publica del certificado de componente: " + e, // $NON-NLS-1$
e);
} catch (final IOException e) {
conn.close();
throw new ApduConnectionException(// $NON-NLS-1$
"No se pudo leer certificado de componente: " + e, // $NON-NLS-1$
e);
}
// ---------------
try {
this.card.verifyIfdCertificateChain(this.pubConsts);
} catch (final Exception e) {
conn.close();
throw new ApduConnectionException(// $NON-NLS-1$
"Error al verificar la cadena de certificados del controlador: " + e, // $NON-NLS-1$
e);
}
// --- STAGE 3 ---
// Autenticacion interna (El driver comprueba la tarjeta)
// ---------------
final byte[] randomIfd;
try {
randomIfd = this.cryptoHelper.generateRandomBytes(8);
} catch (final IOException e1) {
conn.close();
throw new SecureChannelException(// $NON-NLS-1$
"No se pudo generar el array de aleatorios: " + e1, // $NON-NLS-1$
e1);
}
final byte[] kicc;
try {
kicc = this.internalAuthentication(randomIfd, iccPublicKey);
} catch (final Exception e) {
conn.close();
throw new ApduConnectionException(// $NON-NLS-1$
"Error durante el proceso de autenticacion interna de la tarjeta: " + e, // $NON-NLS-1$
e);
}
// --- STAGE 4 ---
// Autenticacion externa (La tarjeta comprueba el driver)
// ---------------
final byte[] randomIcc = this.card.getChallenge();
final byte[] kifd;
try {
kifd = this.externalAuthentication(serial, randomIcc, iccPublicKey);
} catch (final Exception e) {
conn.close();
throw new ApduConnectionException(// $NON-NLS-1$
"Error durante el proceso de autenticacion externa de la tarjeta", // $NON-NLS-1$
e);
}
// --- STAGE 5 ---
// Esta fase no pertenece al procedimiento de apertura del canal seguro (ya esta
// establecido), sino a la obtencion de las claves necesarias para su control. Estas
// son:
// - Kenc: Clave TripleDES (TDES o DESEDE) para encriptar y desencriptar criptogramas.
// - Kmac: Clave TripleDES (TDES o DESEDE) para calcular y verificar checksums.
// - SSC: Contador de secuencia.
// ---------------
// Calculamos Kifdicc como el XOR de los valores Kifd y Kicc
final byte[] kidficc = HexUtils.xor(kicc, kifd);
try {
this.kenc = generateKenc(kidficc);
} catch (final IOException e) {
conn.close();
throw new ApduConnectionException(// $NON-NLS-1$
"Error al generar la clave Kenc para el tratamiento del canal seguro", // $NON-NLS-1$
e);
}
try {
this.kmac = generateKmac(kidficc);
} catch (final IOException e) {
conn.close();
throw new ApduConnectionException(// $NON-NLS-1$
"Error al generar la clave Kmac para el tratamiento del canal seguro", // $NON-NLS-1$
e);
}
this.ssc = generateSsc(randomIfd, randomIcc);
this.openState = true;
}
use of es.gob.jmulticard.apdu.connection.ApduConnection in project jmulticard by ctt-gob-es.
the class TestStBit4IdCamerfirma method main.
/**
* Prueba general de la tarjeta.
* @param args No se usa.
* @throws Exception En cualquier error.
*/
public static void main(final String[] args) throws Exception {
final ApduConnection conn = new SmartcardIoConnection();
final StCard card = new StCard(conn);
card.verifyPin(new CachePasswordCallback(PIN.toCharArray()));
}
use of es.gob.jmulticard.apdu.connection.ApduConnection in project jmulticard by ctt-gob-es.
the class Ceres430KeyStoreImpl method engineLoad.
/**
* {@inheritDoc}
*/
@Override
public void engineLoad(final InputStream stream, final char[] password) throws IOException {
// Ponemos la conexion por defecto
final ApduConnection conn;
try {
conn = Ceres430Provider.getDefaultApduConnection() == null ? // $NON-NLS-1$
(ApduConnection) Class.forName("es.gob.jmulticard.jse.smartcardio.SmartcardIoConnection").getConstructor().newInstance() : Ceres430Provider.getDefaultApduConnection();
} catch (final Exception e) {
// $NON-NLS-1$
throw new IllegalStateException("No hay una conexion de APDU por defecto: " + e);
}
// Aqui se realiza el acceso e inicializacion del DNIe
this.cryptoCard = new CeresSc(conn, password != null ? new CachePasswordCallback(password) : null, new JseCryptoHelper(), null);
this.aliases = Arrays.asList(this.cryptoCard.getAliases());
}
Aggregations