From d7fde6fc92f36a7cc8b8d412724951b12193bb9b Mon Sep 17 00:00:00 2001 From: clemenso Date: Wed, 11 Feb 2009 20:01:17 +0000 Subject: activation applet (NO PINMgmt yet) git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@295 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../bku/smccstal/ext/CardMgmtRequestHandler.java | 48 ++++++++--- .../bku/smccstal/ext/PINMgmtRequestHandler.java | 93 ++++++++++++++++++++++ 2 files changed, 130 insertions(+), 11 deletions(-) create mode 100644 BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINMgmtRequestHandler.java (limited to 'BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext') diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/CardMgmtRequestHandler.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/CardMgmtRequestHandler.java index f499de7e..769342e7 100644 --- a/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/CardMgmtRequestHandler.java +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/CardMgmtRequestHandler.java @@ -19,6 +19,7 @@ */ package at.gv.egiz.bku.smccstal.ext; +import at.gv.egiz.bku.gui.ActivationGUIFacade; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -45,12 +46,13 @@ import at.gv.egiz.stal.ext.APDUScriptRequest.Reset; import at.gv.egiz.stal.ext.APDUScriptResponse.Response; import at.gv.egiz.stal.ext.APDUScriptResponse.ATR; import at.gv.egiz.stal.ext.APDUScriptResponse.ResponseScriptElement; +import java.awt.event.ActionListener; /** * @author mcentner * */ -public class CardMgmtRequestHandler extends AbstractRequestHandler { +public class CardMgmtRequestHandler extends AbstractRequestHandler implements ActionListener { /** * Logging facility. @@ -61,7 +63,12 @@ public class CardMgmtRequestHandler extends AbstractRequestHandler { * The sequence counter. */ private int sequenceNum = 0; - + + /** + * display script num + */ + private int currentActivationScript = 0; + @Override public STALResponse handleRequest(STALRequest request) throws InterruptedException { @@ -69,7 +76,8 @@ public class CardMgmtRequestHandler extends AbstractRequestHandler { // APDU Script Request if (request instanceof APDUScriptRequest) { - gui.showWaitDialog("CardChannel"); + currentActivationScript++; + log.debug("handling APDU script " + currentActivationScript); Card icc = card.getCard(); @@ -81,20 +89,28 @@ public class CardMgmtRequestHandler extends AbstractRequestHandler { List script = ((APDUScriptRequest) request).getScript(); ArrayList responses = new ArrayList(script.size()); + ((ActivationGUIFacade) gui).showActivationProgressDialog(currentActivationScript, script.size(), this, "cancel"); + try { + log.trace("begin exclusive"); icc.beginExclusive(); for (RequestScriptElement scriptElement : script) { + ((ActivationGUIFacade) gui).incrementProgress(); + if (scriptElement instanceof Command) { + log.trace("handling APDU script element COMMAND"); Command command = (Command) scriptElement; CommandAPDU commandAPDU = new CommandAPDU(command.getCommandAPDU()); - + + log.trace("get basicchannel"); CardChannel channel = icc.getBasicChannel(); sequenceNum = command.getSequence(); - log.debug("Transmit " + sequenceNum + " " + commandAPDU.toString()); + log.debug("Transmit APDU (sequence=" + sequenceNum + ")"); + log.trace(commandAPDU.toString()); ResponseAPDU responseAPDU = channel.transmit(commandAPDU); - log.debug("" + responseAPDU); + log.trace(responseAPDU.toString()); byte[] sw = new byte[] { (byte) (0xFF & responseAPDU.getSW1()), @@ -105,16 +121,22 @@ public class CardMgmtRequestHandler extends AbstractRequestHandler { if (command.getExpectedSW() != null && !Arrays.equals(sw, command.getExpectedSW())) { // unexpected SW - log.info("Got unexpected SW. APDU-script execution stopped."); + log.warn("Got unexpected SW. APDU-script execution stopped."); break; } } else if (scriptElement instanceof Reset) { - + + log.trace("handling APDU script element RESET"); sequenceNum = 0; card.reset(); - responses.add(new ATR(icc.getATR().getBytes())); - + javax.smartcardio.ATR atr = icc.getATR(); + log.trace("got ATR: " + atr.toString()); + responses.add(new ATR(atr.getBytes())); + + log.trace("regain exclusive access to card"); + icc = card.getCard(); + icc.beginExclusive(); } } @@ -125,6 +147,9 @@ public class CardMgmtRequestHandler extends AbstractRequestHandler { } catch (SignatureCardException e) { log.info("Failed to reset smart card.", e); responses.add(new Response(sequenceNum, null, null, Response.RC_UNSPECIFIED)); + } catch (RuntimeException e) { + log.error(e); + throw e; } finally { try { icc.endExclusive(); @@ -133,7 +158,8 @@ public class CardMgmtRequestHandler extends AbstractRequestHandler { } } - gui.showWaitDialog("wait for server..."); + log.trace("done handling APDU script " + currentActivationScript + ", return response containing " + responses.size() + " elements"); + ((ActivationGUIFacade) gui).showIdleDialog(this, "cancel"); return new APDUScriptResponse(responses); } else { diff --git a/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINMgmtRequestHandler.java b/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINMgmtRequestHandler.java new file mode 100644 index 00000000..b2d34ff2 --- /dev/null +++ b/BKUAppletExt/src/main/java/at/gv/egiz/bku/smccstal/ext/PINMgmtRequestHandler.java @@ -0,0 +1,93 @@ +/* + * Copyright 2008 Federal Chancellery Austria and + * Graz University of Technology + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package at.gv.egiz.bku.smccstal.ext; + +import at.gv.egiz.bku.gui.PINStatusProvider; +import at.gv.egiz.bku.smccstal.AbstractRequestHandler; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.stal.ErrorResponse; +import at.gv.egiz.stal.STALRequest; +import at.gv.egiz.stal.STALResponse; +import at.gv.egiz.stal.ext.ActivatePINRequest; +import at.gv.egiz.stal.ext.ChangePINRequest; +import at.gv.egiz.stal.ext.UnblockPINRequest; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.smartcardio.Card; +import javax.smartcardio.CardChannel; +import javax.smartcardio.CardException; +import javax.smartcardio.CommandAPDU; +import javax.smartcardio.ResponseAPDU; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +/** + * + * @author Clemens Orthacker + */ +public class PINMgmtRequestHandler extends AbstractRequestHandler implements PINStatusProvider { + + protected static final Log log = LogFactory.getLog(PINMgmtRequestHandler.class); + + @Override + public STALResponse handleRequest(STALRequest request) throws InterruptedException { + if (request instanceof ActivatePINRequest) { + log.error("not implemented yet"); + return new ErrorResponse(1000); + + } else if (request instanceof ChangePINRequest) { + log.error("not implemented yet"); + return new ErrorResponse(1000); + + } else if (request instanceof UnblockPINRequest) { + log.error("not implemented yet"); + return new ErrorResponse(1000); + + } else { + log.error("Got unexpected STAL request: " + request); + return new ErrorResponse(1000); + } + } + + @Override + public boolean requireCard() { + return true; + } + + @Override + public STATUS getPINStatus(int pin) throws SignatureCardException { + try { + Card icc = card.getCard(); + icc.beginExclusive(); + CardChannel channel = icc.getBasicChannel(); + CommandAPDU verifyAPDU = new CommandAPDU(new byte[] {(byte) 0x00} ); + ResponseAPDU responseAPDU = channel.transmit(verifyAPDU); + byte sw1 = (byte) responseAPDU.getSW1(); + byte[] sw = new byte[] { + (byte) (0xFF & responseAPDU.getSW1()), + (byte) (0xFF & responseAPDU.getSW2()) }; + + icc.endExclusive(); + return STATUS.ACTIV; + } catch (CardException ex) { + log.error("Failed to get PIN status: " + ex.getMessage()); + throw new SignatureCardException("Failed to get PIN status", ex); + } + } + +} -- cgit v1.2.3