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 AbstractApduEncrypter
apduEncrypter
Clase de utilidad para encriptar las APDU.private Cwa14890Card
card
Tarjeta CWA-14890 con la que se desea establecer el canal seguro.protected CryptoHelper
cryptoHelper
Utilidad para la ejecución de funciones criptográficas.private static StatusWord
INVALID_CRYPTO_CHECKSUM
private static byte
ISO_9796_2_PADDING_END
private static byte
ISO_9796_2_PADDING_START
private byte[]
kenc
Clave Triple DES (TDES o DESEDE) para encriptar y desencriptar criptogramas.private static int
KICC_LENGTH
private static int
KIFD_LENGTH
private byte[]
kmac
Clave Triple DES (TDES o DESEDE) para calcular y verificar checksums.private static byte
MSB_INCORRECT_LE
Octeto de valor más significativo que indica unLe
incorrecto en la petición.private static byte
MSB_INCORRECT_LE_PACE
Octeto de valor más significativo que indica unLe
incorrecto en la petición.protected boolean
openState
Indica el estado de la conexión.private Cwa14890PrivateConstants
privConsts
private Cwa14890PublicConstants
pubConsts
private static byte[]
SECURE_CHANNEL_KENC_AUX
Código auxiliar para el cálculo de la claveKenc
del canal seguro.private static byte[]
SECURE_CHANNEL_KMAC_AUX
Código auxiliar para el cálculo de la claveKmac
del canal seguro.private byte[]
ssc
Contador de secuencia.protected ApduConnection
subConnection
Conexió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 void
addCardConnectionListener(CardConnectionListener ccl)
Añade un objeto al que se notificará cuando existan eventos en la conexión.void
close()
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 claveKENC
para encriptar y desencriptar criptogramas.private byte[]
generateKmac(byte[] kidficc)
Genera la claveKMAC
para 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.ApduConnection
getSubConnection()
Recupera la conexión subyacente utilizada por la conexión.java.lang.String
getTerminalInfo(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 AbstractApduEncrypter
instantiateApduEncrypter()
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.boolean
isOpen()
Indica si la conexión está abierta o no.void
open()
Abre el canal seguro con la tarjeta.void
removeCardConnectionListener(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.void
setProtocol(ApduConnectionProtocol p)
Establece el Protocolo de conexión con la tarjeta.void
setTerminal(int t)
Establece el lector de tarjetas que se usará para la conexión.java.lang.String
toString()
ResponseApdu
transmit(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 unLe
incorrecto 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 unLe
incorrecto 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 claveKenc
del canal seguro.
-
SECURE_CHANNEL_KMAC_AUX
private static final byte[] SECURE_CHANNEL_KMAC_AUX
Código auxiliar para el cálculo de la claveKmac
del 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:
toString
in classjava.lang.Object
-
open
public void open() throws ApduConnectionException
Abre el canal seguro con la tarjeta. La conexión se reiniciará previamente a la apertura del canal.- Specified by:
open
in interfaceApduConnection
- Throws:
ApduConnectionException
- Cuando ocurre cualquier problema abriendo la conexión.- See Also:
ApduConnection.close()
-
generateKenc
private byte[] generateKenc(byte[] kidficc) throws java.io.IOException
Genera la claveKENC
para 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 valoresKifd
yKicc
.- Returns:
- Clave Triple-DES.
- Throws:
java.io.IOException
- Cuando no puede generarse la clave.
-
generateKmac
private byte[] generateKmac(byte[] kidficc) throws java.io.IOException
Genera la claveKMAC
para 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 valoresKifd
yKicc
.- 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.IOException
Valida 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.IOException
Lleva 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.IOException
Lleva 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 ApduConnectionException
Obtiene 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 ApduConnectionException
Description copied from interface:ApduConnection
Cierra la conexión con la tarjeta inteligente actualmente insertada en el lector.- Specified by:
close
in 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:ApduConnection
Envía un comando APDU a la tarjeta inteligente.- Specified by:
transmit
in 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 ApduConnectionException
Description copied from interface:ApduConnection
Reinicializa la conexión con la tarjeta inteligente.- Specified by:
reset
in 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:ApduConnection
Añ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:
addCardConnectionListener
in 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:ApduConnection
Indica que ya no se desea notificar a un objeto cuando existan eventos en la conexión.- Specified by:
removeCardConnectionListener
in interfaceApduConnection
- Parameters:
ccl
- Objeto al que ya no se desea notificar los eventos de la conexión.
-
getTerminals
public long[] getTerminals(boolean onlyWithCardPresent) throws ApduConnectionException
Description copied from interface:ApduConnection
Devuelve todos los lectores de tarjetas presentes en el sistema.- Specified by:
getTerminals
in 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 ApduConnectionException
Description copied from interface:ApduConnection
Devuelve información sobre un terminal.- Specified by:
getTerminalInfo
in 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 ApduConnectionException
Description copied from interface:ApduConnection
Establece 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:
setTerminal
in 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:ApduConnection
Indica si la conexión está abierta o no.- Specified by:
isOpen
in interfaceApduConnection
- Returns:
true
si la conexión esta abierta,false
si 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:ApduConnection
Recupera la conexión subyacente utilizada por la conexión.- Specified by:
getSubConnection
in interfaceApduConnection
- Returns:
- Conexión subyacente con la tarjeta o
null
si esta conexión es ya la de más bajo nivel.
-
setProtocol
public void setProtocol(ApduConnectionProtocol p)
Description copied from interface:ApduConnection
Establece el Protocolo de conexión con la tarjeta.- Specified by:
setProtocol
in interfaceApduConnection
- Parameters:
p
- Protocolo de conexión con la tarjeta.
-
getKenc
public byte[] getKenc()
Description copied from interface:Cwa14890Connection
Obtiene la clave para encriptar y desencriptar criptogramas.- Specified by:
getKenc
in interfaceCwa14890Connection
- Returns:
- Clave para encriptar y desencriptar criptogramas.
-
getKmac
public byte[] getKmac()
Description copied from interface:Cwa14890Connection
Obtiene la clave para calcular y verificar checksums.- Specified by:
getKmac
in interfaceCwa14890Connection
- Returns:
- Clave para calcular y verificar checksums.
-
getSsc
public byte[] getSsc()
Description copied from interface:Cwa14890Connection
Obtiene el contador de secuencia.- Specified by:
getSsc
in interfaceCwa14890Connection
- Returns:
- Contador de secuencia.
-
-