Class Dnie

    • Field Detail

      • LOGGER

        protected static final java.util.logging.Logger LOGGER
        Registro.
      • ERROR_PIN_SW1

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

        private transient javax.security.auth.callback.CallbackHandler callbackHandler
      • aliases

        private transient java.lang.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 java.lang.String MASTER_FILE_NAME
        Nombre del Master File del DNIe.
        See Also:
        Constant Field Values
      • CERT_ALIAS_AUTH

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

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

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

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

        public static final java.lang.String CERT_ALIAS_INTERMEDIATE_CA
        Alias del certificado de CA intermedia (siempre el mismo en el DNIe).
        See Also:
        Constant Field Values
      • 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 java.security.cert.X509Certificate certAuth
        Certificado de autenticación.
      • certSign

        protected transient java.security.cert.X509Certificate certSign
        Certificado de firma.
      • certCyph

        protected transient java.security.cert.X509Certificate certCyph
        Certificado de cifrado.
      • certSignAlias

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

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

        protected transient java.security.cert.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.
      • 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 javax.security.auth.callback.PasswordCallback passwordCallback
    • Constructor Detail

      • Dnie

        protected Dnie​(ApduConnection conn,
                       javax.security.auth.callback.PasswordCallback pwc,
                       CryptoHelper cryptoHlpr,
                       javax.security.auth.callback.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,
                       javax.security.auth.callback.PasswordCallback pwc,
                       CryptoHelper cryptoHlpr,
                       javax.security.auth.callback.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 Detail

      • 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 javax.security.auth.callback.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 java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • 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.
      • getAliases

        public java.lang.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
      • 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 java.security.cert.X509Certificate getCertificate​(java.lang.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 java.security.interfaces.RSAPublicKey getIccCertPublicKey()
                                                                  throws java.io.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:
        java.io.IOException - Cuando ocurre algún problema en la selección y lectura del certificado
      • 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 java.security.interfaces.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 - Cuando ocurre un error de comunicación con la tarjeta.
      • 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​(java.lang.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,
                           java.lang.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,
                                      java.lang.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.
      • signOperation

        protected byte[] signOperation​(byte[] data,
                                       java.lang.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 javax.security.auth.callback.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 java.lang.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

        private java.security.cert.X509Certificate loadCertificate​(Location location)
                                                            throws java.io.IOException,
                                                                   Iso7816FourCardException,
                                                                   java.security.cert.CertificateException
        Throws:
        java.io.IOException
        Iso7816FourCardException
        java.security.cert.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.
      • 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​(javax.security.auth.callback.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​(java.lang.String oldPin,
                                java.lang.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​(javax.security.auth.callback.CallbackHandler handler)
        Asigna un CallbackHandler a la tarjeta.
        Parameters:
        handler - CallbackHandler a asignar.
      • setPasswordCallback

        public void setPasswordCallback​(javax.security.auth.callback.PasswordCallback pwc)
        Asigna un PasswordCallback a la tarjeta.
        Parameters:
        pwc - PasswordCallback a asignar.
      • getIdesp

        public java.lang.String getIdesp()
                                  throws Iso7816FourCardException,
                                         java.io.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.
        java.io.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.