Search in sources :

Example 1 with SCIOCard

use of org.openecard.common.ifd.scio.SCIOCard in project open-ecard by ecsec.

the class IFD method disconnect.

@Override
public synchronized DisconnectResponse disconnect(Disconnect parameters) {
    try {
        DisconnectResponse response;
        if (!hasContext()) {
            String msg = "Context not initialized.";
            Result r = WSHelper.makeResultError(ECardConstants.Minor.IFD.INVALID_SLOT_HANDLE, msg);
            response = WSHelper.makeResponse(DisconnectResponse.class, r);
            return response;
        }
        try {
            byte[] handle = parameters.getSlotHandle();
            SingleThreadChannel ch = cm.getSlaveChannel(handle);
            cm.closeSlaveChannel(handle);
            // process actions
            SCIOCard card = ch.getChannel().getCard();
            ActionType action = parameters.getAction();
            if (ActionType.RESET == action) {
                String ifdName = card.getTerminal().getName();
                SingleThreadChannel master = cm.getMasterChannel(ifdName);
                HandlerBuilder builder = HandlerBuilder.create();
                ConnectionHandleType cHandleIn = builder.setCardType(ECardConstants.UNKNOWN_CARD).setCardIdentifier(card.getATR().getBytes()).setContextHandle(ctxHandle).setIfdName(ifdName).setSlotIdx(BigInteger.ZERO).buildConnectionHandle();
                builder = HandlerBuilder.create();
                ConnectionHandleType cHandleRm = builder.setContextHandle(ctxHandle).setIfdName(ifdName).setSlotIdx(BigInteger.ZERO).buildConnectionHandle();
                try {
                    master.reconnect();
                    evManager.resetCard(cHandleRm, cHandleIn, card.getProtocol().toUri());
                } catch (IllegalStateException ex) {
                    LOG.warn("Card reconnect failed, trying to establish new card connection.", ex);
                    cm.closeMasterChannel(ifdName);
                    LOG.debug("Master channel closed successfully.");
                    try {
                        cm.getMasterChannel(ifdName);
                        LOG.debug("New card connection established successfully.");
                        evManager.resetCard(cHandleRm, cHandleIn, card.getProtocol().toUri());
                    } catch (NoSuchTerminal ex2) {
                        LOG.error("No terminal present anymore.", ex);
                    }
                }
            }
            // TODO: take care of other actions (probably over ControlIFD)
            // the default is to not disconnect the card, because all existing connections would be broken
            response = WSHelper.makeResponse(DisconnectResponse.class, WSHelper.makeResultOK());
            return response;
        } catch (NoSuchChannel ex) {
            String msg = "No card available in the requested terminal.";
            Result r = WSHelper.makeResultError(ECardConstants.Minor.IFD.INVALID_SLOT_HANDLE, msg);
            response = WSHelper.makeResponse(DisconnectResponse.class, r);
            LOG.warn(msg, ex);
            return response;
        } catch (SCIOException ex) {
            String msg = "Unknown error in the underlying SCIO implementation.";
            Result r = WSHelper.makeResultUnknownError(msg);
            response = WSHelper.makeResponse(DisconnectResponse.class, r);
            LOG.warn(msg, ex);
            return response;
        }
    } catch (Exception ex) {
        LOG.warn(ex.getMessage(), ex);
        throwThreadKillException(ex);
        return WSHelper.makeResponse(DisconnectResponse.class, WSHelper.makeResult(ex));
    }
}
Also used : ConnectionHandleType(iso.std.iso_iec._24727.tech.schema.ConnectionHandleType) ActionType(iso.std.iso_iec._24727.tech.schema.ActionType) NoSuchTerminal(org.openecard.common.ifd.scio.NoSuchTerminal) SingleThreadChannel(org.openecard.ifd.scio.wrapper.SingleThreadChannel) NoSuchChannel(org.openecard.ifd.scio.wrapper.NoSuchChannel) SCIOException(org.openecard.common.ifd.scio.SCIOException) SCIOCard(org.openecard.common.ifd.scio.SCIOCard) ThreadTerminateException(org.openecard.common.ThreadTerminateException) SCIOException(org.openecard.common.ifd.scio.SCIOException) ExecutionException(java.util.concurrent.ExecutionException) Result(oasis.names.tc.dss._1_0.core.schema.Result) DisconnectResponse(iso.std.iso_iec._24727.tech.schema.DisconnectResponse) HandlerBuilder(org.openecard.common.util.HandlerBuilder)

Example 2 with SCIOCard

use of org.openecard.common.ifd.scio.SCIOCard in project open-ecard by ecsec.

the class SingleThreadChannel method connectCard.

private static SCIOCard connectCard(SCIOTerminal term) throws SCIOException {
    SCIOCard card;
    try {
        card = term.connect(SCIOProtocol.T1);
    } catch (SCIOException e1) {
        try {
            card = term.connect(SCIOProtocol.TCL);
        } catch (SCIOException e2) {
            try {
                card = term.connect(SCIOProtocol.T0);
            } catch (SCIOException e3) {
                try {
                    card = term.connect(SCIOProtocol.ANY);
                } catch (SCIOException ex) {
                    throw new SCIOException("Reader refused to connect card with any protocol.", ex.getCode());
                }
            }
        }
    }
    LOG.info("Card connected with protocol {}.", card.getProtocol());
    return card;
}
Also used : SCIOException(org.openecard.common.ifd.scio.SCIOException) SCIOCard(org.openecard.common.ifd.scio.SCIOCard)

Example 3 with SCIOCard

use of org.openecard.common.ifd.scio.SCIOCard in project open-ecard by ecsec.

the class SingleThreadChannel method reconnect.

@Override
public void reconnect() throws SCIOException {
    if (channel.isBasicChannel()) {
        SCIOCard card = channel.getCard();
        SCIOTerminal term = card.getTerminal();
        channel.close();
        card.disconnect(true);
        card = connectCard(term);
        channel = card.getBasicChannel();
        removeSecureMessaging();
    } else {
        throw new RuntimeException("Reconnect called on logical channel.");
    }
}
Also used : SCIOTerminal(org.openecard.common.ifd.scio.SCIOTerminal) SCIOCard(org.openecard.common.ifd.scio.SCIOCard)

Aggregations

SCIOCard (org.openecard.common.ifd.scio.SCIOCard)3 SCIOException (org.openecard.common.ifd.scio.SCIOException)2 ActionType (iso.std.iso_iec._24727.tech.schema.ActionType)1 ConnectionHandleType (iso.std.iso_iec._24727.tech.schema.ConnectionHandleType)1 DisconnectResponse (iso.std.iso_iec._24727.tech.schema.DisconnectResponse)1 ExecutionException (java.util.concurrent.ExecutionException)1 Result (oasis.names.tc.dss._1_0.core.schema.Result)1 ThreadTerminateException (org.openecard.common.ThreadTerminateException)1 NoSuchTerminal (org.openecard.common.ifd.scio.NoSuchTerminal)1 SCIOTerminal (org.openecard.common.ifd.scio.SCIOTerminal)1 HandlerBuilder (org.openecard.common.util.HandlerBuilder)1 NoSuchChannel (org.openecard.ifd.scio.wrapper.NoSuchChannel)1 SingleThreadChannel (org.openecard.ifd.scio.wrapper.SingleThreadChannel)1