Class SecureMessaging

java.lang.Object
es.gob.jmulticard.de.tsenger.androsmex.iso7816.SecureMessaging

public final class SecureMessaging extends Object
Empaquetado de envío y recepción de APDUs para establecer una mensajería segura.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    Tamaño de bloque de cifrado AES.
    private final CryptoHelper
     
    private final byte[]
     
    private final byte[]
     
    private final byte[]
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    SecureMessaging(byte[] ksenc, byte[] ksmac, byte[] initialSSC, CryptoHelper ch)
    Constructor.
  • Method Summary

    Modifier and Type
    Method
    Description
    private static byte[]
    addPadding(byte[] data)
    Añade un relleno ISO9797-1 (método 2) / ISO7816d4-Padding a los datos proporcionados.
    private DO87
    buildDO87(byte[] data)
    Encripta los datos con kenc para construir el DO87.
    private DO8E
    buildDO8E(byte[] header, DO87 do87, DO97 do97)
     
    private static DO97
    buildDO97(int le)
     
    private static byte
    Determina el equivalente a la APDU (ISO/IEC 7816-3 Capítulo 12.1).
    private byte[]
    getMac(byte[] data, byte[] ssCounter, byte[] keyBytes)
    Obtiene el Código de Autenticación de Mensaje (MAC) de tipo AES para los datos proporcionados.
    private static void
    incrementAtIndex(byte[] array)
     
    unwrap(ResponseApdu responseApduEncrypted)
    Obtiene la APDU de respuesta en claro a partir de una APDU protegida.
    Transforma un Comando APDU en claro a Comando APDU protegido.

    Methods inherited from class java.lang.Object

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

    • kenc

      private final transient byte[] kenc
    • kmac

      private final transient byte[] kmac
    • ssc

      private final transient byte[] ssc
    • cryptoHelper

      private final transient CryptoHelper cryptoHelper
    • BLOCK_SIZE

      public static final int BLOCK_SIZE
      Tamaño de bloque de cifrado AES.
      See Also:
  • Constructor Details

    • SecureMessaging

      public SecureMessaging(byte[] ksenc, byte[] ksmac, byte[] initialSSC, CryptoHelper ch)
      Constructor.
      Parameters:
      ksenc - Clave de sesión para encriptar.
      ksmac - Clave de sesión para el checksum.
      initialSSC - Contador de sequencia de envío.
      ch - Utilidad para operaciones criptográficas.
  • Method Details

    • wrap

      public CommandApdu wrap(CommandApdu capdu) throws SecureMessagingException
      Transforma un Comando APDU en claro a Comando APDU protegido.
      Parameters:
      capdu - APDU en claro.
      Returns:
      CommandApdu APDU protegida.
      Throws:
      SecureMessagingException - En cualquier error.
    • unwrap

      public ResponseApdu unwrap(ResponseApdu responseApduEncrypted) throws SecureMessagingException
      Obtiene la APDU de respuesta en claro a partir de una APDU protegida.
      Parameters:
      responseApduEncrypted - APDU protegida.
      Returns:
      APDU en claro.
      Throws:
      SecureMessagingException - En cualquier error.
    • buildDO87

      private DO87 buildDO87(byte[] data) throws SecureMessagingException
      Encripta los datos con kenc para construir el DO87.
      Parameters:
      data - Datos a encriptar.
      Returns:
      DO87 Parámetros del comando.
      Throws:
      SecureMessagingException - En caso de error en el cifrado.
    • buildDO8E

      private DO8E buildDO8E(byte[] header, DO87 do87, DO97 do97) throws SecureMessagingException
      Throws:
      SecureMessagingException
    • buildDO97

      private static DO97 buildDO97(int le)
    • getAPDUStructure

      private static byte getAPDUStructure(CommandApdu capdu)
      Determina el equivalente a la APDU (ISO/IEC 7816-3 Capítulo 12.1).
      Parameters:
      capdu - Comando APDU.
      Returns:
      Tipo de estructura (1 = CASE1, etc.).
    • incrementAtIndex

      private static void incrementAtIndex(byte[] array)
    • getMac

      private byte[] getMac(byte[] data, byte[] ssCounter, byte[] keyBytes) throws InvalidKeyException, NoSuchAlgorithmException
      Obtiene el Código de Autenticación de Mensaje (MAC) de tipo AES para los datos proporcionados.
      Parameters:
      data - Datos sobre los que calcular el MAC.
      ssCounter - Contador de secuencia de envíos (Send Sequence Counter).
      keyBytes - Clave de creación de MAC.
      Returns:
      MAC de los datos.
      Throws:
      NoSuchAlgorithmException - Si no se encuentra el algoritmo de creación del MAC.
      InvalidKeyException - Si la clave de creación del MAC es inválida.
    • addPadding

      private static byte[] addPadding(byte[] data)
      Añade un relleno ISO9797-1 (método 2) / ISO7816d4-Padding a los datos proporcionados.
      Parameters:
      data - Datos a rellenar.
      Returns:
      Datos con el relleno aplicado.