package mixconfig.tools.dataretention.smartcard; import java.util.List; import javax.smartcardio.ATR; import javax.smartcardio.Card; import javax.smartcardio.CardChannel; import javax.smartcardio.CardException; import javax.smartcardio.CardTerminal; import javax.smartcardio.CommandAPDU; import javax.smartcardio.ResponseAPDU; import javax.smartcardio.TerminalFactory; import mixconfig.tools.dataretention.smartcard.commands.AbstractCommand; import mixconfig.tools.dataretention.smartcard.commands.ErrorCodeException; import mixconfig.tools.dataretention.smartcard.commands.SelectAnonCardAppletCommand; public class ConnectionManager { private static ConnectionManager instance; private CardChannel channel; /** * Cached version of the SmartCardProxy */ private ISmartCard smartCard; private ConnectionManager() { // Empty constructor for singleton } public static ConnectionManager getInstance() { if (instance == null) { instance = new ConnectionManager(); } return instance; } public ISmartCard connect() { if (smartCard == null) { /* * Socket sock; sock = new Socket("localhost", 9025); InputStream is * = sock.getInputStream(); OutputStream os = * sock.getOutputStream(); * * channel = CadDevice.getCadClientInstance(CadDevice.PROTOCOL_T1, * is, os); channel.powerUp(); if (useEmulator) { * installAnonApplet(); } */ if (connectToSmartCard()) { smartCard = new SmartCardProxy(this); } } return smartCard; } private void selectAnonApplet() throws ErrorCodeException { AbstractCommand command = new SelectAnonCardAppletCommand(); processCommand(command); } public void disconnect() { /* * try { channel.powerDown(); } catch (IOException e) { // TODO * Auto-generated catch block e.printStackTrace(); } catch * (CadTransportException e) { // TODO Auto-generated catch block * e.printStackTrace(); } */ } void processCommand(AbstractCommand command) throws ErrorCodeException { CommandAPDU commandApdu = command.buildCommandApdu(); ResponseAPDU responseApdu; try { responseApdu = channel.transmit(commandApdu); command.setResponse(responseApdu.getData(), responseApdu.getSW1(), responseApdu.getSW2()); } catch (CardException e) { e.printStackTrace(); } } /** * Method returns list of smart card readers available in system * * @returns readersList * */ private List getReaderList() { try { TerminalFactory factory = TerminalFactory.getDefault(); List readersList = factory.terminals().list(); return readersList; } catch (Exception ex) { System.out.println("Exception : " + ex); return null; } } public boolean connectToSmartCard() { // TRY ALL READERS, FIND FIRST SELECTABLE List terminalList = getReaderList(); // List numbers of Card readers for (int i = 0; i < terminalList.size(); i++) { System.out.println(i + " : " + terminalList.get(i)); CardTerminal m_terminal = terminalList.get(i); try { if (m_terminal.isCardPresent()) { // TRY TO CONNECT VIA T0 AND IF FAIL THEN BY T1 // Card m_card = m_terminal.connect("T=0"); Card m_card = m_terminal.connect("*"); System.out.println("card: " + m_card); channel = m_card.getBasicChannel(); // reset the card ATR atr = m_card.getATR(); System.out.println(atr.toString()); // SELECT APPLET try { selectAnonApplet(); return true; } catch (ErrorCodeException e) { System.out.println("Card without ANONCardApplet found."); } } } catch (CardException e) { System.out.println("Cannot communicate with Card."); } } channel = null; return false; } }