From 974087a04d2fb9b03a72b66c090afe65e5a818dc Mon Sep 17 00:00:00 2001 From: clemenso Date: Thu, 6 Aug 2009 14:01:01 +0000 Subject: FIX [462] PINMgmtSignatureCard changePIN silently ignores wrong pin entry [63cX] git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@414 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- smcc/src/test/java/at/gv/egiz/smcc/CardTest.java | 67 ++++++++++++++++++++++ .../at/gv/egiz/smcc/starcos/STARCOSCardTest.java | 57 +++++++++++++++++- 2 files changed, 123 insertions(+), 1 deletion(-) diff --git a/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java index 298e26a5..f72820e1 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java @@ -76,6 +76,73 @@ public abstract class CardTest { } + public class TestWrongPINProvider implements PINProvider { + + int provided = 0; + int numWrongTries = 0; + + char[] pin; + + public TestWrongPINProvider(char[] pin, int numWrongTries) { + super(); + this.pin = pin; + this.numWrongTries = numWrongTries; + } + + @Override + public char[] providePIN(PINSpec spec, int retries) + throws CancelledException, InterruptedException { + if (provided >= numWrongTries) { + throw new CancelledException("Number of wrong tries reached: " + provided); + } else { + provided++; + return pin; + } + } + + public int getProvided() { + return provided; + } + } + + public class TestWrongChangePINProvider implements ChangePINProvider { + + int provided = 0; + int numWrongTries = 0; + + char[] pin; + char[] oldPin; + + /** emulate ChangePinProvider */ + public TestWrongChangePINProvider(char[] oldPin, char[] newPin, int numWrongTries) { + super(); + this.pin = newPin; + this.oldPin = oldPin; + this.numWrongTries = numWrongTries; + } + + @Override + public char[] providePIN(PINSpec spec, int retries) + throws CancelledException, InterruptedException { + return pin; + } + + public int getProvided() { + return provided; + } + + @Override + public char[] provideOldPIN(PINSpec spec, int retries) + throws CancelledException, InterruptedException { + if (provided >= numWrongTries) { + throw new CancelledException("Number of wrong tries reached: " + provided); + } else { + provided++; + return oldPin; + } + } + } + public CardTest() { super(); } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardTest.java index 0fb4f62d..bf56ef47 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardTest.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardTest.java @@ -45,6 +45,7 @@ import at.gv.egiz.smcc.SignatureCardException; import at.gv.egiz.smcc.SignatureCardFactory; import at.gv.egiz.smcc.CardTest.TestChangePINProvider; import at.gv.egiz.smcc.CardTest.TestPINProvider; +import at.gv.egiz.smcc.PINProvider; import at.gv.egiz.smcc.SignatureCard.KeyboxName; import at.gv.egiz.smcc.acos.A03ApplDEC; import at.gv.egiz.smcc.acos.A04ApplDEC; @@ -52,6 +53,7 @@ import at.gv.egiz.smcc.acos.A04ApplSIG; import at.gv.egiz.smcc.acos.ACOSAppl; import at.gv.egiz.smcc.acos.ACOSApplDEC; import at.gv.egiz.smcc.acos.ACOSApplSIG; +import org.junit.Ignore; public class STARCOSCardTest extends CardTest { @@ -288,10 +290,63 @@ public class STARCOSCardTest extends CardTest { signatureCard.verifyPIN(pinSpec, new TestPINProvider(newPin)); pin = newPin; } - } + } + + @Test + public void testVerifyWrongPin() throws CardNotSupportedException, + LockedException, NotActivatedException, CancelledException, + PINFormatException, SignatureCardException, InterruptedException { + + char[] defaultPin = "123456".toCharArray(); + + PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard(); + CardEmul card = (CardEmul) signatureCard.getCard(); + STARCOSCardChannelEmul channel = (STARCOSCardChannelEmul) card.getBasicChannel(); + channel.setPin(STARCOSCardChannelEmul.KID_PIN_Glob, defaultPin); + STARCOSApplSichereSignatur appl = (STARCOSApplSichereSignatur) card.getApplication(STARCOSApplSichereSignatur.AID_SichereSignatur); + appl.setPin(STARCOSApplSichereSignatur.KID_PIN_SS, defaultPin); + + for (PINSpec pinSpec : signatureCard.getPINSpecs()) { + char[] wrongPin = "999999".toCharArray(); + int numWrongTries = 2; + TestWrongPINProvider wrongPinProvider = new TestWrongPINProvider(wrongPin, numWrongTries); + try { + signatureCard.verifyPIN(pinSpec, wrongPinProvider); + } catch (CancelledException ex) { + } finally { + assertTrue(wrongPinProvider.getProvided() == numWrongTries); + } + } } + @Test + public void testChangeWrongPin() throws CardNotSupportedException, + LockedException, NotActivatedException, CancelledException, + PINFormatException, SignatureCardException, InterruptedException { + char[] defaultPin = "123456".toCharArray(); + + PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard(); + CardEmul card = (CardEmul) signatureCard.getCard(); + STARCOSCardChannelEmul channel = (STARCOSCardChannelEmul) card.getBasicChannel(); + channel.setPin(STARCOSCardChannelEmul.KID_PIN_Glob, defaultPin); + STARCOSApplSichereSignatur appl = (STARCOSApplSichereSignatur) card.getApplication(STARCOSApplSichereSignatur.AID_SichereSignatur); + appl.setPin(STARCOSApplSichereSignatur.KID_PIN_SS, defaultPin); + + for (PINSpec pinSpec : signatureCard.getPINSpecs()) { + char[] wrongPin = "999999".toCharArray(); + int numWrongTries = 2; + TestWrongChangePINProvider wrongPinProvider = + new TestWrongChangePINProvider(wrongPin, defaultPin, numWrongTries); + + try { + signatureCard.changePIN(pinSpec, wrongPinProvider); + } catch (CancelledException ex) { + } finally { + assertTrue(wrongPinProvider.getProvided() == numWrongTries); + } + } + } } -- cgit v1.2.3