es.gob.jmulticard.apdu.iso7816four.pace.MseSetPaceAlgorithmApduCommand Maven / Gradle / Ivy
package es.gob.jmulticard.apdu.iso7816four.pace;
import es.gob.jmulticard.HexUtils;
import es.gob.jmulticard.apdu.iso7816four.MseSetAuthenticationTemplateApduCommand;
/** APDU de establecmiiento de algoritmo para PACE.
* @author Tomás García-Merás. */
public class MseSetPaceAlgorithmApduCommand extends MseSetAuthenticationTemplateApduCommand {
/** Parámetro para el algoritmo de establecimiento de canal PACE. */
public enum PaceAlgorithmParam {
/** Curva brainpool256r1. */
BRAINPOOL_256_R1(
new byte[] {
/* T */ (byte) 0x84,
/* L */ (byte) 0x01,
/* V */ (byte) 0x0d
}
);
private final byte[] paramBytes;
private PaceAlgorithmParam(final byte[] paramId) {
this.paramBytes = paramId.clone();
}
/** Obtiene la representación binaria del OID.
* @return Representación binaria del OID. */
public byte[] getBytes() {
return this.paramBytes.clone();
}
}
/** Tipo de contraseña que se va a usar para establecer el canal PACE. */
public enum PacePasswordType {
/** MRZ Machine-Readable Zone. */
MRZ(
new byte[] {
/* T */ (byte) 0x83,
/* L */ (byte) 0x01,
/* V */ (byte) 0x01
}
),
/** CAN Card Access Number. */
CAN(
new byte[] {
/* T */ (byte) 0x83,
/* L */ (byte) 0x01,
/* V */ (byte) 0x02
}
);
private final byte[] pwdTypeBytes;
private PacePasswordType(final byte[] tpy) {
this.pwdTypeBytes = tpy.clone();
}
/** Obtiene la representación binaria del OID.
* @return Representación binaria del OID. */
public byte[] getBytes() {
return this.pwdTypeBytes.clone();
}
}
/** Algoritmo de establecimiento de canal PACE.
* Los OID son una combinación de:
*
* - 0.4.0.127.0.7 (bsi-de)
* -
*
* - 2.2.4 (id_PACE)
* -
*
* - 1 (id_PACE_DH_GM)
* - 2 (id_PACE_ECDH_GM)
* - 3 (id_PACE_DH_IM)
* - 4 (id_PACE_ECDH_IM)
*
*
*
*
*
*/
public enum PaceAlgorithmOid {
/** id_PACE_ECDH_GM_AES_CBC_CMAC_128 (OID 0.4.0.127.0.7.2.2.4.2.2). */
PACE_ECDH_GM_AES_CBC_CMAC_128(
new byte[] {
/* T */
/* L */ (byte) 0x0A,
/* V */ (byte) 0x04, (byte) 0x00, (byte) 0x7f, (byte) 0x00, (byte) 0x07,
(byte) 0x02, (byte) 0x02, (byte) 0x04, (byte) 0x02, (byte) 0x02
}
),
/** id_PACE_DH_GM_AES_CBC_CMAC_128 (OID 0.4.0.127.0.7.2.2.4.1.2). */
PACE_DH_GM_AES_CBC_CMAC_128(
new byte[] {
/* T */
/* L */ (byte) 0x0A,
/* V */ (byte) 0x04, (byte) 0x00, (byte) 0x7f, (byte) 0x00, (byte) 0x07,
(byte) 0x02, (byte) 0x02, (byte) 0x04, (byte) 0x01, (byte) 0x02
}
);
private final byte[] oidBytes;
private PaceAlgorithmOid(final byte[] oid) {
this.oidBytes = oid.clone();
}
/** Obtiene la representación binaria del OID.
* @return Representación binaria del OID. */
public byte[] getBytes() {
return this.oidBytes.clone();
}
}
/** Crea una APDU de establecmiento de algoritmo para PACE.
* @param cla Clase (CLA) de la APDU.
* @param algorithm Algoritmo a utilizar.
* @param pwdType Tipo de contraseña que se va a usar para establecer el canal PACE.
* @param algorithmParam Parámetro para el algoritmo de establecimiento de canal PACE. */
public MseSetPaceAlgorithmApduCommand(final byte cla,
final PaceAlgorithmOid algorithm,
final PacePasswordType pwdType,
final PaceAlgorithmParam algorithmParam) {
super(
cla,
HexUtils.concatenateByteArrays(
new byte[]{(byte)0x80},
algorithm.getBytes(),
pwdType.getBytes(),
algorithmParam.getBytes()
)
);
}
}