summaryrefslogtreecommitdiff
path: root/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader
diff options
context:
space:
mode:
Diffstat (limited to 'mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader')
-rw-r--r--mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/CardReader.java92
-rw-r--r--mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java106
-rw-r--r--mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java703
-rw-r--r--mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/ReaderFactory.java125
4 files changed, 0 insertions, 1026 deletions
diff --git a/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/CardReader.java b/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/CardReader.java
deleted file mode 100644
index a1246dd6..00000000
--- a/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/CardReader.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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.smcc.reader;
-
-import javax.smartcardio.CardChannel;
-import javax.smartcardio.CardException;
-import javax.smartcardio.ResponseAPDU;
-
-import at.gv.egiz.smcc.CancelledException;
-import at.gv.egiz.smcc.ChangeReferenceDataAPDUSpec;
-import at.gv.egiz.smcc.NewReferenceDataAPDUSpec;
-import at.gv.egiz.smcc.PINSpec;
-import at.gv.egiz.smcc.ResetRetryCounterAPDUSpec;
-import at.gv.egiz.smcc.SignatureCardException;
-import at.gv.egiz.smcc.VerifyAPDUSpec;
-import at.gv.egiz.smcc.pin.gui.ModifyPINGUI;
-import at.gv.egiz.smcc.pin.gui.PINGUI;
-import javax.smartcardio.Card;
-
-/**
- *
- * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
- */
-public interface CardReader {
-
-
- String[] FEATURES = new String[]{"NO_FEATURE",
- "FEATURE_VERIFY_PIN_START",
- "FEATURE_VERIFY_PIN_FINISH",
- "FEATURE_MODIFY_PIN_START",
- "FEATURE_MODIFY_PIN_FINISH",
- "FEATURE_GET_KEY_PRESSED",
- "FEATURE_VERIFY_PIN_DIRECT",
- "FEATURE_MODIFY_PIN_DIRECT",
- "FEATURE_MCT_READER_DIRECT",
- "FEATURE_MCT_UNIVERSAL",
- "FEATURE_IFD_PIN_PROPERTIES",
- "FEATURE_ABORT",
- "FEATURE_SET_SPE_MESSAGE",
- "FEATURE_VERIFY_PIN_DIRECT_APP_ID",
- "FEATURE_MODIFY_PIN_DIRECT_APP_ID",
- "FEATURE_WRITE_DISPLAY",
- "FEATURE_GET_KEY",
- "FEATURE_IFD_DISPLAY_PROPERTIES"};
-
- Byte FEATURE_VERIFY_PIN_START = new Byte((byte) 0x01);
- Byte FEATURE_VERIFY_PIN_FINISH = new Byte((byte) 0x02);
- Byte FEATURE_MODIFY_PIN_START = new Byte((byte) 0x03);
- Byte FEATURE_MODIFY_PIN_FINISH = new Byte((byte) 0x04);
- Byte FEATURE_GET_KEY_PRESSED = new Byte((byte) 0x05);
- Byte FEATURE_VERIFY_PIN_DIRECT = new Byte((byte) 0x06);
- Byte FEATURE_MODIFY_PIN_DIRECT = new Byte((byte) 0x07);
- Byte FEATURE_MCT_READER_DIRECT = new Byte((byte) 0x08);
- Byte FEATURE_MCT_UNIVERSAL = new Byte((byte) 0x09);
- Byte FEATURE_IFD_PIN_PROPERTIES = new Byte((byte) 0x0a);
- //TODO continue list
-
-
- Card connect() throws CardException;
-
- boolean hasFeature(Byte feature);
-
- ResponseAPDU verify(CardChannel channel, VerifyAPDUSpec apduSpec,
- PINGUI pinGUI, PINSpec pinSpec, int retries)
- throws CancelledException, InterruptedException, CardException, SignatureCardException;
-
- ResponseAPDU modify(CardChannel channel, ChangeReferenceDataAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec, int retries)
- throws CancelledException, InterruptedException, CardException, SignatureCardException;
-
- ResponseAPDU modify(CardChannel channel, NewReferenceDataAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec)
- throws CancelledException, InterruptedException, CardException, SignatureCardException;
-
- ResponseAPDU modify(CardChannel channel, ResetRetryCounterAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec, int retries)
- throws CancelledException, InterruptedException, CardException, SignatureCardException;
-}
diff --git a/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java b/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java
deleted file mode 100644
index 03a794fe..00000000
--- a/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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.smcc.reader;
-
-
-import javax.smartcardio.Card;
-import javax.smartcardio.CardChannel;
-import javax.smartcardio.CardException;
-import javax.smartcardio.CardTerminal;
-import javax.smartcardio.ResponseAPDU;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import at.gv.egiz.smcc.ChangeReferenceDataAPDUSpec;
-import at.gv.egiz.smcc.NewReferenceDataAPDUSpec;
-import at.gv.egiz.smcc.PINSpec;
-import at.gv.egiz.smcc.ResetRetryCounterAPDUSpec;
-import at.gv.egiz.smcc.SignatureCardException;
-import at.gv.egiz.smcc.VerifyAPDUSpec;
-import at.gv.egiz.smcc.pin.gui.ModifyPINGUI;
-import at.gv.egiz.smcc.pin.gui.PINGUI;
-import at.gv.egiz.smcc.util.ISO7816Utils;
-
-/**
- *
- * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
- */
-public class DefaultCardReader implements CardReader {
-
- protected final static Log log = LogFactory.getLog(DefaultCardReader.class);
-
- protected CardTerminal ct;
- protected String name;
-
- public DefaultCardReader(CardTerminal ct) {
- if (ct == null) {
- throw new NullPointerException("no card or card terminal provided");
- }
- this.ct = ct;
- this.name = ct.getName();
- }
-
- @Override
- public ResponseAPDU verify(CardChannel channel, VerifyAPDUSpec apduSpec,
- PINGUI pinGUI, PINSpec pinSpec, int retries)
- throws SignatureCardException, CardException, InterruptedException {
-
- log.debug("VERIFY");
- return channel.transmit(ISO7816Utils.createVerifyAPDU(apduSpec, pinGUI.providePIN(pinSpec, retries)));
- }
-
- @Override
- public ResponseAPDU modify(CardChannel channel, ChangeReferenceDataAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec, int retries)
- throws SignatureCardException, CardException, InterruptedException {
- log.debug("MODIFY (CHANGE_REFERENCE_DATA)");
- char[] oldPIN = pinGUI.provideCurrentPIN(pinSpec, retries);
- char[] newPIN = pinGUI.provideNewPIN(pinSpec);
- return channel.transmit(ISO7816Utils.createChangeReferenceDataAPDU(apduSpec, oldPIN, newPIN));
- }
-
- @Override
- public ResponseAPDU modify(CardChannel channel, NewReferenceDataAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec)
- throws SignatureCardException, CardException, InterruptedException {
- log.debug("MODIFY (NEW_REFERENCE_DATA)");
- char[] newPIN = pinGUI.provideNewPIN(pinSpec);
- return channel.transmit(ISO7816Utils.createNewReferenceDataAPDU(apduSpec, newPIN));
- }
-
- @Override
- public ResponseAPDU modify(CardChannel channel, ResetRetryCounterAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec, int retries)
- throws InterruptedException, CardException, SignatureCardException {
- log.debug("MODIFY (RESET_RETRY_COUNTER)");
- //TODO
- return modify(channel, (ChangeReferenceDataAPDUSpec) apduSpec, pinGUI, pinSpec, retries);
- }
-
- @Override
- public Card connect() throws CardException {
- log.debug("connect icc");
- return ct.connect("*");
- }
-
- @Override
- public boolean hasFeature(Byte feature) {
- return false;
- }
-
-}
diff --git a/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java b/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java
deleted file mode 100644
index c2537af8..00000000
--- a/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java
+++ /dev/null
@@ -1,703 +0,0 @@
-/*
- * 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.smcc.reader;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.Map;
-
-import javax.smartcardio.Card;
-import javax.smartcardio.CardChannel;
-import javax.smartcardio.CardException;
-import javax.smartcardio.CardTerminal;
-import javax.smartcardio.ResponseAPDU;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import at.gv.egiz.smcc.CancelledException;
-import at.gv.egiz.smcc.ChangeReferenceDataAPDUSpec;
-import at.gv.egiz.smcc.NewReferenceDataAPDUSpec;
-import at.gv.egiz.smcc.PINConfirmationException;
-import at.gv.egiz.smcc.PINFormatException;
-import at.gv.egiz.smcc.PINOperationAbortedException;
-import at.gv.egiz.smcc.PINSpec;
-import at.gv.egiz.smcc.ResetRetryCounterAPDUSpec;
-import at.gv.egiz.smcc.SignatureCardException;
-import at.gv.egiz.smcc.TimeoutException;
-import at.gv.egiz.smcc.VerifyAPDUSpec;
-import at.gv.egiz.smcc.pin.gui.ModifyPINGUI;
-import at.gv.egiz.smcc.pin.gui.PINGUI;
-import at.gv.egiz.smcc.util.SMCCHelper;
-
-/**
- *
- * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
- */
-public class PinpadCardReader extends DefaultCardReader {
-
- public static final int PIN_ENTRY_POLLING_INTERVAL = 10;
-
- protected final static Log log = LogFactory.getLog(PinpadCardReader.class);
-
- protected byte bEntryValidationCondition = 0x02; // validation key pressed
- protected byte bTimeOut = 0x3c; // 60sec (= max on ReinerSCT)
- protected byte bTimeOut2 = 0x00; // default (attention with SCM)
- protected byte wPINMaxExtraDigitH = 0x00; // min pin length zero digits
- protected byte wPINMaxExtraDigitL = 0x0c; // max pin length 12 digits
-
- /**
- * supported features and respective control codes
- */
- protected Map<Byte, Integer> features;
- protected boolean VERIFY, MODIFY, VERIFY_DIRECT, MODIFY_DIRECT;
-
- public PinpadCardReader(CardTerminal ct, Map<Byte, Integer> features) {
- super(ct);
- if (features == null) {
- throw new NullPointerException("Pinpad card reader does not support any features");
- }
- this.features = features;
-
- if (features.containsKey(FEATURE_VERIFY_PIN_START) &&
- features.containsKey(FEATURE_GET_KEY_PRESSED) &&
- features.containsKey(FEATURE_VERIFY_PIN_FINISH)) {
- VERIFY = true;
- }
- if (features.containsKey(FEATURE_MODIFY_PIN_START) &&
- features.containsKey(FEATURE_GET_KEY_PRESSED) &&
- features.containsKey(FEATURE_MODIFY_PIN_FINISH)) {
- MODIFY = true;
- }
- if (features.containsKey(FEATURE_VERIFY_PIN_DIRECT)) {
- VERIFY_DIRECT = true;
- }
- if (features.containsKey(FEATURE_MODIFY_PIN_DIRECT)) {
- MODIFY_DIRECT = true;
- }
-
- if (name != null) {
- name = name.toLowerCase();
- //ReinerSCT: http://support.reiner-sct.de/downloads/LINUX
- // http://www.linux-club.de/viewtopic.php?f=61&t=101287&start=0
- //old: REINER SCT CyberJack 00 00
- //new (CCID): 0C4B/0300 Reiner-SCT cyberJack pinpad(a) 00 00
- //Snow Leopard: Reiner-SCT cyberJack pinpad(a) 00 00
- //display: REINER SCT CyberJack 00 00
- if(name.startsWith("gemplus gempc pinpad") || name.startsWith("gemalto gempc pinpad")) {
- log.debug("setting custom wPINMaxExtraDigitH (0x04) for " + name);
- wPINMaxExtraDigitH = 0x04;
- log.debug("setting custom wPINMaxExtraDigitL (0x08) for " + name);
- wPINMaxExtraDigitL = 0x08;
- } else if (name.startsWith("omnikey cardman 3621")) {
- log.debug("setting custom wPINMaxExtraDigitH (0x01) for " + name);
- wPINMaxExtraDigitH = 0x01;
- } else if (name.startsWith("scm spr 532") || name.startsWith("scm microsystems inc. sprx32 usb smart card reader")) {
- log.debug("setting custom bTimeOut (0x3c) for " + name);
- bTimeOut = 0x3c;
- log.debug("setting custom bTimeOut2 (0x0f) for " + name);
- bTimeOut2 = 0x0f;
- } else if (name.startsWith("cherry smartboard xx44")) {
- log.debug("setting custom wPINMaxExtraDigitH (0x01) for " + name);
- wPINMaxExtraDigitH = 0x01;
- }
- }
-
- }
-
- @Override
- public boolean hasFeature(Byte feature) {
- return features.containsKey(feature);
- }
-
- private void VERIFY_PIN_START(Card icc, byte[] PIN_VERIFY) throws CardException {
- int ioctl = features.get(FEATURE_VERIFY_PIN_START);
- if (log.isTraceEnabled()) {
- log.trace("VERIFY_PIN_START (" + Integer.toHexString(ioctl) +
- ") " + SMCCHelper.toString(PIN_VERIFY));
- }
- byte[] resp = icc.transmitControlCommand(ioctl, PIN_VERIFY);
- if (resp != null && resp.length > 0) {
- if (resp[0] == (byte) 0x57) {
- log.error("Invalid parameter in PIN_VERIFY structure");
- throw new CardException("ERROR_INVALID_PARAMETER");
- } else {
- log.error("unexpected response to VERIFY_PIN_START: " +
- SMCCHelper.toString(resp));
- throw new CardException("unexpected response to VERIFY_PIN_START: " +
- SMCCHelper.toString(resp));
- }
- }
- }
-
- private byte GET_KEY_PRESSED(Card icc) throws CardException {
- int ioctl = features.get(FEATURE_GET_KEY_PRESSED);
- byte[] resp = icc.transmitControlCommand(ioctl, new byte[0]);
- if (resp != null && resp.length == 1) {
-// if (log.isTraceEnabled()) {
-// log.trace("response " + SMCCHelper.toString(resp));
-// }
- return resp[0];
- }
- log.error("unexpected response to GET_KEY_PRESSED: " +
- SMCCHelper.toString(resp));
- throw new CardException("unexpected response to GET_KEY_PRESSED: " +
- SMCCHelper.toString(resp));
- }
-
- private byte[] VERIFY_PIN_FINISH(Card icc) throws CardException {
- int ioctl = features.get(FEATURE_VERIFY_PIN_FINISH);
- if (log.isTraceEnabled()) {
- log.trace("VERIFY_PIN_FINISH (" + Integer.toHexString(ioctl) + ")");
- }
- byte[] resp = icc.transmitControlCommand(ioctl, new byte[0]);
- if (resp != null && resp.length == 2) {
- if (log.isTraceEnabled()) {
- log.trace("response " + SMCCHelper.toString(resp));
- }
- return resp;
- }
- log.error("unexpected response to VERIFY_PIN_FINISH: " +
- SMCCHelper.toString(resp));
- throw new CardException("unexpected response to VERIFY_PIN_FINISH: " +
- SMCCHelper.toString(resp));
- }
-
- private void MODIFY_PIN_START(Card icc, byte[] PIN_MODIFY) throws CardException {
- int ioctl = features.get(FEATURE_MODIFY_PIN_START);
- if (log.isTraceEnabled()) {
- log.trace("MODFIY_PIN_START (" + Integer.toHexString(ioctl) +
- ") " + SMCCHelper.toString(PIN_MODIFY));
- }
- byte[] resp = icc.transmitControlCommand(ioctl, PIN_MODIFY);
- if (resp != null && resp.length > 0) {
- if (resp[0] == (byte) 0x57) {
- log.error("Invalid parameter in PIN_MODIFY structure");
- throw new CardException("ERROR_INVALID_PARAMETER");
- } else {
- log.error("unexpected response to MODIFY_PIN_START: " +
- SMCCHelper.toString(resp));
- throw new CardException("unexpected response to MODIFY_PIN_START: " +
- SMCCHelper.toString(resp));
- }
- }
- }
-
- private byte[] MODIFY_PIN_FINISH(Card icc) throws CardException {
- int ioctl = features.get(FEATURE_MODIFY_PIN_FINISH);
- if (log.isTraceEnabled()) {
- log.trace("MODIFY_PIN_FINISH (" + Integer.toHexString(ioctl) + ")");
- }
- byte[] resp = icc.transmitControlCommand(ioctl, new byte[0]);
- if (resp != null && resp.length == 2) {
- if (log.isTraceEnabled()) {
- log.trace("response " + SMCCHelper.toString(resp));
- }
- return resp;
- }
- log.error("unexpected response to MODIFY_PIN_FINISH: " +
- SMCCHelper.toString(resp));
- throw new CardException("unexpected response to MODIFY_PIN_FINISH: " +
- SMCCHelper.toString(resp));
- }
-
- private byte[] VERIFY_PIN_DIRECT(Card icc, byte[] PIN_VERIFY) throws CardException {
- int ioctl = features.get(FEATURE_VERIFY_PIN_DIRECT);
- if (log.isTraceEnabled()) {
- log.trace("VERIFY_PIN_DIRECT (" + Integer.toHexString(ioctl) +
- ") " + SMCCHelper.toString(PIN_VERIFY));
- }
- byte[] resp = icc.transmitControlCommand(ioctl, PIN_VERIFY);
- if (log.isTraceEnabled()) {
- log.trace("response " + SMCCHelper.toString(resp));
- }
- return resp;
- }
-
- private byte[] verifyPin(Card icc, byte[] PIN_VERIFY, PINGUI pinGUI)
- throws SignatureCardException, CardException, InterruptedException {
-
-// pinGUI.enterPIN(pinSpec, retries);
-
- log.debug("VERIFY_PIN_START [" + FEATURES[FEATURE_VERIFY_PIN_START] + "]");
- VERIFY_PIN_START(icc, PIN_VERIFY);
-
- byte resp;
- do {
- resp = GET_KEY_PRESSED(icc);
- if (resp == (byte) 0x00) {
- synchronized(this) {
- try {
- wait(PIN_ENTRY_POLLING_INTERVAL);
- } catch (InterruptedException ex) {
- log.error("interrupted in VERIFY_PIN");
- }
- }
- } else if (resp == (byte) 0x0d) {
- log.debug("GET_KEY_PRESSED: 0x0d (user confirmed)");
- break;
- } else if (resp == (byte) 0x2b) {
- log.trace("GET_KEY_PRESSED: 0x2b (user entered valid key 0-9)");
- pinGUI.validKeyPressed();
- } else if (resp == (byte) 0x1b) {
- log.debug("GET_KEY_PRESSED: 0x1b (user cancelled VERIFY_PIN via cancel button)");
- break; // returns 0x6401
- } else if (resp == (byte) 0x08) {
- log.debug("GET_KEY_PRESSED: 0x08 (user pressed correction/backspace button)");
- pinGUI.correctionButtonPressed();
- } else if (resp == (byte) 0x0e) {
- log.debug("GET_KEY_PRESSED: 0x0e (timeout occured)");
- break; // return 0x6400
- } else if (resp == (byte) 0x40) {
- log.debug("GET_KEY_PRESSED: 0x40 (PIN_Operation_Aborted)");
- throw new PINOperationAbortedException("PIN_Operation_Aborted (0x40)");
- } else if (resp == (byte) 0x0a) {
- log.debug("GET_KEY_PRESSED: 0x0a (all keys cleared");
- pinGUI.allKeysCleared();
- } else {
- log.error("unexpected response to GET_KEY_PRESSED: " +
- Integer.toHexString(resp));
- throw new CardException("unexpected response to GET_KEY_PRESSED: " +
- Integer.toHexString(resp));
- }
- } while (true);
-
- return VERIFY_PIN_FINISH(icc);
- }
-
- /**
- * does not display the first pin dialog (enterCurrentPIN or enterNewPIN, depends on bConfirmPIN),
- * since this is easier to do in calling modify()
- */
- private byte[] modifyPin(Card icc, byte[] PIN_MODIFY, ModifyPINGUI pinGUI, PINSpec pINSpec)
- throws PINOperationAbortedException, CardException {
-
- byte pinConfirmations = (byte) 0x00; //b0: new pin not entered (0) / entered (1)
- //b1: current pin not entered (0) / entered (1)
- byte bConfirmPIN = PIN_MODIFY[9];
-
-// if ((bConfirmPIN & (byte) 0x02) == 0) {
-// log.debug("no current PIN entry requested");
-// pinGUI.enterNewPIN(pINSpec);
-// } else {
-// log.debug("current PIN entry requested");
-// pinGUI.enterCurrentPIN(pINSpec, retries);
-// }
-
- log.debug("MODIFY_PIN_START [" + FEATURES[FEATURE_MODIFY_PIN_START] + "]");
- MODIFY_PIN_START(icc, PIN_MODIFY);
-
- byte resp;
- while (true) {
- resp = GET_KEY_PRESSED(icc);
- if (resp == (byte) 0x00) {
- synchronized(this) {
- try {
- wait(PIN_ENTRY_POLLING_INTERVAL);
- } catch (InterruptedException ex) {
- log.error("interrupted in MODIFY_PIN");
- }
- }
- } else if (resp == (byte) 0x0d) {
- if (log.isTraceEnabled()) {
- log.trace("requested pin confirmations: 0b" + Integer.toBinaryString(bConfirmPIN & 0xff));
- log.trace("performed pin confirmations: 0b" + Integer.toBinaryString(pinConfirmations & 0xff));
- }
- log.debug("GET_KEY_PRESSED: 0x0d (user confirmed)");
- if (pinConfirmations == bConfirmPIN) {
- break;
- } else if ((bConfirmPIN & (byte) 0x02) == 0 ||
- (pinConfirmations & (byte) 0x02) == (byte) 0x02) {
- // no current pin entry or current pin entry already performed
- if ((pinConfirmations & (byte) 0x01) == 0) {
- // new pin
- pinConfirmations |= (byte) 0x01;
- pinGUI.confirmNewPIN(pINSpec);
- } // else: new pin confirmed
- } else {
- // current pin entry
- pinConfirmations |= (byte) 0x02;
- pinGUI.enterNewPIN(pINSpec);
- }
- } else if (resp == (byte) 0x2b) {
- log.trace("GET_KEY_PRESSED: 0x2b (user entered valid key 0-9)");
- pinGUI.validKeyPressed();
- } else if (resp == (byte) 0x1b) {
- log.debug("GET_KEY_PRESSED: 0x1b (user cancelled VERIFY_PIN via cancel button)");
- break; // returns 0x6401
- } else if (resp == (byte) 0x08) {
- log.debug("GET_KEY_PRESSED: 0x08 (user pressed correction/backspace button)");
- pinGUI.correctionButtonPressed();
- } else if (resp == (byte) 0x0e) {
- log.debug("GET_KEY_PRESSED: 0x0e (timeout occured)");
- break; // return 0x6400
- } else if (resp == (byte) 0x40) {
- log.debug("GET_KEY_PRESSED: 0x40 (PIN_Operation_Aborted)");
- throw new PINOperationAbortedException("PIN_Operation_Aborted (0x40)");
- } else if (resp == (byte) 0x0a) {
- log.debug("GET_KEY_PRESSED: 0x0a (all keys cleared");
- pinGUI.allKeysCleared();
- } else {
- log.error("unexpected response to GET_KEY_PRESSED: " +
- Integer.toHexString(resp));
- throw new CardException("unexpected response to GET_KEY_PRESSED: " +
- Integer.toHexString(resp));
- }
-
- }
-
- pinGUI.finish();
- return MODIFY_PIN_FINISH(icc);
- }
-
- private byte[] MODIFY_PIN_DIRECT(Card icc, byte[] PIN_MODIFY) throws CardException {
- int ioctl = features.get(FEATURE_MODIFY_PIN_DIRECT);
- if (log.isTraceEnabled()) {
- log.trace("MODIFY_PIN_DIRECT (" + Integer.toHexString(ioctl) +
- ") " + SMCCHelper.toString(PIN_MODIFY));
- }
- byte[] resp = icc.transmitControlCommand(ioctl, PIN_MODIFY);
- if (log.isTraceEnabled()) {
- log.trace("response " + SMCCHelper.toString(resp));
- }
- return resp;
- }
-
- protected byte[] createPINModifyStructure(NewReferenceDataAPDUSpec apduSpec, PINSpec pinSpec) {
-
- ByteArrayOutputStream s = new ByteArrayOutputStream();
- // bTimeOut
- s.write(bTimeOut);
- // bTimeOut2
- s.write(bTimeOut2);
- // bmFormatString
- s.write(1 << 7 // system unit = byte
- | (0xF & apduSpec.getPinPosition()) << 3
- | (0x1 & apduSpec.getPinJustification() << 2)
- | (0x3 & apduSpec.getPinFormat()));
- // bmPINBlockString
- s.write((0xF & apduSpec.getPinLengthSize()) << 4
- | (0xF & apduSpec.getPinLength()));
- // bmPINLengthFormat
- s.write(// system unit = bit
- (0xF & apduSpec.getPinLengthPos()));
- // bInsertionOffsetOld
- s.write(0x00);
- // bInsertionOffsetNew
- s.write(apduSpec.getPinInsertionOffsetNew());
- // wPINMaxExtraDigit
- s.write(Math.min(pinSpec.getMaxLength(), wPINMaxExtraDigitL));
- s.write(Math.max(pinSpec.getMinLength(), wPINMaxExtraDigitH));
- // bConfirmPIN
- s.write(0x01);
- // bEntryValidationCondition
- s.write(bEntryValidationCondition);
- // bNumberMessage
- s.write(0x02);
- // wLangId English (United States), see http://www.usb.org/developers/docs/USB_LANGIDs.pdf
- s.write(0x09);
- s.write(0x04);
- // bMsgIndex1
- s.write(0x01);
- // bMsgIndex2
- s.write(0x02);
- // bMsgIndex3
- s.write(0x00);
-
- // bTeoPrologue
- s.write(0x00);
- s.write(0x00);
- s.write(0x00);
- // ulDataLength
- s.write(apduSpec.getApdu().length);
- s.write(0x00);
- s.write(0x00);
- s.write(0x00);
- // abData
- try {
- s.write(apduSpec.getApdu());
- } catch (IOException e) {
- // As we are dealing with ByteArrayOutputStreams no exception is to be
- // expected.
- throw new RuntimeException(e);
- }
-
- return s.toByteArray();
-
- }
-
- protected byte[] createPINModifyStructure(ChangeReferenceDataAPDUSpec apduSpec, PINSpec pinSpec) {
- //TODO bInsertionOffsetOld (0x00), bConfirmPIN (0x01), bNumberMessage (0x02), bMsgIndex1/2/3
-
- ByteArrayOutputStream s = new ByteArrayOutputStream();
- // bTimeOut
- s.write(bTimeOut);
- // bTimeOut2
- s.write(bTimeOut2);
- // bmFormatString
- s.write(1 << 7 // system unit = byte
- | (0xF & apduSpec.getPinPosition()) << 3
- | (0x1 & apduSpec.getPinJustification() << 2)
- | (0x3 & apduSpec.getPinFormat()));
- // bmPINBlockString
- s.write((0xF & apduSpec.getPinLengthSize()) << 4
- | (0xF & apduSpec.getPinLength()));
- // bmPINLengthFormat
- s.write(// system unit = bit
- (0xF & apduSpec.getPinLengthPos()));
- // bInsertionOffsetOld (0x00 for no old pin?)
- s.write(apduSpec.getPinInsertionOffsetOld());
- // bInsertionOffsetNew
- s.write(apduSpec.getPinInsertionOffsetNew());
- // wPINMaxExtraDigit
- s.write(Math.min(pinSpec.getMaxLength(), wPINMaxExtraDigitL));
- s.write(Math.max(pinSpec.getMinLength(), wPINMaxExtraDigitH));
- // bConfirmPIN
- s.write(0x03);
- // bEntryValidationCondition
- s.write(bEntryValidationCondition);
- // bNumberMessage
- s.write(0x03);
- // wLangId English (United States), see http://www.usb.org/developers/docs/USB_LANGIDs.pdf
- s.write(0x09);
- s.write(0x04);
- // bMsgIndex1
- s.write(0x00);
- // bMsgIndex2
- s.write(0x01);
- // bMsgIndex3
- s.write(0x02);
-
- // bTeoPrologue
- s.write(0x00);
- s.write(0x00);
- s.write(0x00);
- // ulDataLength
- s.write(apduSpec.getApdu().length);
- s.write(0x00);
- s.write(0x00);
- s.write(0x00);
- // abData
- try {
- s.write(apduSpec.getApdu());
- } catch (IOException e) {
- // As we are dealing with ByteArrayOutputStreams no exception is to be
- // expected.
- throw new RuntimeException(e);
- }
-
- return s.toByteArray();
-
- }
-
- protected byte[] createPINVerifyStructure(VerifyAPDUSpec apduSpec, PINSpec pinSpec) {
-
- ByteArrayOutputStream s = new ByteArrayOutputStream();
- // bTimeOut
- s.write(bTimeOut);
- // bTimeOut2
- s.write(bTimeOut2);
- // bmFormatString
- s.write(1 << 7 // system unit = byte
- | (0xF & apduSpec.getPinPosition()) << 3
- | (0x1 & apduSpec.getPinJustification() << 2)
- | (0x3 & apduSpec.getPinFormat()));
- // bmPINBlockString
- s.write((0xF & apduSpec.getPinLengthSize()) << 4
- | (0xF & apduSpec.getPinLength()));
- // bmPINLengthFormat
- s.write(// system unit = bit
- (0xF & apduSpec.getPinLengthPos()));
- // wPINMaxExtraDigit
- s.write(Math.min(pinSpec.getMaxLength(), wPINMaxExtraDigitL)); // max PIN length
- s.write(Math.max(pinSpec.getMinLength(), wPINMaxExtraDigitH)); // min PIN length
- // bEntryValidationCondition
- s.write(bEntryValidationCondition);
- // bNumberMessage
- s.write(0x01);
- // wLangId
- s.write(0x09);
- s.write(0x04);
- // bMsgIndex
- s.write(0x00);
- // bTeoPrologue
- s.write(0x00);
- s.write(0x00);
- s.write(0x00);
- // ulDataLength
- s.write(apduSpec.getApdu().length);
- s.write(0x00);
- s.write(0x00);
- s.write(0x00);
- // abData
- try {
- s.write(apduSpec.getApdu());
- } catch (IOException e) {
- // As we are dealing with ByteArrayOutputStreams no exception is to be
- // expected.
- throw new RuntimeException(e);
- }
-
- return s.toByteArray();
-
- }
-
- @Override
- public ResponseAPDU verify(CardChannel channel, VerifyAPDUSpec apduSpec,
- PINGUI pinGUI, PINSpec pinSpec, int retries)
- throws SignatureCardException, CardException, InterruptedException {
-
- ResponseAPDU resp = null;
-
- byte[] s = createPINVerifyStructure(apduSpec, pinSpec);
- Card icc = channel.getCard();
-
- if (VERIFY) {
- pinGUI.enterPIN(pinSpec, retries);
- resp = new ResponseAPDU(verifyPin(icc, s, pinGUI));
- } else if (VERIFY_DIRECT) {
- pinGUI.enterPINDirect(pinSpec, retries);
- log.debug("VERIFY_PIN_DIRECT [" + FEATURES[FEATURE_VERIFY_PIN_DIRECT] + "]");
- resp = new ResponseAPDU(VERIFY_PIN_DIRECT(icc, s));
- } else {
- log.warn("falling back to default pin-entry");
- return super.verify(channel, apduSpec, pinGUI, pinSpec, retries);
- }
-
- switch (resp.getSW()) {
- case 0x6400:
- log.debug("SPE operation timed out.");
- throw new TimeoutException();
- case 0x6401:
- log.debug("SPE operation was cancelled by the 'Cancel' button.");
- throw new CancelledException();
- case 0x6403:
- log.debug("User entered too short or too long PIN "
- + "regarding MIN/MAX PIN length.");
- throw new PINFormatException();
- case 0x6480:
- log.debug("SPE operation was aborted by the 'Cancel' operation "
- + "at the host system.");
- case 0x6b80:
- log.info("Invalid parameter in passed structure.");
- default:
- return resp;
- }
- }
-
- @Override
- public ResponseAPDU modify(CardChannel channel, ChangeReferenceDataAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec, int retries)
- throws SignatureCardException, CardException, InterruptedException {
-
- ResponseAPDU resp = null;
-
- byte[] s = createPINModifyStructure(apduSpec, pinSpec);
- Card icc = channel.getCard();
-
- if (MODIFY) {
- pinGUI.enterCurrentPIN(pinSpec, retries);
- resp = new ResponseAPDU(modifyPin(icc, s, pinGUI, pinSpec));
- } else if (MODIFY_DIRECT) {
- pinGUI.modifyPINDirect(pinSpec, retries);
- log.debug("MODIFY_PIN_DIRECT [" + FEATURES[FEATURE_MODIFY_PIN_DIRECT] + "]");
- resp = new ResponseAPDU(MODIFY_PIN_DIRECT(icc, s));
- } else {
- log.warn("falling back to default pin-entry");
- return super.modify(channel, apduSpec, pinGUI, pinSpec, retries);
- }
-
- switch (resp.getSW()) {
- case 0x6400:
- log.debug("SPE operation timed out.");
- throw new TimeoutException();
- case 0x6401:
- log.debug("SPE operation was cancelled by the 'Cancel' button.");
- throw new CancelledException();
- case 0x6402:
- log.debug("Modify PIN operation failed because two 'new PIN' " +
- "entries do not match");
- throw new PINConfirmationException();
- case 0x6403:
- log.debug("User entered too short or too long PIN "
- + "regarding MIN/MAX PIN length.");
- throw new PINFormatException();
- case 0x6480:
- log.debug("SPE operation was aborted by the 'Cancel' operation "
- + "at the host system.");
- case 0x6b80:
- log.info("Invalid parameter in passed structure.");
- default:
- return resp;
- }
- }
-
- @Override
- public ResponseAPDU modify(CardChannel channel, NewReferenceDataAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec)
- throws SignatureCardException, CardException, InterruptedException {
-
- ResponseAPDU resp = null;
-
- byte[] s = createPINModifyStructure(apduSpec, pinSpec);
- Card icc = channel.getCard();
-
- if (MODIFY) {
- pinGUI.enterNewPIN(pinSpec);
- resp = new ResponseAPDU(modifyPin(icc, s, pinGUI, pinSpec));
- } else if (MODIFY_DIRECT) {
- pinGUI.modifyPINDirect(pinSpec, -1);
- log.debug("MODIFY_PIN_DIRECT [" + FEATURES[FEATURE_MODIFY_PIN_DIRECT] + "]");
- resp = new ResponseAPDU(MODIFY_PIN_DIRECT(icc, s));
- } else {
- log.warn("falling back to default pin-entry");
- return super.modify(channel, apduSpec, pinGUI, pinSpec);
- }
-
- switch (resp.getSW()) {
- case 0x6400:
- log.debug("SPE operation timed out.");
- throw new TimeoutException();
- case 0x6401:
- log.debug("SPE operation was cancelled by the 'Cancel' button.");
- throw new CancelledException();
- case 0x6402:
- log.debug("Modify PIN operation failed because two 'new PIN' " +
- "entries do not match");
- throw new PINConfirmationException();
- case 0x6403:
- log.debug("User entered too short or too long PIN "
- + "regarding MIN/MAX PIN length.");
- throw new PINFormatException();
- case 0x6480:
- log.debug("SPE operation was aborted by the 'Cancel' operation "
- + "at the host system.");
- case 0x6b80:
- log.info("Invalid parameter in passed structure.");
- default:
- return resp;
- }
- }
-
- @Override
- public ResponseAPDU modify(CardChannel channel, ResetRetryCounterAPDUSpec apduSpec,
- ModifyPINGUI pinGUI, PINSpec pinSpec, int retries)
- throws InterruptedException, CardException, SignatureCardException {
- //TODO
- return modify(channel, (ChangeReferenceDataAPDUSpec) apduSpec, pinGUI, pinSpec, retries);
- }
-}
diff --git a/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/ReaderFactory.java b/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/ReaderFactory.java
deleted file mode 100644
index bf1730e9..00000000
--- a/mocca-1.2.11/smcc/src/main/java/at/gv/egiz/smcc/reader/ReaderFactory.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * 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.smcc.reader;
-
-import at.gv.egiz.smcc.conf.SMCCConfiguration;
-import at.gv.egiz.smcc.util.SMCCHelper;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import javax.smartcardio.Card;
-import javax.smartcardio.CardException;
-import javax.smartcardio.CardTerminal;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- *
- * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
- */
-public class ReaderFactory {
-
- protected final static Log log = LogFactory.getLog(ReaderFactory.class);
-
- protected static SMCCConfiguration configuration;
-
- public void setConfiguration(SMCCConfiguration configuration) {
- if (configuration != null) {
- log.debug("reader configuration: disablePinpad=" + configuration.isDisablePinpad());
- }
- //spring injects configuration into singleton ReaderFactory instance,
- //but we access the ReaderFactory statically (getReader)
- //(we rather should query the application context to obtain a reader factory)
- ReaderFactory.configuration = configuration;
- }
-
- public static CardReader getReader(Card icc, CardTerminal ct) {
-
- String name = ct.getName();
- log.info("creating reader " + name);
-
- Map<Byte, Integer> features;
- if (configuration != null && configuration.isDisablePinpad()) {
- features = Collections.emptyMap();
- } else {
- features = queryFeatures(icc);
- }
-
- CardReader reader;
- if (features.isEmpty()) {
- reader = new DefaultCardReader(ct);
- } else {
- reader = new PinpadCardReader(ct, features);
- }
-
- return reader;
- }
-
- private static int CTL_CODE(int code) {
- String os_name = System.getProperty("os.name").toLowerCase();
- if (os_name.indexOf("windows") > -1) {
- // cf. WinIOCTL.h
- return (0x31 << 16 | (code) << 2);
- }
- // cf. reader.h
- return 0x42000000 + (code);
- }
-
- static int IOCTL_GET_FEATURE_REQUEST = CTL_CODE(3400);
-
- private static Map<Byte, Integer> queryFeatures(Card icc) {
- Map<Byte, Integer> features = new HashMap<Byte, Integer>();
-
- if (icc == null) {
- log.warn("invalid card handle, cannot query ifd features");
- } else {
- try {
- if (log.isTraceEnabled()) {
- log.trace("GET_FEATURE_REQUEST " + Integer.toHexString(IOCTL_GET_FEATURE_REQUEST));
- }
- byte[] resp = icc.transmitControlCommand(IOCTL_GET_FEATURE_REQUEST,
- new byte[0]);
-
- if (log.isTraceEnabled()) {
- log.trace("Response TLV " + SMCCHelper.toString(resp));
- }
- // tag
- // length in bytes (always 4)
- // control code value for supported feature (in big endian)
- for (int i = 0; i < resp.length; i += 6) {
- Byte feature = new Byte(resp[i]);
- Integer ioctl = new Integer((0xff & resp[i + 2]) << 24) |
- ((0xff & resp[i + 3]) << 16) |
- ((0xff & resp[i + 4]) << 8) |
- (0xff & resp[i + 5]);
- if (log.isInfoEnabled()) {
- log.info("IFD supports " + CardReader.FEATURES[feature.intValue()] +
- ": " + Integer.toHexString(ioctl.intValue()));
- }
- features.put(feature, ioctl);
- }
- } catch (CardException ex) {
- log.debug("Failed to query IFD features: " + ex.getMessage());
- log.trace(ex);
- log.info("IFD does not support secure pin entry");
- }
- }
- return features;
- }
-
-}