Class Cwa14890OneV1Connection

    • Field Detail

      • 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 un Le 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 un Le 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 clave Kenc del canal seguro.
      • SECURE_CHANNEL_KMAC_AUX

        private static final byte[] SECURE_CHANNEL_KMAC_AUX
        Código auxiliar para el cálculo de la clave Kmac 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.
    • 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 class java.lang.Object
      • generateKenc

        private byte[] generateKenc​(byte[] kidficc)
                             throws java.io.IOException
        Genera la clave KENC 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 valores Kifd y Kicc.
        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 clave KMAC 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 valores Kifd y Kicc.
        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.
      • 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 interface ApduConnection
        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 interface ApduConnection
        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 interface ApduConnection
        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 interface ApduConnection
        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 interface ApduConnection
        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 interface ApduConnection
        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 interface ApduConnection
        Returns:
        Conexión subyacente con la tarjeta o null si esta conexión es ya la de más bajo nivel.
      • getKenc

        public byte[] getKenc()
        Description copied from interface: Cwa14890Connection
        Obtiene la clave para encriptar y desencriptar criptogramas.
        Specified by:
        getKenc in interface Cwa14890Connection
        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 interface Cwa14890Connection
        Returns:
        Clave para calcular y verificar checksums.