Class AbstractApduEncrypter

java.lang.Object
es.gob.jmulticard.connection.AbstractApduEncrypter
Direct Known Subclasses:
ApduEncrypterAes, ApduEncrypterDes

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

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

    Constructors
    Constructor
    Description
     
  • Method Summary

    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(Integer le, byte[] tlvDataBytes)
     
    private byte[]
    getDataTlv(byte[] data, byte[] keyCipher, byte[] sendSequenceCounter, CryptoHelper cryptoHelper, int paddingSize)
     
    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 Details

    • TAG_DATA_TLV

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

      private static final byte TAG_LE_TLV
      Tag del TLV del Le de una APDU protegida.
      See Also:
    • 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:
    • 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:
    • ISO7816_PADDING_PREFIX

      private static final byte ISO7816_PADDING_PREFIX
      Primer byte a agregar en los padding ISO-7816.
      See Also:
    • 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 Details

    • AbstractApduEncrypter

      public AbstractApduEncrypter()
  • Method Details

    • protectAPDU

      public CipheredApdu protectAPDU(CommandApdu unprotectedApdu, byte[] keyCipher, byte[] keyMac, byte[] sendSequenceCounter, CryptoHelper cryptoHelper) throws 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:
      IOException - Si ocurren problemas durante los cifrados de la APDU.
    • encryptData

      protected abstract byte[] encryptData(byte[] data, byte[] key, byte[] ssc, CryptoHelper cryptoHelper) throws 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:
      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 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:
      IOException - Si hay errores de entrada / salida.
    • decryptResponseApdu

      public abstract ResponseApdu decryptResponseApdu(ResponseApdu responseApdu, byte[] keyCipher, byte[] ssc, byte[] kMac, CryptoHelper cryptoHelper) throws 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:
      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(Integer le, byte[] tlvDataBytes)
    • getDataTlv

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