Class Cwa14890OneV1Connection

java.lang.Object
es.gob.jmulticard.connection.cwa14890.Cwa14890OneV1Connection
All Implemented Interfaces:
ApduConnection, Cwa14890Connection
Direct Known Subclasses:
Cwa14890OneV2Connection

public class Cwa14890OneV1Connection extends Object implements Cwa14890Connection
Utilidad para el establecimiento y control del canal seguro CWA-14890 con cifrado DES y MAC de cuatro octetos.
  • Field Details

    • KICC_LENGTH

      private static final int KICC_LENGTH
      See Also:
    • KIFD_LENGTH

      private static final int KIFD_LENGTH
      See Also:
    • ISO_9796_2_PADDING_START

      private static final byte ISO_9796_2_PADDING_START
      See Also:
    • ISO_9796_2_PADDING_END

      private static final byte ISO_9796_2_PADDING_END
      See Also:
    • 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:
    • 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:
    • 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.
    • pubConsts

      private transient Cwa14890PublicConstants pubConsts
    • privConsts

      private transient Cwa14890PrivateConstants privConsts
  • Constructor Details

    • 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 Details

    • instantiateApduEncrypter

      protected AbstractApduEncrypter instantiateApduEncrypter()
      Obtiene la clase de utilidad para encriptar las APDU.
      Returns:
      Clase de utilidad para encriptar las APDU.
    • toString

      public String toString()
      Overrides:
      toString in class 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 interface ApduConnection
      Throws:
      ApduConnectionException - Cuando ocurre cualquier problema abriendo la conexión.
      See Also:
    • generateKenc

      private byte[] generateKenc(byte[] kidficc) throws 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:
      IOException - Cuando no puede generarse la clave.
    • generateKmac

      private byte[] generateKmac(byte[] kidficc) throws 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:
      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, RSAPrivateKey ifdPrivateKey, int ifdKeyLength, Cwa14890PrivateConstants privConsts, Cwa14890PublicConstants pubConsts, RSAPublicKey iccPublicKey, CryptoHelper cryptoHelper) throws 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:
      IOException - Si el mensaje no es válido o no se ha podido validar.
    • internalAuthentication

      private byte[] internalAuthentication(byte[] randomIfd, RSAPublicKey iccPublicKey) throws SecureChannelException, ApduConnectionException, 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.
      IOException - Cuando ocurre un error en el cifrado/descifrado de los mensajes.
    • externalAuthentication

      private byte[] externalAuthentication(byte[] serial, byte[] randomIcc, RSAPublicKey iccPublicKey) throws 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.
      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 interface ApduConnection
      Throws:
      ApduConnectionException - Cuando ocurre cualquier problema cerrando la conexión.
      See Also:
    • 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 interface ApduConnection
      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 interface ApduConnection
      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 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 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.
    • setProtocol

      public void setProtocol(ApduConnectionProtocol p)
      Description copied from interface: ApduConnection
      Establece el Protocolo de conexión con la tarjeta.
      Specified by:
      setProtocol in interface ApduConnection
      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 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.
    • getSsc

      public byte[] getSsc()
      Description copied from interface: Cwa14890Connection
      Obtiene el contador de secuencia.
      Specified by:
      getSsc in interface Cwa14890Connection
      Returns:
      Contador de secuencia.