From eca63e98023ea8b2dd51100ad9d5e5cbc75fd0b1 Mon Sep 17 00:00:00 2001 From: tkellner Date: Wed, 10 Apr 2013 15:15:12 +0000 Subject: 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 --- .../at/gv/egiz/smcc/reader/PinpadCardReader.java | 34 +++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java') diff --git a/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java b/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java index d7fdc17f..f02344eb 100644 --- a/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java +++ b/smcc/src/main/java/at/gv/egiz/smcc/reader/PinpadCardReader.java @@ -596,11 +596,14 @@ public class PinpadCardReader extends DefaultCardReader { byte[] s = createPINVerifyStructure(apduSpec, pinSpec); Card icc = channel.getCard(); + boolean regain; if (VERIFY) { + regain = dropExclusive(icc); pinGUI.enterPIN(pinSpec, retries); resp = new ResponseAPDU(verifyPin(icc, s, pinGUI)); } else if (VERIFY_DIRECT) { + regain = dropExclusive(icc); pinGUI.enterPINDirect(pinSpec, retries); log.debug("VERIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_VERIFY_PIN_DIRECT]); resp = new ResponseAPDU(VERIFY_PIN_DIRECT(icc, s)); @@ -608,6 +611,7 @@ public class PinpadCardReader extends DefaultCardReader { log.warn("Falling back to default pin-entry."); return super.verify(channel, apduSpec, pinGUI, pinSpec, retries); } + regainExclusive(icc, regain); switch (resp.getSW()) { case 0x6400: @@ -639,11 +643,14 @@ public class PinpadCardReader extends DefaultCardReader { byte[] s = createPINModifyStructure(apduSpec, pinSpec); Card icc = channel.getCard(); - + boolean regain; + if (MODIFY) { + regain = dropExclusive(icc); pinGUI.enterCurrentPIN(pinSpec, retries); resp = new ResponseAPDU(modifyPin(icc, s, pinGUI, pinSpec)); } else if (MODIFY_DIRECT) { + regain = dropExclusive(icc); pinGUI.modifyPINDirect(pinSpec, retries); log.debug("MODIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_MODIFY_PIN_DIRECT]); resp = new ResponseAPDU(MODIFY_PIN_DIRECT(icc, s)); @@ -651,6 +658,7 @@ public class PinpadCardReader extends DefaultCardReader { log.warn("Falling back to default pin-entry."); return super.modify(channel, apduSpec, pinGUI, pinSpec, retries); } + regainExclusive(icc, regain); switch (resp.getSW()) { case 0x6400: @@ -686,11 +694,14 @@ public class PinpadCardReader extends DefaultCardReader { byte[] s = createPINModifyStructure(apduSpec, pinSpec); Card icc = channel.getCard(); + boolean regain; if (MODIFY) { + regain = dropExclusive(icc); pinGUI.enterNewPIN(pinSpec); resp = new ResponseAPDU(modifyPin(icc, s, pinGUI, pinSpec)); } else if (MODIFY_DIRECT) { + regain = dropExclusive(icc); pinGUI.modifyPINDirect(pinSpec, -1); log.debug("MODIFY_PIN_DIRECT [{}]", FEATURES[FEATURE_MODIFY_PIN_DIRECT]); resp = new ResponseAPDU(MODIFY_PIN_DIRECT(icc, s)); @@ -698,6 +709,7 @@ public class PinpadCardReader extends DefaultCardReader { log.warn("Falling back to default pin-entry."); return super.modify(channel, apduSpec, pinGUI, pinSpec); } + regainExclusive(icc, regain); switch (resp.getSW()) { case 0x6400: @@ -731,4 +743,24 @@ public class PinpadCardReader extends DefaultCardReader { //TODO return modify(channel, (ChangeReferenceDataAPDUSpec) apduSpec, pinGUI, pinSpec, retries); } + + 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(); + } + } } -- cgit v1.2.3