Class Cwa14890OneV1Connection
- java.lang.Object
-
- es.gob.jmulticard.connection.cwa14890.Cwa14890OneV1Connection
-
- All Implemented Interfaces:
ApduConnection,Cwa14890Connection
- Direct Known Subclasses:
Cwa14890OneV2Connection
public class Cwa14890OneV1Connection extends java.lang.Object implements Cwa14890Connection
Utilidad para el establecimiento y control del canal seguro CWA-14890 con cifrado DES y MAC de cuatro octetos.
-
-
Field Summary
Fields Modifier and Type Field Description protected AbstractApduEncrypterapduEncrypterClase de utilidad para encriptar las APDU.private Cwa14890CardcardTarjeta CWA-14890 con la que se desea establecer el canal seguro.protected CryptoHelpercryptoHelperUtilidad para la ejecución de funciones criptográficas.private static StatusWordINVALID_CRYPTO_CHECKSUMprivate static byteISO_9796_2_PADDING_ENDprivate static byteISO_9796_2_PADDING_STARTprivate byte[]kencClave Triple DES (TDES o DESEDE) para encriptar y desencriptar criptogramas.private static intKICC_LENGTHprivate static intKIFD_LENGTHprivate byte[]kmacClave Triple DES (TDES o DESEDE) para calcular y verificar checksums.private static byteMSB_INCORRECT_LEOcteto de valor más significativo que indica unLeincorrecto en la petición.private static byteMSB_INCORRECT_LE_PACEOcteto de valor más significativo que indica unLeincorrecto en la petición.protected booleanopenStateIndica el estado de la conexión.private Cwa14890PrivateConstantsprivConstsprivate Cwa14890PublicConstantspubConstsprivate static byte[]SECURE_CHANNEL_KENC_AUXCódigo auxiliar para el cálculo de la claveKencdel canal seguro.private static byte[]SECURE_CHANNEL_KMAC_AUXCódigo auxiliar para el cálculo de la claveKmacdel canal seguro.private byte[]sscContador de secuencia.protected ApduConnectionsubConnectionConexión subyacente para el envío de APDUs.
-
Constructor Summary
Constructors Constructor Description Cwa14890OneV1Connection(Cwa14890Card connectedCard, ApduConnection connection, CryptoHelper cryptoHlpr, Cwa14890PublicConstants cwaConsts, Cwa14890PrivateConstants cwaPrivConsts)Crea el canal seguro CWA-14890 para la comunicación de la tarjeta.Cwa14890OneV1Connection(ApduConnection connection, CryptoHelper cryptoHlpr)Crea el canal seguro CWA-14890 para la comunicación de la tarjeta.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description voidaddCardConnectionListener(CardConnectionListener ccl)Añade un objeto al que se notificará cuando existan eventos en la conexión.voidclose()Cierra la conexión con la tarjeta inteligente actualmente insertada en el lector.private byte[]externalAuthentication(byte[] serial, byte[] randomIcc, java.security.interfaces.RSAPublicKey iccPublicKey)Lleva a cabo el proceso de autenticación externa mediante el cual la tarjeta comprueba el controlador.private byte[]generateKenc(byte[] kidficc)Genera la claveKENCpara encriptar y desencriptar criptogramas.private byte[]generateKmac(byte[] kidficc)Genera la claveKMACpara calcular y verificar checksums.private static byte[]generateSsc(byte[] randomIfd, byte[] randomIcc)Genera el contador de secuencia SSC a partir de los semillas aleatorias calculadas en los procesos de autenticación interna y externa.byte[]getKenc()Obtiene la clave para encriptar y desencriptar criptogramas.byte[]getKmac()Obtiene la clave para calcular y verificar checksums.private byte[]getPaddedSerial()Obtiene el número de serie de la tarjeta en un array de 8 octetos, completando con ceros a la izquierda si es necesario.byte[]getSsc()Obtiene el contador de secuencia.ApduConnectiongetSubConnection()Recupera la conexión subyacente utilizada por la conexión.java.lang.StringgetTerminalInfo(int terminal)Devuelve información sobre un terminal.long[]getTerminals(boolean onlyWithCardPresent)Devuelve todos los lectores de tarjetas presentes en el sistema.private static byte[]increment(byte[] data)Calcula y devuelve el valor entregado más 1.protected AbstractApduEncrypterinstantiateApduEncrypter()Obtiene la clase de utilidad para encriptar las APDU.private byte[]internalAuthentication(byte[] randomIfd, java.security.interfaces.RSAPublicKey iccPublicKey)Lleva a cabo el proceso de autenticación interna de la tarjeta mediante el cual el controlador comprueba la tarjeta.static byte[]internalAuthGetInternalAuthenticateMessage(Cwa14890Card card, Cwa14890PublicConstants pubConsts, byte[] randomIfd)Solicita a la tarjeta un mensaje firmado de autenticación interna.static byte[]internalAuthValidateInternalAuthenticateMessage(byte[] chrCCvIfd, byte[] sigMinCiphered, byte[] randomIfd, java.security.interfaces.RSAPrivateKey ifdPrivateKey, int ifdKeyLength, Cwa14890PrivateConstants privConsts, Cwa14890PublicConstants pubConsts, java.security.interfaces.RSAPublicKey iccPublicKey, CryptoHelper cryptoHelper)Valida un mensaje de autenticación interna generado por una tarjeta.booleanisOpen()Indica si la conexión está abierta o no.voidopen()Abre el canal seguro con la tarjeta.voidremoveCardConnectionListener(CardConnectionListener ccl)Indica que ya no se desea notificar a un objeto cuando existan eventos en la conexión.byte[]reset()Reinicializa la conexión con la tarjeta inteligente.voidsetProtocol(ApduConnectionProtocol p)Establece el Protocolo de conexión con la tarjeta.voidsetTerminal(int t)Establece el lector de tarjetas que se usará para la conexión.java.lang.StringtoString()ResponseApdutransmit(CommandApdu command)Envía un comando APDU a la tarjeta inteligente.
-
-
-
Field Detail
-
KICC_LENGTH
private static final int KICC_LENGTH
- See Also:
- Constant Field Values
-
KIFD_LENGTH
private static final int KIFD_LENGTH
- See Also:
- Constant Field Values
-
ISO_9796_2_PADDING_START
private static final byte ISO_9796_2_PADDING_START
- See Also:
- Constant Field Values
-
ISO_9796_2_PADDING_END
private static final byte ISO_9796_2_PADDING_END
- See Also:
- Constant Field Values
-
INVALID_CRYPTO_CHECKSUM
private static final StatusWord INVALID_CRYPTO_CHECKSUM
-
MSB_INCORRECT_LE
private static final byte MSB_INCORRECT_LE
Octeto de valor más significativo que indica unLeincorrecto en la petición.- See Also:
- Constant Field Values
-
MSB_INCORRECT_LE_PACE
private static final byte MSB_INCORRECT_LE_PACE
Octeto de valor más significativo que indica unLeincorrecto en la petición.- See Also:
- Constant Field Values
-
SECURE_CHANNEL_KENC_AUX
private static final byte[] SECURE_CHANNEL_KENC_AUX
Código auxiliar para el cálculo de la claveKencdel canal seguro.
-
SECURE_CHANNEL_KMAC_AUX
private static final byte[] SECURE_CHANNEL_KMAC_AUX
Código auxiliar para el cálculo de la claveKmacdel canal seguro.
-
cryptoHelper
protected final transient CryptoHelper cryptoHelper
Utilidad para la ejecución de funciones criptográficas.
-
card
private transient Cwa14890Card card
Tarjeta CWA-14890 con la que se desea establecer el canal seguro.
-
subConnection
protected transient ApduConnection subConnection
Conexión subyacente para el envío de APDUs.
-
kenc
private transient byte[] kenc
Clave Triple DES (TDES o DESEDE) para encriptar y desencriptar criptogramas.
-
kmac
private transient byte[] kmac
Clave Triple DES (TDES o DESEDE) para calcular y verificar checksums.
-
ssc
private transient byte[] ssc
Contador de secuencia.
-
openState
protected transient boolean openState
Indica el estado de la conexión.
-
apduEncrypter
protected final transient AbstractApduEncrypter apduEncrypter
Clase de utilidad para encriptar las APDU.
-
pubConsts
private transient Cwa14890PublicConstants pubConsts
-
privConsts
private transient Cwa14890PrivateConstants privConsts
-
-
Constructor Detail
-
Cwa14890OneV1Connection
public Cwa14890OneV1Connection(ApduConnection connection, CryptoHelper cryptoHlpr)
Crea el canal seguro CWA-14890 para la comunicación de la tarjeta. Es necesario abrir el canal asociándolo a una conexión para poder trasmitir APDUs. Si no se indica una conexión se utilizaráa la conexión implícita de la tarjeta indicada.- Parameters:
connection- Conexión sobre la cual montar el canal seguro.cryptoHlpr- Motor de operaciones criptográficas.
-
Cwa14890OneV1Connection
public Cwa14890OneV1Connection(Cwa14890Card connectedCard, ApduConnection connection, CryptoHelper cryptoHlpr, Cwa14890PublicConstants cwaConsts, Cwa14890PrivateConstants cwaPrivConsts)
Crea el canal seguro CWA-14890 para la comunicación de la tarjeta. Es necesario abrir el canal asociándolo a una conexión para poder trasmitir APDUs. Si no se indica una conexión se utilizaráa la conexión implícita de la tarjeta indicada.- Parameters:
connectedCard- Tarjeta con la funcionalidad CWA-14890.connection- Conexión sobre la cual montar el canal seguro.cryptoHlpr- Motor de operaciones criptográficas.cwaConsts- Clase de claves públicas CWA-14890.cwaPrivConsts- Clase de claves privadas CWA-14890.
-
-
Method Detail
-
instantiateApduEncrypter
protected AbstractApduEncrypter instantiateApduEncrypter()
Obtiene la clase de utilidad para encriptar las APDU.- Returns:
- Clase de utilidad para encriptar las APDU.
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object
-
open
public void open() throws ApduConnectionExceptionAbre el canal seguro con la tarjeta. La conexión se reiniciará previamente a la apertura del canal.- Specified by:
openin interfaceApduConnection- Throws:
ApduConnectionException- Cuando ocurre cualquier problema abriendo la conexión.- See Also:
ApduConnection.close()
-
generateKenc
private byte[] generateKenc(byte[] kidficc) throws java.io.IOExceptionGenera la claveKENCpara encriptar y desencriptar criptogramas. La clave de cifrado Kenc se obtiene como los 16 primeros octetos de la huella SHA-1 de la concatenación de kifdicc con el valor "00 00 00 01" (SECURE_CHANNEL_KENC_AUX).- Parameters:
kidficc- XOR de los valoresKifdyKicc.- Returns:
- Clave Triple-DES.
- Throws:
java.io.IOException- Cuando no puede generarse la clave.
-
generateKmac
private byte[] generateKmac(byte[] kidficc) throws java.io.IOExceptionGenera la claveKMACpara calcular y verificar checksums. La clave para el cálculo del MAC Kmac se obtiene como los 16 primeros octetos de la huella SHA-1 de la concatenación de kifdicc con el valor "00 00 00 02" (SECURE_CHANNEL_KMAC_AUX).- Parameters:
kidficc- XOR de los valoresKifdyKicc.- Returns:
- Clave Triple-DES.
- Throws:
java.io.IOException- Cuando no puede generarse la clave.
-
generateSsc
private static byte[] generateSsc(byte[] randomIfd, byte[] randomIcc)Genera el contador de secuencia SSC a partir de los semillas aleatorias calculadas en los procesos de autenticación interna y externa. El contador de secuencia SSC se obtiene concatenando los 4 octetos menos significativos del desafío de la tarjeta (RND.ICC) con los 4 menos significativos del desafío del terminal (RND.IFD)- Parameters:
randomIfd- Aleatorio del desafío del terminal.randomIcc- Aleatorio del desafío de la tarjeta.- Returns:
- Contador de secuencia.
-
internalAuthGetInternalAuthenticateMessage
public static byte[] internalAuthGetInternalAuthenticateMessage(Cwa14890Card card, Cwa14890PublicConstants pubConsts, byte[] randomIfd) throws ApduConnectionException
Solicita a la tarjeta un mensaje firmado de autenticación interna.- Parameters:
card- Tarjeta que se desea autenticar.pubConsts- Constantes públicas para la apertura de canal CWA-14890.randomIfd- Aleatorio del desafío del terminal.- Returns:
- Mensaje de autenticación interna firmado por la tarjeta con su clave privada de componente.
- Throws:
ApduConnectionException- Si hay cualquier error durante el proceso.
-
internalAuthValidateInternalAuthenticateMessage
public static byte[] internalAuthValidateInternalAuthenticateMessage(byte[] chrCCvIfd, byte[] sigMinCiphered, byte[] randomIfd, java.security.interfaces.RSAPrivateKey ifdPrivateKey, int ifdKeyLength, Cwa14890PrivateConstants privConsts, Cwa14890PublicConstants pubConsts, java.security.interfaces.RSAPublicKey iccPublicKey, CryptoHelper cryptoHelper) throws java.io.IOExceptionValida un mensaje de autenticación interna generado por una tarjeta.- Parameters:
chrCCvIfd- CHR de la clave pública del certificado de terminal.sigMinCiphered- Mensaje de autenticación generado por la tarjeta.randomIfd- Aleatorio del desafío del terminal.ifdPrivateKey- Clave privada del certificado de terminal.ifdKeyLength- Longitud, en octetos, de las claves RSA del certificado de componente del terminal.privConsts- Constantes privadas para la apertura de canal CWA-14890.pubConsts- Constantes públicas para la apertura de canal CWA-14890.iccPublicKey- Clave pública del certificado de componente.cryptoHelper- Utilidad para la ejecución de funciones criptográficas.- Returns:
- Kicc para el cifrado de APDUs con esta tarjeta.
- Throws:
java.io.IOException- Si el mensaje no es válido o no se ha podido validar.
-
internalAuthentication
private byte[] internalAuthentication(byte[] randomIfd, java.security.interfaces.RSAPublicKey iccPublicKey) throws SecureChannelException, ApduConnectionException, java.io.IOExceptionLleva a cabo el proceso de autenticación interna de la tarjeta mediante el cual el controlador comprueba la tarjeta.- Parameters:
randomIfd- Array de 8 bytes aleatorios (generados por el controlador, de forma externa a la tarjeta).iccPublicKey- Clave pública del certificado de componente.- Returns:
- Semilla de 32 [KICC_LENGTH] bits, generada por la tarjeta, para la derivación de claves del canal seguro.
- Throws:
SecureChannelException- Cuando ocurre un error en el establecimiento de claves.ApduConnectionException- Cuando ocurre un error en la comunicación con la tarjeta.java.io.IOException- Cuando ocurre un error en el cifrado/descifrado de los mensajes.
-
externalAuthentication
private byte[] externalAuthentication(byte[] serial, byte[] randomIcc, java.security.interfaces.RSAPublicKey iccPublicKey) throws java.io.IOExceptionLleva a cabo el proceso de autenticación externa mediante el cual la tarjeta comprueba el controlador. La implementación usa siempre SHA-1 para las huellas.- Parameters:
serial- Número de serie de la tarjeta.randomIcc- Array de 8 octetos aleatorios generados por la tarjeta.iccPublicKey- Clava pública del certificado de componente.- Returns:
- Semilla de 32 [KIFD_LENGTH] bytes, generada por el Terminal, para la derivación de claves del canal seguro.
- Throws:
SecureChannelException- Cuando ocurre un error en el establecimiento de claves.ApduConnectionException- Cuando ocurre un error en la comunicación con la tarjeta.java.io.IOException- Cuando ocurre un error en el cifrado o en el descifrado de los mensajes.
-
getPaddedSerial
private byte[] getPaddedSerial() throws ApduConnectionExceptionObtiene el número de serie de la tarjeta en un array de 8 octetos, completando con ceros a la izquierda si es necesario.- Returns:
- Número de serie en formato de 8 bytes.
- Throws:
ApduConnectionException- Cuando ocurre un error en la comunicación con la tarjeta.
-
close
public void close() throws ApduConnectionExceptionDescription copied from interface:ApduConnectionCierra la conexión con la tarjeta inteligente actualmente insertada en el lector.- Specified by:
closein interfaceApduConnection- Throws:
ApduConnectionException- Cuando ocurre cualquier problema cerrando la conexión.- See Also:
ApduConnection.open()
-
transmit
public ResponseApdu transmit(CommandApdu command) throws ApduConnectionException
Description copied from interface:ApduConnectionEnvía un comando APDU a la tarjeta inteligente.- Specified by:
transmitin interfaceApduConnection- Parameters:
command- APDU que se desea enviar a la tarjeta.- Returns:
- APDU de respuesta de la tarjeta al envío.
- Throws:
ApduConnectionException- Cuando ocurre cualquier problema con la conexión transmitiendo la APDU.
-
reset
public byte[] reset() throws ApduConnectionExceptionDescription copied from interface:ApduConnectionReinicializa la conexión con la tarjeta inteligente.- Specified by:
resetin interfaceApduConnection- Returns:
- Respuesta al reset (ATR) de la tarjeta.
- Throws:
ApduConnectionException- Cuando ocurre cualquier problema reinicializando la conexión.
-
addCardConnectionListener
public void addCardConnectionListener(CardConnectionListener ccl)
Description copied from interface:ApduConnectionAñade un objeto al que se notificará cuando existan eventos en la conexión. Solo se notificarán las inserciones y las extracciones cuando la implementación subyacente lo soporte.- Specified by:
addCardConnectionListenerin interfaceApduConnection- Parameters:
ccl- Objeto al que se desea notificar los eventos de la conexión.
-
removeCardConnectionListener
public void removeCardConnectionListener(CardConnectionListener ccl)
Description copied from interface:ApduConnectionIndica que ya no se desea notificar a un objeto cuando existan eventos en la conexión.- Specified by:
removeCardConnectionListenerin interfaceApduConnection- Parameters:
ccl- Objeto al que ya no se desea notificar los eventos de la conexión.
-
getTerminals
public long[] getTerminals(boolean onlyWithCardPresent) throws ApduConnectionExceptionDescription copied from interface:ApduConnectionDevuelve todos los lectores de tarjetas presentes en el sistema.- Specified by:
getTerminalsin interfaceApduConnection- Parameters:
onlyWithCardPresent- Para indicar que sólo devuelva lectores que tengan una tarjeta insertada.- Returns:
- Una lista con los identificadores de lectores de tarjetas conectados.
- Throws:
ApduConnectionException- Cuando ocurran problemas en la conexión con los lectores.
-
getTerminalInfo
public java.lang.String getTerminalInfo(int terminal) throws ApduConnectionExceptionDescription copied from interface:ApduConnectionDevuelve información sobre un terminal.- Specified by:
getTerminalInfoin interfaceApduConnection- Parameters:
terminal- Número de terminal que se desea obtener información.- Returns:
- Una descripción del terminal especificado.
- Throws:
ApduConnectionException- Cuando ocurren problemas en la conexión con los lectores.
-
setTerminal
public void setTerminal(int t) throws ApduConnectionExceptionDescription copied from interface:ApduConnectionEstablece el lector de tarjetas que se usará para la conexión. Si se cambia el terminal estando la conexión ya abierta, se intentará reabrirla con el nuevo terminal.- Specified by:
setTerminalin interfaceApduConnection- Parameters:
t- Número de terminal que se desea pase a ser el actual.- Throws:
ApduConnectionException- Cuando se especifica un número de terminal no válido.
-
isOpen
public boolean isOpen()
Description copied from interface:ApduConnectionIndica si la conexión está abierta o no.- Specified by:
isOpenin interfaceApduConnection- Returns:
truesi la conexión esta abierta,falsesi está cerrada.
-
increment
private static byte[] increment(byte[] data)
Calcula y devuelve el valor entregado más 1.- Parameters:
data- Datos a incrementar.- Returns:
- Valor incrementado.
-
getSubConnection
public ApduConnection getSubConnection()
Description copied from interface:ApduConnectionRecupera la conexión subyacente utilizada por la conexión.- Specified by:
getSubConnectionin interfaceApduConnection- Returns:
- Conexión subyacente con la tarjeta o
nullsi esta conexión es ya la de más bajo nivel.
-
setProtocol
public void setProtocol(ApduConnectionProtocol p)
Description copied from interface:ApduConnectionEstablece el Protocolo de conexión con la tarjeta.- Specified by:
setProtocolin interfaceApduConnection- Parameters:
p- Protocolo de conexión con la tarjeta.
-
getKenc
public byte[] getKenc()
Description copied from interface:Cwa14890ConnectionObtiene la clave para encriptar y desencriptar criptogramas.- Specified by:
getKencin interfaceCwa14890Connection- Returns:
- Clave para encriptar y desencriptar criptogramas.
-
getKmac
public byte[] getKmac()
Description copied from interface:Cwa14890ConnectionObtiene la clave para calcular y verificar checksums.- Specified by:
getKmacin interfaceCwa14890Connection- Returns:
- Clave para calcular y verificar checksums.
-
getSsc
public byte[] getSsc()
Description copied from interface:Cwa14890ConnectionObtiene el contador de secuencia.- Specified by:
getSscin interfaceCwa14890Connection- Returns:
- Contador de secuencia.
-
-