Package es.gob.jmulticard.connection
Class AbstractApduEncrypter
- java.lang.Object
-
- es.gob.jmulticard.connection.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.
-
Constructor Summary
Constructors Constructor Description AbstractApduEncrypter()
-
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.
-
-
-
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.
-
-
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 byte0x80
al array y se completa con bytes0x00
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
-
-