Class AbstractApduEncrypter

  • Direct Known Subclasses:
    ApduEncrypterAes, ApduEncrypterDes

    public abstract class AbstractApduEncrypter
    extends java.lang.Object
    Cifrador de APDU según CWA-14890.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static byte CLA_OF_PROTECTED_APDU
      CLA que se suma a los CLA de las APDU que se protegen.
      private static byte ISO7816_PADDING_PREFIX
      Primer byte a agregar en los padding ISO-7816.
      protected int paddingLength
      En el relleno ISO-7816, longitud de la cual debe ser múltiplo el tamaño de los datos de salida.
      protected static byte TAG_DATA_TLV
      Tag del TLV de datos de una APDU protegida.
      private static byte TAG_LE_TLV
      Tag del TLV del Le de una APDU protegida.
      private static byte TLV_VALUE_PREFIX_TO_MAC
      Byte prefijo de los datos para el cálculo de la MAC.
    • Method Summary

      All Methods Static Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      protected static byte[] addPadding7816​(byte[] data, int size)
      Agrega un relleno (padding) a un array de bytes conforme las especificaciones ISO 7816.
      abstract ResponseApdu decryptResponseApdu​(ResponseApdu responseApdu, byte[] keyCipher, byte[] ssc, byte[] kMac, CryptoHelper cryptoHelper)
      Desencripta la Apdu de respuesta recibida a partir de las variables del canal de cifrado (kenc, kmac, ssc).
      protected abstract byte[] encryptData​(byte[] data, byte[] key, byte[] ssc, CryptoHelper cryptoHelper)
      Encripta los datos para una APDU cifrada.
      protected abstract byte[] generateMac​(byte[] dataPadded, byte[] ssc, byte[] kMac, CryptoHelper cryptoHelper)
      Aplica el algoritmo para la generación de la MAC del mensaje.
      private static byte[] getCompleteDataBytes​(java.lang.Integer le, byte[] tlvDataBytes)  
      private byte[] getDataTlv​(byte[] data, byte[] keyCipher, byte[] sendSequenceCounter, CryptoHelper cryptoHelper, int paddingSize)  
      CipheredApdu protectAPDU​(CommandApdu unprotectedApdu, byte[] keyCipher, byte[] keyMac, byte[] sendSequenceCounter, CryptoHelper cryptoHelper)
      Encapsula una APDU para ser enviada por un canal seguro CWA-14890.
      protected static byte[] removePadding7816​(byte[] paddedData)
      Elimina el padding ISO 7816 de los datos.
      private static void wipeByteArray​(byte[] inArray)
      Borra un array de octetos insertando nulos.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • TAG_DATA_TLV

        protected static final byte TAG_DATA_TLV
        Tag del TLV de datos de una APDU protegida.
        See Also:
        Constant Field Values
      • TAG_LE_TLV

        private static final byte TAG_LE_TLV
        Tag del TLV del Le de una APDU protegida.
        See Also:
        Constant Field Values
      • TLV_VALUE_PREFIX_TO_MAC

        private static final byte TLV_VALUE_PREFIX_TO_MAC
        Byte prefijo de los datos para el cálculo de la MAC.
        See Also:
        Constant Field Values
      • CLA_OF_PROTECTED_APDU

        private static final byte CLA_OF_PROTECTED_APDU
        CLA que se suma a los CLA de las APDU que se protegen.
        See Also:
        Constant Field Values
      • ISO7816_PADDING_PREFIX

        private static final byte ISO7816_PADDING_PREFIX
        Primer byte a agregar en los padding ISO-7816.
        See Also:
        Constant Field Values
      • paddingLength

        protected transient int paddingLength
        En el relleno ISO-7816, longitud de la cual debe ser múltiplo el tamaño de los datos de salida.
    • Constructor Detail

      • AbstractApduEncrypter

        public AbstractApduEncrypter()
    • Method Detail

      • protectAPDU

        public CipheredApdu protectAPDU​(CommandApdu unprotectedApdu,
                                        byte[] keyCipher,
                                        byte[] keyMac,
                                        byte[] sendSequenceCounter,
                                        CryptoHelper cryptoHelper)
                                 throws java.io.IOException
        Encapsula una APDU para ser enviada por un canal seguro CWA-14890. El contador SSC se autoincrementa durante la operación.
        Parameters:
        unprotectedApdu - APDU desprotegida (en claro).
        keyCipher - Clave simétrica de cifrado.
        keyMac - Clave simétrica para el MAC.
        sendSequenceCounter - Contador de secuencia actual.
        cryptoHelper - Operador criptográfico.
        Returns:
        APDU protegida (cifrada y con MAC).
        Throws:
        java.io.IOException - Si ocurren problemas durante los cifrados de la APDU.
      • encryptData

        protected abstract byte[] encryptData​(byte[] data,
                                              byte[] key,
                                              byte[] ssc,
                                              CryptoHelper cryptoHelper)
                                       throws java.io.IOException
        Encripta los datos para una APDU cifrada.
        Parameters:
        data - Datos de la APDU.
        key - Clave de cifrado.
        ssc - Contador de secuencia.
        cryptoHelper - Clase con las funcionalidades de criptografía.
        Returns:
        Datos enconcriptados.
        Throws:
        java.io.IOException - En cualquier error.
      • addPadding7816

        protected static byte[] addPadding7816​(byte[] data,
                                               int size)
        Agrega un relleno (padding) a un array de bytes conforme las especificaciones ISO 7816. Esto es, se agrega un byte 0x80 al array y se completa con bytes 0x00 hasta que el array es múltiplo de 8.
        Parameters:
        data - Datos a los que agregar el relleno.
        size - Longitud de la cual debe ser múltiplo el tamaño de los datos de salida.
        Returns:
        Datos con relleno.
      • removePadding7816

        protected static byte[] removePadding7816​(byte[] paddedData)
        Elimina el padding ISO 7816 de los datos.
        Parameters:
        paddedData - Datos con padding.
        Returns:
        Datos sin padding.
      • generateMac

        protected abstract byte[] generateMac​(byte[] dataPadded,
                                              byte[] ssc,
                                              byte[] kMac,
                                              CryptoHelper cryptoHelper)
                                       throws java.io.IOException
        Aplica el algoritmo para la generación de la MAC del mensaje.
        Parameters:
        dataPadded - Datos sobre los que generar la MAC.
        ssc - Contador de secuencia de la operación.
        kMac - Clave necesaria para la operación (algoritmo dependiente de la implementación).
        cryptoHelper - Manejador para la realización de las operaciones criptográficas.
        Returns:
        Clave de autenticación de los datos.
        Throws:
        java.io.IOException - Si hay errores de entrada / salida.
      • decryptResponseApdu

        public abstract ResponseApdu decryptResponseApdu​(ResponseApdu responseApdu,
                                                         byte[] keyCipher,
                                                         byte[] ssc,
                                                         byte[] kMac,
                                                         CryptoHelper cryptoHelper)
                                                  throws java.io.IOException
        Desencripta la Apdu de respuesta recibida a partir de las variables del canal de cifrado (kenc, kmac, ssc).
        Parameters:
        responseApdu - Respuesta a desencriptar.
        keyCipher - Clave de cifrado.
        ssc - Contador de secuencia.
        kMac - Clave de cifrado.
        cryptoHelper - Instancia que lleva a cabo las operaciones de cifrado.
        Returns:
        Apdu descifrada.
        Throws:
        java.io.IOException - En cualquier error durante el proceso de descifrado.
      • wipeByteArray

        private static void wipeByteArray​(byte[] inArray)
        Borra un array de octetos insertando nulos.
        Parameters:
        inArray - Array a borrar, se modifica por mutabilidad.
      • getCompleteDataBytes

        private static byte[] getCompleteDataBytes​(java.lang.Integer le,
                                                   byte[] tlvDataBytes)
      • getDataTlv

        private byte[] getDataTlv​(byte[] data,
                                  byte[] keyCipher,
                                  byte[] sendSequenceCounter,
                                  CryptoHelper cryptoHelper,
                                  int paddingSize)
                           throws java.io.IOException
        Throws:
        java.io.IOException