summaryrefslogtreecommitdiff
path: root/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java
diff options
context:
space:
mode:
authortkellner <tkellner@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4>2013-04-10 15:15:12 +0000
committertkellner <tkellner@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4>2013-04-10 15:15:12 +0000
commiteca63e98023ea8b2dd51100ad9d5e5cbc75fd0b1 (patch)
tree46a85c66b4a2d439447eb66799f3811c249d75b2 /smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java
parent4f8ceef828caa55526fe0dec3bae1c35ff8f5e3f (diff)
downloadmocca-eca63e98023ea8b2dd51100ad9d5e5cbc75fd0b1.tar.gz
mocca-eca63e98023ea8b2dd51100ad9d5e5cbc75fd0b1.tar.bz2
mocca-eca63e98023ea8b2dd51100ad9d5e5cbc75fd0b1.zip
Solve Win8 issues by dropping exclusive access during pin entry
git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@1169 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
Diffstat (limited to 'smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java')
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java32
1 files changed, 31 insertions, 1 deletions
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java b/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java
index fef60e2b..d3cb9a81 100644
--- a/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java
+++ b/smcc/src/main/java/at/gv/egiz/smcc/reader/DefaultCardReader.java
@@ -43,6 +43,7 @@ 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;
+import at.gv.egiz.smcc.util.SMCCHelper;
/**
*
@@ -69,7 +70,11 @@ public class DefaultCardReader implements CardReader {
throws SignatureCardException, CardException, InterruptedException {
log.debug("VERIFY");
- return channel.transmit(ISO7816Utils.createVerifyAPDU(apduSpec, pinGUI.providePIN(pinSpec, retries)));
+ Card card = channel.getCard();
+ boolean regain = dropExclusive(card);
+ char[] pin = pinGUI.providePIN(pinSpec, retries);
+ regainExclusive(card, regain);
+ return channel.transmit(ISO7816Utils.createVerifyAPDU(apduSpec, pin));
}
@Override
@@ -77,8 +82,11 @@ public class DefaultCardReader implements CardReader {
ModifyPINGUI pinGUI, PinInfo pinSpec, int retries)
throws SignatureCardException, CardException, InterruptedException {
log.debug("MODIFY (CHANGE_REFERENCE_DATA)");
+ Card card = channel.getCard();
+ boolean regain = dropExclusive(card);
char[] oldPIN = pinGUI.provideCurrentPIN(pinSpec, retries);
char[] newPIN = pinGUI.provideNewPIN(pinSpec);
+ regainExclusive(card, regain);
return channel.transmit(ISO7816Utils.createChangeReferenceDataAPDU(apduSpec, oldPIN, newPIN));
}
@@ -87,7 +95,10 @@ public class DefaultCardReader implements CardReader {
ModifyPINGUI pinGUI, PinInfo pinSpec)
throws SignatureCardException, CardException, InterruptedException {
log.debug("MODIFY (NEW_REFERENCE_DATA)");
+ Card card = channel.getCard();
+ boolean regain = dropExclusive(card);
char[] newPIN = pinGUI.provideNewPIN(pinSpec);
+ regainExclusive(card, regain);
return channel.transmit(ISO7816Utils.createNewReferenceDataAPDU(apduSpec, newPIN));
}
@@ -111,4 +122,23 @@ public class DefaultCardReader implements CardReader {
return false;
}
+ private boolean dropExclusive(Card card) throws CardException {
+ if (SMCCHelper.isWindows8()) {
+ log.debug("Win8 - giving up exclusive acess");
+ try {
+ card.endExclusive();
+ } catch (IllegalStateException e) {
+ log.debug("Didn't have exclusive access");
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void regainExclusive(Card card, boolean doRegainExclusive) throws CardException {
+ if (SMCCHelper.isWindows8() && doRegainExclusive) {
+ log.debug("Win8 - trying to regain exclusive acess");
+ card.beginExclusive();
+ }
+ }
}