Foros de consultas y discusión

Verificación de PIN

Nicolás Balparda, modificado hace 6 años.

Verificación de PIN

Youngling Mensajes: 5 Fecha de incorporación: 26/12/17 Mensajes recientes
Buenas, ¿cómo están?

Estoy intentando verificar el PIN de la cédula electrónica, pero cada vez que mando el comando me retorna 6D00 - como si la instrucción no se entendiera. Estoy haciendo la misma prueba que está en el sitio.

¿Alguna idea?

Saludos,
​​​​​​​Nicolás
thumbnail
Francisco Perdomo, modificado hace 6 años.

RE: Verificación de PIN

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Buenas Nicolás, 

Te animás a darnos mas contexto para ver como atacar el problema? 

En qué ambiente estás? Que código estás usando? Que línea es en la que termina fallando? 
Alguno dato más que pueda ser relevante.

Estamos a las órdenes, trataremos de responder lo más pronto posible

Francisco
Nicolás Balparda, modificado hace 6 años.

RE: Verificación de PIN

Youngling Mensajes: 5 Fecha de incorporación: 26/12/17 Mensajes recientes
Francisco, ¿cómo estás?


Estoy desde Visual Studio (C#). Mi código es el siguiente. La respuesta en la variable vRespuestaHEXA es la que digo que me devuelve 6D00. Estoy haciendo pruebas conceptuales para luego generar el módulo, pero no logro que esto me funcione bien. La extracción de los datos filiatorios, número de cédula y la imagen la logro sin inconveniente.

Saludos & gracias,

public static bool ValidarPIN(int pPIN)
        {
            bool vResultado = false;

            SCardContext vSCardContext = ComandosAPDU.IniciarConexion();
            SCardReader vSCardReader = ConectarADispositivo(vSCardContext);

            byte[] vComandoTemporal = new byte[] { 0x00, 0x20, 0x00, 0x11, 0x0C };
            byte[] vComandoPIN = new byte[12];

            char[] vPINChar = pPIN.ToString().ToCharArray();
            byte[] vConvertido = new byte[vPINChar.Length];
            for (int i = 0; i < vPINChar.Length; i++)
            {
                vConvertido = (byte)vPINChar;
            }
            byte vCero = 0;
            for (int i = 0; i < vComandoPIN.Length; i++)
            {
                vComandoPIN = vConvertido.Length <= i ? vCero : vConvertido;
            }
            byte[] vComando = new byte[vComandoTemporal.Length + vComandoPIN.Length];

            System.Buffer.BlockCopy(vComandoTemporal, 0, vComando, 0, vComandoTemporal.Length);
            System.Buffer.BlockCopy(vComandoPIN, 0, vComando, vComandoTemporal.Length, vComandoPIN.Length);

            byte[] vRespuesta = Transmitir(vSCardReader, vComando, true, true);
            string vRespuestaHEXA = Utils.byteArrayToHex(vRespuesta);
            vComando = new byte[] { 0x00, 0x20, 0x00, 0x11, 0x00 };
            vRespuesta = Transmitir(vSCardReader, vComando, true, true);

            LiberarConexion(vSCardContext);

            return vResultado;
        }
thumbnail
Francisco Perdomo, modificado hace 6 años.

RE: Verificación de PIN

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes

            byte[] vComandoTemporal = new byte[] { 0x00, 0x20, 0x00, 0x11, 0x0C };
         
          

El último bloque hexa no lo estaríamos usando en el código nuestro
Te paso el código que tenemos de verificar PIN:

 private static boolean verifyPIN(CardChannel channel) throws CardException, FileNotFoundException, UnsupportedEncodingException {
        String CLASS = "00";
        String INSTRUCTION = "20";
        String PARAM1 = "00";
        String PARAM2 = "11";

        String dataIN = PIN_ASCII; // 1234

        // Aparentemente el Reference PIN es de 12 bytes de largo,
        // por lo que el DATA tiene que ser siempre de 12 bytes.
        // se pone con padding de ceros para completar 12.
        // Los caracteres van codificados en ascii, hay que ver si se hace
        // enforcement de eso
        byte CLASSbyte = Utils.hexStringToByteArray(CLASS)[0];
        byte INSbyte = Utils.hexStringToByteArray(INSTRUCTION)[0];
        byte P1byte = Utils.hexStringToByteArray(PARAM1)[0];
        byte P2byte = Utils.hexStringToByteArray(PARAM2)[0];
        ResponseAPDU r = Utils.sendCommand(channel, CLASSbyte, INSbyte, P1byte, P2byte, Utils.hexStringToByteArray(dataIN), 0);
        System.out.println(r.getSW1()+""+r.getSW2());
        return (r.getSW1() == (int) 0x90 && r.getSW2() == (int) 0x00);

        // El SW 6A80 indica error de codificacion, es decir, en los TLV
        // El SW 63Cx indica error de match y que quedan x intentos
        // 9000 es SW de exito
    }
La respuesta que te da no la conozco bien, pero puedes hacer la prueba sin mandar el 0Ch y decirnos que te devuelve, capaz con eso se resuelve todo.
Comparaste lo que tienes con nuestro código? Está en java pero capaz que puedes ver alguna diferencia (y está bastante bien documentado) https://github.com/eIDuy/apdu-services
2.5.0.0
thumbnail
Francisco Perdomo, modificado hace 6 años.

RE: Verificación de PIN

Padawan Mensajes: 36 Fecha de incorporación: 27/03/17 Mensajes recientes
Por las dudas tambien te consulto: antes de que se corra ese código está seleccionado el IAS?
2.5.0.0
Nicolás Balparda, modificado hace 6 años.

RE: Verificación de PIN

Youngling Mensajes: 5 Fecha de incorporación: 26/12/17 Mensajes recientes
Francisco, ¿cómo estás?

Me estaba faltando el IAS (mala mía emoticon).

¡Gracias por tu ayuda!

Saludos,

​​​​​​​Nicolás