Conexión Smart Card Simple con Java

Ejemplo conexión a un chip smartcard, utilizando Java

import java.util.List;

import javax.smartcardio.Card;
import javax.smartcardio.CardChannel;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.ATR;
import javax.smartcardio.CommandAPDU;
import javax.smartcardio.ResponseAPDU;
import javax.smartcardio.TerminalFactory;

/**
* Clase que maneja las conexiones PC/SC
*
* @version 2.0 Marzo de 2014
* @author Julio Chinchilla
*/
public class SCardConexion  {

    private Card card = null;
    private CardChannel channel = null;    

    /**
     * Devuelve una lista de objetos tipo CardTerminal, donde viene toda la
     * información de las terminales PC/SC conectadas
     * @return
     * @throws CardException
     */
    public synchronized List<CardTerminal> terminals () throws CardException {
        TerminalFactory factory = TerminalFactory.getDefault();
        return factory.terminals().list();
    }

    /**
    * Metodo conncet abre la conección utilizando un canal básico con el PC/SC
    * @param t número de lector PC/SC conectado al puerto USB
    * @param protocol protocolo a utilizar durante la conección utilice ("T=0", "T=1",
    * o "T=CL"), o "*" para conectar al protocolo disponible durante la conexion
    * @return Un objeto de tipo ATR que contiene el mensaje de contacto Anwer to reset
    * @see <a href="http://es.wikipedia.org/wiki/Tarjeta_inteligente">WikiES: Tarjeta inteligente</a>
    * @see <a href="http://en.wikipedia.org/wiki/Answer_to_reset">WikiEng: Answer to reset</a>
    * @throws CardException
    */
    public synchronized ATR connect (int t, String protocol) throws CardException {
        CardTerminal terminal = this.terminals().get(t);
        card = terminal.connect(protocol);
        card.beginExclusive();
        channel = card.getBasicChannel();
        return card.getATR();
    }

    /**
    * Metodo transmit, transmite un comando hacia el canal abierto de la conexión PC/SC
    * @param apdu recibe un objeto de tipo CommandAPDU
    * @return Un objeto de tipo ResponseAPDU que contiene la data de respuesta Response Data Lr y SW1-SW2
    * @see <a href="http://es.wikipedia.org/wiki/Application_Protocol_Data_Unit">WikiES: Application Protocol Data Unit</a>
    * @throws CardException
    */
    public synchronized ResponseAPDU transmit (CommandAPDU apdu) throws CardException {
        return channel.transmit(apdu);
    }

    /**
     * Metodo disconnect, desconeta la conexion PC/SC terminando el canal exclusivo
     * @throws CardException
     */
    public synchronized void disconnect () throws CardException {
        card.endExclusive();
        card.disconnect(true);
    }    

}
Anuncios

8 comentarios sobre “Conexión Smart Card Simple con Java

  1. Muchas gracias por el ejemplo la verdad esta muy claro y muy bien explicado, pero tengo una duda como se cual es el número de lector PC/SC conectado al puerto USB

    lo siento si mi pregunta es muy obvia y de ante mano te agradezco

    saludos,

      1. Muchas gracias por tu pronta respuesta Julio, te comento que e llamado previamente el método terminals() pero no me retorna nada pero al enviarle como parámetro 0 si conecta con la tarjeta, ahora bien quiero leer un DPI para un proyecto de la universidad pero no se que mandarle como CommandAPDU tu me podrías ayudar?

        Gracias por el apoyo

      2. Lo que te devuelve es una Lista de objetos CardTerminal, ese objeto trae sus metodos como getName() o isCardPresent(), no devuelve el número de objeto pero en el recorrido de la lista puedes agrear el número usando el del recorrido. Por cierto: Voy a estar dando una charla en el Java Day 2017, los temas a abarcar son: Conexiones SmartCard y Lectura de Tarjetas de crédito, tocaré temas como los estándares IS7816 y el EMV. La idea es ver el tema de SmartCard desde cero y tocar estándares que usan las tarjetas de crédito, asi como ciertos detalles de operaciones con bits y la libería smartcardio de java.

      3. Hola Gracias por los ejemplos e información proporcionada, me ha servido de ayuda. Yo también estoy haciendo un proyecto sobre esto, pero al igual a al comentario de la persona anterior me confunde un poco el tema de CommandAPDU y los datos obtenidos. Gracias por compartir.

      4. Voy a estar dando una charla en el Java Day 2017, los temas a abarcar son: Conexiones SmartCard y Lectura de Tarjetas de crédito, tocaré temas como los estándares IS7816 y el EMV.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s