Class Dnie

All Implemented Interfaces:
Card, CryptoCard, Cwa14890Card, Dni
Direct Known Subclasses:
CeresSc, Dnie3, Tif

public class Dnie extends AbstractIso7816EightCard implements Dni, Cwa14890Card
DNI Electrónico.
  • Field Details

    • DEFAULT_KEY_SIZE

      private static final int DEFAULT_KEY_SIZE
      See Also:
    • LOGGER

      protected static final Logger LOGGER
      Registro.
    • ERROR_PIN_SW1

      private static final byte ERROR_PIN_SW1
      Octeto que identifica una verificación fallida del PIN.
      See Also:
    • callbackHandler

      private transient CallbackHandler callbackHandler
    • aliases

      private transient String[] aliases
    • CERT_ICC_FILE_ID

      private static final byte[] CERT_ICC_FILE_ID
      Identificador del fichero del certificado de componente del DNIe.
    • MASTER_FILE_NAME

      private static final String MASTER_FILE_NAME
      Nombre del Master File del DNIe.
      See Also:
    • CERT_ALIAS_AUTH

      public static final String CERT_ALIAS_AUTH
      Alias del certificado de autenticación del DNIe (siempre el mismo en el DNIe y tarjetas derivadas).
      See Also:
    • CERT_ALIAS_SIGN

      public static final String CERT_ALIAS_SIGN
      Alias del certificado de firma del DNIe (siempre el mismo en el DNIe y tarjetas derivadas).
      See Also:
    • CERT_ALIAS_SIGNALIAS

      protected static final String CERT_ALIAS_SIGNALIAS
      Alias del certificado de firma (siempre el mismo en el DNIe y tarjetas derivadas).
      See Also:
    • CERT_ALIAS_CYPHER

      protected static final String CERT_ALIAS_CYPHER
      Alias del certificado de cifrado (siempre el mismo en las tarjetas derivadas del DNIe que soportan cifrado).
      See Also:
    • CERT_ALIAS_INTERMEDIATE_CA

      public static final String CERT_ALIAS_INTERMEDIATE_CA
      Alias del certificado de CA intermedia (siempre el mismo en el DNIe).
      See Also:
    • AUTH_KEY_LABEL

      private static final String AUTH_KEY_LABEL
      See Also:
    • SIGN_KEY_LABEL

      private static final String SIGN_KEY_LABEL
      See Also:
    • CYPH_KEY_LABEL

      private static final String CYPH_KEY_LABEL
      See Also:
    • CDF_LOCATION

      protected static final Location CDF_LOCATION
      Localización del CDF PKCS#15.
    • PRKDF_LOCATION

      protected static final Location PRKDF_LOCATION
      Localización del PrKDF PKCS#15.
    • IDESP_LOCATION

      protected static final Location IDESP_LOCATION
      Localización del EF IDESP.
    • certAuth

      protected transient X509Certificate certAuth
      Certificado de autenticación.
    • certSign

      protected transient X509Certificate certSign
      Certificado de firma.
    • certCyph

      protected transient X509Certificate certCyph
      Certificado de cifrado.
    • certSignAlias

      protected transient X509Certificate certSignAlias
      Certificado de firma con seudónimo.
    • certIcc

      protected transient X509Certificate certIcc
      Certificado de componente (ICC).
    • intermediateCaCert

      protected transient X509Certificate intermediateCaCert
      Certificado de CA intermedia.
    • certPathAuth

      private transient Location certPathAuth
      Localización del certificado de autenticación.
    • certPathSign

      private transient Location certPathSign
      Localización del certificado de firma. Es opcional, ya que no está presente en los DNI de menores de edad no emancipados.
    • certPathCyph

      private transient Location certPathCyph
      Localización del certificado de cifrado. Es opcional, ya que solo está presente en las TIF, no en los DNIe normales.
    • certPathSignAlias

      private transient Location certPathSignAlias
      Localización del certificado de firma con seudónimo. Es opcional, ya que solo está presente en las TIF, no en los DNIe normales.
    • authKeyRef

      private transient DniePrivateKeyReference authKeyRef
      Referencia a la clave privada de autenticación.
    • signKeyRef

      private transient DniePrivateKeyReference signKeyRef
      Referencia a la clave privada de firma.
    • cyphKeyRef

      private transient DniePrivateKeyReference cyphKeyRef
      Referencia a la clave privada de cifrado. Es opcional, ya que solo está presente en las TIF, no en los DNIe normales.
    • signAliasKeyRef

      private transient DniePrivateKeyReference signAliasKeyRef
      Referencia a la clave privada de firma con seudónimo. Es opcional, ya que solo está presente en las TIF, no en los DNIe normales.
    • rawConnection

      protected transient ApduConnection rawConnection
      Conexión inicial con la tarjeta, sin ningún canal seguro.
    • cryptoHelper

      protected final CryptoHelper cryptoHelper
      Manejador de funciones criptográficas.
    • passwordCallback

      private PasswordCallback passwordCallback
  • Constructor Details

    • Dnie

      protected Dnie(ApduConnection conn, PasswordCallback pwc, CryptoHelper cryptoHlpr, CallbackHandler ch) throws ApduConnectionException
      Construye una clase que representa un DNIe.
      Parameters:
      conn - Conexión con la tarjeta.
      pwc - PasswordCallback para obtener el PIN del DNIe.
      cryptoHlpr - Funcionalidades criptográficas de utilidad que pueden variar entre máquinas virtuales.
      ch - Gestor de callbacks para la solicitud de datos al usuario.
      Throws:
      ApduConnectionException - Si la conexión con la tarjeta se proporciona cerrada y no es posible abrirla.
    • Dnie

      protected Dnie(ApduConnection conn, PasswordCallback pwc, CryptoHelper cryptoHlpr, CallbackHandler ch, boolean loadCertsAndKeys) throws ApduConnectionException
      Construye una clase que representa un DNIe.
      Parameters:
      conn - Conexión con la tarjeta.
      pwc - PasswordCallback para obtener el PIN del DNIe.
      cryptoHlpr - Funcionalidades criptográficas de utilidad que pueden variar entre máquinas virtuales.
      ch - Gestor de callbacks para la solicitud de datos al usuario.
      loadCertsAndKeys - Si se indica true, se cargan las referencias a las claves privadas y a los certificados, mientras que si se indica false, no se cargan, permitiendo la instanciación de un DNIe sin capacidades de firma o autenticación con certificados.
      Throws:
      ApduConnectionException - Si la conexión con la tarjeta se proporciona cerrada y no es posible abrirla.
  • Method Details

    • getCryptoHelper

      protected CryptoHelper getCryptoHelper()
      Obtiene la clase con funcionalidades de base de criptografía.
      Returns:
      Clase con funcionalidades de base de criptografía.
    • getPasswordCallback

      protected PasswordCallback getPasswordCallback()
      Obtiene la PasswordCallback.
      Returns:
      PasswordCallback.
    • getCwa14890PublicConstants

      protected Cwa14890PublicConstants getCwa14890PublicConstants()
      Obtiene las constantes públicas CWA-14890 para el cifrado de canal.
      Returns:
      Constantes públicas CWA-14890 para el cifrado de canal.
    • getCwa14890PrivateConstants

      protected Cwa14890PrivateConstants getCwa14890PrivateConstants()
      Obtiene las constantes privadas CWA-14890 para el cifrado de canal.
      Returns:
      Constantes privadas CWA-14890 para el cifrado de canal.
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • connect

      public static void connect(ApduConnection conn) throws ApduConnectionException
      Conecta con el lector del sistema que tenga un DNIe insertado.
      Parameters:
      conn - Conexión hacia el DNIe.
      Throws:
      ApduConnectionException - Si hay problemas de conexión con la tarjeta.
    • loadKeyReferences

      protected void loadKeyReferences()
      Carga la información pública con la referencia a las claves de firma.
    • getSerialNumber

      public byte[] getSerialNumber() throws ApduConnectionException
      Recupera el número de serie de un DNIe.
      Specified by:
      getSerialNumber in interface Cwa14890Card
      Returns:
      Un array de octetos que contiene el número de serie del DNIe.
      Throws:
      ApduConnectionException - Si la conexión con la tarjeta se proporciona cerrada y no es posible abrirla.
    • getCardName

      public String getCardName()
      Description copied from class: AbstractSmartCard
      Obtiene el nombre de la tarjeta.
      Specified by:
      getCardName in class AbstractSmartCard
      Returns:
      Nombre de la tarjeta
    • getAliases

      public String[] getAliases()
      Description copied from interface: CryptoCard
      Obtiene los alias de los certificados de la tarjeta.
      Specified by:
      getAliases in interface CryptoCard
      Returns:
      Array con los alias de los certificados de la tarjeta
    • getCdf

      public Cdf getCdf() throws ApduConnectionException
      Obtiene el CDF PKCS#15 del DNIe.
      Returns:
      CDF PKCS#15 del DNIe.
      Throws:
      ApduConnectionException - Si no se puede conectar con el DNIe.
    • loadCertificatesPaths

      protected void loadCertificatesPaths() throws ApduConnectionException
      Carga el certificado de la CA intermedia y las localizaciones de los certificados de firma y autenticación.
      Throws:
      ApduConnectionException - Si hay problemas en la precarga.
    • getCertificate

      public X509Certificate getCertificate(String alias) throws CryptoCardException, PinException
      Description copied from interface: CryptoCard
      Obtiene el certificado correspondiente al alias proporcionado.
      Specified by:
      getCertificate in interface CryptoCard
      Parameters:
      alias - Alias del certificado.
      Returns:
      Certificado correspondiente al alias proporcionado o null si no existe ningún certificado con ese alias.
      Throws:
      CryptoCardException - Si ocurre algún problema al recuperar el certificado.
      PinException - Si el PIN proporcionado es incorrecto.
    • verifyIcc

      public void verifyIcc()
      Description copied from interface: Cwa14890Card
      Verifica el certificado de componente de la tarjeta.
      Specified by:
      verifyIcc in interface Cwa14890Card
    • getIccCertPublicKey

      public RSAPublicKey getIccCertPublicKey() throws IOException
      Description copied from interface: Cwa14890Card
      Recupera la clave pública del certificado de componente.
      Specified by:
      getIccCertPublicKey in interface Cwa14890Card
      Returns:
      Clave pública del certificado de componente.
      Throws:
      IOException - Cuando ocurre algún problema en la selección y lectura del certificado
    • verifyIfdCertificateChain

      public void verifyIfdCertificateChain(Cwa14890PublicConstants consts) throws ApduConnectionException
      Description copied from interface: Cwa14890Card
      Verifica que los certificados declarados por el controlador (certificados de terminal) sean válidos para el uso de la tarjeta.
      Specified by:
      verifyIfdCertificateChain in interface Cwa14890Card
      Parameters:
      consts - Clase de claves.
      Throws:
      ApduConnectionException
    • getRefIccPrivateKey

      public byte[] getRefIccPrivateKey(Cwa14890PublicConstants consts)
      Description copied from interface: Cwa14890Card
      Recupera la referencia a la clave privada del certificado de componente.
      Specified by:
      getRefIccPrivateKey in interface Cwa14890Card
      Parameters:
      consts - Clase de claves.
      Returns:
      Referencia a clave privada
    • getChrCCvIfd

      public byte[] getChrCCvIfd(Cwa14890PublicConstants consts)
      Description copied from interface: Cwa14890Card
      Recupera el CHR de la clave pública del certificado de terminal.
      Specified by:
      getChrCCvIfd in interface Cwa14890Card
      Parameters:
      consts - Clase de claves.
      Returns:
      Referencia a clave pública
    • getIfdPrivateKey

      public RSAPrivateKey getIfdPrivateKey(Cwa14890PrivateConstants consts)
      Description copied from interface: Cwa14890Card
      Recupera la clave privada del certificado de componente del terminal.
      Specified by:
      getIfdPrivateKey in interface Cwa14890Card
      Parameters:
      consts - Clase de claves privadas.
      Returns:
      Clave privada.
    • setKeysToAuthentication

      public void setKeysToAuthentication(byte[] refPublicKey, byte[] refPrivateKey) throws ApduConnectionException
      Description copied from interface: Cwa14890Card
      Establece una clave pública y otra privada para la autenticación. interna y externa de la tarjeta.
      Specified by:
      setKeysToAuthentication in interface Cwa14890Card
      Parameters:
      refPublicKey - Referencia a la clave pública.
      refPrivateKey - Referencia a la clave privada.
      Throws:
      ApduConnectionException
    • getInternalAuthenticateMessage

      public byte[] getInternalAuthenticateMessage(byte[] randomIfd, byte[] chrCCvIfd) throws ApduConnectionException
      Description copied from interface: Cwa14890Card
      Obtiene el mensaje de autenticación interna de la tarjeta.
      Specified by:
      getInternalAuthenticateMessage in interface Cwa14890Card
      Parameters:
      randomIfd - Bytes aleatorios generados.
      chrCCvIfd - CHR de la clave pública del certificado de terminal.
      Returns:
      Mensaje cifrado con la clave privada de componente de la tarjeta.
      Throws:
      ApduConnectionException - Cuando ocurre un error de comunicación con la tarjeta.
    • externalAuthentication

      public boolean externalAuthentication(byte[] extAuthenticationData) throws ApduConnectionException
      Description copied from interface: Cwa14890Card
      Envia el mensaje de autenticación externa.
      Specified by:
      externalAuthentication in interface Cwa14890Card
      Parameters:
      extAuthenticationData - Mensaje de autenticación externa.
      Returns:
      true si la autenticación finalizó correctamente, false en caso contrario.
      Throws:
      ApduConnectionException - Cuando ocurre un error en la comunicación con la tarjeta.
    • getPrivateKey

      public PrivateKeyReference getPrivateKey(String alias)
      Description copied from interface: CryptoCard
      Obtiene una referencia a la clave privada correspondiente al alias proporcionado.
      Specified by:
      getPrivateKey in interface CryptoCard
      Parameters:
      alias - Alias del certificado
      Returns:
      Referencia a la clave privada correspondiente al alias proporcionado o null si no existe ninguna clave privada con ese alias
    • sign

      public byte[] sign(byte[] data, String signAlgorithm, PrivateKeyReference privateKeyReference) throws CryptoCardException, PinException
      Description copied from interface: CryptoCard
      Realiza una firma electrónica.
      Specified by:
      sign in interface CryptoCard
      Parameters:
      data - Datos a firmar.
      signAlgorithm - Algoritmo de firma.
      privateKeyReference - Referencia a la clave privada de firma.
      Returns:
      Datos firmados (PKCS#1 v1.5).
      Throws:
      CryptoCardException - Si ocurre algún problema durante la firma.
      PinException - Si el PIN proporcionado es incorrecto o no es posible obtenerlo.
    • signInternal

      protected byte[] signInternal(byte[] data, String signAlgorithm, PrivateKeyReference privateKeyReference) throws CryptoCardException, PinException
      Ejecuta la operación interna de firma del DNIe.
      Parameters:
      data - Datos a firmar.
      signAlgorithm - Algoritmo de firma.
      privateKeyReference - Referencia a la clave privada de firma.
      Returns:
      Datos firmados.
      Throws:
      CryptoCardException - Si hay problemas durante el proceso.
      PinException - Si no se ha podido realizar la firma por un problema con el PIN (no estar hecha la autenticación de PIN).
    • needAuthorizationToSign

      protected boolean needAuthorizationToSign()
      Indica si la tarjeta requiere autorización del usuario para ejecutar una operación de firma.
      Returns:
      true si la tarjeta requiere autorización del usuario para ejecutar una operación de firma, false en caso contrario.
    • cipherData

      public byte[] cipherData(byte[] data, PrivateKeyReference privateKeyReference) throws CryptoCardException, PinException, LostChannelException
      Realiza un cifrado RSA directo con una clave privada.
      Parameters:
      data - Datos a cifrar.
      privateKeyReference - Referencia a la clave privada RSA a usar.
      Returns:
      Datos cifrados.
      Throws:
      CryptoCardException - Si hay errores en el proceso en la tarjeta o en la comunicación con ella.
      PinException - Si el PIN introducido no es correcto.
      LostChannelException - Si se pierde el canal de cifrado.
    • signOperation

      protected byte[] signOperation(byte[] data, String signAlgorithm, PrivateKeyReference privateKeyReference) throws CryptoCardException, PinException
      Realiza la operación de firma.
      Parameters:
      data - Datos que se desean firmar.
      signAlgorithm - Algoritmo de firma (por ejemplo, SHA512withRSA, SHA1withRSA, etc.).
      privateKeyReference - Referencia a la clave privada para la firma.
      Returns:
      Firma de los datos.
      Throws:
      CryptoCardException - Cuando se produce un error durante la operación de firma.
      PinException - Si el PIN proporcionado en la PasswordCallback es incorrecto y no estaba habilitado el reintento automático.
      AuthenticationModeLockedException - Cuando el DNIe está bloqueado.
    • openSecureChannelIfNotAlreadyOpened

      public void openSecureChannelIfNotAlreadyOpened() throws CryptoCardException, PinException
      Establece y abre el canal seguro CWA-14890 si no lo estaba ya.
      Throws:
      CryptoCardException - Si hay problemas en el proceso.
      PinException - Si el PIN usado para la apertura de canal no es válido o no se ha proporcionado un PIN para validar.
    • openSecureChannelIfNotAlreadyOpened

      public void openSecureChannelIfNotAlreadyOpened(boolean doChv) throws CryptoCardException, PinException
      Establece y abre el canal seguro CWA-14890 si no lo estaba ya.
      Parameters:
      doChv - true si la apertura de canal seguro debe incluir la verificación de PIN, false si debe abrirse canal seguro sin verificar PIN.
      Throws:
      CryptoCardException - Si hay problemas en el proceso.
      PinException - Si el PIN usado para la apertura de canal no es válido o no se ha proporcionado un PIN para validar (en el caso de que se opte por verificar el PIN).
    • getPinRetriesLeft

      public int getPinRetriesLeft() throws PinException
      Devuelve los intentos restantes de comprobación de PIN del DNIe.
      Returns:
      Intentos restantes de comprobación de PIN del DNIe.
      Throws:
      PinException - Si hay cualquier problema durante el proceso.
    • getInternalPasswordCallback

      protected PasswordCallback getInternalPasswordCallback() throws PinException, PasswordCallbackNotFoundException
      Obtiene la PasswordCallback predefinida.
      Returns:
      PasswordCallback predefinida.
      Throws:
      PinException - Si no se puede obtener el PIN del CallbackHandler.
      PasswordCallbackNotFoundException - Si no hay una PasswordCallback definida.
    • getInternalPasswordCallback

      protected PasswordCallback getInternalPasswordCallback(boolean reset) throws PinException, PasswordCallbackNotFoundException
      Obtiene la PasswordCallback predefinida.
      Parameters:
      reset - Si hay que eliinar cualquier PIN previemante introducido en la PasswordCallback.
      Returns:
      PasswordCallback predefinida.
      Throws:
      PinException - Si no se puede obtener el PIN del CallbackHandler.
      PasswordCallbackNotFoundException - Si no hay una PasswordCallback definida.
    • getPinMessage

      protected String getPinMessage(int retriesLeft)
      Devuelve el texto del diálogo de inserción de PIN.
      Parameters:
      retriesLeft - Intentos restantes antes de bloquear la tarjeta.
      Returns:
      Mensaje que mostrar en el cuerpo del diálogo de inserción de PIN.
    • loadCertificate

      Throws:
      IOException
      Iso7816FourCardException
      CertificateException
    • loadCertificates

      protected void loadCertificates() throws CryptoCardException
      Carga los certificados del DNIe. Necesita que estén previamente cargadas las rutas hacia los certificados.
      Throws:
      CryptoCardException - En cualquier error durante la carga.
    • selectMasterFile

      protected final void selectMasterFile() throws ApduConnectionException, Iso7816FourCardException
      Description copied from class: AbstractIso7816FourCard
      Selecciona el fichero maestro (directorio raíz de la tarjeta).
      Specified by:
      selectMasterFile in class AbstractIso7816FourCard
      Throws:
      ApduConnectionException - Si hay problemas en el envío de la APDU.
      Iso7816FourCardException - Si no se puede seleccionar el fichero maestro por cualquier otra causa.
    • isSecurityChannelOpen

      protected boolean isSecurityChannelOpen()
      Indica si el canal CWA-14890 está o no abierto.
      Returns:
      true si el canal CWA-14890 está abierto, false en caso contrario.
    • verifyPin

      public void verifyPin(PasswordCallback psc) throws ApduConnectionException, PinException
      Description copied from class: AbstractIso7816FourCard
      Verifica el PIN de la tarjeta. El método reintenta hasta que se introduce el PIN correctamente, se bloquea la tarjeta por exceso de intentos de introducción de PIN o se recibe una excepción (derivada de RuntimeException o una ApduConnectionException.
      Specified by:
      verifyPin in class AbstractIso7816FourCard
      Parameters:
      psc - PIN de la tarjeta.
      Throws:
      ApduConnectionException - Cuando ocurre un error en la comunicación con la tarjeta.
      PinException - Si el PIN proporcionado en la PasswordCallback es incorrecto y no estaba habilitado el reintento automático
    • getIfdKeyLength

      public int getIfdKeyLength(Cwa14890PublicConstants consts)
      Description copied from interface: Cwa14890Card
      Obtiene la longitud, en octetos, de las claves RSA del certificado de comnponente del terminal.
      Specified by:
      getIfdKeyLength in interface Cwa14890Card
      Parameters:
      consts - Clase de claves.
      Returns:
      Longitud, en octetos, de las claves RSA del certificado de comnponente del terminal.
    • changePIN

      public byte[] changePIN(String oldPin, String newPin) throws CryptoCardException, PinException
      Realiza la operación de cambio de PIN. Necesita tener un canal administrativo abierto.
      Parameters:
      oldPin - PIN actual.
      newPin - PIN nuevo.
      Returns:
      APDU de respuesta de la operación.
      Throws:
      CryptoCardException - Cuando se produce un error en el cambio de PIN.
      PinException - Si el PIN actual es incorrecto.
      AuthenticationModeLockedException - Cuando el DNIe está bloqueado.
    • setCallbackHandler

      public void setCallbackHandler(CallbackHandler handler)
      Asigna un CallbackHandler a la tarjeta.
      Parameters:
      handler - CallbackHandler a asignar.
    • setPasswordCallback

      public void setPasswordCallback(PasswordCallback pwc)
      Asigna un PasswordCallback a la tarjeta.
      Parameters:
      pwc - PasswordCallback a asignar.
    • getIdesp

      public String getIdesp() throws Iso7816FourCardException, IOException
      Obtiene el número de soporte (IDESP) del DNIe.
      Returns:
      Obtiene el número de soporte (IDESP) del DNIe.
      Throws:
      Iso7816FourCardException - Si hay problemas enviando la APDU.
      FileNotFoundException - Si no se encuentra el fichero que contiene el IDESP.
      IOException - Si no se puede conectar con la tarjeta.
    • needsPinForLoadingCerts

      protected boolean needsPinForLoadingCerts()
      Indica si este DNIe necesita validar el PIN para tener acceso a los certificados.
      Returns:
      true si este DNIe necesita validar el PIN para tener acceso a los certificados false en caso contrario.
    • loadCertificatesIfNotAlreadyLoaded

      private void loadCertificatesIfNotAlreadyLoaded() throws ApduConnectionException, CryptoCardException, PinException
      Carga los certificados del DNIe si no lo estaban ya.
      Throws:
      PinException - Si se necesita el PIN para cargar certificados y no se ha podido comprobar el PIN.
      ApduConnectionException
      CryptoCardException