diff options
| author | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2010-01-05 10:06:47 +0000 | 
|---|---|---|
| committer | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2010-01-05 10:06:47 +0000 | 
| commit | 3da4655d011dfc2f04f9e4ac28b38aee42d01bc0 (patch) | |
| tree | d9b524ca4ccfd6e48573dfecf5191ccba48278af /smcc/src/test/java/at | |
| parent | ecc11bdb13ae27385486ad1c944ee01ffd0440e7 (diff) | |
| download | mocca-3da4655d011dfc2f04f9e4ac28b38aee42d01bc0.tar.gz mocca-3da4655d011dfc2f04f9e4ac28b38aee42d01bc0.tar.bz2 mocca-3da4655d011dfc2f04f9e4ac28b38aee42d01bc0.zip | |
Features
[#437] Handle pinpad [64:03] response apdu correctly
[#445] pin entry feedback for VERIFY_PIN_START/FINISH
[#471] Provide SecureViewer Link before Pinpad PinEntry timeout starts
Bugs
[#479] PIN Managment Applet allows unmatching new pin and pin confirmation
[#480] PIN Management displays blocked PINs as ACTIVE
[#486] Not possible to select 3 times in series the same item from signedReferencesList for display in secureViewer
[#506] change pin dialog (gui) issues
[#508] e-card G3 PIN activation (with TransportPIN) not supported
[#509] closing secure viewer window (WINDOW_CLOSING) leaves "signature data is displayed in viewer" dialog in applet
git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@565 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
Diffstat (limited to 'smcc/src/test/java/at')
31 files changed, 918 insertions, 328 deletions
| diff --git a/smcc/src/test/java/at/gv/egiz/smcc/AbstractAppl.java b/smcc/src/test/java/at/gv/egiz/smcc/AbstractAppl.java index 137de509..affb06ff 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/AbstractAppl.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/AbstractAppl.java @@ -51,6 +51,7 @@ public abstract class AbstractAppl implements CardAppl {      return files;    } +  @Override    public abstract void setPin(int kid, char[] value);  }
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/CardEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/CardEmul.java index 6017bcce..3dfc8510 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/CardEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/CardEmul.java @@ -28,15 +28,15 @@ import javax.smartcardio.CardException;  @SuppressWarnings("restriction")  public abstract class CardEmul extends Card { -  protected Thread exclThread = null; -  protected CardChannel channel = newCardChannel(this); +  protected Thread exclThread; // = null; +  protected CardChannel channel; // = newCardChannel(this);    protected List<AbstractAppl> applications = new ArrayList<AbstractAppl>();    public CardEmul() {      super();    } -  protected abstract CardChannelEmul newCardChannel(CardEmul cardEmul); +//  protected abstract CardChannelEmul newCardChannel(CardEmul cardEmul);    @Override    public void beginExclusive() throws CardException { @@ -71,9 +71,9 @@ public abstract class CardEmul extends Card {    @Override    public void disconnect(boolean reset) throws CardException { -    if (reset) { -      channel = newCardChannel(this); -    } +//    if (reset) { +//      channel = newCardChannel(this); +//    }    }    @Override @@ -93,7 +93,7 @@ public abstract class CardEmul extends Card {        }    public AbstractAppl getApplication(byte[] fid) { -     +      for(AbstractAppl appl : applications) {        if (Arrays.equals(appl.getAID(), fid) || Arrays.equals(appl.getFID(), fid)) {          return appl; 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 b3bd07ab..44e48836 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java @@ -16,12 +16,14 @@  */  package at.gv.egiz.smcc; +import at.gv.egiz.smcc.pin.gui.CancelPINProvider; +import at.gv.egiz.smcc.pin.gui.InterruptPINProvider; +import at.gv.egiz.smcc.pin.gui.CancelChangePINProvider;  import static org.junit.Assert.*;  import java.io.ByteArrayInputStream;  import java.io.IOException;  import java.io.UnsupportedEncodingException; -import java.security.MessageDigest;  import java.security.NoSuchAlgorithmException;  import java.util.Arrays;  import java.util.List; @@ -32,119 +34,15 @@ import org.junit.Test;  import at.gv.egiz.smcc.SignatureCard.KeyboxName;  import at.gv.egiz.smcc.acos.A04ApplDEC; +import at.gv.egiz.smcc.pin.gui.DummyPINGUI; +import at.gv.egiz.smcc.pin.gui.ModifyPINGUI; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; +import org.junit.Ignore;  @SuppressWarnings("restriction")  public abstract class CardTest { -  public class TestPINProvider implements PINProvider { -     -    int provided = 0; -   -    char[] pin; -   -    public TestPINProvider(char[] pin) { -      super(); -      this.pin = pin; -    } -   -    @Override -    public char[] providePIN(PINSpec spec, int retries) -        throws CancelledException, InterruptedException { -      provided++; -      return pin; -    } - -    public int getProvided() { -      return provided; -    } -   -  } - -  public class TestChangePINProvider extends TestPINProvider implements -      ChangePINProvider { -   -    char[] oldPin; -   -    public TestChangePINProvider(char[] oldPin, char[] pin) { -      super(pin); -      this.oldPin = oldPin; -    } -   -    @Override -    public char[] provideOldPIN(PINSpec spec, int retries) -        throws CancelledException, InterruptedException { -      return oldPin; -    } -   -  } - -  public class TestInvalidPINProvider implements PINProvider { - -    int provided = 0; -    int numWrongTries = 0; - -    char[] pin; - -    public TestInvalidPINProvider(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 TestInvalidChangePINProvider implements ChangePINProvider { - -    int provided = 0; -    int numWrongTries = 0; - -    char[] pin; -    char[] oldPin; - -    /** emulate ChangePinProvider */ -    public TestInvalidChangePINProvider(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();    } @@ -167,7 +65,7 @@ public abstract class CardTest {      SignatureCard signatureCard = createSignatureCard(); -    TestPINProvider pinProvider = new TestPINProvider(pin); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider(pin);      byte[] idlink = signatureCard.getInfobox("IdentityLink",          pinProvider, null); @@ -184,13 +82,7 @@ public abstract class CardTest {          SignatureCard signatureCard = createSignatureCard(); -        PINProvider pinProvider = new PINProvider() { -          @Override -          public char[] providePIN(PINSpec spec, int retries) -              throws CancelledException, InterruptedException { -            throw new CancelledException(); -          } -        }; +        PINGUI pinProvider = new CancelPINProvider();      signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, pinProvider, @@ -205,13 +97,7 @@ public abstract class CardTest {          SignatureCard signatureCard = createSignatureCard(); -        PINProvider pinProvider = new PINProvider() { -          @Override -          public char[] providePIN(PINSpec spec, int retries) -              throws CancelledException, InterruptedException { -            throw new CancelledException(); -          } -        }; +        PINGUI pinProvider = new CancelPINProvider();          signatureCard.createSignature(new ByteArrayInputStream("MOCCA"              .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, @@ -226,13 +112,7 @@ public abstract class CardTest {          SignatureCard signatureCard = createSignatureCard(); -        PINProvider pinProvider = new PINProvider() { -          @Override -          public char[] providePIN(PINSpec spec, int retries) -              throws CancelledException, InterruptedException { -            throw new InterruptedException(); -          } -        }; +        PINGUI pinProvider = new InterruptPINProvider();          signatureCard.createSignature(new ByteArrayInputStream("MOCCA"              .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, @@ -247,13 +127,7 @@ public abstract class CardTest {          SignatureCard signatureCard = createSignatureCard(); -        PINProvider pinProvider = new PINProvider() { -          @Override -          public char[] providePIN(PINSpec spec, int retries) -              throws CancelledException, InterruptedException { -            throw new InterruptedException(); -          } -        }; +        PINGUI pinProvider = new InterruptPINProvider();          signatureCard.createSignature(new ByteArrayInputStream("MOCCA"              .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, @@ -268,11 +142,11 @@ public abstract class CardTest {          final SignatureCard signatureCard = createSignatureCard(); -        PINProvider pinProvider = new PINProvider() { +        PINGUI pinProvider = new DummyPINGUI() {            @Override            public char[] providePIN(PINSpec spec, int retries)                throws CancelledException, InterruptedException { -       +              try {                signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR);                assertTrue(false); @@ -281,10 +155,10 @@ public abstract class CardTest {                // expected                throw new CancelledException();              } -       +            }          }; -       +          signatureCard.createSignature(new ByteArrayInputStream("MOCCA"              .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR,              pinProvider, null); @@ -298,7 +172,7 @@ public abstract class CardTest {          final SignatureCard signatureCard = createSignatureCard(); -        PINProvider pinProvider = new PINProvider() { +        PINGUI pinProvider = new DummyPINGUI() {            @Override            public char[] providePIN(PINSpec spec, int retries)                throws CancelledException, InterruptedException { @@ -311,7 +185,6 @@ public abstract class CardTest {                // expected                throw new CancelledException();              } -                  }          }; @@ -339,13 +212,7 @@ public abstract class CardTest {          PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard(); -        PINProvider pinProvider = new PINProvider() { -          @Override -          public char[] providePIN(PINSpec spec, int retries) -              throws CancelledException, InterruptedException { -            throw new CancelledException(); -          } -        }; +        ModifyPINGUI pinProvider = new CancelChangePINProvider();          List<PINSpec> specs = signatureCard.getPINSpecs(); diff --git a/smcc/src/test/java/at/gv/egiz/smcc/PIN.java b/smcc/src/test/java/at/gv/egiz/smcc/PIN.java index ae883727..2cda0c2f 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/PIN.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/PIN.java @@ -23,19 +23,23 @@ public class PIN {    public static final int STATE_PIN_VERIFIED = 1;    public static final int STATE_PIN_BLOCKED = -1; + +  public static final int STATE_PIN_NOTACTIVE = 2;    public byte[] pin;    public int kid; -  public int state = STATE_RESET; +  public int state; // = STATE_RESET; -  public int kfpc = 10; +  public int kfpc; // = 10; -  public PIN(byte[] pin, int kid, int kfpc) { +  //TODO also provde default constructor without state param +  public PIN(byte[] pin, int kid, int kfpc, int state) {      this.pin = pin;      this.kid = kid;      this.kfpc = kfpc; +    this.state = state;    }  } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03ApplDEC.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03ApplDEC.java index 9fd96d73..f4ac5c35 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03ApplDEC.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03ApplDEC.java @@ -40,7 +40,7 @@ public class A03ApplDEC extends ACOSApplDEC {      putFile(new File(FID_EF_INFOBOX, EF_INFOBOX, FCI_EF_INFOBOX, KID_PIN_INF));      try { -      pins.put(KID_PIN_INF, new PIN("0000\0\0\0\0".getBytes("ASCII"), KID_PIN_INF, 10)); +      pins.put(KID_PIN_INF, new PIN("0000\0\0\0\0".getBytes("ASCII"), KID_PIN_INF, 10, PIN.STATE_RESET));      } catch (UnsupportedEncodingException e) {        throw new RuntimeException(e);      } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardEmul.java index 58216b6b..7394bae7 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardEmul.java @@ -24,13 +24,8 @@ import at.gv.egiz.smcc.CardEmul;  public class A03CardEmul extends ACOSCardEmul {    public A03CardEmul(A03ApplSIG applSIG, A03ApplDEC applDEC) { +    channel = new A03CardChannelEmul(this);      applications.add(applSIG);      applications.add(applDEC);    } - -  @Override -  protected CardChannelEmul newCardChannel(CardEmul cardEmul) { -    return new A03CardChannelEmul(this); -  } -  } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardTest.java index 776c0370..3a8ac41c 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardTest.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardTest.java @@ -22,15 +22,16 @@ import java.util.Arrays;  import org.junit.Test; -import at.gv.egiz.smcc.ACOSCard;  import at.gv.egiz.smcc.CancelledException;  import at.gv.egiz.smcc.CardEmul;  import at.gv.egiz.smcc.CardNotSupportedException;  import at.gv.egiz.smcc.CardTerminalEmul; +import at.gv.egiz.smcc.pin.gui.ChangePINProvider;  import at.gv.egiz.smcc.LockedException;  import at.gv.egiz.smcc.NotActivatedException;  import at.gv.egiz.smcc.PINFormatException;  import at.gv.egiz.smcc.PINMgmtSignatureCard; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider;  import at.gv.egiz.smcc.PINSpec;  import at.gv.egiz.smcc.SignatureCard;  import at.gv.egiz.smcc.SignatureCardException; @@ -74,12 +75,12 @@ public class A03CardTest extends ACOSCardTest {        char[] pin = defaultPin;        for (int i = pinSpec.getMinLength(); i <= pinSpec.getMaxLength(); i++) { -        signatureCard.verifyPIN(pinSpec, new TestPINProvider(pin)); +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(pin));          char[] newPin = new char[i];          Arrays.fill(newPin, '0');          signatureCard -            .changePIN(pinSpec, new TestChangePINProvider(pin, newPin)); -        signatureCard.verifyPIN(pinSpec, new TestPINProvider(newPin)); +            .changePIN(pinSpec, new ChangePINProvider(pin, newPin)); +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(newPin));          pin = newPin;        } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardEmul.java index 70925aa6..dd44d05b 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardEmul.java @@ -24,14 +24,9 @@ import at.gv.egiz.smcc.CardEmul;  public class A04CardEmul extends ACOSCardEmul {    public A04CardEmul(A04ApplSIG applSIG, A04ApplDEC applDEC) { +    channel = new A04CardChannelEmul(this);      applications.add(applSIG);      applications.add(applDEC);    } - -  @Override -  protected CardChannelEmul newCardChannel(CardEmul cardEmul) { -    return new A04CardChannelEmul(this); -  } -  } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardTest.java index d15e80d7..1cbea1b3 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardTest.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardTest.java @@ -28,7 +28,6 @@ import java.util.Arrays;  import org.junit.BeforeClass;  import org.junit.Test; -import at.gv.egiz.smcc.ACOSCard;  import at.gv.egiz.smcc.CancelledException;  import at.gv.egiz.smcc.CardEmul;  import at.gv.egiz.smcc.CardNotSupportedException; @@ -41,7 +40,8 @@ import at.gv.egiz.smcc.PINSpec;  import at.gv.egiz.smcc.SignatureCard;  import at.gv.egiz.smcc.SignatureCardException;  import at.gv.egiz.smcc.SignatureCardFactory; -import at.gv.egiz.smcc.CardTest.TestPINProvider; +import at.gv.egiz.smcc.pin.gui.ChangePINProvider; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider;  public class A04CardTest extends ACOSCardTest { @@ -88,8 +88,8 @@ public class A04CardTest extends ACOSCardTest {          char[] newPin = new char[i];          Arrays.fill(newPin, '0');          signatureCard -            .changePIN(pinSpec, new TestChangePINProvider(pin, newPin)); -        signatureCard.verifyPIN(pinSpec, new TestPINProvider(newPin)); +            .changePIN(pinSpec, new ChangePINProvider(pin, newPin)); +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(newPin));          pin = newPin;        } @@ -111,7 +111,7 @@ public class A04CardTest extends ACOSCardTest {      SignatureCard signatureCard = factory.createSignatureCard(card,          new CardTerminalEmul(card)); -    TestPINProvider pinProvider = new TestPINProvider(pin); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider(pin);      byte[] idlink = signatureCard.getInfobox("IdentityLink",          pinProvider, null); @@ -129,7 +129,7 @@ public class A04CardTest extends ACOSCardTest {      SignatureCard signatureCard = createSignatureCard(); -    TestPINProvider pinProvider = new TestPINProvider(pin); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider(pin);      byte[] idlink = signatureCard.getInfobox("IdentityLink",          pinProvider, null); diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSApplDEC.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSApplDEC.java index 08979536..09a754f3 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSApplDEC.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSApplDEC.java @@ -297,7 +297,7 @@ public abstract class ACOSApplDEC extends ACOSAppl {      System.arraycopy(C_CH_EKEY, 0, EF_C_CH_EKEY, 0, C_CH_EKEY.length);      putFile(new File(FID_EF_C_CH_EKEY, EF_C_CH_EKEY, FCI_EF_C_CH_EKEY));      try { -      pins.put(KID_PIN_DEC, new PIN("1234\0\0\0\0".getBytes("ASCII"), KID_PIN_DEC, 10)); +      pins.put(KID_PIN_DEC, new PIN("1234\0\0\0\0".getBytes("ASCII"), KID_PIN_DEC, 10, PIN.STATE_RESET));      } catch (UnsupportedEncodingException e) {        throw new RuntimeException(e);      } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSApplSIG.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSApplSIG.java index e476b434..6ab5903a 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSApplSIG.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSApplSIG.java @@ -221,7 +221,7 @@ public abstract class ACOSApplSIG extends ACOSAppl {      // PINs      try { -      pins.put(KID_PIN_SIG, new PIN(Arrays.copyOf("123456".getBytes("ASCII"), 8), KID_PIN_SIG, 3)); +      pins.put(KID_PIN_SIG, new PIN(Arrays.copyOf("123456".getBytes("ASCII"), 8), KID_PIN_SIG, 3, PIN.STATE_RESET));      } catch (UnsupportedEncodingException e) {        throw new RuntimeException(e);      } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardTest.java index 56d1e4b2..4f012739 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardTest.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardTest.java @@ -16,26 +16,23 @@  */  package at.gv.egiz.smcc.acos; -import static org.junit.Assert.assertEquals;  import static org.junit.Assert.assertNotNull;  import static org.junit.Assert.assertNull;  import static org.junit.Assert.assertTrue;  import java.io.ByteArrayInputStream;  import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.security.MessageDigest;  import java.security.NoSuchAlgorithmException;  import java.util.Arrays;  import org.junit.Test; -import at.gv.egiz.smcc.ACOSCard;  import at.gv.egiz.smcc.CardEmul;  import at.gv.egiz.smcc.CardNotSupportedException;  import at.gv.egiz.smcc.CardTest;  import at.gv.egiz.smcc.LockedException;  import at.gv.egiz.smcc.NotActivatedException; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider;  import at.gv.egiz.smcc.SignatureCard;  import at.gv.egiz.smcc.SignatureCardException;  import at.gv.egiz.smcc.SignatureCard.KeyboxName; @@ -60,7 +57,7 @@ public abstract class ACOSCardTest extends CardTest {      appl.clearInfobox();      byte[] idlink = signatureCard.getInfobox("IdentityLink", -        new TestPINProvider(pin), null); +        new SMCCTestPINProvider(pin), null);      assertNull(idlink);    } @@ -76,7 +73,7 @@ public abstract class ACOSCardTest extends CardTest {      ACOSApplDEC appl = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC);      appl.setInfoboxHeader((byte) 0xFF); -    signatureCard.getInfobox("IdentityLink", new TestPINProvider(pin), null); +    signatureCard.getInfobox("IdentityLink", new SMCCTestPINProvider(pin), null);    } @@ -138,7 +135,7 @@ public abstract class ACOSCardTest extends CardTest {      byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), -        KeyboxName.SECURE_SIGNATURE_KEYPAIR, new TestPINProvider(pin), null); +        KeyboxName.SECURE_SIGNATURE_KEYPAIR, new SMCCTestPINProvider(pin), null);      assertNotNull(signature); @@ -158,7 +155,7 @@ public abstract class ACOSCardTest extends CardTest {      byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), -        KeyboxName.CERITIFIED_KEYPAIR, new TestPINProvider(pin), null); +        KeyboxName.CERITIFIED_KEYPAIR, new SMCCTestPINProvider(pin), null);      assertNotNull(signature); @@ -171,7 +168,7 @@ public abstract class ACOSCardTest extends CardTest {      SignatureCard signatureCard = createSignatureCard(); -    TestPINProvider pinProvider = new TestPINProvider("000000".toCharArray()); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("000000".toCharArray());      signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, @@ -186,7 +183,7 @@ public abstract class ACOSCardTest extends CardTest {      SignatureCard signatureCard = createSignatureCard(); -    TestPINProvider pinProvider = new TestPINProvider("0000".toCharArray()); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("0000".toCharArray());      signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, @@ -204,7 +201,7 @@ public abstract class ACOSCardTest extends CardTest {      ACOSApplSIG appl = (ACOSApplSIG) card.getApplication(ACOSAppl.AID_SIG);      appl.setPin(ACOSApplSIG.KID_PIN_SIG, null); -    TestPINProvider pinProvider = new TestPINProvider("000000".toCharArray()); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("000000".toCharArray());      signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, @@ -222,7 +219,7 @@ public abstract class ACOSCardTest extends CardTest {      ACOSApplDEC appl = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC);      appl.setPin(ACOSApplDEC.KID_PIN_DEC, null); -    TestPINProvider pinProvider = new TestPINProvider("0000".toCharArray()); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("0000".toCharArray());      signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/CancelChangePINProvider.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/CancelChangePINProvider.java new file mode 100644 index 00000000..dffe7e29 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/CancelChangePINProvider.java @@ -0,0 +1,39 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +public class CancelChangePINProvider extends DummyChangePINGUI implements ModifyPINGUI { + +  public CancelChangePINProvider() { +  } + +  @Override +  public char[] provideCurrentPIN(PINSpec spec, int retries) +          throws CancelledException, InterruptedException { +    throw new CancelledException("cancelled by cancelPINProvider"); +  } + +  @Override +  public char[] provideNewPIN(PINSpec spec) +          throws CancelledException, InterruptedException { +    throw new CancelledException("cancelled by cancelPINProvider"); +  } + +}
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/CancelPINProvider.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/CancelPINProvider.java new file mode 100644 index 00000000..77f19345 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/CancelPINProvider.java @@ -0,0 +1,29 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +public class CancelPINProvider extends DummyPINGUI implements PINGUI { + +  @Override +  public char[] providePIN(PINSpec spec, int retries) +          throws CancelledException, InterruptedException { +    throw new CancelledException("cancelled by cancelPINProvider"); +  } +}
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/ChangePINProvider.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/ChangePINProvider.java new file mode 100644 index 00000000..5eb8b9a1 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/ChangePINProvider.java @@ -0,0 +1,49 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +public class ChangePINProvider extends DummyChangePINGUI implements ModifyPINGUI { + +  int provided = 0; +  char[] pin; +  char[] oldPin; + +  public ChangePINProvider(char[] oldPin, char[] pin) { +    this.pin = pin; +    this.oldPin = oldPin; +  } + +  public int getProvided() { +    return provided; +  } + +  @Override +  public char[] provideCurrentPIN(PINSpec spec, int retries) +          throws CancelledException, InterruptedException { +    provided++; +    return oldPin; +  } + +  @Override +  public char[] provideNewPIN(PINSpec spec) { +    return pin; +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/DummyChangePINGUI.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/DummyChangePINGUI.java new file mode 100644 index 00000000..fff89409 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/DummyChangePINGUI.java @@ -0,0 +1,68 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +public abstract class DummyChangePINGUI implements ModifyPINGUI { + +  @Override +  public void validKeyPressed() { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void correctionButtonPressed() { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void allKeysCleared() { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void finish() { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void finishDirect() { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void modifyPINDirect(PINSpec spec, int retries) throws CancelledException, InterruptedException { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void enterCurrentPIN(PINSpec spec, int retries) { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void enterNewPIN(PINSpec spec) { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void confirmNewPIN(PINSpec spec) { +    throw new UnsupportedOperationException("Not supported yet."); +  } +}
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/DummyPINGUI.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/DummyPINGUI.java new file mode 100644 index 00000000..4d99b5c1 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/DummyPINGUI.java @@ -0,0 +1,48 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +public abstract class DummyPINGUI implements PINGUI { + +   @Override +  public void enterPINDirect(PINSpec spec, int retries) throws CancelledException, InterruptedException { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void enterPIN(PINSpec spec, int retries) throws CancelledException, InterruptedException { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void validKeyPressed() { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void correctionButtonPressed() { +    throw new UnsupportedOperationException("Not supported yet."); +  } + +  @Override +  public void allKeysCleared() { +    throw new UnsupportedOperationException("Not supported yet."); +  } +}
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InterruptPINProvider.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InterruptPINProvider.java new file mode 100644 index 00000000..5706b888 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InterruptPINProvider.java @@ -0,0 +1,34 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +@SuppressWarnings("restriction") +public class InterruptPINProvider extends DummyPINGUI implements PINGUI { + +  public InterruptPINProvider() { +  } + +  @Override +  public char[] providePIN(PINSpec spec, int retries) +          throws CancelledException, InterruptedException { +    throw new InterruptedException("interrupted by cancelPINProvider"); +  } + +}
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InvalidChangePINProvider.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InvalidChangePINProvider.java new file mode 100644 index 00000000..69c9f42a --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InvalidChangePINProvider.java @@ -0,0 +1,56 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +public class InvalidChangePINProvider extends DummyChangePINGUI implements ModifyPINGUI { + +  int provided = 0; +  int numWrongTries = 0; +  char[] pin; +  char[] oldPin; + +  /** emulate ChangePinProvider */ +  public InvalidChangePINProvider(char[] oldPin, char[] newPin, int numWrongTries) { +    super(); +    this.pin = newPin; +    this.oldPin = oldPin; +    this.numWrongTries = numWrongTries; +  } + +  @Override +  public char[] provideCurrentPIN(PINSpec spec, int retries) +          throws CancelledException, InterruptedException { +    if (provided >= numWrongTries) { +      throw new CancelledException("Number of wrong tries reached: " + provided); +    } else { +      provided++; +      return oldPin; +    } +  } + +  public int getProvided() { +    return provided; +  } + +  @Override +  public char[] provideNewPIN(PINSpec spec) { +    return pin; +  } +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InvalidPINProvider.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InvalidPINProvider.java new file mode 100644 index 00000000..db01fd0d --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/InvalidPINProvider.java @@ -0,0 +1,48 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +public class InvalidPINProvider extends DummyPINGUI implements PINGUI { + +  int provided = 0; +  int numWrongTries = 0; +  char[] pin; + +  public InvalidPINProvider(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; +  } +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/SMCCTestPINProvider.java b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/SMCCTestPINProvider.java new file mode 100644 index 00000000..dffc90d7 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/pin/gui/SMCCTestPINProvider.java @@ -0,0 +1,43 @@ +/* + * 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.pin.gui; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PINSpec; + +public class SMCCTestPINProvider extends DummyPINGUI implements PINGUI { + +  public int provided = 0; +  char[] pin; + +  public SMCCTestPINProvider(char[] pin) { +    this.pin = pin; +  } + +  @Override +  public char[] providePIN(PINSpec spec, int retries) +          throws CancelledException, InterruptedException { +    provided++; +    return pin; +  } + +  public int getProvided() { +    return provided; +  } + +  +}
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSAppl.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSAppl.java index 2ca63eea..62528e6e 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSAppl.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSAppl.java @@ -69,27 +69,4 @@ public abstract class STARCOSAppl extends AbstractAppl implements CardAppl {        pin.next().state = PIN.STATE_RESET;      }    } -   -  public void setPin(int kid, char[] value) { -    PIN pin = pins.get(kid); -    if (pin != null) { -      if (value == null) { -        pin.pin = null; -      } else { -        byte[] b = new byte[8]; -        b[0] = (byte) (0x20 | value.length); -        for(int i = 1, j = 0; i < b.length; i++) { -          int h = ((j < value.length)  -                  ? Character.digit(value[j++], 10)  -                  : 0x0F); -          int l = ((j < value.length)  -                  ? Character.digit(value[j++], 10)  -                  : 0x0F); -          b[i] = (byte) ((h << 4) | l); -        } -        pin.pin = b; -      } -    } -  } -  } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplGewoehnlicheSignatur.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplGewoehnlicheSignatur.java index cec305da..8741dd2d 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplGewoehnlicheSignatur.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplGewoehnlicheSignatur.java @@ -16,7 +16,6 @@  */  package at.gv.egiz.smcc.starcos; -import java.io.UnsupportedEncodingException;  import java.util.Arrays;  import java.util.Random; @@ -200,12 +199,18 @@ public class STARCOSApplGewoehnlicheSignatur extends STARCOSAppl {    protected byte[] EF_C_X509_CH_AUT = new byte[2000]; -   -  public STARCOSApplGewoehnlicheSignatur(STARCOSCardChannelEmul channel) { + +  protected byte[] dst; + +  public static final byte[] DST = new byte[] { (byte) 0x84, (byte) 0x03, (byte) 0x80, (byte) 0x02, (byte) 0x00, (byte) 0x89, (byte) 0x03, (byte) 0x13, (byte) 0x35, (byte) 0x10}; +  public static final byte[] DST_G3 = new byte[] { (byte) 0x84, (byte) 0x03, (byte) 0x80, (byte) 0x02, (byte) 0x00, (byte) 0x80, (byte) 0x01, (byte) 0x04 }; + +  public STARCOSApplGewoehnlicheSignatur(STARCOSCardChannelEmul channel, byte[] dst) {      super(channel);      // Files      System.arraycopy(C_X509_CH_AUT, 0, EF_C_X509_CH_AUT, 0, C_X509_CH_AUT.length);      putFile(new File(FID_EF_C_X509_CH_AUT, EF_C_X509_CH_AUT, FCI_EF_C_X509_CH_AUT)); +    this.dst = dst;    }    @Override @@ -240,12 +245,19 @@ public class STARCOSApplGewoehnlicheSignatur extends STARCOSAppl {        case 0x81:          // EXTERNAL AUTHENTICATE        } +    case 0xAA: +      switch (command.getP1()) { +      case 0x41:  +        if (Arrays.equals(new byte[] {(byte) 0x80, (byte) 0x01, (byte) 0x10}, command.getData())) { +          return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); +        } +      default: +        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); +      }      case 0xB6:        switch (command.getP1()) {        case 0x41: {          // PSO - COMPUTE DIGITAL SIGNATURE -        byte[] dst = new byte[] { (byte) 0x84, (byte) 0x03, (byte) 0x80, -            (byte) 0x02, (byte) 0x00, (byte) 0x89, (byte) 0x03, (byte) 0x13, (byte) 0x35, (byte) 0x10};          if (Arrays.equals(dst, command.getData())) {            securityEnv = command.getData();            return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); @@ -328,5 +340,10 @@ public class STARCOSApplGewoehnlicheSignatur extends STARCOSAppl {    } +  @Override +  public void setPin(int kid, char[] value) { +    throw new UnsupportedOperationException("Not supported yet."); +  } +  }
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplInfobox.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplInfobox.java index b7835a43..c470351a 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplInfobox.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplInfobox.java @@ -156,5 +156,10 @@ public class STARCOSApplInfobox extends STARCOSAppl {      throw new CardException("Not supported.");    } +  @Override +  public void setPin(int kid, char[] value) { +    throw new UnsupportedOperationException("Not supported yet."); +  } +  }
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplSichereSignatur.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplSichereSignatur.java index 9fb5ad37..4036ca41 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplSichereSignatur.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplSichereSignatur.java @@ -213,16 +213,14 @@ public class STARCOSApplSichereSignatur extends STARCOSAppl {    protected byte[] EF_C_X509_CH_DS = new byte[2000]; -  public STARCOSApplSichereSignatur(STARCOSCardChannelEmul channel) { +  public STARCOSApplSichereSignatur(STARCOSCardChannelEmul channel, byte[] SS_pin, int pinState) {      super(channel);      // Files      System.arraycopy(C_X509_CH_DS, 0, EF_C_X509_CH_DS, 0, C_X509_CH_DS.length);      putFile(new File(FID_EF_C_X509_CH_DS, EF_C_X509_CH_DS, FCI_EF_C_X509_CH_DS));      // PINs -    pins.put(KID_PIN_SS, new PIN(new byte[] { (byte) 0x24, (byte) 0x12, -        (byte) 0x34, (byte) 0x56, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, -        (byte) 0xFF }, KID_PIN_SS, 3)); +    pins.put(KID_PIN_SS, new PIN(SS_pin, KID_PIN_SS, 3, pinState));    }    @Override @@ -344,4 +342,34 @@ public class STARCOSApplSichereSignatur extends STARCOSAppl {    } +  /** +   * set and activate pin +   * @param value if null, pin will be set to NOTACTIVE +   */ +  @Override +  public void setPin(int kid, char[] value) { +    PIN pin = pins.get(kid); +    if (pin != null) { +      if (value == null) { +//        pin.pin = null; +        //TransportPIN +//        pin.pin = new byte[] { (byte) 0x26, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; +        pin.state = PIN.STATE_PIN_NOTACTIVE; +      } else { +        byte[] b = new byte[8]; +        b[0] = (byte) (0x20 | value.length); +        for(int i = 1, j = 0; i < b.length; i++) { +          int h = ((j < value.length) +                  ? Character.digit(value[j++], 10) +                  : 0x0F); +          int l = ((j < value.length) +                  ? Character.digit(value[j++], 10) +                  : 0x0F); +          b[i] = (byte) ((h << 4) | l); +        } +        pin.pin = b; +        pin.state = PIN.STATE_RESET; +      } +    } +  }  }
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardChannelEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardChannelEmul.java index 89030894..2e0c54eb 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardChannelEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardChannelEmul.java @@ -16,7 +16,6 @@  */  package at.gv.egiz.smcc.starcos; -import java.io.UnsupportedEncodingException;  import java.util.Arrays;  import java.util.HashMap; @@ -30,6 +29,8 @@ import at.gv.egiz.smcc.CardChannelEmul;  import at.gv.egiz.smcc.CardEmul;  import at.gv.egiz.smcc.File;  import at.gv.egiz.smcc.PIN; +import java.util.ArrayList; +import java.util.List;  @SuppressWarnings("restriction")  public class STARCOSCardChannelEmul extends CardChannelEmul { @@ -40,14 +41,13 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {     *      */    protected CardEmul cardEmul; -   + +  public final List<File> globalFiles = new ArrayList<File>();    public final HashMap<Integer, PIN> globalPins = new HashMap<Integer, PIN>(); -  public STARCOSCardChannelEmul(CardEmul cardEmul) { +  public STARCOSCardChannelEmul(CardEmul cardEmul, byte[] Glob_PIN, int PIN_STATE) {      this.cardEmul = cardEmul; -    globalPins.put(KID_PIN_Glob, new PIN(new byte[] { (byte) 0x24, (byte) 0x00, -        (byte) 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, -        (byte) 0xFF }, KID_PIN_Glob, 10)); +    globalPins.put(KID_PIN_Glob, new PIN(Glob_PIN, KID_PIN_Glob, 10, PIN_STATE));   }    @Override @@ -88,6 +88,21 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {            }          }          return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x82}); +      } else if (globalFiles != null) { +        if (command.getP2() != 0x04) { +          throw new CardException("Not supported."); +        } +        for (File file : globalFiles) { +          if (Arrays.equals(fid, file.fid)) { +            currentFile = file; +            byte[] response = new byte[file.fcx.length + 2]; +            System.arraycopy(file.fcx, 0, response, 0, file.fcx.length); +            response[file.fcx.length] = (byte) 0x90; +            response[file.fcx.length + 1] = (byte) 0x00; +            return new ResponseAPDU(response); +          } +        } +        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x82});        } else {          throw new CardException("Not supported.");        } @@ -121,6 +136,23 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {    } +  protected ResponseAPDU cmdREAD_RECORD(CommandAPDU command) throws CardException { +    if (command.getINS() != 0xB2) { +      throw new IllegalArgumentException("INS has to be 0xB2"); +    } +    if (currentFile == null) { +      return new ResponseAPDU(new byte[]{ (byte) 0x69, (byte) 0x86 }); +    } +    if (command.getP1() != 0x01 || command.getP2() != 0x04) { +      throw new CardException("Not implemented."); +    } +    byte[] response = new byte[currentFile.file.length + 2]; +    System.arraycopy(currentFile.file, 0, response, 0, currentFile.file.length); +    response[currentFile.file.length] = (byte) 0x90; +    response[currentFile.file.length + 1] = (byte) 0x00; +    return new ResponseAPDU(response); +  } +    protected ResponseAPDU cmdREAD_BINARY(CommandAPDU command) throws CardException {      if (command.getINS() != 0xB0) { @@ -192,6 +224,10 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {        case 0xB0:          return cmdREAD_BINARY(command); +      // READ RECORD +      case 0xB2: +        return cmdREAD_RECORD(command); +        // VERIFY        case 0x20:          return cmdVERIFY(command); @@ -248,9 +284,15 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {      }      if (pin != null) { -   -      if (reference.length == 0) { -        return new ResponseAPDU(new byte[] { (byte) 0x63, (byte) (pin.kfpc | 0xC0)}); + +      if (reference == null || reference.length == 0) { +        if (pin.state == PIN.STATE_PIN_NOTACTIVE) { +          return new ResponseAPDU(new byte[] { (byte) 0x69, (byte) 0x84 }); +        } else if (pin.state == PIN.STATE_PIN_BLOCKED) { +          return new ResponseAPDU(new byte[] { (byte) 0x63, (byte) 0xc0 }); +        } else { +          return new ResponseAPDU(new byte[] { (byte) 0x63, (byte) (pin.kfpc | 0xC0)}); +        }        }        if (reference.length != 8) { @@ -264,7 +306,7 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {          case PIN.STATE_RESET:            pin.state = PIN.STATE_PIN_VERIFIED; -           +          default:            pin.kfpc = 10;            return new ResponseAPDU(new byte[] { (byte) 0x90, (byte) 0x00 }); @@ -321,7 +363,20 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {          return new ResponseAPDU(new byte[] {(byte) 0x67, (byte) 0x00});        } -      response = verifyPin(0xFF & command.getP2(), data); +      PIN pin; +      if (currentAppl != null) { +        pin = currentAppl.pins.get(command.getP2()); +      } else { +        pin = globalPins.get(command.getP2()); +      } +      if (pin.state == PIN.STATE_PIN_NOTACTIVE) { +        pin.pin = data; +        pin.state = PIN.STATE_RESET; +        response = new ResponseAPDU(new byte[] { (byte) 0x90, (byte) 0x00 }); +      } else { +        // P1 == 0x01 not allowed on active pin (?) +        response = new ResponseAPDU(new byte[] { (byte) 0x6A, (byte) 0x86}); +      }      } else if (command.getP1() == 0x00) { @@ -330,21 +385,22 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {        }        response = verifyPin(0xFF & command.getP2(), Arrays.copyOf(data, 8)); -     + +      if (response.getSW() == 0x9000) { +        PIN pin; +        if (currentAppl != null) { +          pin = currentAppl.pins.get(command.getP2()); +        } else { +          pin = globalPins.get(command.getP2()); +        } +        pin.pin = Arrays.copyOfRange(data, 8, 16); +        pin.state = PIN.STATE_PIN_VERIFIED; +      } +      } else {        return new ResponseAPDU(new byte[] { (byte) 0x6A, (byte) 0x81 });      } -    if (response.getSW() == 0x9000) { -      PIN pin; -      if (currentAppl != null) { -        pin = currentAppl.pins.get(command.getP2()); -      } else { -        pin = globalPins.get(command.getP2()); -      } -      pin.pin = Arrays.copyOfRange(data, 8, 16); -    } -      return response;    } @@ -353,7 +409,10 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {      PIN pin = globalPins.get(kid);      if (pin != null) {        if (value == null) { -        pin.pin = null; +//        pin.pin = null; +        //TransportPIN +//        pin.pin = new byte[] { (byte) 0x24, (byte) 0x12, (byte) 0x34, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; +        pin.state = PIN.STATE_PIN_NOTACTIVE;        } else {          byte[] b = new byte[8];          b[0] = (byte) (0x20 | value.length); diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardEmul.java index 7b2f3fbe..5963fb63 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardEmul.java @@ -21,30 +21,34 @@ import javax.smartcardio.ATR;  import at.gv.egiz.smcc.CardChannelEmul;  import at.gv.egiz.smcc.CardEmul; +import at.gv.egiz.smcc.PIN;  @SuppressWarnings("restriction")  public class STARCOSCardEmul extends CardEmul { -   + +  public static byte[] DEFAULT_SS_PIN = new byte[] { (byte) 0x26, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; +  public static byte[] DEFAULT_Glob_PIN = new byte[] { (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; +    protected static ATR ATR = new ATR(new byte[] {        (byte) 0x3b, (byte) 0xbd, (byte) 0x18, (byte) 0x00, (byte) 0x81, (byte) 0x31, (byte) 0xfe, (byte) 0x45,         (byte) 0x80, (byte) 0x51, (byte) 0x02, (byte) 0x67, (byte) 0x05, (byte) 0x18, (byte) 0xb1, (byte) 0x02,         (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x81, (byte) 0x05, (byte) 0x31    }); -   +    public STARCOSCardEmul() { -    applications.add(new STARCOSApplSichereSignatur((STARCOSCardChannelEmul) channel)); +    this(DEFAULT_SS_PIN, DEFAULT_Glob_PIN, PIN.STATE_RESET); +  } + +  public STARCOSCardEmul(byte[] SS_PIN, byte[] Glob_PIN, int PIN_STATE) { +    channel = new STARCOSCardChannelEmul(this, Glob_PIN, PIN_STATE); +    applications.add(new STARCOSApplSichereSignatur((STARCOSCardChannelEmul) channel, SS_PIN, PIN_STATE));      applications.add(new STARCOSApplInfobox((STARCOSCardChannelEmul) channel)); -    applications.add(new STARCOSApplGewoehnlicheSignatur((STARCOSCardChannelEmul) channel)); +    applications.add(new STARCOSApplGewoehnlicheSignatur((STARCOSCardChannelEmul) channel, +            STARCOSApplGewoehnlicheSignatur.DST));    }    @Override    public ATR getATR() {      return ATR;    } - -  @Override -  protected CardChannelEmul newCardChannel(CardEmul cardEmul) { -    return new STARCOSCardChannelEmul(this); -  } -  }
\ No newline at end of file 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 b7dc9a0c..154884d4 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 @@ -22,12 +22,9 @@ import static org.junit.Assert.assertTrue;  import java.io.ByteArrayInputStream;  import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.security.MessageDigest;  import java.security.NoSuchAlgorithmException;  import java.util.Arrays; -import javax.smartcardio.CardChannel;  import org.junit.Test; @@ -36,25 +33,20 @@ import at.gv.egiz.smcc.CardEmul;  import at.gv.egiz.smcc.CardNotSupportedException;  import at.gv.egiz.smcc.CardTerminalEmul;  import at.gv.egiz.smcc.CardTest; +import at.gv.egiz.smcc.pin.gui.ChangePINProvider; +import at.gv.egiz.smcc.pin.gui.InvalidChangePINProvider; +import at.gv.egiz.smcc.pin.gui.InvalidPINProvider;  import at.gv.egiz.smcc.LockedException;  import at.gv.egiz.smcc.NotActivatedException; +import at.gv.egiz.smcc.PIN;  import at.gv.egiz.smcc.PINFormatException;  import at.gv.egiz.smcc.PINMgmtSignatureCard;  import at.gv.egiz.smcc.PINSpec; -import at.gv.egiz.smcc.STARCOSCard;  import at.gv.egiz.smcc.SignatureCard;  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.pin.gui.SMCCTestPINProvider;  import at.gv.egiz.smcc.SignatureCard.KeyboxName; -import at.gv.egiz.smcc.acos.A03ApplDEC; -import at.gv.egiz.smcc.acos.A04ApplDEC; -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 { @@ -69,7 +61,17 @@ public class STARCOSCardTest extends CardTest {      assertTrue(signatureCard instanceof PINMgmtSignatureCard);      return signatureCard;    } -   + +  protected SignatureCard createSignatureCard(byte[] SS_PIN, byte[] Glob_PIN, int pinState) +      throws CardNotSupportedException { +    SignatureCardFactory factory = SignatureCardFactory.getInstance(); +    STARCOSCardEmul card = new STARCOSCardEmul(SS_PIN, Glob_PIN, pinState); +    SignatureCard signatureCard = factory.createSignatureCard(card, +        new CardTerminalEmul(card)); +    assertTrue(signatureCard instanceof PINMgmtSignatureCard); +    return signatureCard; +  } +    @Test    public void testGetInfoboxIdentityLinkEmpty() throws SignatureCardException,        InterruptedException, CardNotSupportedException { @@ -82,7 +84,7 @@ public class STARCOSCardTest extends CardTest {      appl.clearInfobox();      byte[] idlink = signatureCard.getInfobox("IdentityLink", -        new TestPINProvider(pin), null); +        new SMCCTestPINProvider(pin), null);      assertNull(idlink);    } @@ -98,10 +100,10 @@ public class STARCOSCardTest extends CardTest {      STARCOSApplInfobox appl = (STARCOSApplInfobox) card.getApplication(STARCOSAppl.AID_Infobox);      appl.setInfoboxHeader((byte) 0xFF); -    signatureCard.getInfobox("IdentityLink", new TestPINProvider(pin), null); +    signatureCard.getInfobox("IdentityLink", new SMCCTestPINProvider(pin), null);    } -  +    @Test    public void testGetCerts() throws SignatureCardException,        InterruptedException, CardNotSupportedException { @@ -145,7 +147,7 @@ public class STARCOSCardTest extends CardTest {      signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR);    } -   +    @Test    public void testSignSichereSignatur() throws SignatureCardException,        InterruptedException, CardNotSupportedException, @@ -160,7 +162,7 @@ public class STARCOSCardTest extends CardTest {      byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), -        KeyboxName.SECURE_SIGNATURE_KEYPAIR, new TestPINProvider(pin), null); +        KeyboxName.SECURE_SIGNATURE_KEYPAIR, new SMCCTestPINProvider(pin), null);      assertNotNull(signature); @@ -180,12 +182,12 @@ public class STARCOSCardTest extends CardTest {      byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), -        KeyboxName.CERITIFIED_KEYPAIR, new TestPINProvider(pin), null); +        KeyboxName.CERITIFIED_KEYPAIR, new SMCCTestPINProvider(pin), null);      assertNotNull(signature);    } -   +    @Test(expected = LockedException.class)    public void testSignSichereSignaturInvalidPin() throws SignatureCardException,        InterruptedException, CardNotSupportedException, @@ -193,7 +195,7 @@ public class STARCOSCardTest extends CardTest {      SignatureCard signatureCard = createSignatureCard(); -    TestPINProvider pinProvider = new TestPINProvider("000000".toCharArray()); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("000000".toCharArray());      signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, @@ -208,7 +210,7 @@ public class STARCOSCardTest extends CardTest {      SignatureCard signatureCard = createSignatureCard(); -    TestPINProvider pinProvider = new TestPINProvider("1234".toCharArray()); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("1234".toCharArray());      signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, @@ -221,12 +223,9 @@ public class STARCOSCardTest extends CardTest {        InterruptedException, CardNotSupportedException,        NoSuchAlgorithmException, IOException { -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    STARCOSApplSichereSignatur appl = (STARCOSApplSichereSignatur) card.getApplication(STARCOSApplSichereSignatur.AID_SichereSignatur); -    appl.setPin(STARCOSApplSichereSignatur.KID_PIN_SS, null); +    SignatureCard signatureCard = createSignatureCard(null, null, PIN.STATE_PIN_BLOCKED); -    TestPINProvider pinProvider = new TestPINProvider("000000".toCharArray()); +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("000000".toCharArray());      assertTrue(pinProvider.getProvided() <= 0);      signatureCard.createSignature(new ByteArrayInputStream("MOCCA" @@ -240,68 +239,79 @@ public class STARCOSCardTest extends CardTest {        InterruptedException, CardNotSupportedException,        NoSuchAlgorithmException, IOException { -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    STARCOSCardChannelEmul channel = (STARCOSCardChannelEmul) card.getBasicChannel(); -    channel.setPin(STARCOSCardChannelEmul.KID_PIN_Glob, null); - -    TestPINProvider pinProvider = new TestPINProvider("0000".toCharArray()); +    SignatureCard signatureCard = createSignatureCard(null, null, PIN.STATE_PIN_BLOCKED); +     +    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("0000".toCharArray());      signatureCard.createSignature(new ByteArrayInputStream("MOCCA"          .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR,          pinProvider, null);    } -   +    @Test    public void testChangePin() 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); +    // set all initial pins to DEFAULT_SS_PIN (123456) +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard( +            STARCOSCardEmul.DEFAULT_SS_PIN, STARCOSCardEmul.DEFAULT_SS_PIN, PIN.STATE_RESET);      for (PINSpec pinSpec : signatureCard.getPINSpecs()) { -      char[] pin = defaultPin; +      char[] pin = "123456".toCharArray();        for (int i = pinSpec.getMinLength(); i <= pinSpec.getMaxLength(); i++) { -        signatureCard.verifyPIN(pinSpec, new TestPINProvider(pin)); +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(pin));          char[] newPin = new char[i];          Arrays.fill(newPin, '0');          signatureCard -            .changePIN(pinSpec, new TestChangePINProvider(pin, newPin)); -        signatureCard.verifyPIN(pinSpec, new TestPINProvider(newPin)); +            .changePIN(pinSpec, new ChangePINProvider(pin, newPin)); +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(newPin));          pin = newPin;        }      }    }    @Test -  public void testVerifyInvalidPin() throws CardNotSupportedException, +  @Override +  public void testActivatePin() throws CardNotSupportedException,        LockedException, NotActivatedException, CancelledException,        PINFormatException, SignatureCardException, InterruptedException { -    char[] defaultPin = "123456".toCharArray(); +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard( +            null, null, PIN.STATE_PIN_NOTACTIVE); + +    for (PINSpec pinSpec : signatureCard.getPINSpecs()) { + +      char[] pin = "1234567890".substring(0, pinSpec.getMinLength()).toCharArray(); + +      boolean notActive = false; +      try { +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(pin)); +      } catch (NotActivatedException ex) { +        notActive = true; +      } +      assertTrue(notActive); + +      signatureCard.activatePIN(pinSpec, new ChangePINProvider(null, pin)); +      signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(pin)); +    } +  } + +  @Test +  public void testVerifyInvalidPin() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException {      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[] invalidPin = "999999".toCharArray();        int numInvalidTries = 2; -      TestInvalidPINProvider invalidPinProvider = new TestInvalidPINProvider(invalidPin, numInvalidTries); +      InvalidPINProvider invalidPinProvider = new InvalidPINProvider(invalidPin, numInvalidTries);        try {          signatureCard.verifyPIN(pinSpec, invalidPinProvider);        } catch (CancelledException ex) { @@ -315,21 +325,15 @@ public class STARCOSCardTest extends CardTest {    public void testChangeInvalidPin() 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[] invalidPin = "999999".toCharArray();        int numInvalidTries = 2; -      TestInvalidChangePINProvider invalidPinProvider = -              new TestInvalidChangePINProvider(invalidPin, defaultPin, numInvalidTries); +      InvalidChangePINProvider invalidPinProvider = +              new InvalidChangePINProvider(invalidPin, invalidPin, numInvalidTries);        try {          signatureCard.changePIN(pinSpec, invalidPinProvider); diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardChannelEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardChannelEmul.java new file mode 100644 index 00000000..dc6836ae --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardChannelEmul.java @@ -0,0 +1,46 @@ +/* + * 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.starcos; + +import at.gv.egiz.smcc.CardEmul; +import at.gv.egiz.smcc.File; +import at.gv.egiz.smcc.PIN; + +/** + * + * @author clemens + */ +public class STARCOSG3CardChannelEmul extends STARCOSCardChannelEmul { + +  public STARCOSG3CardChannelEmul(CardEmul cardEmul, byte[] Glob_PIN, int PIN_STATE) { +    super(cardEmul, Glob_PIN, PIN_STATE); + +    // G3 version file +    byte[] versionFileFID = new byte[]{(byte) 0x00, (byte) 0x32}; +    byte[] versionFile = new byte[]{ +      (byte) 0xa5, (byte) 0x0e, (byte) 0x53, (byte) 0x02, (byte) 0x01, (byte) 0x20, (byte) 0x54, (byte) 0x08, +      (byte) 0x01, (byte) 0x01, (byte) 0x03, (byte) 0x01, (byte) 0x04, (byte) 0x01, (byte) 0x70, (byte) 0x01}; +    byte[] versionFileFCX = new byte[]{ +      (byte) 0x62, (byte) 0x1a, (byte) 0x80, (byte) 0x02, (byte) 0x00, (byte) 0x14, (byte) 0x82, (byte) 0x05, +      (byte) 0x44, (byte) 0x41, (byte) 0x00, (byte) 0x14, (byte) 0x01, (byte) 0x83, (byte) 0x02, (byte) 0x00, +      (byte) 0x32, (byte) 0x88, (byte) 0x01, (byte) 0xd8, (byte) 0x8a, (byte) 0x01, (byte) 0x05, (byte) 0xa1, +      (byte) 0x03, (byte) 0x8b, (byte) 0x01, (byte) 0x03}; + +    globalFiles.add(new File(versionFileFID, versionFile, versionFileFCX)); + +  } + } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardEmul.java new file mode 100644 index 00000000..7583b3ad --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardEmul.java @@ -0,0 +1,57 @@ +/* + * 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.starcos; + +import at.gv.egiz.smcc.CardEmul; +import javax.smartcardio.ATR; + +import at.gv.egiz.smcc.PIN; + +@SuppressWarnings("restriction") +public class STARCOSG3CardEmul extends CardEmul { + +  public static byte[] TRANSPORT_SS_PIN = new byte[] { (byte) 0x26, (byte) 0x12, (byte) 0x34, (byte) 0x56, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; +  public static byte[] TRANSPORT_Glob_PIN = new byte[] { (byte) 0x24, (byte) 0x12, (byte) 0x34, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; + +  public static byte[] DEFAULT_SS_PIN = TRANSPORT_SS_PIN; +  public static byte[] DEFAULT_Glob_PIN = new byte[] { (byte) 0x24, (byte) 0x00, (byte) 0x00, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}; + +  protected static ATR ATR = new ATR(new byte[] { +      (byte) 0x3b, (byte) 0xbd, (byte) 0x18, (byte) 0x00, (byte) 0x81, (byte) 0x31, (byte) 0xfe, (byte) 0x45, +      (byte) 0x80, (byte) 0x51, (byte) 0x02, (byte) 0x67, (byte) 0x05, (byte) 0x18, (byte) 0xb1, (byte) 0x02, +      (byte) 0x02, (byte) 0x02, (byte) 0x01, (byte) 0x81, (byte) 0x05, (byte) 0x31 +  }); + +  public STARCOSG3CardEmul(byte[] SS_PIN, byte[] Glob_PIN, int PIN_STATE){ +    channel = new STARCOSG3CardChannelEmul(this, Glob_PIN, PIN_STATE); +    applications.add(new STARCOSApplSichereSignatur((STARCOSCardChannelEmul) channel, +            SS_PIN, PIN_STATE)); +    applications.add(new STARCOSApplInfobox((STARCOSCardChannelEmul) channel)); +    applications.add(new STARCOSApplGewoehnlicheSignatur((STARCOSCardChannelEmul) channel, +            STARCOSApplGewoehnlicheSignatur.DST_G3)); +  } + + +  public STARCOSG3CardEmul() { +    this(DEFAULT_SS_PIN, DEFAULT_Glob_PIN, PIN.STATE_RESET); +  } + +  @Override +  public ATR getATR() { +    return ATR; +  } +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardTest.java new file mode 100644 index 00000000..06744c82 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardTest.java @@ -0,0 +1,119 @@ +/* +* 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.starcos; + +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; + + +import org.junit.Test; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.CardEmul; +import at.gv.egiz.smcc.CardNotSupportedException; +import at.gv.egiz.smcc.CardTerminalEmul; +import at.gv.egiz.smcc.CardTest; +import at.gv.egiz.smcc.pin.gui.ChangePINProvider; +import at.gv.egiz.smcc.LockedException; +import at.gv.egiz.smcc.NotActivatedException; +import at.gv.egiz.smcc.PIN; +import at.gv.egiz.smcc.PINFormatException; +import at.gv.egiz.smcc.PINMgmtSignatureCard; +import at.gv.egiz.smcc.PINSpec; +import at.gv.egiz.smcc.SignatureCard; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.SignatureCardFactory; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; +import org.junit.Ignore; + +public class STARCOSG3CardTest extends CardTest { + +  @Override +  protected SignatureCard createSignatureCard() +      throws CardNotSupportedException { +    SignatureCardFactory factory = SignatureCardFactory.getInstance(); +    STARCOSG3CardEmul card = new STARCOSG3CardEmul(); +    SignatureCard signatureCard = factory.createSignatureCard(card, +        new CardTerminalEmul(card)); +    assertTrue(signatureCard instanceof PINMgmtSignatureCard); +    return signatureCard; +  } + +  protected SignatureCard createSignatureCard(byte[] SS_PIN, byte[] Glob_PIN, int pinState) +      throws CardNotSupportedException { +    SignatureCardFactory factory = SignatureCardFactory.getInstance(); +    STARCOSG3CardEmul card = new STARCOSG3CardEmul(SS_PIN, Glob_PIN, pinState); +    SignatureCard signatureCard = factory.createSignatureCard(card, +        new CardTerminalEmul(card)); +    assertTrue(signatureCard instanceof PINMgmtSignatureCard); +    return signatureCard; +  } + +  @Test +  public void testChangePin() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard( +            STARCOSG3CardEmul.DEFAULT_SS_PIN, STARCOSG3CardEmul.DEFAULT_SS_PIN, PIN.STATE_RESET); +     +    for (PINSpec pinSpec : signatureCard.getPINSpecs()) { + +      char[] pin = "123456".toCharArray(); + +      for (int i = pinSpec.getMinLength(); i <= pinSpec.getMaxLength(); i++) { +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(pin)); +        char[] newPin = new char[i]; +        Arrays.fill(newPin, '0'); +        signatureCard +            .changePIN(pinSpec, new ChangePINProvider(pin, newPin)); +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(newPin)); +        pin = newPin; +      } +    } +  } + +  @Test +  @Override +  public void testActivatePin() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard( +            STARCOSG3CardEmul.TRANSPORT_SS_PIN, STARCOSG3CardEmul.TRANSPORT_SS_PIN, PIN.STATE_PIN_NOTACTIVE); +     +    for (PINSpec pinSpec : signatureCard.getPINSpecs()) { + +      char[] pin = "123456789".substring(0, pinSpec.getMinLength()).toCharArray(); +      char[] transportPIN = "123456".toCharArray(); + +      boolean notActive = false; +      try { +        signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(pin)); +      } catch (NotActivatedException ex) { +        notActive = true; +      } +      assertTrue(notActive); + +      signatureCard.activatePIN(pinSpec, new ChangePINProvider(transportPIN, pin)); +      signatureCard.verifyPIN(pinSpec, new SMCCTestPINProvider(pin)); +    } +  } + +   +} | 
