diff options
Diffstat (limited to 'smcc/src/test/java')
62 files changed, 2547 insertions, 2905 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 affb06ff..62339591 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/AbstractAppl.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/AbstractAppl.java @@ -20,15 +20,34 @@ import java.util.ArrayList;  import java.util.HashMap;  import java.util.List; -import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU; -import javax.smartcardio.ResponseAPDU;  public abstract class AbstractAppl implements CardAppl { -  public final HashMap<Integer, PIN> pins = new HashMap<Integer, PIN>(); +  /** +   * The Application Identifier. +   */ +  private byte[] aid; +   +  /** +   * The File Identifier. +   */ +  private byte[] fid; +   +  /** +   * The File Control (Information / Parameter) +   */ +  private byte[] fcx; +   +  /** +   * The PINs used by this Application. +   */ +  public HashMap<Integer, PIN> pins = new HashMap<Integer, PIN>(); +  /** +   * The Files used by this Application. +   */    protected List<File> files = new ArrayList<File>();    public void checkINS(CommandAPDU command, int ins) { @@ -37,12 +56,54 @@ public abstract class AbstractAppl implements CardAppl {      }    } +  public void setAid(byte[] aID) { +    aid = aID; +  } + +  @Override +  public byte[] getAID() { +    return aid; +  } + +  public void setFid(byte[] fid) { +    this.fid = fid; +  } +    @Override -  public abstract byte[] getAID(); +  public byte[] getFID() { +    return fid; +  } + +  public void setFcx(byte[] fcx) { +    this.fcx = fcx; +  }    @Override -  public abstract byte[] getFCI(); +  public byte[] getFCX() { +    return fcx; +  } +  /** +   * @return the pins +   */ +  public HashMap<Integer, PIN> getPins() { +    return pins; +  } + +  /** +   * @param pins the pins to set +   */ +  public void setPins(HashMap<Integer, PIN> pins) { +    this.pins = pins; +  } + +  /** +   * @param files the files to set +   */ +  public void setFiles(List<File> files) { +    this.files = files; +  } +    public void putFile(File file) {      files.add(file);    } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/CardAppl.java b/smcc/src/test/java/at/gv/egiz/smcc/CardAppl.java index 76a3e567..e8d89af0 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/CardAppl.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/CardAppl.java @@ -21,14 +21,13 @@ import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU; -@SuppressWarnings("restriction")  public interface CardAppl {    public byte[] getAID();    public byte[] getFID(); -  public byte[] getFCI(); +  public byte[] getFCX();    public void leaveApplContext(); diff --git a/smcc/src/test/java/at/gv/egiz/smcc/CardChannelEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/CardChannelEmul.java index bfe4e31c..cd4397b3 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/CardChannelEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/CardChannelEmul.java @@ -18,20 +18,18 @@ package at.gv.egiz.smcc;  import java.nio.ByteBuffer; +import javax.smartcardio.Card;  import javax.smartcardio.CardChannel;  import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU; -@SuppressWarnings("restriction")  public abstract class CardChannelEmul extends CardChannel { +   +  protected CardEmul cardEmul;    protected AbstractAppl currentAppl = null;    protected File currentFile = null; -  public CardChannelEmul() { -    super(); -  } -    @Override    public int getChannelNumber() {      return 0; @@ -49,4 +47,12 @@ public abstract class CardChannelEmul extends CardChannel {      return responseBytes.length;    } +  public Card getCard() { +    return cardEmul; +  } + +  public void setCardEmul(CardEmul card) { +    this.cardEmul = card; +  } +  }
\ 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 3dfc8510..36794903 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/CardEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/CardEmul.java @@ -1,79 +1,101 @@  /* -* 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. -*/ + * 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;  import java.util.ArrayList;  import java.util.Arrays;  import java.util.List; +import javax.smartcardio.ATR;  import javax.smartcardio.Card;  import javax.smartcardio.CardChannel;  import javax.smartcardio.CardException; +public class CardEmul extends Card { -@SuppressWarnings("restriction") -public abstract class CardEmul extends Card { - -  protected Thread exclThread; // = null; -  protected CardChannel channel; // = newCardChannel(this); +  protected ATR atr; +   +  protected Thread exclThread; +  protected CardChannel basicChannel;    protected List<AbstractAppl> applications = new ArrayList<AbstractAppl>();    public CardEmul() {      super();    } -//  protected abstract CardChannelEmul newCardChannel(CardEmul cardEmul); +  public void setAtr(byte[] atr) { +    this.atr = new ATR(atr); +  } + +  /** +   * @param basicChannel +   *          the basicChannel to set +   */ +  public void setBasicChannel(CardChannel basicChannel) { +    this.basicChannel = basicChannel; +  } + +  /** +   * @param applications +   *          the applications to set +   */ +  public void setApplications(List<AbstractAppl> applications) { +    this.applications = applications; +  }    @Override    public void beginExclusive() throws CardException { -     +      if (exclThread == Thread.currentThread()) { -      throw new CardException("Exclusive access already assigned to current thread."); +      throw new CardException( +          "Exclusive access already assigned to current thread.");      } else if (exclThread != null) { -      throw new CardException("Exclusive access already assigned to another thread."); +      throw new CardException( +          "Exclusive access already assigned to another thread.");      } -   +      exclThread = Thread.currentThread(); -     +    }    @Override    public void endExclusive() throws CardException { -     +      if (exclThread == Thread.currentThread()) {        exclThread = null;      } else if (exclThread == null) {        throw new CardException("Exclusive access has not been assigned.");      } else { -      throw new CardException("Exclusive access has not been assigned to current thread."); +      throw new CardException( +          "Exclusive access has not been assigned to current thread.");      } -   +    }    @Override    public CardChannel getBasicChannel() { -    return channel; +    return basicChannel;    }    @Override    public void disconnect(boolean reset) throws CardException { -//    if (reset) { -//      channel = newCardChannel(this); -//    } +    // if (reset) { +    // channel = newCardChannel(this); +    // }    }    @Override @@ -89,18 +111,24 @@ public abstract class CardEmul extends Card {    @Override    public byte[] transmitControlCommand(int arg0, byte[] arg1)        throws CardException { -            throw new CardException("transmitControlCommand() not supported."); -      } +    throw new CardException("transmitControlCommand() not supported."); +  } + +  @Override +  public ATR getATR() { +    return atr; +  }    public AbstractAppl getApplication(byte[] fid) { -    for(AbstractAppl appl : applications) { -      if (Arrays.equals(appl.getAID(), fid) || Arrays.equals(appl.getFID(), fid)) { +    for (AbstractAppl appl : applications) { +      if (Arrays.equals(appl.getAID(), fid) +          || Arrays.equals(appl.getFID(), fid)) {          return appl;        }      }      return null; -     +    }  }
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java deleted file mode 100644 index 17a8a03f..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/CardTest.java +++ /dev/null @@ -1,220 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc; - -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.NoSuchAlgorithmException; -import java.util.Arrays; - -import javax.smartcardio.Card; - -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; - -@SuppressWarnings("restriction") -public abstract class CardTest { - -  public CardTest() { -    super(); -  } - -  protected abstract SignatureCard createSignatureCard() -      throws CardNotSupportedException; - -  @Test -  public void testGetCard() throws CardNotSupportedException { -    SignatureCard signatureCard = createSignatureCard(); -    Card card = signatureCard.getCard(); -    assertNotNull(card); -  } - -  @Test -  public void testGetInfoboxIdentityLink() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    final char[] pin = "0000".toCharArray(); -     -    SignatureCard signatureCard = createSignatureCard(); -     -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider(pin); - -    byte[] idlink = signatureCard.getInfobox("IdentityLink", -        pinProvider, null); -    assertNotNull(idlink); -    assertTrue(Arrays.equals(idlink, A04ApplDEC.IDLINK)); -    assertEquals(1, pinProvider.provided); - -  } - -  @Test(expected = CancelledException.class) -  public void testSignSIGCancel() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { -       -        SignatureCard signatureCard = createSignatureCard(); -       -        PINGUI pinProvider = new CancelPINProvider(); -       -    signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, pinProvider, -        null); -       -      } - -  @Test(expected = CancelledException.class) -  public void testSignDECCancel() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { -       -        SignatureCard signatureCard = createSignatureCard(); -       -        PINGUI pinProvider = new CancelPINProvider(); -       -        signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -            .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, -            pinProvider, null); -       -      } - -  @Test(expected = InterruptedException.class) -  public void testSignSIGInterrrupted() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { -       -        SignatureCard signatureCard = createSignatureCard(); -       -        PINGUI pinProvider = new InterruptPINProvider(); -       -        signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -            .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, -            pinProvider, null); -       -      } - -  @Test(expected = InterruptedException.class) -  public void testSignDECInterrrupted() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { -       -        SignatureCard signatureCard = createSignatureCard(); -       -        PINGUI pinProvider = new InterruptPINProvider(); -       -        signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -            .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, -            pinProvider, null); -       -      } - -  @Test(expected = CancelledException.class) -  public void testSignSIGConcurrent() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { -       -        final SignatureCard signatureCard = createSignatureCard(); -       -        PINGUI pinProvider = new DummyPINGUI() { -          @Override -          public char[] providePIN(PinInfo spec, int retries) -              throws CancelledException, InterruptedException { - -            try { -              signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); -              assertTrue(false); -              return null; -            } catch (SignatureCardException e) { -              // expected -              throw new CancelledException(); -            } - -          } -        }; - -        signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -            .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, -            pinProvider, null); -       -      } - -  @Test(expected = CancelledException.class) -  public void testSignDECConcurrent() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { -       -        final SignatureCard signatureCard = createSignatureCard(); -       -        PINGUI pinProvider = new DummyPINGUI() { -          @Override -          public char[] providePIN(PinInfo spec, int retries) -              throws CancelledException, InterruptedException { -       -            try { -              signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); -              assertTrue(false); -              return null; -            } catch (SignatureCardException e) { -              // expected -              throw new CancelledException(); -            } -          } -        }; -       -        signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -            .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, -            pinProvider, null); -       -      } - -  @Test -  public void testGetPinSpecs() throws CardNotSupportedException, SignatureCardException { -   -    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard(); -   -    PinInfo[] specs = signatureCard.getPinInfos(); -    assertNotNull(specs); -    assertTrue(specs.length > 0); -   -  } - -  @Test(expected = SignatureCardException.class) -  public void testActivatePin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, UnsupportedEncodingException { -       -        PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard(); -       -        ModifyPINGUI pinProvider = new CancelChangePINProvider(); -       -        PinInfo[] specs = signatureCard.getPinInfos(); -       -        signatureCard.activatePIN(specs[0], pinProvider); -      } - -}
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/File.java b/smcc/src/test/java/at/gv/egiz/smcc/File.java index e47c5f7d..d3376fa1 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/File.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/File.java @@ -17,10 +17,14 @@  package at.gv.egiz.smcc;  public class File { +      public byte[] fid;    public byte[] file;    public byte[] fcx;    public int kid = -1; +   +  public File() { +  }    public File(byte[] fid, byte[] file, byte[] fcx) {      this.fid = fid; @@ -35,4 +39,62 @@ public class File {      this.kid = kid;    } +  /** +   * @return the fid +   */ +  public byte[] getFid() { +    return fid; +  } + +  /** +   * @param fid the fid to set +   */ +  public void setFid(byte[] fid) { +    this.fid = fid; +  } + +  /** +   * @return the file +   */ +  public byte[] getFile() { +    return file; +  } + +  /** +   * @param file the file to set +   */ +  public void setFile(byte[] file) { +    this.file = file; +  } + +  /** +   * @return the fcx +   */ +  public byte[] getFcx() { +    return fcx; +  } + +  /** +   * @param fcx the fcx to set +   */ +  public void setFcx(byte[] fcx) { +    this.fcx = fcx; +  } + +  /** +   * @return the kid +   */ +  public int getKid() { +    return kid; +  } + +  /** +   * @param kid the kid to set +   */ +  public void setKid(int kid) { +    this.kid = kid; +  } + +   +    }
\ No newline at end of file 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 2cda0c2f..fbcd030a 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/PIN.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/PIN.java @@ -34,6 +34,9 @@ public class PIN {    public int kfpc; // = 10; +  public PIN() { +  }; +      //TODO also provde default constructor without state param    public PIN(byte[] pin, int kid, int kfpc, int state) {      this.pin = pin; @@ -42,4 +45,62 @@ public class PIN {      this.state = state;    } +  /** +   * @return the pin +   */ +  public byte[] getPin() { +    return pin; +  } + +  /** +   * @param pin the pin to set +   */ +  public void setPin(byte[] pin) { +    this.pin = pin; +  } + +  /** +   * @return the kid +   */ +  public int getKid() { +    return kid; +  } + +  /** +   * @param kid the kid to set +   */ +  public void setKid(int kid) { +    this.kid = kid; +  } + +  /** +   * @return the state +   */ +  public int getState() { +    return state; +  } + +  /** +   * @param state the state to set +   */ +  public void setState(int state) { +    this.state = state; +  } + +  /** +   * @return the kfpc +   */ +  public int getKfpc() { +    return kfpc; +  } + +  /** +   * @param kfpc the kfpc to set +   */ +  public void setKfpc(int kfpc) { +    this.kfpc = kfpc; +  } + +   +    } 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 f4ac5c35..e70649ad 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 @@ -16,7 +16,6 @@  */  package at.gv.egiz.smcc.acos; -import java.io.UnsupportedEncodingException;  import java.util.Arrays;  import java.util.Random; @@ -24,28 +23,11 @@ import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.File;  import at.gv.egiz.smcc.PIN; -@SuppressWarnings("restriction")  public class A03ApplDEC extends ACOSApplDEC { -  public static final int KID_PIN_INF = 0x83; - -  public A03ApplDEC() { -    super(); - -    System.arraycopy(IDLINK, 0, EF_INFOBOX, 0, IDLINK.length); -    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, PIN.STATE_RESET)); -    } catch (UnsupportedEncodingException e) { -      throw new RuntimeException(e); -    } -  } -    @Override    public ResponseAPDU cmdMANAGE_SECURITY_ENVIRONMENT(CommandAPDU command, CardChannelEmul channel) { diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03ApplSIG.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03ApplSIG.java index d059ad57..82c3cbed 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03ApplSIG.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03ApplSIG.java @@ -24,14 +24,8 @@ import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.CardChannelEmul; -@SuppressWarnings("restriction")  public class A03ApplSIG extends ACOSApplSIG { -  public A03ApplSIG() { -    super(); -    System.arraycopy(C_CH_DS, 0, EF_C_CH_DS, 0, C_CH_DS.length); -  } -    @Override    public ResponseAPDU cmdMANAGE_SECURITY_ENVIRONMENT(CommandAPDU command, CardChannelEmul channel) { @@ -63,9 +57,9 @@ public class A03ApplSIG extends ACOSApplSIG {      case 0xB8:        switch (command.getP1()) {        case 0x41: -        // PSO � DECIPHER +        // PSO - DECIPHER        case 0x81: -        // PSO � ENCIPHER +        // PSO - ENCIPHER        }      default:        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x81}); diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardChannelEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardChannelEmul.java index c8d5382c..c3a2fbde 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardChannelEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardChannelEmul.java @@ -21,17 +21,11 @@ import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU; -import at.gv.egiz.smcc.CardEmul;  import at.gv.egiz.smcc.PIN; -@SuppressWarnings("restriction")  public class A03CardChannelEmul extends ACOSCardChannelEmul { -  public A03CardChannelEmul(CardEmul cardEmul) { -    super(cardEmul); -  } -    @Override    public ResponseAPDU cmdREAD_BINARY(CommandAPDU command) throws CardException { 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 deleted file mode 100644 index 4a94c623..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardTest.java +++ /dev/null @@ -1,92 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc.acos; - -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.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.PinInfo; -import at.gv.egiz.smcc.SignatureCard; -import at.gv.egiz.smcc.SignatureCardException; -import at.gv.egiz.smcc.SignatureCardFactory; - -public class A03CardTest extends ACOSCardTest { - -  @Override -  protected SignatureCard createSignatureCard() -      throws CardNotSupportedException { -    SignatureCardFactory factory = SignatureCardFactory.getInstance(); -    CardEmul card = new A03CardEmul(new A03ApplSIG(), new A03ApplDEC()); -    SignatureCard signatureCard = factory.createSignatureCard(card, -        new CardTerminalEmul(card)); -    assertTrue(signatureCard instanceof PINMgmtSignatureCard); -    return signatureCard; -  } - -  @Override -  protected int getVersion() { -    return 1; -  } - -  @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(); -    ACOSApplSIG applSIG = (ACOSApplSIG) card.getApplication(ACOSAppl.AID_SIG); -    applSIG.setPin(ACOSApplSIG.KID_PIN_SIG, defaultPin); -    ACOSApplDEC applDEC = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC); -    applDEC.setPin(ACOSApplDEC.KID_PIN_DEC, defaultPin); -    applDEC.setPin(A03ApplDEC.KID_PIN_INF, defaultPin); - -    for (PinInfo pinSpec : signatureCard.getPinInfos()) { - -      char[] pin = defaultPin; - -      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; -      } - -    } - -  } - -   -} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java index e38a8e80..b264bcae 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplDEC.java @@ -16,39 +16,20 @@  */  package at.gv.egiz.smcc.acos; -import java.io.UnsupportedEncodingException;  import java.security.GeneralSecurityException; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.KeyPair; -import java.security.KeyPairGenerator; -import java.security.NoSuchAlgorithmException;  import java.security.PrivateKey; -import java.security.PublicKey;  import java.security.Signature; -import java.security.interfaces.RSAPrivateKey; -import java.security.interfaces.RSAPublicKey;  import java.util.Arrays; -import javax.crypto.BadPaddingException;  import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.KeyGenerator; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.IvParameterSpec; -import javax.crypto.spec.SecretKeySpec;  import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.File;  import at.gv.egiz.smcc.PIN; -@SuppressWarnings("restriction")  public class A04ApplDEC extends ACOSApplDEC {    private static final byte[] SEC_ENV_INTERNAL_AUTHENTICATE = new byte[] { (byte) 0x84, @@ -57,91 +38,10 @@ public class A04ApplDEC extends ACOSApplDEC {    private static final byte[] SEC_ENV_DECIPHER = new byte[] { (byte) 0x84,        (byte) 0x01, (byte) 0x88, (byte) 0x80, (byte) 0x01, (byte) 0x02 }; -  private static final RSAPrivateKey SK_CH_EKEY; -   -  private static final RSAPublicKey PK_CH_EKEY; -   -  static { -    try { -      KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA"); -      gen.initialize(1536); -      KeyPair keyPair = gen.generateKeyPair(); -      SK_CH_EKEY = (RSAPrivateKey) keyPair.getPrivate(); -      PK_CH_EKEY = (RSAPublicKey) keyPair.getPublic(); -    } catch (NoSuchAlgorithmException e) { -      throw new RuntimeException(e); -    } -  } -   -  public A04ApplDEC() { -    this(false); -  } - -  public A04ApplDEC(boolean encrypt) { -     -    int offset = 0; -     -    // HEADER 'AIK' + version -    byte[] header; -    try { -      header = "AIK".getBytes("ASCII"); -    } catch (UnsupportedEncodingException e) { -      throw new RuntimeException(e); -    } -    System.arraycopy(header, 0, EF_INFOBOX, offset, header.length); -    offset += header.length; -    EF_INFOBOX[offset++] = 1;  -     -    // HEADER identity link -    EF_INFOBOX[offset++] = (byte) 0x01; // Personenbindung -    if (encrypt) { -      EF_INFOBOX[offset++] = (byte) 0x01; // Modifier +  protected PrivateKey privateKey; -      byte[] cipherText; -      byte[] encKey; -      try { -        KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); -        SecretKey secretKey = keyGenerator.generateKey(); -         -        byte[] keyBytes = secretKey.getEncoded(); -         -        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); -        byte[] iv = new byte[8]; -        Arrays.fill(iv, (byte) 0x00); -        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); -        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); -        cipherText = cipher.doFinal(IDLINK); -         -        cipher = Cipher.getInstance("RSA"); -        cipher.init(Cipher.ENCRYPT_MODE, PK_CH_EKEY); -        encKey = cipher.doFinal(keyBytes); -         -      } catch (GeneralSecurityException e) { -        throw new RuntimeException(e); -      } -       -      int len = encKey.length + cipherText.length + 2; -       -      EF_INFOBOX[offset++] = (byte) (0xFF & len); -      EF_INFOBOX[offset++] = (byte) (0xFF & len >> 8); -       -      EF_INFOBOX[offset++] = (byte) (0xFF & encKey.length); -      EF_INFOBOX[offset++] = (byte) (0xFF & encKey.length >> 8); -       -      System.arraycopy(encKey, 0, EF_INFOBOX, offset, encKey.length); -      offset += encKey.length; -       -      System.arraycopy(cipherText, 0, EF_INFOBOX, offset, cipherText.length); -       -    } else { -      EF_INFOBOX[offset++] = (byte) 0x00; // Modifier -      EF_INFOBOX[offset++] = (byte) (0xFF & IDLINK.length); -      EF_INFOBOX[offset++] = (byte) (0xFF & IDLINK.length >> 8); -      System.arraycopy(IDLINK, 0, EF_INFOBOX, offset, IDLINK.length); -      offset += IDLINK.length; -    } -     -    putFile(new File(FID_EF_INFOBOX, EF_INFOBOX, FCI_EF_INFOBOX)); +  public void setPrivateKey(PrivateKey privateKey) { +    this.privateKey = privateKey;    }    @Override @@ -197,6 +97,8 @@ public class A04ApplDEC extends ACOSApplDEC {      if (command.getP1() == 0x80 && command.getP2() == 0x86) { +      // DECIPHER +              byte[] data = command.getData();        if (!Arrays.equals(securityEnv, SEC_ENV_DECIPHER)) { @@ -217,7 +119,7 @@ public class A04ApplDEC extends ACOSApplDEC {        byte[] plainText;        try {          Cipher cipher = Cipher.getInstance("RSA"); -        cipher.init(Cipher.DECRYPT_MODE, SK_CH_EKEY); +        cipher.init(Cipher.DECRYPT_MODE, privateKey);          plainText = cipher.doFinal(cipherText);        } catch (GeneralSecurityException e) {          throw new CardException(e); @@ -268,8 +170,8 @@ public class A04ApplDEC extends ACOSApplDEC {        byte[] sig;        try { -        Signature signature = Signature.getInstance("RSA"); -        signature.initSign(SK_CH_EKEY); +        Signature signature = Signature.getInstance(privateKey.getAlgorithm()); +        signature.initSign(privateKey);          signature.update(digest);          sig = signature.sign();        } catch (GeneralSecurityException e) { diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplSIG.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplSIG.java index aee6a7f7..f19db2d0 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplSIG.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04ApplSIG.java @@ -22,26 +22,10 @@ import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.File; -@SuppressWarnings("restriction")  public class A04ApplSIG extends ACOSApplSIG { -  private static byte[] FID_EF_INFO = new byte[] { (byte) 0xd0, (byte) 0x02 }; - -  private static byte[] FCI_EF_INFO = new byte[] { (byte) 0x6f, (byte) 0x07, -      (byte) 0x80, (byte) 0x02, (byte) 0x00, (byte) 0x08, (byte) 0x82, -      (byte) 0x01, (byte) 0x01 }; - -  private static byte[] EF_INFO = new byte[] { (byte) 0x02, (byte) 0x00, -      (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, -      (byte) 0x00, (byte) 0x90, (byte) 0x00 }; - -  public A04ApplSIG() { -    putFile(new File(FID_EF_INFO, EF_INFO, FCI_EF_INFO)); -  } -    @Override    public ResponseAPDU cmdMANAGE_SECURITY_ENVIRONMENT(CommandAPDU command, CardChannelEmul channel) { @@ -73,9 +57,9 @@ public class A04ApplSIG extends ACOSApplSIG {      case 0xB8:        switch (command.getP1()) {        case 0x41: -        // PSO � DECIPHER +        // PSO - DECIPHER        case 0x81: -        // PSO � ENCIPHER +        // PSO - ENCIPHER        }      default:        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x81}); diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardChannelEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardChannelEmul.java index 3eaece91..31c5ba98 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardChannelEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardChannelEmul.java @@ -21,16 +21,9 @@ import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU; -import at.gv.egiz.smcc.CardEmul; - -@SuppressWarnings("restriction")  public class A04CardChannelEmul extends ACOSCardChannelEmul { -  public A04CardChannelEmul(CardEmul cardEmul) { -    super(cardEmul); -  } -    @Override    public ResponseAPDU cmdREAD_BINARY(CommandAPDU command) throws CardException { 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 deleted file mode 100644 index a7a5eef4..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardTest.java +++ /dev/null @@ -1,143 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc.acos; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import iaik.security.provider.IAIK; - -import java.security.Security; -import java.util.Arrays; - -import org.junit.BeforeClass; -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.LockedException; -import at.gv.egiz.smcc.NotActivatedException; -import at.gv.egiz.smcc.PINFormatException; -import at.gv.egiz.smcc.PINMgmtSignatureCard; -import at.gv.egiz.smcc.PinInfo; -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.ChangePINProvider; -import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; - -public class A04CardTest extends ACOSCardTest { - -  @Override -  protected SignatureCard createSignatureCard() -      throws CardNotSupportedException { -    SignatureCardFactory factory = SignatureCardFactory.getInstance(); -    CardEmul card = new A04CardEmul(new A04ApplSIG(), new A04ApplDEC()); -    SignatureCard signatureCard = factory.createSignatureCard(card, -        new CardTerminalEmul(card)); -    assertTrue(signatureCard instanceof PINMgmtSignatureCard); -    return signatureCard; -  } - -  @Override -  protected int getVersion() { -    return 2; -  } - -  @BeforeClass -  public static void setupClass() { -    IAIK.addAsProvider(); -  } -   -  @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(); -    ACOSApplSIG applSIG = (ACOSApplSIG) card.getApplication(ACOSAppl.AID_SIG); -    applSIG.setPin(ACOSApplSIG.KID_PIN_SIG, defaultPin); -    ACOSApplDEC applDEC = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC); -    applDEC.setPin(ACOSApplDEC.KID_PIN_DEC, defaultPin); - -    for (PinInfo pinSpec : signatureCard.getPinInfos()) { - -      char[] pin = defaultPin; - -      for (int i = pinSpec.getMinLength(); i <= pinSpec.getMaxLength(); i++) { -        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 -  public void testGetInfoboxIdentityLinkEncrypted() -      throws CardNotSupportedException, SignatureCardException, -      InterruptedException { -     -    char[] pin = "0000".toCharArray(); - -    SignatureCardFactory factory = SignatureCardFactory.getInstance(); -    A04ApplDEC applDEC = new A04ApplDEC(true); -    applDEC.setPin(A04ApplDEC.KID_PIN_DEC, pin); -    CardEmul card = new A04CardEmul(new A04ApplSIG(), applDEC); -    SignatureCard signatureCard = factory.createSignatureCard(card, -        new CardTerminalEmul(card)); - -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider(pin); - -    byte[] idlink = signatureCard.getInfobox("IdentityLink", -        pinProvider, null); -    assertNotNull(idlink); -    assertTrue(Arrays.equals(idlink, A04ApplDEC.IDLINK)); -    assertEquals(1, pinProvider.getProvided()); - -  } -   -  @Test -  public void testGetInfoboxIdentityLink() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    final char[] pin = "0000".toCharArray(); -     -    SignatureCard signatureCard = createSignatureCard(); -     -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider(pin); - -    byte[] idlink = signatureCard.getInfobox("IdentityLink", -        pinProvider, null); -    assertNotNull(idlink); -    assertTrue(Arrays.equals(idlink, A04ApplDEC.IDLINK)); -    assertEquals(0, pinProvider.getProvided()); - -  } - - -} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSAppl.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSAppl.java index 4c340d61..61632d56 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSAppl.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSAppl.java @@ -29,19 +29,8 @@ import at.gv.egiz.smcc.CardAppl;  import at.gv.egiz.smcc.CardChannelEmul;  import at.gv.egiz.smcc.PIN; -@SuppressWarnings("restriction")  public abstract class ACOSAppl extends AbstractAppl implements CardAppl { -  public static byte[] AID_SIG = new byte[] { (byte) 0xA0, (byte) 0x00, -        (byte) 0x00, (byte) 0x01, (byte) 0x18, (byte) 0x45, (byte) 0x43 }; -   -  public static byte[] FID_SIG = new byte[] { (byte) 0xDF, (byte) 0x70 }; -   -  public static byte[] AID_DEC = new byte[] { (byte) 0xA0, (byte) 0x00, -        (byte) 0x00, (byte) 0x01, (byte) 0x18, (byte) 0x45, (byte) 0x4E }; - -  public static byte[] FID_DEC = new byte[] { (byte) 0xDF, (byte) 0x71 }; -    protected byte[] securityEnv;    protected byte[] hash; 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 09a754f3..06b66d13 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 @@ -16,319 +16,9 @@  */  package at.gv.egiz.smcc.acos; -import java.io.UnsupportedEncodingException; -import java.util.Arrays; - -import at.gv.egiz.smcc.File; -import at.gv.egiz.smcc.PIN;  public abstract class ACOSApplDEC extends ACOSAppl { -  public static final byte[] IDLINK = new byte[] { -      (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x11, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x0c,  -      (byte) 0x26, (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f,  -      (byte) 0x77, (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72,  -      (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x7a,  -      (byte) 0x6d, (byte) 0x72, (byte) 0x2f, (byte) 0x70, (byte) 0x65, (byte) 0x72, (byte) 0x73, (byte) 0x62,  -      (byte) 0x32, (byte) 0x30, (byte) 0x34, (byte) 0x2e, (byte) 0x78, (byte) 0x73, (byte) 0x6c, (byte) 0x0c,  -      (byte) 0x29, (byte) 0x73, (byte) 0x7a, (byte) 0x72, (byte) 0x2e, (byte) 0x62, (byte) 0x6d, (byte) 0x69,  -      (byte) 0x2e, (byte) 0x67, (byte) 0x76, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2d, (byte) 0x41,  -      (byte) 0x73, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e,  -      (byte) 0x49, (byte) 0x44, (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x36, (byte) 0x33, (byte) 0x35,  -      (byte) 0x36, (byte) 0x33, (byte) 0x36, (byte) 0x36, (byte) 0x37, (byte) 0x39, (byte) 0x39, (byte) 0x39,  -      (byte) 0x31, (byte) 0x39, (byte) 0x0c, (byte) 0x19, (byte) 0x32, (byte) 0x30, (byte) 0x30, (byte) 0x39,  -      (byte) 0x2d, (byte) 0x30, (byte) 0x33, (byte) 0x2d, (byte) 0x30, (byte) 0x36, (byte) 0x54, (byte) 0x31,  -      (byte) 0x36, (byte) 0x3a, (byte) 0x31, (byte) 0x39, (byte) 0x3a, (byte) 0x32, (byte) 0x36, (byte) 0x2b,  -      (byte) 0x30, (byte) 0x31, (byte) 0x3a, (byte) 0x30, (byte) 0x30, (byte) 0xa0, (byte) 0x42, (byte) 0x30,  -      (byte) 0x40, (byte) 0x0c, (byte) 0x18, (byte) 0x45, (byte) 0x68, (byte) 0x42, (byte) 0x53, (byte) 0x36,  -      (byte) 0x54, (byte) 0x6f, (byte) 0x31, (byte) 0x49, (byte) 0x6c, (byte) 0x54, (byte) 0x4b, (byte) 0x4f,  -      (byte) 0x4a, (byte) 0x45, (byte) 0x39, (byte) 0x75, (byte) 0x62, (byte) 0x74, (byte) 0x48, (byte) 0x69,  -      (byte) 0x51, (byte) 0x3d, (byte) 0x3d, (byte) 0x0c, (byte) 0x0a, (byte) 0x58, (byte) 0x58, (byte) 0x58,  -      (byte) 0xc5, (byte) 0x90, (byte) 0x7a, (byte) 0x67, (byte) 0xc3, (byte) 0xbc, (byte) 0x72, (byte) 0x0c,  -      (byte) 0x0c, (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0x54, (byte) 0xc3, (byte) 0xbc, (byte) 0x7a,  -      (byte) 0x65, (byte) 0x6b, (byte) 0xc3, (byte) 0xa7, (byte) 0x69, (byte) 0x0c, (byte) 0x0a, (byte) 0x31,  -      (byte) 0x39, (byte) 0x37, (byte) 0x33, (byte) 0x2d, (byte) 0x30, (byte) 0x36, (byte) 0x2d, (byte) 0x30,  -      (byte) 0x34, (byte) 0x30, (byte) 0x0a, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01, (byte) 0x00,  -      (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x03, (byte) 0x82, (byte) 0x01,  -      (byte) 0x01, (byte) 0x00, (byte) 0x9f, (byte) 0xa5, (byte) 0x68, (byte) 0xa9, (byte) 0x14, (byte) 0x4c,  -      (byte) 0xa4, (byte) 0x5d, (byte) 0x9d, (byte) 0x09, (byte) 0x99, (byte) 0x2e, (byte) 0xe7, (byte) 0x45,  -      (byte) 0x2e, (byte) 0x42, (byte) 0x49, (byte) 0x02, (byte) 0x16, (byte) 0xd9, (byte) 0xcb, (byte) 0x90,  -      (byte) 0x43, (byte) 0x27, (byte) 0x03, (byte) 0x43, (byte) 0x6d, (byte) 0xb4, (byte) 0x8c, (byte) 0xdc,  -      (byte) 0x1c, (byte) 0x77, (byte) 0xd4, (byte) 0x2e, (byte) 0xa1, (byte) 0x40, (byte) 0xe7, (byte) 0xe0,  -      (byte) 0x03, (byte) 0x60, (byte) 0x15, (byte) 0xf7, (byte) 0xdb, (byte) 0x03, (byte) 0x5e, (byte) 0xca,  -      (byte) 0xe4, (byte) 0x35, (byte) 0xba, (byte) 0x2b, (byte) 0xfd, (byte) 0xe6, (byte) 0xb8, (byte) 0xd8,  -      (byte) 0xb7, (byte) 0x2a, (byte) 0x80, (byte) 0xdd, (byte) 0x38, (byte) 0xe0, (byte) 0x8a, (byte) 0x69,  -      (byte) 0xad, (byte) 0x67, (byte) 0x60, (byte) 0x65, (byte) 0x42, (byte) 0xc9, (byte) 0x41, (byte) 0x60,  -      (byte) 0x94, (byte) 0xde, (byte) 0x84, (byte) 0x54, (byte) 0xad, (byte) 0xb3, (byte) 0xf4, (byte) 0xf7,  -      (byte) 0x44, (byte) 0xd5, (byte) 0xf3, (byte) 0xd3, (byte) 0xb6, (byte) 0x87, (byte) 0x8a, (byte) 0x22,  -      (byte) 0x38, (byte) 0x00, (byte) 0xcb, (byte) 0xa4, (byte) 0x4f, (byte) 0x96, (byte) 0xc2, (byte) 0x28,  -      (byte) 0xc2, (byte) 0x8d, (byte) 0x91, (byte) 0x95, (byte) 0xb4, (byte) 0xea, (byte) 0x00, (byte) 0x59,  -      (byte) 0x2e, (byte) 0xec, (byte) 0x78, (byte) 0xd8, (byte) 0x0f, (byte) 0x26, (byte) 0x04, (byte) 0xee,  -      (byte) 0xed, (byte) 0x13, (byte) 0xbf, (byte) 0x81, (byte) 0x68, (byte) 0x81, (byte) 0x43, (byte) 0xbe,  -      (byte) 0x15, (byte) 0x0e, (byte) 0xba, (byte) 0xf9, (byte) 0x6a, (byte) 0x18, (byte) 0xeb, (byte) 0x95,  -      (byte) 0xad, (byte) 0xb4, (byte) 0x0f, (byte) 0x3c, (byte) 0x94, (byte) 0x63, (byte) 0x32, (byte) 0x81,  -      (byte) 0x90, (byte) 0xcf, (byte) 0x3f, (byte) 0x95, (byte) 0xff, (byte) 0x8d, (byte) 0x86, (byte) 0xed,  -      (byte) 0xe4, (byte) 0x75, (byte) 0xd5, (byte) 0x09, (byte) 0x32, (byte) 0x17, (byte) 0x38, (byte) 0xb2,  -      (byte) 0x68, (byte) 0x35, (byte) 0x49, (byte) 0x8c, (byte) 0xa6, (byte) 0xd0, (byte) 0x3e, (byte) 0xde,  -      (byte) 0x6e, (byte) 0x47, (byte) 0x68, (byte) 0xbf, (byte) 0x98, (byte) 0x33, (byte) 0xae, (byte) 0x59,  -      (byte) 0x9f, (byte) 0xe0, (byte) 0x19, (byte) 0x9b, (byte) 0x5b, (byte) 0x1b, (byte) 0x8f, (byte) 0x74,  -      (byte) 0xd2, (byte) 0x9c, (byte) 0x01, (byte) 0x1a, (byte) 0xdf, (byte) 0xaf, (byte) 0xf8, (byte) 0x96,  -      (byte) 0x91, (byte) 0xcb, (byte) 0xf8, (byte) 0xbf, (byte) 0x06, (byte) 0xc7, (byte) 0xd5, (byte) 0x17,  -      (byte) 0x95, (byte) 0xef, (byte) 0xc5, (byte) 0x97, (byte) 0x37, (byte) 0x1b, (byte) 0xb0, (byte) 0xa1,  -      (byte) 0x4f, (byte) 0x9f, (byte) 0x01, (byte) 0x82, (byte) 0x90, (byte) 0x4a, (byte) 0x6a, (byte) 0x04,  -      (byte) 0xdb, (byte) 0x31, (byte) 0x1a, (byte) 0x58, (byte) 0xeb, (byte) 0xcd, (byte) 0x68, (byte) 0xe3,  -      (byte) 0x68, (byte) 0x0b, (byte) 0xa0, (byte) 0x11, (byte) 0x44, (byte) 0x08, (byte) 0xa0, (byte) 0x5c,  -      (byte) 0xfc, (byte) 0x61, (byte) 0x15, (byte) 0x1f, (byte) 0xbb, (byte) 0x22, (byte) 0x87, (byte) 0x18,  -      (byte) 0xa3, (byte) 0x07, (byte) 0x9b, (byte) 0x0d, (byte) 0x13, (byte) 0x7c, (byte) 0xff, (byte) 0x30,  -      (byte) 0xcf, (byte) 0xf3, (byte) 0xaf, (byte) 0xe4, (byte) 0x45, (byte) 0x05, (byte) 0xa0, (byte) 0x8e,  -      (byte) 0x6b, (byte) 0xef, (byte) 0x70, (byte) 0xf5, (byte) 0x4b, (byte) 0x68, (byte) 0x8f, (byte) 0x61,  -      (byte) 0xd6, (byte) 0xf5, (byte) 0xa0, (byte) 0x17, (byte) 0x03, (byte) 0x15, (byte) 0x00, (byte) 0x8e,  -      (byte) 0xa8, (byte) 0xdf, (byte) 0xa9, (byte) 0x77, (byte) 0xfd, (byte) 0x9b, (byte) 0x4b, (byte) 0x91,  -      (byte) 0x89, (byte) 0x34, (byte) 0x84, (byte) 0xf3, (byte) 0x24, (byte) 0xb2, (byte) 0x5a, (byte) 0x39,  -      (byte) 0xa9, (byte) 0xf2, (byte) 0x17, (byte) 0xa1, (byte) 0x17, (byte) 0x03, (byte) 0x15, (byte) 0x00,  -      (byte) 0xdb, (byte) 0xa2, (byte) 0xfd, (byte) 0xa4, (byte) 0xe7, (byte) 0x65, (byte) 0x2e, (byte) 0x7e,  -      (byte) 0xb0, (byte) 0xc8, (byte) 0xfa, (byte) 0x4d, (byte) 0x13, (byte) 0x28, (byte) 0xdf, (byte) 0xb1,  -      (byte) 0x58, (byte) 0x3b, (byte) 0x9e, (byte) 0x29, (byte) 0xa2, (byte) 0x17, (byte) 0x03, (byte) 0x15,  -      (byte) 0x00, (byte) 0x68, (byte) 0xa0, (byte) 0x17, (byte) 0x18, (byte) 0xb7, (byte) 0xb3, (byte) 0xc3,  -      (byte) 0x60, (byte) 0x77, (byte) 0x82, (byte) 0x8d, (byte) 0xf1, (byte) 0x5e, (byte) 0x10, (byte) 0xc3,  -      (byte) 0x2d, (byte) 0x78, (byte) 0x2c, (byte) 0x11, (byte) 0x0b -    }; -  private static byte[] FCI = new byte[] { (byte) 0x6f, (byte) 0x1a, (byte) 0x84, -        (byte) 0x07, (byte) 0xa0, (byte) 0x00, (byte) 0x00, (byte) 0x01, -        (byte) 0x18, (byte) 0x4e, (byte) 0x43, (byte) 0x85, (byte) 0x0f, -        (byte) 0x50, (byte) 0x0d, (byte) 0x44, (byte) 0x49, (byte) 0x47, -        (byte) 0x53, (byte) 0x49, (byte) 0x47, (byte) 0x20, (byte) 0x43, -        (byte) 0x43, (byte) 0x20, (byte) 0x45, (byte) 0x4e, (byte) 0x43 }; -  protected static byte[] FID_EF_C_CH_EKEY = new byte[] { (byte) 0xc0, (byte) 0x01 }; -  protected static byte[] FCI_EF_C_CH_EKEY = new byte[] { (byte) 0x6f, (byte) 0x07, -    (byte) 0x80, (byte) 0x02, (byte) 0x07, (byte) 0xd0, (byte) 0x82, -    (byte) 0x01, (byte) 0x01}; -  protected static byte[] C_CH_EKEY = new byte[] { -      (byte) 0x30, (byte) 0x82, (byte) 0x05, (byte) 0x7f, (byte) 0x30, (byte) 0x82, (byte) 0x04, (byte) 0x67,  -      (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01, (byte) 0x02, (byte) 0x02, (byte) 0x03, (byte) 0x02,  -      (byte) 0x05, (byte) 0x51, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,  -      (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -      (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0xa1, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09,  -      (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,  -      (byte) 0x54, (byte) 0x31, (byte) 0x48, (byte) 0x30, (byte) 0x46, (byte) 0x06, (byte) 0x03, (byte) 0x55,  -      (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x3f, (byte) 0x41, (byte) 0x2d, (byte) 0x54, (byte) 0x72,  -      (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x47, (byte) 0x65, (byte) 0x73, (byte) 0x2e,  -      (byte) 0x20, (byte) 0x66, (byte) 0x2e, (byte) 0x20, (byte) 0x53, (byte) 0x69, (byte) 0x63, (byte) 0x68,  -      (byte) 0x65, (byte) 0x72, (byte) 0x68, (byte) 0x65, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x73,  -      (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x20, (byte) 0x69,  -      (byte) 0x6d, (byte) 0x20, (byte) 0x65, (byte) 0x6c, (byte) 0x65, (byte) 0x6b, (byte) 0x74, (byte) 0x72,  -      (byte) 0x2e, (byte) 0x20, (byte) 0x44, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x6e, (byte) 0x76,  -      (byte) 0x65, (byte) 0x72, (byte) 0x6b, (byte) 0x65, (byte) 0x68, (byte) 0x72, (byte) 0x20, (byte) 0x47,  -      (byte) 0x6d, (byte) 0x62, (byte) 0x48, (byte) 0x31, (byte) 0x23, (byte) 0x30, (byte) 0x21, (byte) 0x06,  -      (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0b, (byte) 0x0c, (byte) 0x1a, (byte) 0x61, (byte) 0x2d,  -      (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72, (byte) 0x65,  -      (byte) 0x6d, (byte) 0x69, (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73,  -      (byte) 0x74, (byte) 0x2d, (byte) 0x45, (byte) 0x6e, (byte) 0x63, (byte) 0x2d, (byte) 0x30, (byte) 0x32,  -      (byte) 0x31, (byte) 0x23, (byte) 0x30, (byte) 0x21, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,  -      (byte) 0x03, (byte) 0x0c, (byte) 0x1a, (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67,  -      (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72, (byte) 0x65, (byte) 0x6d, (byte) 0x69, (byte) 0x75,  -      (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x45,  -      (byte) 0x6e, (byte) 0x63, (byte) 0x2d, (byte) 0x30, (byte) 0x32, (byte) 0x30, (byte) 0x1e, (byte) 0x17,  -      (byte) 0x0d, (byte) 0x30, (byte) 0x39, (byte) 0x30, (byte) 0x31, (byte) 0x31, (byte) 0x33, (byte) 0x30,  -      (byte) 0x39, (byte) 0x34, (byte) 0x35, (byte) 0x31, (byte) 0x32, (byte) 0x5a, (byte) 0x17, (byte) 0x0d,  -      (byte) 0x31, (byte) 0x32, (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x31, (byte) 0x30, (byte) 0x39,  -      (byte) 0x34, (byte) 0x35, (byte) 0x31, (byte) 0x32, (byte) 0x5a, (byte) 0x30, (byte) 0x70, (byte) 0x31,  -      (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,  -      (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x54, (byte) 0x31, (byte) 0x1f, (byte) 0x30, (byte) 0x1d,  -      (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x16, (byte) 0x58,  -      (byte) 0x58, (byte) 0x58, (byte) 0x4f, (byte) 0x74, (byte) 0x74, (byte) 0x6f, (byte) 0x20, (byte) 0x58,  -      (byte) 0x58, (byte) 0x58, (byte) 0x4f, (byte) 0x74, (byte) 0x74, (byte) 0x61, (byte) 0x6b, (byte) 0x72,  -      (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x65, (byte) 0x72, (byte) 0x31, (byte) 0x17, (byte) 0x30,  -      (byte) 0x15, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x04, (byte) 0x0c, (byte) 0x0e,  -      (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0x4f, (byte) 0x74, (byte) 0x74, (byte) 0x61, (byte) 0x6b,  -      (byte) 0x72, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x65, (byte) 0x72, (byte) 0x31, (byte) 0x10,  -      (byte) 0x30, (byte) 0x0e, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x2a, (byte) 0x0c,  -      (byte) 0x07, (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0x4f, (byte) 0x74, (byte) 0x74, (byte) 0x6f,  -      (byte) 0x31, (byte) 0x15, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,  -      (byte) 0x05, (byte) 0x13, (byte) 0x0c, (byte) 0x39, (byte) 0x37, (byte) 0x30, (byte) 0x30, (byte) 0x31,  -      (byte) 0x36, (byte) 0x38, (byte) 0x36, (byte) 0x36, (byte) 0x31, (byte) 0x37, (byte) 0x34, (byte) 0x30,  -      (byte) 0x81, (byte) 0xdf, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,  -      (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x05,  -      (byte) 0x00, (byte) 0x03, (byte) 0x81, (byte) 0xcd, (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0xc9,  -      (byte) 0x02, (byte) 0x81, (byte) 0xc1, (byte) 0x00, (byte) 0xae, (byte) 0xe6, (byte) 0x07, (byte) 0x1d,  -      (byte) 0xb9, (byte) 0x56, (byte) 0x0a, (byte) 0x98, (byte) 0x1a, (byte) 0xde, (byte) 0x52, (byte) 0xf2,  -      (byte) 0x77, (byte) 0xdc, (byte) 0x5e, (byte) 0x76, (byte) 0x7f, (byte) 0xe5, (byte) 0xc1, (byte) 0x79,  -      (byte) 0xb9, (byte) 0x51, (byte) 0x97, (byte) 0x08, (byte) 0x20, (byte) 0x4e, (byte) 0xa6, (byte) 0xa3,  -      (byte) 0xab, (byte) 0xdf, (byte) 0x49, (byte) 0x21, (byte) 0x2b, (byte) 0x65, (byte) 0x4f, (byte) 0x7c,  -      (byte) 0x26, (byte) 0xe8, (byte) 0xb9, (byte) 0x47, (byte) 0xdf, (byte) 0x03, (byte) 0x0f, (byte) 0xf7,  -      (byte) 0x4e, (byte) 0xf4, (byte) 0x47, (byte) 0x3d, (byte) 0x32, (byte) 0x61, (byte) 0x05, (byte) 0x33,  -      (byte) 0x0f, (byte) 0xdc, (byte) 0x97, (byte) 0x3e, (byte) 0xbf, (byte) 0x9b, (byte) 0xf2, (byte) 0xf8,  -      (byte) 0xb3, (byte) 0xe2, (byte) 0xc4, (byte) 0x4d, (byte) 0xe0, (byte) 0x48, (byte) 0x6a, (byte) 0x1b,  -      (byte) 0xd2, (byte) 0xfe, (byte) 0xfa, (byte) 0xee, (byte) 0x24, (byte) 0x08, (byte) 0xdc, (byte) 0x60,  -      (byte) 0x2a, (byte) 0x78, (byte) 0x6c, (byte) 0x1d, (byte) 0xd3, (byte) 0x74, (byte) 0x43, (byte) 0x1f,  -      (byte) 0x1f, (byte) 0x4e, (byte) 0xd2, (byte) 0x0f, (byte) 0x89, (byte) 0x3c, (byte) 0xe3, (byte) 0x1e,  -      (byte) 0xfa, (byte) 0x31, (byte) 0x5a, (byte) 0xc2, (byte) 0x04, (byte) 0x24, (byte) 0xd1, (byte) 0xe5,  -      (byte) 0x51, (byte) 0xc4, (byte) 0x94, (byte) 0x26, (byte) 0xd1, (byte) 0x32, (byte) 0x1e, (byte) 0xdf,  -      (byte) 0x64, (byte) 0xaa, (byte) 0xaf, (byte) 0x2c, (byte) 0x85, (byte) 0x25, (byte) 0x88, (byte) 0x8f,  -      (byte) 0x80, (byte) 0xe4, (byte) 0x05, (byte) 0x74, (byte) 0xd5, (byte) 0xda, (byte) 0x69, (byte) 0x88,  -      (byte) 0x4a, (byte) 0x0c, (byte) 0x6a, (byte) 0x85, (byte) 0x5f, (byte) 0x67, (byte) 0x51, (byte) 0x6c,  -      (byte) 0x5c, (byte) 0x1c, (byte) 0x41, (byte) 0x88, (byte) 0x4c, (byte) 0xad, (byte) 0x83, (byte) 0xc9,  -      (byte) 0x10, (byte) 0x97, (byte) 0x45, (byte) 0x00, (byte) 0x3f, (byte) 0xbd, (byte) 0x1d, (byte) 0x2f,  -      (byte) 0x28, (byte) 0x2e, (byte) 0x78, (byte) 0x97, (byte) 0x05, (byte) 0xa5, (byte) 0x41, (byte) 0x42,  -      (byte) 0x37, (byte) 0x08, (byte) 0x60, (byte) 0x0b, (byte) 0x66, (byte) 0xb1, (byte) 0xb8, (byte) 0xdd,  -      (byte) 0x98, (byte) 0x03, (byte) 0x03, (byte) 0x33, (byte) 0xc9, (byte) 0x15, (byte) 0xf7, (byte) 0x5b,  -      (byte) 0x35, (byte) 0xa5, (byte) 0xaa, (byte) 0x7a, (byte) 0x5e, (byte) 0xe9, (byte) 0xa7, (byte) 0x60,  -      (byte) 0xba, (byte) 0xd8, (byte) 0x0d, (byte) 0x6d, (byte) 0xb3, (byte) 0x85, (byte) 0x70, (byte) 0x0e,  -      (byte) 0x38, (byte) 0x6f, (byte) 0xf0, (byte) 0xfd, (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00,  -      (byte) 0x01, (byte) 0xa3, (byte) 0x82, (byte) 0x02, (byte) 0x32, (byte) 0x30, (byte) 0x82, (byte) 0x02,  -      (byte) 0x2e, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23,  -      (byte) 0x04, (byte) 0x0c, (byte) 0x30, (byte) 0x0a, (byte) 0x80, (byte) 0x08, (byte) 0x4b, (byte) 0x5d,  -      (byte) 0x02, (byte) 0x5c, (byte) 0x6d, (byte) 0x58, (byte) 0x24, (byte) 0x67, (byte) 0x30, (byte) 0x81,  -      (byte) 0x84, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -      (byte) 0x07, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x78, (byte) 0x30, (byte) 0x76, (byte) 0x30,  -      (byte) 0x2c, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -      (byte) 0x07, (byte) 0x30, (byte) 0x01, (byte) 0x86, (byte) 0x20, (byte) 0x68, (byte) 0x74, (byte) 0x74,  -      (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x6f, (byte) 0x63, (byte) 0x73, (byte) 0x70,  -      (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x2d,  -      (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74,  -      (byte) 0x2f, (byte) 0x6f, (byte) 0x63, (byte) 0x73, (byte) 0x70, (byte) 0x30, (byte) 0x46, (byte) 0x06,  -      (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x30,  -      (byte) 0x02, (byte) 0x86, (byte) 0x3a, (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a,  -      (byte) 0x2f, (byte) 0x2f, (byte) 0x77, (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x61, (byte) 0x2d,  -      (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74,  -      (byte) 0x2f, (byte) 0x63, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x73, (byte) 0x2f, (byte) 0x61,  -      (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72,  -      (byte) 0x65, (byte) 0x6d, (byte) 0x69, (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65,  -      (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x45, (byte) 0x6e, (byte) 0x63, (byte) 0x2d, (byte) 0x30,  -      (byte) 0x32, (byte) 0x2e, (byte) 0x63, (byte) 0x72, (byte) 0x74, (byte) 0x30, (byte) 0x81, (byte) 0x93,  -      (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x20, (byte) 0x04, (byte) 0x81, (byte) 0x8b,  -      (byte) 0x30, (byte) 0x81, (byte) 0x88, (byte) 0x30, (byte) 0x81, (byte) 0x85, (byte) 0x06, (byte) 0x06,  -      (byte) 0x2a, (byte) 0x28, (byte) 0x00, (byte) 0x11, (byte) 0x01, (byte) 0x03, (byte) 0x30, (byte) 0x7b,  -      (byte) 0x30, (byte) 0x3d, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05,  -      (byte) 0x05, (byte) 0x07, (byte) 0x02, (byte) 0x01, (byte) 0x16, (byte) 0x31, (byte) 0x68, (byte) 0x74,  -      (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x77, (byte) 0x77, (byte) 0x77,  -      (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74,  -      (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x64, (byte) 0x6f, (byte) 0x63, (byte) 0x73,  -      (byte) 0x2f, (byte) 0x63, (byte) 0x70, (byte) 0x2f, (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69,  -      (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x70, (byte) 0x72, (byte) 0x65, (byte) 0x6d, (byte) 0x69,  -      (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x30,  -      (byte) 0x3a, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -      (byte) 0x07, (byte) 0x02, (byte) 0x02, (byte) 0x30, (byte) 0x2e, (byte) 0x1a, (byte) 0x2c, (byte) 0x44,  -      (byte) 0x69, (byte) 0x65, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x20, (byte) 0x5a, (byte) 0x65,  -      (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x6b, (byte) 0x61, (byte) 0x74,  -      (byte) 0x20, (byte) 0x64, (byte) 0x69, (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x20, (byte) 0x6e,  -      (byte) 0x75, (byte) 0x72, (byte) 0x20, (byte) 0x7a, (byte) 0x75, (byte) 0x20, (byte) 0x54, (byte) 0x65,  -      (byte) 0x73, (byte) 0x74, (byte) 0x7a, (byte) 0x77, (byte) 0x65, (byte) 0x63, (byte) 0x6b, (byte) 0x65,  -      (byte) 0x6e, (byte) 0x20, (byte) 0x21, (byte) 0x30, (byte) 0x81, (byte) 0xa4, (byte) 0x06, (byte) 0x03,  -      (byte) 0x55, (byte) 0x1d, (byte) 0x1f, (byte) 0x04, (byte) 0x81, (byte) 0x9c, (byte) 0x30, (byte) 0x81,  -      (byte) 0x99, (byte) 0x30, (byte) 0x81, (byte) 0x96, (byte) 0xa0, (byte) 0x81, (byte) 0x93, (byte) 0xa0,  -      (byte) 0x81, (byte) 0x90, (byte) 0x86, (byte) 0x81, (byte) 0x8d, (byte) 0x6c, (byte) 0x64, (byte) 0x61,  -      (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x6c, (byte) 0x64, (byte) 0x61, (byte) 0x70,  -      (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x2d,  -      (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74,  -      (byte) 0x2f, (byte) 0x6f, (byte) 0x75, (byte) 0x3d, (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69,  -      (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72, (byte) 0x65, (byte) 0x6d, (byte) 0x69,  -      (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d,  -      (byte) 0x45, (byte) 0x6e, (byte) 0x63, (byte) 0x2d, (byte) 0x30, (byte) 0x32, (byte) 0x2c, (byte) 0x6f,  -      (byte) 0x3d, (byte) 0x41, (byte) 0x2d, (byte) 0x54, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74,  -      (byte) 0x2c, (byte) 0x63, (byte) 0x3d, (byte) 0x41, (byte) 0x54, (byte) 0x3f, (byte) 0x63, (byte) 0x65,  -      (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74,  -      (byte) 0x65, (byte) 0x72, (byte) 0x65, (byte) 0x76, (byte) 0x6f, (byte) 0x63, (byte) 0x61, (byte) 0x74,  -      (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x6c, (byte) 0x69, (byte) 0x73, (byte) 0x74, (byte) 0x3f,  -      (byte) 0x62, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x3f, (byte) 0x6f, (byte) 0x62, (byte) 0x6a,  -      (byte) 0x65, (byte) 0x63, (byte) 0x74, (byte) 0x63, (byte) 0x6c, (byte) 0x61, (byte) 0x73, (byte) 0x73,  -      (byte) 0x3d, (byte) 0x65, (byte) 0x69, (byte) 0x64, (byte) 0x43, (byte) 0x65, (byte) 0x72, (byte) 0x74,  -      (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x69, (byte) 0x6f,  -      (byte) 0x6e, (byte) 0x41, (byte) 0x75, (byte) 0x74, (byte) 0x68, (byte) 0x6f, (byte) 0x72, (byte) 0x69,  -      (byte) 0x74, (byte) 0x79, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d,  -      (byte) 0x0e, (byte) 0x04, (byte) 0x0a, (byte) 0x04, (byte) 0x08, (byte) 0x4a, (byte) 0x24, (byte) 0x43,  -      (byte) 0xc0, (byte) 0x85, (byte) 0x2a, (byte) 0xb4, (byte) 0x51, (byte) 0x30, (byte) 0x0e, (byte) 0x06,  -      (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0f, (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x04,  -      (byte) 0x04, (byte) 0x03, (byte) 0x02, (byte) 0x04, (byte) 0xb0, (byte) 0x30, (byte) 0x25, (byte) 0x06,  -      (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x11, (byte) 0x04, (byte) 0x1e, (byte) 0x30, (byte) 0x1c,  -      (byte) 0x81, (byte) 0x1a, (byte) 0x74, (byte) 0x68, (byte) 0x6f, (byte) 0x6d, (byte) 0x61, (byte) 0x73,  -      (byte) 0x2e, (byte) 0x72, (byte) 0x6f, (byte) 0x65, (byte) 0x73, (byte) 0x73, (byte) 0x6c, (byte) 0x65,  -      (byte) 0x72, (byte) 0x40, (byte) 0x65, (byte) 0x67, (byte) 0x69, (byte) 0x7a, (byte) 0x2e, (byte) 0x67,  -      (byte) 0x76, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03,  -      (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30,  -      (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7,  -      (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x82,  -      (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x4a, (byte) 0x36, (byte) 0x02, (byte) 0xb3, (byte) 0xab,  -      (byte) 0x02, (byte) 0xe9, (byte) 0xe1, (byte) 0xaf, (byte) 0x3f, (byte) 0xd5, (byte) 0xcd, (byte) 0x3d,  -      (byte) 0x51, (byte) 0x08, (byte) 0xb8, (byte) 0x73, (byte) 0x23, (byte) 0x68, (byte) 0x0c, (byte) 0x22,  -      (byte) 0x32, (byte) 0xcd, (byte) 0xbe, (byte) 0xc8, (byte) 0x77, (byte) 0xbc, (byte) 0x47, (byte) 0x37,  -      (byte) 0xdd, (byte) 0x89, (byte) 0x7c, (byte) 0x22, (byte) 0x24, (byte) 0x2f, (byte) 0x23, (byte) 0xea,  -      (byte) 0x3e, (byte) 0xc2, (byte) 0xf4, (byte) 0x59, (byte) 0x78, (byte) 0xa6, (byte) 0xbe, (byte) 0xcd,  -      (byte) 0x71, (byte) 0xaa, (byte) 0xb5, (byte) 0xbc, (byte) 0xe3, (byte) 0xbc, (byte) 0x3f, (byte) 0xf1,  -      (byte) 0xfa, (byte) 0x1a, (byte) 0x43, (byte) 0x2b, (byte) 0x91, (byte) 0x35, (byte) 0x67, (byte) 0xa5,  -      (byte) 0x62, (byte) 0x9d, (byte) 0x55, (byte) 0x85, (byte) 0xe0, (byte) 0x3f, (byte) 0xed, (byte) 0x00,  -      (byte) 0x67, (byte) 0x80, (byte) 0x6a, (byte) 0xfb, (byte) 0x46, (byte) 0x8a, (byte) 0xed, (byte) 0x48,  -      (byte) 0x03, (byte) 0xe7, (byte) 0x9d, (byte) 0x5c, (byte) 0xac, (byte) 0xdf, (byte) 0xec, (byte) 0x2d,  -      (byte) 0x53, (byte) 0x8b, (byte) 0x01, (byte) 0xdb, (byte) 0x14, (byte) 0x91, (byte) 0x21, (byte) 0xaf,  -      (byte) 0xa7, (byte) 0x91, (byte) 0x69, (byte) 0x7e, (byte) 0x97, (byte) 0x68, (byte) 0xcc, (byte) 0x2a,  -      (byte) 0x06, (byte) 0x1a, (byte) 0xbc, (byte) 0x53, (byte) 0x35, (byte) 0xde, (byte) 0xd7, (byte) 0x62,  -      (byte) 0x12, (byte) 0xbd, (byte) 0x54, (byte) 0xb5, (byte) 0x4c, (byte) 0x3c, (byte) 0xaf, (byte) 0x55,  -      (byte) 0xa4, (byte) 0x5b, (byte) 0x28, (byte) 0x61, (byte) 0x68, (byte) 0x03, (byte) 0xc6, (byte) 0x72,  -      (byte) 0xc0, (byte) 0xa2, (byte) 0x3f, (byte) 0x84, (byte) 0x02, (byte) 0xf8, (byte) 0x3d, (byte) 0x70,  -      (byte) 0x3f, (byte) 0xde, (byte) 0x9d, (byte) 0x6a, (byte) 0x71, (byte) 0x16, (byte) 0x87, (byte) 0x9d,  -      (byte) 0x93, (byte) 0x3d, (byte) 0x46, (byte) 0x41, (byte) 0xa9, (byte) 0x6a, (byte) 0xca, (byte) 0x87,  -      (byte) 0xd4, (byte) 0xd1, (byte) 0x3f, (byte) 0x1d, (byte) 0x6e, (byte) 0x6a, (byte) 0xbf, (byte) 0x02,  -      (byte) 0x9b, (byte) 0xfb, (byte) 0x4a, (byte) 0x47, (byte) 0xe0, (byte) 0x20, (byte) 0x4a, (byte) 0x2d,  -      (byte) 0x5a, (byte) 0x0c, (byte) 0x6b, (byte) 0x25, (byte) 0xd6, (byte) 0x2d, (byte) 0xd4, (byte) 0x53,  -      (byte) 0x08, (byte) 0x41, (byte) 0xa9, (byte) 0x16, (byte) 0xa2, (byte) 0xa0, (byte) 0xef, (byte) 0x13,  -      (byte) 0xa8, (byte) 0xec, (byte) 0x7e, (byte) 0x99, (byte) 0x15, (byte) 0xf9, (byte) 0x1a, (byte) 0x18,  -      (byte) 0x5e, (byte) 0x75, (byte) 0xc7, (byte) 0x5d, (byte) 0x40, (byte) 0xd4, (byte) 0x84, (byte) 0x4a,  -      (byte) 0xd2, (byte) 0xf7, (byte) 0x7c, (byte) 0x65, (byte) 0x12, (byte) 0xc7, (byte) 0xae, (byte) 0xbc,  -      (byte) 0x9d, (byte) 0x3e, (byte) 0xce, (byte) 0x42, (byte) 0xfe, (byte) 0xe4, (byte) 0x98, (byte) 0x10,  -      (byte) 0x63, (byte) 0x0d, (byte) 0xaa, (byte) 0x2d, (byte) 0x73, (byte) 0x7d, (byte) 0x46, (byte) 0x19,  -      (byte) 0xca, (byte) 0x78, (byte) 0x94, (byte) 0xe5, (byte) 0x11, (byte) 0x83, (byte) 0x87, (byte) 0xb2,  -      (byte) 0xf7, (byte) 0x59, (byte) 0x90, (byte) 0x47, (byte) 0x86, (byte) 0x57, (byte) 0xcf, (byte) 0xc7,  -      (byte) 0x7b, (byte) 0x8f, (byte) 0xac, (byte) 0x20, (byte) 0xbd, (byte) 0x46, (byte) 0xea, (byte) 0xa2,  -      (byte) 0x10, (byte) 0xe1, (byte) 0x72, (byte) 0x3e, (byte) 0xe3, (byte) 0x72, (byte) 0x20, (byte) 0x24,  -      (byte) 0xa5, (byte) 0x2f, (byte) 0xc5 -    };    protected static final int KID_PIN_DEC = 0x81; - -  protected static byte[] FID_EF_INFOBOX = new byte[] { (byte) 0xc0, (byte) 0x02 }; -  protected static byte[] FCI_EF_INFOBOX = new byte[] { (byte) 0x6f, (byte) 0x07, -    (byte) 0x80, (byte) 0x02, (byte) 0x05, (byte) 0xdc, (byte) 0x82, -    (byte) 0x01, (byte) 0x01}; -   -  protected byte[] EF_INFOBOX = new byte[1500]; - -  protected byte[] EF_C_CH_EKEY = new byte[2000]; -   -  public ACOSApplDEC() { -    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, PIN.STATE_RESET)); -    } catch (UnsupportedEncodingException e) { -      throw new RuntimeException(e); -    } -  } - -  @Override -  public byte[] getAID() { -    return AID_DEC; -  } - -  @Override -  public byte[] getFID() { -    return FID_DEC; -  } - -  @Override -  public byte[] getFCI() { -    return FCI; -  } - -  public void clearInfobox() { -    Arrays.fill(EF_INFOBOX, (byte) 0x00); -  } -   -  public void setInfoboxHeader(byte b) { -    EF_INFOBOX[0] = b; -  } -   -  public void clearCert() { -    Arrays.fill(EF_C_CH_EKEY, (byte) 0x00); -  } -  }
\ No newline at end of file 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 6ab5903a..e7e844ba 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 @@ -16,232 +16,18 @@  */  package at.gv.egiz.smcc.acos; -import java.io.UnsupportedEncodingException; -import java.util.Arrays;  import java.util.Random;  import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.File;  import at.gv.egiz.smcc.PIN; -@SuppressWarnings("restriction")  public abstract class ACOSApplSIG extends ACOSAppl { -  private static byte[] FCI = new byte[] { (byte) 0x6f, (byte) 0x1a, -        (byte) 0x84, (byte) 0x07, (byte) 0xa0, (byte) 0x00, (byte) 0x00, -        (byte) 0x01, (byte) 0x18, (byte) 0x45, (byte) 0x43, (byte) 0x85, -        (byte) 0x0f, (byte) 0x50, (byte) 0x0d, (byte) 0x44, (byte) 0x49, -        (byte) 0x47, (byte) 0x53, (byte) 0x49, (byte) 0x47, (byte) 0x20, -        (byte) 0x43, (byte) 0x43, (byte) 0x20, (byte) 0x45, (byte) 0x43, -        (byte) 0x43 }; -  protected static byte[] FID_EF_C_CH_DS = new byte[] { (byte) 0xc0, (byte) 0x02 }; -  protected static byte[] FCI_EF_C_CH_DS = new byte[] { (byte) 0x6f, (byte) 0x07, -        (byte) 0x80, (byte) 0x02, (byte) 0x07, (byte) 0xd0, (byte) 0x82, -        (byte) 0x01, (byte) 0x01 }; -  protected static byte[] C_CH_DS = new byte[] { -      (byte) 0x30, (byte) 0x82, (byte) 0x05, (byte) 0x2b, (byte) 0x30, (byte) 0x82, (byte) 0x04, (byte) 0x13,  -      (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01, (byte) 0x02, (byte) 0x02, (byte) 0x03, (byte) 0x02,  -      (byte) 0x05, (byte) 0x52, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,  -      (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -      (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0xa1, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09,  -      (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,  -      (byte) 0x54, (byte) 0x31, (byte) 0x48, (byte) 0x30, (byte) 0x46, (byte) 0x06, (byte) 0x03, (byte) 0x55,  -      (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x3f, (byte) 0x41, (byte) 0x2d, (byte) 0x54, (byte) 0x72,  -      (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x47, (byte) 0x65, (byte) 0x73, (byte) 0x2e,  -      (byte) 0x20, (byte) 0x66, (byte) 0x2e, (byte) 0x20, (byte) 0x53, (byte) 0x69, (byte) 0x63, (byte) 0x68,  -      (byte) 0x65, (byte) 0x72, (byte) 0x68, (byte) 0x65, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x73,  -      (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x20, (byte) 0x69,  -      (byte) 0x6d, (byte) 0x20, (byte) 0x65, (byte) 0x6c, (byte) 0x65, (byte) 0x6b, (byte) 0x74, (byte) 0x72,  -      (byte) 0x2e, (byte) 0x20, (byte) 0x44, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x6e, (byte) 0x76,  -      (byte) 0x65, (byte) 0x72, (byte) 0x6b, (byte) 0x65, (byte) 0x68, (byte) 0x72, (byte) 0x20, (byte) 0x47,  -      (byte) 0x6d, (byte) 0x62, (byte) 0x48, (byte) 0x31, (byte) 0x23, (byte) 0x30, (byte) 0x21, (byte) 0x06,  -      (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0b, (byte) 0x0c, (byte) 0x1a, (byte) 0x61, (byte) 0x2d,  -      (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72, (byte) 0x65,  -      (byte) 0x6d, (byte) 0x69, (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73,  -      (byte) 0x74, (byte) 0x2d, (byte) 0x53, (byte) 0x69, (byte) 0x67, (byte) 0x2d, (byte) 0x30, (byte) 0x32,  -      (byte) 0x31, (byte) 0x23, (byte) 0x30, (byte) 0x21, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,  -      (byte) 0x03, (byte) 0x0c, (byte) 0x1a, (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67,  -      (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72, (byte) 0x65, (byte) 0x6d, (byte) 0x69, (byte) 0x75,  -      (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x53,  -      (byte) 0x69, (byte) 0x67, (byte) 0x2d, (byte) 0x30, (byte) 0x32, (byte) 0x30, (byte) 0x1e, (byte) 0x17,  -      (byte) 0x0d, (byte) 0x30, (byte) 0x39, (byte) 0x30, (byte) 0x31, (byte) 0x31, (byte) 0x33, (byte) 0x30,  -      (byte) 0x39, (byte) 0x34, (byte) 0x35, (byte) 0x31, (byte) 0x32, (byte) 0x5a, (byte) 0x17, (byte) 0x0d,  -      (byte) 0x31, (byte) 0x32, (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x31, (byte) 0x30, (byte) 0x39,  -      (byte) 0x34, (byte) 0x35, (byte) 0x31, (byte) 0x32, (byte) 0x5a, (byte) 0x30, (byte) 0x70, (byte) 0x31,  -      (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,  -      (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x54, (byte) 0x31, (byte) 0x1f, (byte) 0x30, (byte) 0x1d,  -      (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x16, (byte) 0x58,  -      (byte) 0x58, (byte) 0x58, (byte) 0x4f, (byte) 0x74, (byte) 0x74, (byte) 0x6f, (byte) 0x20, (byte) 0x58,  -      (byte) 0x58, (byte) 0x58, (byte) 0x4f, (byte) 0x74, (byte) 0x74, (byte) 0x61, (byte) 0x6b, (byte) 0x72,  -      (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x65, (byte) 0x72, (byte) 0x31, (byte) 0x17, (byte) 0x30,  -      (byte) 0x15, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x04, (byte) 0x0c, (byte) 0x0e,  -      (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0x4f, (byte) 0x74, (byte) 0x74, (byte) 0x61, (byte) 0x6b,  -      (byte) 0x72, (byte) 0x69, (byte) 0x6e, (byte) 0x67, (byte) 0x65, (byte) 0x72, (byte) 0x31, (byte) 0x10,  -      (byte) 0x30, (byte) 0x0e, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x2a, (byte) 0x0c,  -      (byte) 0x07, (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0x4f, (byte) 0x74, (byte) 0x74, (byte) 0x6f,  -      (byte) 0x31, (byte) 0x15, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,  -      (byte) 0x05, (byte) 0x13, (byte) 0x0c, (byte) 0x39, (byte) 0x37, (byte) 0x30, (byte) 0x30, (byte) 0x31,  -      (byte) 0x36, (byte) 0x38, (byte) 0x36, (byte) 0x36, (byte) 0x31, (byte) 0x37, (byte) 0x34, (byte) 0x30,  -      (byte) 0x59, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86, (byte) 0x48,  -      (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86,  -      (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x01, (byte) 0x03, (byte) 0x42,  -      (byte) 0x00, (byte) 0x04, (byte) 0x6b, (byte) 0xde, (byte) 0x5f, (byte) 0x5e, (byte) 0xd5, (byte) 0x2b,  -      (byte) 0xbe, (byte) 0x1e, (byte) 0xb9, (byte) 0x82, (byte) 0x19, (byte) 0x75, (byte) 0xf4, (byte) 0x3b,  -      (byte) 0xc1, (byte) 0x34, (byte) 0xe9, (byte) 0xdb, (byte) 0x0b, (byte) 0x25, (byte) 0x31, (byte) 0x33,  -      (byte) 0xfa, (byte) 0x8b, (byte) 0x72, (byte) 0xd4, (byte) 0x9f, (byte) 0x21, (byte) 0xf5, (byte) 0x62,  -      (byte) 0xb9, (byte) 0xf6, (byte) 0x50, (byte) 0xdb, (byte) 0xcc, (byte) 0xbf, (byte) 0x43, (byte) 0xb9,  -      (byte) 0x5e, (byte) 0x75, (byte) 0x2a, (byte) 0x37, (byte) 0xbe, (byte) 0x32, (byte) 0xa6, (byte) 0x83,  -      (byte) 0xb1, (byte) 0x5c, (byte) 0xc3, (byte) 0x9d, (byte) 0xf0, (byte) 0xab, (byte) 0xe6, (byte) 0x8f,  -      (byte) 0xe4, (byte) 0x97, (byte) 0x83, (byte) 0x57, (byte) 0x89, (byte) 0xe0, (byte) 0x13, (byte) 0xe3,  -      (byte) 0x13, (byte) 0xa8, (byte) 0xa3, (byte) 0x82, (byte) 0x02, (byte) 0x65, (byte) 0x30, (byte) 0x82,  -      (byte) 0x02, (byte) 0x61, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d,  -      (byte) 0x23, (byte) 0x04, (byte) 0x0c, (byte) 0x30, (byte) 0x0a, (byte) 0x80, (byte) 0x08, (byte) 0x46,  -      (byte) 0x06, (byte) 0x9f, (byte) 0x8e, (byte) 0x41, (byte) 0x8e, (byte) 0x15, (byte) 0xbd, (byte) 0x30,  -      (byte) 0x27, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -      (byte) 0x07, (byte) 0x01, (byte) 0x03, (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x04, (byte) 0x18,  -      (byte) 0x30, (byte) 0x16, (byte) 0x30, (byte) 0x08, (byte) 0x06, (byte) 0x06, (byte) 0x04, (byte) 0x00,  -      (byte) 0x8e, (byte) 0x46, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0a, (byte) 0x06, (byte) 0x08,  -      (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x0b, (byte) 0x01,  -      (byte) 0x30, (byte) 0x81, (byte) 0x84, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01,  -      (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x78, (byte) 0x30,  -      (byte) 0x76, (byte) 0x30, (byte) 0x2c, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01,  -      (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x30, (byte) 0x01, (byte) 0x86, (byte) 0x20, (byte) 0x68,  -      (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x6f, (byte) 0x63,  -      (byte) 0x73, (byte) 0x70, (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2e,  -      (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e,  -      (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x6f, (byte) 0x63, (byte) 0x73, (byte) 0x70, (byte) 0x30,  -      (byte) 0x46, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -      (byte) 0x07, (byte) 0x30, (byte) 0x02, (byte) 0x86, (byte) 0x3a, (byte) 0x68, (byte) 0x74, (byte) 0x74,  -      (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x77, (byte) 0x77, (byte) 0x77, (byte) 0x2e,  -      (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e,  -      (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x63, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x73,  -      (byte) 0x2f, (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d,  -      (byte) 0x50, (byte) 0x72, (byte) 0x65, (byte) 0x6d, (byte) 0x69, (byte) 0x75, (byte) 0x6d, (byte) 0x2d,  -      (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x53, (byte) 0x69, (byte) 0x67,  -      (byte) 0x2d, (byte) 0x30, (byte) 0x32, (byte) 0x2e, (byte) 0x63, (byte) 0x72, (byte) 0x74, (byte) 0x30,  -      (byte) 0x81, (byte) 0x9d, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x20, (byte) 0x04,  -      (byte) 0x81, (byte) 0x95, (byte) 0x30, (byte) 0x81, (byte) 0x92, (byte) 0x30, (byte) 0x81, (byte) 0x85,  -      (byte) 0x06, (byte) 0x06, (byte) 0x2a, (byte) 0x28, (byte) 0x00, (byte) 0x11, (byte) 0x01, (byte) 0x03,  -      (byte) 0x30, (byte) 0x7b, (byte) 0x30, (byte) 0x3d, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06,  -      (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x02, (byte) 0x01, (byte) 0x16, (byte) 0x31,  -      (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x77,  -      (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75,  -      (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x64, (byte) 0x6f,  -      (byte) 0x63, (byte) 0x73, (byte) 0x2f, (byte) 0x63, (byte) 0x70, (byte) 0x2f, (byte) 0x61, (byte) 0x2d,  -      (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x70, (byte) 0x72, (byte) 0x65,  -      (byte) 0x6d, (byte) 0x69, (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73,  -      (byte) 0x74, (byte) 0x30, (byte) 0x3a, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01,  -      (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x02, (byte) 0x02, (byte) 0x30, (byte) 0x2e, (byte) 0x1a,  -      (byte) 0x2c, (byte) 0x44, (byte) 0x69, (byte) 0x65, (byte) 0x73, (byte) 0x65, (byte) 0x73, (byte) 0x20,  -      (byte) 0x5a, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x6b,  -      (byte) 0x61, (byte) 0x74, (byte) 0x20, (byte) 0x64, (byte) 0x69, (byte) 0x65, (byte) 0x6e, (byte) 0x74,  -      (byte) 0x20, (byte) 0x6e, (byte) 0x75, (byte) 0x72, (byte) 0x20, (byte) 0x7a, (byte) 0x75, (byte) 0x20,  -      (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x7a, (byte) 0x77, (byte) 0x65, (byte) 0x63,  -      (byte) 0x6b, (byte) 0x65, (byte) 0x6e, (byte) 0x20, (byte) 0x21, (byte) 0x30, (byte) 0x08, (byte) 0x06,  -      (byte) 0x06, (byte) 0x04, (byte) 0x00, (byte) 0x8b, (byte) 0x30, (byte) 0x01, (byte) 0x01, (byte) 0x30,  -      (byte) 0x81, (byte) 0xa4, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x1f, (byte) 0x04,  -      (byte) 0x81, (byte) 0x9c, (byte) 0x30, (byte) 0x81, (byte) 0x99, (byte) 0x30, (byte) 0x81, (byte) 0x96,  -      (byte) 0xa0, (byte) 0x81, (byte) 0x93, (byte) 0xa0, (byte) 0x81, (byte) 0x90, (byte) 0x86, (byte) 0x81,  -      (byte) 0x8d, (byte) 0x6c, (byte) 0x64, (byte) 0x61, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f,  -      (byte) 0x6c, (byte) 0x64, (byte) 0x61, (byte) 0x70, (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73,  -      (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73,  -      (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x6f, (byte) 0x75, (byte) 0x3d,  -      (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x50,  -      (byte) 0x72, (byte) 0x65, (byte) 0x6d, (byte) 0x69, (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x54,  -      (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x53, (byte) 0x69, (byte) 0x67, (byte) 0x2d,  -      (byte) 0x30, (byte) 0x32, (byte) 0x2c, (byte) 0x6f, (byte) 0x3d, (byte) 0x41, (byte) 0x2d, (byte) 0x54,  -      (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2c, (byte) 0x63, (byte) 0x3d, (byte) 0x41,  -      (byte) 0x54, (byte) 0x3f, (byte) 0x63, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66,  -      (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x65, (byte) 0x76,  -      (byte) 0x6f, (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x6c,  -      (byte) 0x69, (byte) 0x73, (byte) 0x74, (byte) 0x3f, (byte) 0x62, (byte) 0x61, (byte) 0x73, (byte) 0x65,  -      (byte) 0x3f, (byte) 0x6f, (byte) 0x62, (byte) 0x6a, (byte) 0x65, (byte) 0x63, (byte) 0x74, (byte) 0x63,  -      (byte) 0x6c, (byte) 0x61, (byte) 0x73, (byte) 0x73, (byte) 0x3d, (byte) 0x65, (byte) 0x69, (byte) 0x64,  -      (byte) 0x43, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63,  -      (byte) 0x61, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x41, (byte) 0x75, (byte) 0x74,  -      (byte) 0x68, (byte) 0x6f, (byte) 0x72, (byte) 0x69, (byte) 0x74, (byte) 0x79, (byte) 0x30, (byte) 0x11,  -      (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x0a, (byte) 0x04,  -      (byte) 0x08, (byte) 0x46, (byte) 0x08, (byte) 0xda, (byte) 0x9e, (byte) 0x68, (byte) 0xf8, (byte) 0xe5,  -      (byte) 0x81, (byte) 0x30, (byte) 0x0e, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0f,  -      (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x04, (byte) 0x04, (byte) 0x03, (byte) 0x02, (byte) 0x06,  -      (byte) 0xc0, (byte) 0x30, (byte) 0x25, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x11,  -      (byte) 0x04, (byte) 0x1e, (byte) 0x30, (byte) 0x1c, (byte) 0x81, (byte) 0x1a, (byte) 0x74, (byte) 0x68,  -      (byte) 0x6f, (byte) 0x6d, (byte) 0x61, (byte) 0x73, (byte) 0x2e, (byte) 0x72, (byte) 0x6f, (byte) 0x65,  -      (byte) 0x73, (byte) 0x73, (byte) 0x6c, (byte) 0x65, (byte) 0x72, (byte) 0x40, (byte) 0x65, (byte) 0x67,  -      (byte) 0x69, (byte) 0x7a, (byte) 0x2e, (byte) 0x67, (byte) 0x76, (byte) 0x2e, (byte) 0x61, (byte) 0x74,  -      (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04,  -      (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,  -      (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,  -      (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x82, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0xd8,  -      (byte) 0xec, (byte) 0xe5, (byte) 0x5c, (byte) 0x17, (byte) 0x42, (byte) 0xe8, (byte) 0x2f, (byte) 0x04,  -      (byte) 0x1f, (byte) 0xe2, (byte) 0x04, (byte) 0x57, (byte) 0x07, (byte) 0x30, (byte) 0xdc, (byte) 0x4f,  -      (byte) 0x61, (byte) 0x7d, (byte) 0xd8, (byte) 0x89, (byte) 0x36, (byte) 0x31, (byte) 0x26, (byte) 0x45,  -      (byte) 0x55, (byte) 0x64, (byte) 0xd3, (byte) 0x55, (byte) 0x1b, (byte) 0x83, (byte) 0x51, (byte) 0xa0,  -      (byte) 0x39, (byte) 0x1b, (byte) 0x6a, (byte) 0x7e, (byte) 0xfa, (byte) 0x7e, (byte) 0x2c, (byte) 0xd0,  -      (byte) 0xd3, (byte) 0x86, (byte) 0x7b, (byte) 0x8d, (byte) 0x29, (byte) 0x8f, (byte) 0xa3, (byte) 0x83,  -      (byte) 0xd2, (byte) 0x72, (byte) 0xce, (byte) 0x43, (byte) 0xcf, (byte) 0xc1, (byte) 0x27, (byte) 0xf1,  -      (byte) 0x4d, (byte) 0x11, (byte) 0xe2, (byte) 0x67, (byte) 0xbe, (byte) 0x6e, (byte) 0x34, (byte) 0x7d,  -      (byte) 0x04, (byte) 0x1f, (byte) 0xba, (byte) 0x55, (byte) 0x34, (byte) 0xea, (byte) 0xc2, (byte) 0xcf,  -      (byte) 0x0f, (byte) 0x64, (byte) 0x7b, (byte) 0x84, (byte) 0xe0, (byte) 0x55, (byte) 0x05, (byte) 0x82,  -      (byte) 0xdd, (byte) 0x9d, (byte) 0xd7, (byte) 0xeb, (byte) 0x91, (byte) 0x78, (byte) 0x69, (byte) 0x49,  -      (byte) 0x58, (byte) 0x70, (byte) 0xff, (byte) 0x83, (byte) 0x70, (byte) 0xa0, (byte) 0xb3, (byte) 0xb7,  -      (byte) 0x3d, (byte) 0x0f, (byte) 0x8e, (byte) 0xe9, (byte) 0x1b, (byte) 0x21, (byte) 0xef, (byte) 0x31,  -      (byte) 0x0b, (byte) 0xe3, (byte) 0xac, (byte) 0xc6, (byte) 0x0f, (byte) 0x57, (byte) 0x4f, (byte) 0xd8,  -      (byte) 0xd6, (byte) 0xb2, (byte) 0xd0, (byte) 0xca, (byte) 0xd9, (byte) 0x6f, (byte) 0x3f, (byte) 0x6e,  -      (byte) 0x83, (byte) 0x8c, (byte) 0xff, (byte) 0x47, (byte) 0xca, (byte) 0xbc, (byte) 0x81, (byte) 0x60,  -      (byte) 0x5f, (byte) 0xe2, (byte) 0xdd, (byte) 0xbd, (byte) 0x89, (byte) 0xb2, (byte) 0x52, (byte) 0xac,  -      (byte) 0xc3, (byte) 0x8b, (byte) 0x44, (byte) 0x99, (byte) 0x70, (byte) 0xe7, (byte) 0x2c, (byte) 0x52,  -      (byte) 0x21, (byte) 0xaa, (byte) 0xa2, (byte) 0x0f, (byte) 0x38, (byte) 0xc6, (byte) 0x98, (byte) 0x4d,  -      (byte) 0x48, (byte) 0xda, (byte) 0x65, (byte) 0x41, (byte) 0xa4, (byte) 0xad, (byte) 0x41, (byte) 0x7c,  -      (byte) 0x99, (byte) 0x14, (byte) 0xe5, (byte) 0xcb, (byte) 0x51, (byte) 0xd7, (byte) 0xab, (byte) 0x76,  -      (byte) 0xb1, (byte) 0x20, (byte) 0xce, (byte) 0x32, (byte) 0x1b, (byte) 0x11, (byte) 0x5c, (byte) 0xef,  -      (byte) 0x8b, (byte) 0x4f, (byte) 0xf3, (byte) 0x46, (byte) 0x5b, (byte) 0x11, (byte) 0xd7, (byte) 0x91,  -      (byte) 0xb6, (byte) 0x41, (byte) 0xd3, (byte) 0x23, (byte) 0xb6, (byte) 0x03, (byte) 0xa8, (byte) 0x98,  -      (byte) 0x40, (byte) 0x76, (byte) 0x13, (byte) 0x5d, (byte) 0x4c, (byte) 0xb2, (byte) 0xe9, (byte) 0xfe,  -      (byte) 0x90, (byte) 0x27, (byte) 0x04, (byte) 0xfc, (byte) 0x10, (byte) 0x45, (byte) 0x8b, (byte) 0x10,  -      (byte) 0xc3, (byte) 0xb2, (byte) 0x4b, (byte) 0x3c, (byte) 0xd2, (byte) 0x5b, (byte) 0x0f, (byte) 0xe8,  -      (byte) 0xfb, (byte) 0xb9, (byte) 0x45, (byte) 0xaf, (byte) 0x05, (byte) 0xc4, (byte) 0xba, (byte) 0xc7,  -      (byte) 0xfc, (byte) 0xa5, (byte) 0x7d, (byte) 0xdb, (byte) 0x4f, (byte) 0xa9, (byte) 0x76, (byte) 0xe2,  -      (byte) 0xfa, (byte) 0xc7, (byte) 0xe0, (byte) 0xad, (byte) 0x70, (byte) 0xaa, (byte) 0x40, (byte) 0x15,  -      (byte) 0x64, (byte) 0x01, (byte) 0xba, (byte) 0xc6, (byte) 0xc3, (byte) 0x83, (byte) 0x65, (byte) 0x95,  -      (byte) 0x3c, (byte) 0x05, (byte) 0x53, (byte) 0x88, (byte) 0xe7, (byte) 0x19, (byte) 0x98 -    }; -      protected static final int KID_PIN_SIG = 0x81; -  protected byte[] EF_C_CH_DS = new byte[2000]; -   -  public ACOSApplSIG() { -    // Files -    System.arraycopy(C_CH_DS, 0, EF_C_CH_DS, 0, C_CH_DS.length); -    putFile(new File(FID_EF_C_CH_DS, EF_C_CH_DS, FCI_EF_C_CH_DS)); -     -    // PINs -    try { -      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); -    } -  } - -  @Override -  public byte[] getAID() { -    return AID_SIG; -  } - -  @Override -  public byte[] getFID() { -    return FID_SIG; -  } - -  @Override -  public byte[] getFCI() { -    return FCI; -  } -    @Override    public ResponseAPDU cmdPERFORM_SECURITY_OPERATION(CommandAPDU command, CardChannelEmul channel) { @@ -295,8 +81,4 @@ public abstract class ACOSApplSIG extends ACOSAppl {    } -  public void clearCert() { -    Arrays.fill(EF_C_CH_DS, (byte) 0x00); -  } -  }
\ No newline at end of file diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardChannelEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardChannelEmul.java index 25923686..5fcf2e37 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardChannelEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardChannelEmul.java @@ -18,34 +18,17 @@ package at.gv.egiz.smcc.acos;  import java.util.Arrays; -import javax.smartcardio.Card;  import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.AbstractAppl;  import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.CardEmul;  import at.gv.egiz.smcc.File;  import at.gv.egiz.smcc.PIN; -@SuppressWarnings("restriction")  public abstract class ACOSCardChannelEmul extends CardChannelEmul { -  /** -   *  -   */ -  protected CardEmul cardEmul; - -  public ACOSCardChannelEmul(CardEmul cardEmul) { -    this.cardEmul = cardEmul; -  } - -  @Override -  public Card getCard() { -    return cardEmul; -  } -    protected ResponseAPDU cmdSELECT(CommandAPDU command) throws CardException {      byte[] fid = command.getData(); @@ -58,7 +41,7 @@ public abstract class ACOSCardChannelEmul extends CardChannelEmul {        }        currentAppl = appl; -      byte[] fci = currentAppl.getFCI(); +      byte[] fci = currentAppl.getFCX();        byte[] response = new byte[fci.length + 2];        System.arraycopy(fci, 0, response, 0, fci.length);        response[fci.length] = (byte) 0x90; diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardEmul.java deleted file mode 100644 index b9f70a5d..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardEmul.java +++ /dev/null @@ -1,38 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc.acos; - - -import javax.smartcardio.ATR; - -import at.gv.egiz.smcc.CardEmul; - -@SuppressWarnings("restriction") -public abstract class ACOSCardEmul extends CardEmul { - -  protected static ATR ATR = new ATR(new byte[] { -        (byte) 0x3b, (byte) 0xbf, (byte) 0x11, (byte) 0x00, (byte) 0x81, (byte) 0x31, (byte) 0xfe, (byte) 0x45,  -        (byte) 0x45, (byte) 0x50, (byte) 0x41, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,  -        (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0xf1 -  }); -   -  @Override -  public ATR getATR() { -    return ATR; -  } - -}
\ No newline at end of file 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 deleted file mode 100644 index 4f012739..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardTest.java +++ /dev/null @@ -1,230 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc.acos; - -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.security.NoSuchAlgorithmException; -import java.util.Arrays; - -import org.junit.Test; - -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; - -public abstract class ACOSCardTest extends CardTest { - -  public ACOSCardTest() { -    super(); -  } - -  protected abstract int getVersion(); - -  @Test -  public void testGetInfoboxIdentityLinkEmpty() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    char[] pin = "0000".toCharArray(); -     -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    ACOSApplDEC appl = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC); -    appl.clearInfobox(); - -    byte[] idlink = signatureCard.getInfobox("IdentityLink", -        new SMCCTestPINProvider(pin), null); -    assertNull(idlink); - -  } -   -  @Test(expected = SignatureCardException.class) -  public void testGetInfoboxIdentityInvalid() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    char[] pin = "0000".toCharArray(); -     -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    ACOSApplDEC appl = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC); -    appl.setInfoboxHeader((byte) 0xFF); - -    signatureCard.getInfobox("IdentityLink", new SMCCTestPINProvider(pin), null); - -  } - -  @Test -  public void testGetCerts() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    SignatureCard signatureCard = createSignatureCard(); - -    byte[] cert; - -    cert = signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); -    assertNotNull(cert); -    assertTrue(Arrays.equals(cert, A04ApplSIG.C_CH_DS)); - -    cert = signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); -    assertNotNull(cert); -    assertTrue(Arrays.equals(cert, A04ApplDEC.C_CH_EKEY)); - -  } - -  @Test(expected = NotActivatedException.class) -  public void testGetSIGCertEmpty() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    ACOSApplSIG appl = (ACOSApplSIG) card.getApplication(ACOSAppl.AID_SIG); -    appl.clearCert(); - -    signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); - -  } - -  @Test(expected = NotActivatedException.class) -  public void testGetDECCertEmpty() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    ACOSApplDEC appl = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC); -    appl.clearCert(); - -    signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); - -  } - -  @Test -  public void testSignSIG() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    char[] pin = "123456".toCharArray(); - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    ACOSApplSIG appl = (ACOSApplSIG) card.getApplication(ACOSAppl.AID_SIG); -    appl.setPin(ACOSApplSIG.KID_PIN_SIG, pin); - -    byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), -        KeyboxName.SECURE_SIGNATURE_KEYPAIR, new SMCCTestPINProvider(pin), null); - -    assertNotNull(signature); - -  } - -  @Test -  public void testSignDEC() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    char[] pin = "1234".toCharArray(); - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    ACOSApplDEC appl = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC); -    appl.setPin(ACOSApplDEC.KID_PIN_DEC, pin); - -    byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), -        KeyboxName.CERITIFIED_KEYPAIR, new SMCCTestPINProvider(pin), null); - -    assertNotNull(signature); - -  } - -  @Test(expected = LockedException.class) -  public void testSignSIGInvalidPin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    SignatureCard signatureCard = createSignatureCard(); - -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("000000".toCharArray()); - -    signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, -        pinProvider, null); - -  } - -  @Test(expected = LockedException.class) -  public void testSignDECInvalidPin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    SignatureCard signatureCard = createSignatureCard(); - -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("0000".toCharArray()); - -    signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, -        pinProvider, null); - -  } - -  @Test(expected = LockedException.class) -  public void testSignSIGBlockedPin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    ACOSApplSIG appl = (ACOSApplSIG) card.getApplication(ACOSAppl.AID_SIG); -    appl.setPin(ACOSApplSIG.KID_PIN_SIG, null); - -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("000000".toCharArray()); - -    signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, -        pinProvider, null); - -  } - -  @Test(expected = LockedException.class) -  public void testSignDECBlockedPin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    ACOSApplDEC appl = (ACOSApplDEC) card.getApplication(ACOSAppl.AID_DEC); -    appl.setPin(ACOSApplDEC.KID_PIN_DEC, null); - -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("0000".toCharArray()); - -    signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, -        pinProvider, null); - -  } - -}
\ 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 index 814ced11..5c0065bc 100644 --- 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 @@ -19,7 +19,6 @@ package at.gv.egiz.smcc.pin.gui;  import at.gv.egiz.smcc.CancelledException;  import at.gv.egiz.smcc.PinInfo; -@SuppressWarnings("restriction")  public class InterruptPINProvider extends DummyPINGUI implements PINGUI {    public InterruptPINProvider() { 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 62528e6e..7267e79b 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 @@ -16,9 +16,6 @@  */  package at.gv.egiz.smcc.starcos; -import java.io.UnsupportedEncodingException; -import java.math.BigInteger; -import java.util.Arrays;  import java.util.Iterator;  import javax.smartcardio.CommandAPDU; @@ -29,31 +26,15 @@ import at.gv.egiz.smcc.CardAppl;  import at.gv.egiz.smcc.CardChannelEmul;  import at.gv.egiz.smcc.PIN; -@SuppressWarnings("restriction")  public abstract class STARCOSAppl extends AbstractAppl implements CardAppl { -  public static byte[] AID_SichereSignatur = new byte[] { (byte) 0xD0, (byte) 0x40, -        (byte) 0x00, (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x12, (byte) 0x01 }; -   -  public static byte[] FID_SichereSignatur = new byte[] { (byte) 0x3F, (byte) 0x04 }; -   -  public static byte[] AID_Infobox = new byte[] { (byte) 0xD0, (byte) 0x40, -    (byte) 0x00, (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x18, (byte) 0x01 }; - -  public static byte[] FID_Infobox = new byte[] { (byte) 0x3F, (byte) 0x06 }; - -  public static byte[] AID_GewoehnlicheSignatur = new byte[] { (byte) 0xD0, (byte) 0x40, -    (byte) 0x00, (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x13, (byte) 0x01 }; - -  public static byte[] FID_GewoehnlicheSignatur = new byte[] { (byte) 0x3F, (byte) 0x05 }; -      protected STARCOSCardChannelEmul channel;    protected byte[] securityEnv;    protected byte[] hash; -  public STARCOSAppl(STARCOSCardChannelEmul channel) { +  public void setCardChannel(STARCOSCardChannelEmul channel) {      this.channel = channel;    } 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 8741dd2d..d443ef38 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,220 +16,41 @@  */  package at.gv.egiz.smcc.starcos; +import java.security.GeneralSecurityException; +import java.security.interfaces.RSAPrivateKey;  import java.util.Arrays;  import java.util.Random; +import javax.crypto.Cipher;  import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.File;  import at.gv.egiz.smcc.PIN; -@SuppressWarnings("restriction")  public class STARCOSApplGewoehnlicheSignatur extends STARCOSAppl { - -  private static byte[] FCI = new byte[] { (byte) 0x6f, (byte) 0x14, -      (byte) 0x84, (byte) 0x08, (byte) 0xd0, (byte) 0x40, (byte) 0x00, -      (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x13, (byte) 0x01, -      (byte) 0xa5, (byte) 0x08, (byte) 0x53, (byte) 0x02, (byte) 0x01, -      (byte) 0x10, (byte) 0x54, (byte) 0x02, (byte) 0x01, (byte) 0x00 }; -   -  protected static byte[] FID_EF_C_X509_CH_AUT = new byte[] { (byte) 0x2f, -      (byte) 0x01 }; -   -  protected static byte[] FCI_EF_C_X509_CH_AUT = new byte[] { (byte) 0x62, -      (byte) 0x16, (byte) 0x80, (byte) 0x02, (byte) 0x04, (byte) 0x9c, -      (byte) 0x82, (byte) 0x01, (byte) 0x01, (byte) 0x83, (byte) 0x02, -      (byte) 0x2f, (byte) 0x01, (byte) 0x88, (byte) 0x01, (byte) 0x08, -      (byte) 0x8a, (byte) 0x01, (byte) 0x05, (byte) 0xa1, (byte) 0x03, -      (byte) 0x8b, (byte) 0x01, (byte) 0x08 }; -  protected static byte[] C_X509_CH_AUT = new byte[] { -    (byte) 0x30, (byte) 0x82, (byte) 0x04, (byte) 0x98, (byte) 0x30, (byte) 0x82, (byte) 0x03, (byte) 0x80,  -    (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01, (byte) 0x02, (byte) 0x02, (byte) 0x03, (byte) 0x02,  -    (byte) 0x06, (byte) 0x5f, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,  -    (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -    (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0x95, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09,  -    (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,  -    (byte) 0x54, (byte) 0x31, (byte) 0x48, (byte) 0x30, (byte) 0x46, (byte) 0x06, (byte) 0x03, (byte) 0x55,  -    (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x3f, (byte) 0x41, (byte) 0x2d, (byte) 0x54, (byte) 0x72,  -    (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x47, (byte) 0x65, (byte) 0x73, (byte) 0x2e,  -    (byte) 0x20, (byte) 0x66, (byte) 0x2e, (byte) 0x20, (byte) 0x53, (byte) 0x69, (byte) 0x63, (byte) 0x68,  -    (byte) 0x65, (byte) 0x72, (byte) 0x68, (byte) 0x65, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x73,  -    (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x20, (byte) 0x69,  -    (byte) 0x6d, (byte) 0x20, (byte) 0x65, (byte) 0x6c, (byte) 0x65, (byte) 0x6b, (byte) 0x74, (byte) 0x72,  -    (byte) 0x2e, (byte) 0x20, (byte) 0x44, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x6e, (byte) 0x76,  -    (byte) 0x65, (byte) 0x72, (byte) 0x6b, (byte) 0x65, (byte) 0x68, (byte) 0x72, (byte) 0x20, (byte) 0x47,  -    (byte) 0x6d, (byte) 0x62, (byte) 0x48, (byte) 0x31, (byte) 0x1d, (byte) 0x30, (byte) 0x1b, (byte) 0x06,  -    (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0b, (byte) 0x0c, (byte) 0x14, (byte) 0x61, (byte) 0x2d,  -    (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x74, (byte) 0x6f, (byte) 0x6b,  -    (byte) 0x65, (byte) 0x6e, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d,  -    (byte) 0x30, (byte) 0x33, (byte) 0x31, (byte) 0x1d, (byte) 0x30, (byte) 0x1b, (byte) 0x06, (byte) 0x03,  -    (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x14, (byte) 0x61, (byte) 0x2d, (byte) 0x73,  -    (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x74, (byte) 0x6f, (byte) 0x6b, (byte) 0x65,  -    (byte) 0x6e, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x30,  -    (byte) 0x33, (byte) 0x30, (byte) 0x1e, (byte) 0x17, (byte) 0x0d, (byte) 0x30, (byte) 0x39, (byte) 0x30,  -    (byte) 0x33, (byte) 0x30, (byte) 0x36, (byte) 0x31, (byte) 0x35, (byte) 0x32, (byte) 0x32, (byte) 0x33,  -    (byte) 0x38, (byte) 0x5a, (byte) 0x17, (byte) 0x0d, (byte) 0x31, (byte) 0x32, (byte) 0x30, (byte) 0x33,  -    (byte) 0x30, (byte) 0x36, (byte) 0x31, (byte) 0x35, (byte) 0x32, (byte) 0x32, (byte) 0x33, (byte) 0x38,  -    (byte) 0x5a, (byte) 0x30, (byte) 0x72, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06,  -    (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x54,  -    (byte) 0x31, (byte) 0x20, (byte) 0x30, (byte) 0x1e, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,  -    (byte) 0x03, (byte) 0x0c, (byte) 0x17, (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0xc5, (byte) 0x90,  -    (byte) 0x7a, (byte) 0x67, (byte) 0xc3, (byte) 0xbc, (byte) 0x72, (byte) 0x20, (byte) 0x58, (byte) 0x58,  -    (byte) 0x58, (byte) 0x54, (byte) 0xc3, (byte) 0xbc, (byte) 0x7a, (byte) 0x65, (byte) 0x6b, (byte) 0xc3,  -    (byte) 0xa7, (byte) 0x69, (byte) 0x31, (byte) 0x15, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03,  -    (byte) 0x55, (byte) 0x04, (byte) 0x04, (byte) 0x0c, (byte) 0x0c, (byte) 0x58, (byte) 0x58, (byte) 0x58,  -    (byte) 0x54, (byte) 0xc3, (byte) 0xbc, (byte) 0x7a, (byte) 0x65, (byte) 0x6b, (byte) 0xc3, (byte) 0xa7,  -    (byte) 0x69, (byte) 0x31, (byte) 0x13, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55,  -    (byte) 0x04, (byte) 0x2a, (byte) 0x0c, (byte) 0x0a, (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0xc5,  -    (byte) 0x90, (byte) 0x7a, (byte) 0x67, (byte) 0xc3, (byte) 0xbc, (byte) 0x72, (byte) 0x31, (byte) 0x15,  -    (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x05, (byte) 0x13,  -    (byte) 0x0c, (byte) 0x37, (byte) 0x30, (byte) 0x34, (byte) 0x38, (byte) 0x37, (byte) 0x31, (byte) 0x30,  -    (byte) 0x35, (byte) 0x30, (byte) 0x30, (byte) 0x30, (byte) 0x38, (byte) 0x30, (byte) 0x49, (byte) 0x30,  -    (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d,  -    (byte) 0x02, (byte) 0x01, (byte) 0x06, (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce,  -    (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x01, (byte) 0x03, (byte) 0x32, (byte) 0x00, (byte) 0x04,  -    (byte) 0x02, (byte) 0x55, (byte) 0x51, (byte) 0xf9, (byte) 0x2a, (byte) 0xea, (byte) 0x6f, (byte) 0xd3,  -    (byte) 0xf5, (byte) 0xda, (byte) 0xa9, (byte) 0x7a, (byte) 0x22, (byte) 0xfc, (byte) 0xb4, (byte) 0x38,  -    (byte) 0xe9, (byte) 0x5c, (byte) 0xdc, (byte) 0x6b, (byte) 0x86, (byte) 0xa6, (byte) 0x77, (byte) 0xa7,  -    (byte) 0x90, (byte) 0xf3, (byte) 0x36, (byte) 0xe0, (byte) 0xc4, (byte) 0xde, (byte) 0x72, (byte) 0xf2,  -    (byte) 0x1a, (byte) 0x07, (byte) 0xfa, (byte) 0xd0, (byte) 0xc8, (byte) 0x1c, (byte) 0xa0, (byte) 0xc8,  -    (byte) 0x8b, (byte) 0x5d, (byte) 0xde, (byte) 0x9e, (byte) 0xf8, (byte) 0x3b, (byte) 0x7c, (byte) 0x8c,  -    (byte) 0xa3, (byte) 0x82, (byte) 0x01, (byte) 0xec, (byte) 0x30, (byte) 0x82, (byte) 0x01, (byte) 0xe8,  -    (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04,  -    (byte) 0x0c, (byte) 0x30, (byte) 0x0a, (byte) 0x80, (byte) 0x08, (byte) 0x47, (byte) 0x7e, (byte) 0x5b,  -    (byte) 0xdb, (byte) 0x37, (byte) 0x33, (byte) 0xb1, (byte) 0xfa, (byte) 0x30, (byte) 0x7e, (byte) 0x06,  -    (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x01,  -    (byte) 0x01, (byte) 0x04, (byte) 0x72, (byte) 0x30, (byte) 0x70, (byte) 0x30, (byte) 0x2c, (byte) 0x06,  -    (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x30,  -    (byte) 0x01, (byte) 0x86, (byte) 0x20, (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a,  -    (byte) 0x2f, (byte) 0x2f, (byte) 0x6f, (byte) 0x63, (byte) 0x73, (byte) 0x70, (byte) 0x2d, (byte) 0x74,  -    (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72,  -    (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x6f,  -    (byte) 0x63, (byte) 0x73, (byte) 0x70, (byte) 0x30, (byte) 0x40, (byte) 0x06, (byte) 0x08, (byte) 0x2b,  -    (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x30, (byte) 0x02, (byte) 0x86,  -    (byte) 0x34, (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f,  -    (byte) 0x77, (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72,  -    (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x63,  -    (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x73, (byte) 0x2f, (byte) 0x61, (byte) 0x2d, (byte) 0x73,  -    (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x74, (byte) 0x6f, (byte) 0x6b, (byte) 0x65,  -    (byte) 0x6e, (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x30,  -    (byte) 0x33, (byte) 0x2e, (byte) 0x63, (byte) 0x72, (byte) 0x74, (byte) 0x30, (byte) 0x81, (byte) 0x86,  -    (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x20, (byte) 0x04, (byte) 0x7f, (byte) 0x30,  -    (byte) 0x7d, (byte) 0x30, (byte) 0x7b, (byte) 0x06, (byte) 0x06, (byte) 0x2a, (byte) 0x28, (byte) 0x00,  -    (byte) 0x11, (byte) 0x01, (byte) 0x03, (byte) 0x30, (byte) 0x71, (byte) 0x30, (byte) 0x35, (byte) 0x06,  -    (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x02,  -    (byte) 0x01, (byte) 0x16, (byte) 0x29, (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a,  -    (byte) 0x2f, (byte) 0x2f, (byte) 0x77, (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x61, (byte) 0x2d,  -    (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74,  -    (byte) 0x2f, (byte) 0x64, (byte) 0x6f, (byte) 0x63, (byte) 0x73, (byte) 0x2f, (byte) 0x63, (byte) 0x70,  -    (byte) 0x2f, (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d,  -    (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x30, (byte) 0x38, (byte) 0x06, (byte) 0x08,  -    (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x02, (byte) 0x02,  -    (byte) 0x30, (byte) 0x2c, (byte) 0x1a, (byte) 0x2a, (byte) 0x44, (byte) 0x69, (byte) 0x65, (byte) 0x73,  -    (byte) 0x65, (byte) 0x73, (byte) 0x20, (byte) 0x5a, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69,  -    (byte) 0x66, (byte) 0x69, (byte) 0x6b, (byte) 0x61, (byte) 0x74, (byte) 0x20, (byte) 0x64, (byte) 0x69,  -    (byte) 0x65, (byte) 0x6e, (byte) 0x74, (byte) 0x20, (byte) 0x6e, (byte) 0x75, (byte) 0x72, (byte) 0x20,  -    (byte) 0x7a, (byte) 0x75, (byte) 0x20, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x7a,  -    (byte) 0x77, (byte) 0x65, (byte) 0x63, (byte) 0x6b, (byte) 0x65, (byte) 0x6e, (byte) 0x30, (byte) 0x81,  -    (byte) 0x99, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x1f, (byte) 0x04, (byte) 0x81,  -    (byte) 0x91, (byte) 0x30, (byte) 0x81, (byte) 0x8e, (byte) 0x30, (byte) 0x81, (byte) 0x8b, (byte) 0xa0,  -    (byte) 0x81, (byte) 0x88, (byte) 0xa0, (byte) 0x81, (byte) 0x85, (byte) 0x86, (byte) 0x81, (byte) 0x82,  -    (byte) 0x6c, (byte) 0x64, (byte) 0x61, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x6c,  -    (byte) 0x64, (byte) 0x61, (byte) 0x70, (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74,  -    (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74,  -    (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x6f, (byte) 0x75, (byte) 0x3d, (byte) 0x61,  -    (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x74, (byte) 0x6f,  -    (byte) 0x6b, (byte) 0x65, (byte) 0x6e, (byte) 0x2d, (byte) 0x30, (byte) 0x33, (byte) 0x2c, (byte) 0x6f,  -    (byte) 0x3d, (byte) 0x41, (byte) 0x2d, (byte) 0x54, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74,  -    (byte) 0x2c, (byte) 0x63, (byte) 0x3d, (byte) 0x41, (byte) 0x54, (byte) 0x3f, (byte) 0x63, (byte) 0x65,  -    (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74,  -    (byte) 0x65, (byte) 0x72, (byte) 0x65, (byte) 0x76, (byte) 0x6f, (byte) 0x63, (byte) 0x61, (byte) 0x74,  -    (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x6c, (byte) 0x69, (byte) 0x73, (byte) 0x74, (byte) 0x3f,  -    (byte) 0x62, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x3f, (byte) 0x6f, (byte) 0x62, (byte) 0x6a,  -    (byte) 0x65, (byte) 0x63, (byte) 0x74, (byte) 0x63, (byte) 0x6c, (byte) 0x61, (byte) 0x73, (byte) 0x73,  -    (byte) 0x3d, (byte) 0x65, (byte) 0x69, (byte) 0x64, (byte) 0x43, (byte) 0x65, (byte) 0x72, (byte) 0x74,  -    (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x69, (byte) 0x6f,  -    (byte) 0x6e, (byte) 0x41, (byte) 0x75, (byte) 0x74, (byte) 0x68, (byte) 0x6f, (byte) 0x72, (byte) 0x69,  -    (byte) 0x74, (byte) 0x79, (byte) 0x30, (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d,  -    (byte) 0x0e, (byte) 0x04, (byte) 0x0a, (byte) 0x04, (byte) 0x08, (byte) 0x4a, (byte) 0x43, (byte) 0x51,  -    (byte) 0x30, (byte) 0x45, (byte) 0xfc, (byte) 0x2a, (byte) 0x00, (byte) 0x30, (byte) 0x0e, (byte) 0x06,  -    (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0f, (byte) 0x01, (byte) 0x01, (byte) 0xff, (byte) 0x04,  -    (byte) 0x04, (byte) 0x03, (byte) 0x02, (byte) 0x04, (byte) 0xb0, (byte) 0x30, (byte) 0x09, (byte) 0x06,  -    (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04, (byte) 0x02, (byte) 0x30, (byte) 0x00,  -    (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,  -    (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x00, (byte) 0x03,  -    (byte) 0x82, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x31, (byte) 0xdc, (byte) 0xf3, (byte) 0x43,  -    (byte) 0x79, (byte) 0xdd, (byte) 0xa9, (byte) 0x2a, (byte) 0xdc, (byte) 0x21, (byte) 0xf9, (byte) 0xd9,  -    (byte) 0x8f, (byte) 0x9a, (byte) 0x4e, (byte) 0x01, (byte) 0x40, (byte) 0x9a, (byte) 0xf1, (byte) 0x14,  -    (byte) 0x8d, (byte) 0x3a, (byte) 0x5e, (byte) 0x88, (byte) 0x36, (byte) 0x45, (byte) 0x1f, (byte) 0x16,  -    (byte) 0x3e, (byte) 0xeb, (byte) 0xa2, (byte) 0xef, (byte) 0xbf, (byte) 0x55, (byte) 0xbd, (byte) 0x5e,  -    (byte) 0x0e, (byte) 0x19, (byte) 0xc7, (byte) 0x0c, (byte) 0xbd, (byte) 0xed, (byte) 0xdf, (byte) 0xb8,  -    (byte) 0x75, (byte) 0x4e, (byte) 0x6a, (byte) 0x3a, (byte) 0x9a, (byte) 0x10, (byte) 0xfa, (byte) 0x49,  -    (byte) 0xc1, (byte) 0xd2, (byte) 0x35, (byte) 0xc5, (byte) 0x9a, (byte) 0xd7, (byte) 0xf4, (byte) 0xf0,  -    (byte) 0xcd, (byte) 0x13, (byte) 0xd1, (byte) 0x24, (byte) 0x06, (byte) 0xf8, (byte) 0x1f, (byte) 0xea,  -    (byte) 0xd6, (byte) 0x7a, (byte) 0xcb, (byte) 0x4f, (byte) 0xb5, (byte) 0x3e, (byte) 0x6c, (byte) 0xb2,  -    (byte) 0xfc, (byte) 0xe3, (byte) 0xaa, (byte) 0x2b, (byte) 0x20, (byte) 0x91, (byte) 0xf5, (byte) 0x5b,  -    (byte) 0xf1, (byte) 0x94, (byte) 0x0e, (byte) 0x06, (byte) 0x0a, (byte) 0xfd, (byte) 0x25, (byte) 0x71,  -    (byte) 0x11, (byte) 0xfc, (byte) 0x84, (byte) 0x46, (byte) 0xef, (byte) 0x5b, (byte) 0x0b, (byte) 0xa4,  -    (byte) 0x4a, (byte) 0x5d, (byte) 0x42, (byte) 0x99, (byte) 0xc8, (byte) 0x4e, (byte) 0x51, (byte) 0xd8,  -    (byte) 0x63, (byte) 0xd1, (byte) 0xbd, (byte) 0x00, (byte) 0xa3, (byte) 0xdd, (byte) 0x8f, (byte) 0x12,  -    (byte) 0x42, (byte) 0xbe, (byte) 0xca, (byte) 0x15, (byte) 0x37, (byte) 0x4c, (byte) 0xd2, (byte) 0xc9,  -    (byte) 0xa7, (byte) 0x37, (byte) 0xb2, (byte) 0x76, (byte) 0xb7, (byte) 0x34, (byte) 0x92, (byte) 0x98,  -    (byte) 0x60, (byte) 0xe7, (byte) 0x3d, (byte) 0x55, (byte) 0xa2, (byte) 0x6c, (byte) 0xb6, (byte) 0x66,  -    (byte) 0x67, (byte) 0xe1, (byte) 0xe4, (byte) 0x8f, (byte) 0xe3, (byte) 0xa5, (byte) 0xb8, (byte) 0xb5,  -    (byte) 0xc8, (byte) 0x8f, (byte) 0x9e, (byte) 0xe3, (byte) 0xf1, (byte) 0xaa, (byte) 0x8e, (byte) 0xe6,  -    (byte) 0xe2, (byte) 0x47, (byte) 0x49, (byte) 0x3d, (byte) 0xbe, (byte) 0x8c, (byte) 0xdd, (byte) 0xce,  -    (byte) 0x8d, (byte) 0x52, (byte) 0xac, (byte) 0xb9, (byte) 0x83, (byte) 0xe9, (byte) 0x9d, (byte) 0x98,  -    (byte) 0x7b, (byte) 0xda, (byte) 0x2b, (byte) 0xbc, (byte) 0x83, (byte) 0xcb, (byte) 0x74, (byte) 0x64,  -    (byte) 0x17, (byte) 0x4c, (byte) 0x33, (byte) 0xbb, (byte) 0x88, (byte) 0xc2, (byte) 0xdd, (byte) 0x08,  -    (byte) 0x69, (byte) 0xd8, (byte) 0xa2, (byte) 0xac, (byte) 0x95, (byte) 0x71, (byte) 0xd3, (byte) 0xf8,  -    (byte) 0xc9, (byte) 0xd1, (byte) 0xd6, (byte) 0x0e, (byte) 0xc3, (byte) 0x67, (byte) 0xa1, (byte) 0xdb,  -    (byte) 0xca, (byte) 0x58, (byte) 0xaa, (byte) 0x4b, (byte) 0xec, (byte) 0x37, (byte) 0x46, (byte) 0x73,  -    (byte) 0xc3, (byte) 0xa3, (byte) 0x7b, (byte) 0x1e, (byte) 0xdd, (byte) 0xf9, (byte) 0xb3, (byte) 0xbb,  -    (byte) 0xe0, (byte) 0x16, (byte) 0x39, (byte) 0xaf, (byte) 0xa0, (byte) 0x19, (byte) 0x9e, (byte) 0x89,  -    (byte) 0x37, (byte) 0x1e, (byte) 0x6e, (byte) 0x41, (byte) 0x59, (byte) 0xe1, (byte) 0x86, (byte) 0xea,  -    (byte) 0x0b, (byte) 0x39, (byte) 0x03, (byte) 0x89, (byte) 0xd2, (byte) 0xba, (byte) 0xd5, (byte) 0x0c,  -    (byte) 0x84, (byte) 0x09, (byte) 0xdd, (byte) 0xc7, (byte) 0x00, (byte) 0x2c, (byte) 0x2e, (byte) 0x1a,  -    (byte) 0x69, (byte) 0xeb, (byte) 0xdf, (byte) 0xb1 -  }; -   - -  protected byte[] EF_C_X509_CH_AUT = new byte[2000]; +  private static byte[] SE_DECIPHER = new byte[] { +    (byte) 0x84, (byte) 0x03, (byte) 0x80, (byte) 0x03, (byte) 0x00, +    (byte) 0x80, (byte) 0x01, (byte) 0x81}; +  private RSAPrivateKey privateKey; +      protected byte[] dst; +   +  protected byte[] ct; -  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 -  public byte[] getAID() { -    return AID_GewoehnlicheSignatur; -  } - -  @Override -  public byte[] getFID() { -    return FID_GewoehnlicheSignatur; +  public void setPrivateKey(RSAPrivateKey privateKey) { +    this.privateKey = privateKey;    } -  @Override -  public byte[] getFCI() { -    return FCI; +  public void setDst(byte[] dst) { +    this.dst = dst;    } -  public void clearCert() { -    Arrays.fill(EF_C_X509_CH_AUT, (byte) 0x00); +  public void setCt(byte[] ct) { +    this.ct = ct;    }    @Override @@ -271,9 +92,15 @@ public class STARCOSApplGewoehnlicheSignatur extends STARCOSAppl {      case 0xB8:        switch (command.getP1()) {        case 0x41: -        // PSO � DECIPHER +        // PSO - DECIPHER +        if (Arrays.equals(ct, command.getData())) { +          securityEnv = command.getData(); +          return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); +        } else { +          return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); +        }        case 0x81: -        // PSO � ENCIPHER +        // PSO - ENCIPHER        }      default:        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x81}); @@ -333,6 +160,44 @@ public class STARCOSApplGewoehnlicheSignatur extends STARCOSAppl {        hash = null;        return new ResponseAPDU(response); +     +    } else if (command.getP1() == 0x80 && command.getP2() == 0x86) { +       +      // DECIPHER +      if (!Arrays.equals(securityEnv, SE_DECIPHER)) { +        return new ResponseAPDU(new byte[] {(byte) 0x6F, (byte) 0x05}); +      } + +      byte[] data = command.getData(); +       +      if (data.length != 193) { +        return new ResponseAPDU(new byte[] {(byte) 0x67, (byte) 0x00}); +      } + +      if (((STARCOSCardChannelEmul) channel).globalPins +          .get(STARCOSCardChannelEmul.KID_PIN_Glob).state != PIN.STATE_PIN_VERIFIED) { +        // Security Status not satisfied +        return new ResponseAPDU(new byte[] {(byte) 0x69, (byte) 0x82}); +      } + +      byte[] cipherText = Arrays.copyOfRange(data, 1, data.length); +       +      byte[] plainText; +      try { +        Cipher cipher = Cipher.getInstance("RSA"); +        cipher.init(Cipher.DECRYPT_MODE, privateKey); +        plainText = cipher.doFinal(cipherText); +      } catch (GeneralSecurityException e) { +        throw new CardException(e); +      } +       +      byte[] response = new byte[plainText.length + 2]; +      System.arraycopy(plainText, 0, response, 0, plainText.length); +      response[plainText.length] = (byte) 0x90; +      response[plainText.length + 1] = (byte) 0x00; +       +      return new ResponseAPDU(response); +            } else {        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x00}); 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 c470351a..9ac2cdb5 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 @@ -16,132 +16,15 @@  */  package at.gv.egiz.smcc.starcos; -import java.util.Arrays; -  import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.File; -@SuppressWarnings("restriction")  public class STARCOSApplInfobox extends STARCOSAppl { -  public static final byte[] IDLINK = new byte[] { -    (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x11, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x0c,  -    (byte) 0x26, (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f,  -    (byte) 0x77, (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72,  -    (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x7a,  -    (byte) 0x6d, (byte) 0x72, (byte) 0x2f, (byte) 0x70, (byte) 0x65, (byte) 0x72, (byte) 0x73, (byte) 0x62,  -    (byte) 0x32, (byte) 0x30, (byte) 0x34, (byte) 0x2e, (byte) 0x78, (byte) 0x73, (byte) 0x6c, (byte) 0x0c,  -    (byte) 0x29, (byte) 0x73, (byte) 0x7a, (byte) 0x72, (byte) 0x2e, (byte) 0x62, (byte) 0x6d, (byte) 0x69,  -    (byte) 0x2e, (byte) 0x67, (byte) 0x76, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2d, (byte) 0x41,  -    (byte) 0x73, (byte) 0x73, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e,  -    (byte) 0x49, (byte) 0x44, (byte) 0x31, (byte) 0x32, (byte) 0x33, (byte) 0x36, (byte) 0x33, (byte) 0x35,  -    (byte) 0x36, (byte) 0x33, (byte) 0x36, (byte) 0x36, (byte) 0x37, (byte) 0x39, (byte) 0x39, (byte) 0x39,  -    (byte) 0x31, (byte) 0x39, (byte) 0x0c, (byte) 0x19, (byte) 0x32, (byte) 0x30, (byte) 0x30, (byte) 0x39,  -    (byte) 0x2d, (byte) 0x30, (byte) 0x33, (byte) 0x2d, (byte) 0x30, (byte) 0x36, (byte) 0x54, (byte) 0x31,  -    (byte) 0x36, (byte) 0x3a, (byte) 0x31, (byte) 0x39, (byte) 0x3a, (byte) 0x32, (byte) 0x36, (byte) 0x2b,  -    (byte) 0x30, (byte) 0x31, (byte) 0x3a, (byte) 0x30, (byte) 0x30, (byte) 0xa0, (byte) 0x42, (byte) 0x30,  -    (byte) 0x40, (byte) 0x0c, (byte) 0x18, (byte) 0x45, (byte) 0x68, (byte) 0x42, (byte) 0x53, (byte) 0x36,  -    (byte) 0x54, (byte) 0x6f, (byte) 0x31, (byte) 0x49, (byte) 0x6c, (byte) 0x54, (byte) 0x4b, (byte) 0x4f,  -    (byte) 0x4a, (byte) 0x45, (byte) 0x39, (byte) 0x75, (byte) 0x62, (byte) 0x74, (byte) 0x48, (byte) 0x69,  -    (byte) 0x51, (byte) 0x3d, (byte) 0x3d, (byte) 0x0c, (byte) 0x0a, (byte) 0x58, (byte) 0x58, (byte) 0x58,  -    (byte) 0xc5, (byte) 0x90, (byte) 0x7a, (byte) 0x67, (byte) 0xc3, (byte) 0xbc, (byte) 0x72, (byte) 0x0c,  -    (byte) 0x0c, (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0x54, (byte) 0xc3, (byte) 0xbc, (byte) 0x7a,  -    (byte) 0x65, (byte) 0x6b, (byte) 0xc3, (byte) 0xa7, (byte) 0x69, (byte) 0x0c, (byte) 0x0a, (byte) 0x31,  -    (byte) 0x39, (byte) 0x37, (byte) 0x33, (byte) 0x2d, (byte) 0x30, (byte) 0x36, (byte) 0x2d, (byte) 0x30,  -    (byte) 0x34, (byte) 0x30, (byte) 0x0a, (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01, (byte) 0x00,  -    (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x03, (byte) 0x82, (byte) 0x01,  -    (byte) 0x01, (byte) 0x00, (byte) 0x9f, (byte) 0xa5, (byte) 0x68, (byte) 0xa9, (byte) 0x14, (byte) 0x4c,  -    (byte) 0xa4, (byte) 0x5d, (byte) 0x9d, (byte) 0x09, (byte) 0x99, (byte) 0x2e, (byte) 0xe7, (byte) 0x45,  -    (byte) 0x2e, (byte) 0x42, (byte) 0x49, (byte) 0x02, (byte) 0x16, (byte) 0xd9, (byte) 0xcb, (byte) 0x90,  -    (byte) 0x43, (byte) 0x27, (byte) 0x03, (byte) 0x43, (byte) 0x6d, (byte) 0xb4, (byte) 0x8c, (byte) 0xdc,  -    (byte) 0x1c, (byte) 0x77, (byte) 0xd4, (byte) 0x2e, (byte) 0xa1, (byte) 0x40, (byte) 0xe7, (byte) 0xe0,  -    (byte) 0x03, (byte) 0x60, (byte) 0x15, (byte) 0xf7, (byte) 0xdb, (byte) 0x03, (byte) 0x5e, (byte) 0xca,  -    (byte) 0xe4, (byte) 0x35, (byte) 0xba, (byte) 0x2b, (byte) 0xfd, (byte) 0xe6, (byte) 0xb8, (byte) 0xd8,  -    (byte) 0xb7, (byte) 0x2a, (byte) 0x80, (byte) 0xdd, (byte) 0x38, (byte) 0xe0, (byte) 0x8a, (byte) 0x69,  -    (byte) 0xad, (byte) 0x67, (byte) 0x60, (byte) 0x65, (byte) 0x42, (byte) 0xc9, (byte) 0x41, (byte) 0x60,  -    (byte) 0x94, (byte) 0xde, (byte) 0x84, (byte) 0x54, (byte) 0xad, (byte) 0xb3, (byte) 0xf4, (byte) 0xf7,  -    (byte) 0x44, (byte) 0xd5, (byte) 0xf3, (byte) 0xd3, (byte) 0xb6, (byte) 0x87, (byte) 0x8a, (byte) 0x22,  -    (byte) 0x38, (byte) 0x00, (byte) 0xcb, (byte) 0xa4, (byte) 0x4f, (byte) 0x96, (byte) 0xc2, (byte) 0x28,  -    (byte) 0xc2, (byte) 0x8d, (byte) 0x91, (byte) 0x95, (byte) 0xb4, (byte) 0xea, (byte) 0x00, (byte) 0x59,  -    (byte) 0x2e, (byte) 0xec, (byte) 0x78, (byte) 0xd8, (byte) 0x0f, (byte) 0x26, (byte) 0x04, (byte) 0xee,  -    (byte) 0xed, (byte) 0x13, (byte) 0xbf, (byte) 0x81, (byte) 0x68, (byte) 0x81, (byte) 0x43, (byte) 0xbe,  -    (byte) 0x15, (byte) 0x0e, (byte) 0xba, (byte) 0xf9, (byte) 0x6a, (byte) 0x18, (byte) 0xeb, (byte) 0x95,  -    (byte) 0xad, (byte) 0xb4, (byte) 0x0f, (byte) 0x3c, (byte) 0x94, (byte) 0x63, (byte) 0x32, (byte) 0x81,  -    (byte) 0x90, (byte) 0xcf, (byte) 0x3f, (byte) 0x95, (byte) 0xff, (byte) 0x8d, (byte) 0x86, (byte) 0xed,  -    (byte) 0xe4, (byte) 0x75, (byte) 0xd5, (byte) 0x09, (byte) 0x32, (byte) 0x17, (byte) 0x38, (byte) 0xb2,  -    (byte) 0x68, (byte) 0x35, (byte) 0x49, (byte) 0x8c, (byte) 0xa6, (byte) 0xd0, (byte) 0x3e, (byte) 0xde,  -    (byte) 0x6e, (byte) 0x47, (byte) 0x68, (byte) 0xbf, (byte) 0x98, (byte) 0x33, (byte) 0xae, (byte) 0x59,  -    (byte) 0x9f, (byte) 0xe0, (byte) 0x19, (byte) 0x9b, (byte) 0x5b, (byte) 0x1b, (byte) 0x8f, (byte) 0x74,  -    (byte) 0xd2, (byte) 0x9c, (byte) 0x01, (byte) 0x1a, (byte) 0xdf, (byte) 0xaf, (byte) 0xf8, (byte) 0x96,  -    (byte) 0x91, (byte) 0xcb, (byte) 0xf8, (byte) 0xbf, (byte) 0x06, (byte) 0xc7, (byte) 0xd5, (byte) 0x17,  -    (byte) 0x95, (byte) 0xef, (byte) 0xc5, (byte) 0x97, (byte) 0x37, (byte) 0x1b, (byte) 0xb0, (byte) 0xa1,  -    (byte) 0x4f, (byte) 0x9f, (byte) 0x01, (byte) 0x82, (byte) 0x90, (byte) 0x4a, (byte) 0x6a, (byte) 0x04,  -    (byte) 0xdb, (byte) 0x31, (byte) 0x1a, (byte) 0x58, (byte) 0xeb, (byte) 0xcd, (byte) 0x68, (byte) 0xe3,  -    (byte) 0x68, (byte) 0x0b, (byte) 0xa0, (byte) 0x11, (byte) 0x44, (byte) 0x08, (byte) 0xa0, (byte) 0x5c,  -    (byte) 0xfc, (byte) 0x61, (byte) 0x15, (byte) 0x1f, (byte) 0xbb, (byte) 0x22, (byte) 0x87, (byte) 0x18,  -    (byte) 0xa3, (byte) 0x07, (byte) 0x9b, (byte) 0x0d, (byte) 0x13, (byte) 0x7c, (byte) 0xff, (byte) 0x30,  -    (byte) 0xcf, (byte) 0xf3, (byte) 0xaf, (byte) 0xe4, (byte) 0x45, (byte) 0x05, (byte) 0xa0, (byte) 0x8e,  -    (byte) 0x6b, (byte) 0xef, (byte) 0x70, (byte) 0xf5, (byte) 0x4b, (byte) 0x68, (byte) 0x8f, (byte) 0x61,  -    (byte) 0xd6, (byte) 0xf5, (byte) 0xa0, (byte) 0x17, (byte) 0x03, (byte) 0x15, (byte) 0x00, (byte) 0x8e,  -    (byte) 0xa8, (byte) 0xdf, (byte) 0xa9, (byte) 0x77, (byte) 0xfd, (byte) 0x9b, (byte) 0x4b, (byte) 0x91,  -    (byte) 0x89, (byte) 0x34, (byte) 0x84, (byte) 0xf3, (byte) 0x24, (byte) 0xb2, (byte) 0x5a, (byte) 0x39,  -    (byte) 0xa9, (byte) 0xf2, (byte) 0x17, (byte) 0xa1, (byte) 0x17, (byte) 0x03, (byte) 0x15, (byte) 0x00,  -    (byte) 0xdb, (byte) 0xa2, (byte) 0xfd, (byte) 0xa4, (byte) 0xe7, (byte) 0x65, (byte) 0x2e, (byte) 0x7e,  -    (byte) 0xb0, (byte) 0xc8, (byte) 0xfa, (byte) 0x4d, (byte) 0x13, (byte) 0x28, (byte) 0xdf, (byte) 0xb1,  -    (byte) 0x58, (byte) 0x3b, (byte) 0x9e, (byte) 0x29, (byte) 0xa2, (byte) 0x17, (byte) 0x03, (byte) 0x15,  -    (byte) 0x00, (byte) 0x68, (byte) 0xa0, (byte) 0x17, (byte) 0x18, (byte) 0xb7, (byte) 0xb3, (byte) 0xc3,  -    (byte) 0x60, (byte) 0x77, (byte) 0x82, (byte) 0x8d, (byte) 0xf1, (byte) 0x5e, (byte) 0x10, (byte) 0xc3,  -    (byte) 0x2d, (byte) 0x78, (byte) 0x2c, (byte) 0x11, (byte) 0x0b -  }; -   -  private static byte[] FCP = new byte[] { (byte) 0x6f, (byte) 0x14, -      (byte) 0x84, (byte) 0x08, (byte) 0xd0, (byte) 0x40, (byte) 0x00, -      (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x18, (byte) 0x01, -      (byte) 0xa5, (byte) 0x08, (byte) 0x53, (byte) 0x02, (byte) 0x01, -      (byte) 0x11, (byte) 0x54, (byte) 0x02, (byte) 0x01, (byte) 0x00 }; -   -  protected static byte[] FID_EF_IdentityLink = new byte[] { (byte) 0xef, (byte) 0x01 }; -   -  protected static byte[] FCP_EF_IdentityLink = new byte[] { (byte) 0x62, -      (byte) 0x16, (byte) 0x80, (byte) 0x02, (byte) 0x04, (byte) 0x00, -      (byte) 0x82, (byte) 0x01, (byte) 0x01, (byte) 0x83, (byte) 0x02, -      (byte) 0xef, (byte) 0x01, (byte) 0x88, (byte) 0x01, (byte) 0x08, -      (byte) 0x8a, (byte) 0x01, (byte) 0x05, (byte) 0xa1, (byte) 0x03, -      (byte) 0x8b, (byte) 0x01, (byte) 0x02 }; -   -  protected static byte[] EF_IdentityLink = new byte[1500]; - -  public STARCOSApplInfobox(STARCOSCardChannelEmul channel) { -    super(channel); -    System.arraycopy(IDLINK, 0, EF_IdentityLink, 0, IDLINK.length); -    putFile(new File(FID_EF_IdentityLink, EF_IdentityLink, FCP_EF_IdentityLink, 0x01)); -  } - -  @Override -  public byte[] getAID() { -    return AID_Infobox; -  } - -  @Override -  public byte[] getFID() { -    return FID_Infobox; -  } - -  @Override -  public byte[] getFCI() { -    return FCP; -  } - -  public void clearInfobox() { -    Arrays.fill(EF_IdentityLink, (byte) 0x00); -  } -   -  public void setInfoboxHeader(byte b) { -    EF_IdentityLink[0] = b; +  public STARCOSApplInfobox() {    }    @Override 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 deleted file mode 100644 index 4036ca41..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSApplSichereSignatur.java +++ /dev/null @@ -1,375 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc.starcos; - -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.Random; - -import javax.smartcardio.CardException; -import javax.smartcardio.CommandAPDU; -import javax.smartcardio.ResponseAPDU; - -import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.File; -import at.gv.egiz.smcc.PIN; - -@SuppressWarnings("restriction") -public class STARCOSApplSichereSignatur extends STARCOSAppl { - -  private static byte[] FCI = new byte[] { (byte) 0x6f, (byte) 0x16, -      (byte) 0x84, (byte) 0x08, (byte) 0xd0, (byte) 0x40, (byte) 0x00, -      (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x12, (byte) 0x01, -      (byte) 0xa5, (byte) 0x0a, (byte) 0x53, (byte) 0x02, (byte) 0x01, -      (byte) 0x10, (byte) 0x54, (byte) 0x04, (byte) 0x01, (byte) 0x00, -      (byte) 0x03, (byte) 0x00 }; -   -  protected static byte[] FID_EF_C_X509_CH_DS = new byte[] { (byte) 0xc0, -      (byte) 0x00 }; -   -  protected static byte[] FCI_EF_C_X509_CH_DS = new byte[] { (byte) 0x62, -      (byte) 0x16, (byte) 0x80, (byte) 0x02, (byte) 0x04, (byte) 0xef, -      (byte) 0x82, (byte) 0x01, (byte) 0x01, (byte) 0x83, (byte) 0x02, -      (byte) 0xc0, (byte) 0x00, (byte) 0x88, (byte) 0x01, (byte) 0x08, -      (byte) 0x8a, (byte) 0x01, (byte) 0x05, (byte) 0xa1, (byte) 0x03, -      (byte) 0x8b, (byte) 0x01, (byte) 0x0e }; -   -  protected static byte[] C_X509_CH_DS = new byte[] { -    (byte) 0x30, (byte) 0x82, (byte) 0x04, (byte) 0xeb, (byte) 0x30, (byte) 0x82, (byte) 0x03, (byte) 0xd3,  -    (byte) 0xa0, (byte) 0x03, (byte) 0x02, (byte) 0x01, (byte) 0x02, (byte) 0x02, (byte) 0x03, (byte) 0x02,  -    (byte) 0x06, (byte) 0x5e, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a, (byte) 0x86,  -    (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x05,  -    (byte) 0x00, (byte) 0x30, (byte) 0x81, (byte) 0xa1, (byte) 0x31, (byte) 0x0b, (byte) 0x30, (byte) 0x09,  -    (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06, (byte) 0x13, (byte) 0x02, (byte) 0x41,  -    (byte) 0x54, (byte) 0x31, (byte) 0x48, (byte) 0x30, (byte) 0x46, (byte) 0x06, (byte) 0x03, (byte) 0x55,  -    (byte) 0x04, (byte) 0x0a, (byte) 0x0c, (byte) 0x3f, (byte) 0x41, (byte) 0x2d, (byte) 0x54, (byte) 0x72,  -    (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x47, (byte) 0x65, (byte) 0x73, (byte) 0x2e,  -    (byte) 0x20, (byte) 0x66, (byte) 0x2e, (byte) 0x20, (byte) 0x53, (byte) 0x69, (byte) 0x63, (byte) 0x68,  -    (byte) 0x65, (byte) 0x72, (byte) 0x68, (byte) 0x65, (byte) 0x69, (byte) 0x74, (byte) 0x73, (byte) 0x73,  -    (byte) 0x79, (byte) 0x73, (byte) 0x74, (byte) 0x65, (byte) 0x6d, (byte) 0x65, (byte) 0x20, (byte) 0x69,  -    (byte) 0x6d, (byte) 0x20, (byte) 0x65, (byte) 0x6c, (byte) 0x65, (byte) 0x6b, (byte) 0x74, (byte) 0x72,  -    (byte) 0x2e, (byte) 0x20, (byte) 0x44, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x6e, (byte) 0x76,  -    (byte) 0x65, (byte) 0x72, (byte) 0x6b, (byte) 0x65, (byte) 0x68, (byte) 0x72, (byte) 0x20, (byte) 0x47,  -    (byte) 0x6d, (byte) 0x62, (byte) 0x48, (byte) 0x31, (byte) 0x23, (byte) 0x30, (byte) 0x21, (byte) 0x06,  -    (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x0b, (byte) 0x0c, (byte) 0x1a, (byte) 0x61, (byte) 0x2d,  -    (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72, (byte) 0x65,  -    (byte) 0x6d, (byte) 0x69, (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73,  -    (byte) 0x74, (byte) 0x2d, (byte) 0x53, (byte) 0x69, (byte) 0x67, (byte) 0x2d, (byte) 0x30, (byte) 0x32,  -    (byte) 0x31, (byte) 0x23, (byte) 0x30, (byte) 0x21, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04,  -    (byte) 0x03, (byte) 0x0c, (byte) 0x1a, (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67,  -    (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72, (byte) 0x65, (byte) 0x6d, (byte) 0x69, (byte) 0x75,  -    (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x53,  -    (byte) 0x69, (byte) 0x67, (byte) 0x2d, (byte) 0x30, (byte) 0x32, (byte) 0x30, (byte) 0x1e, (byte) 0x17,  -    (byte) 0x0d, (byte) 0x30, (byte) 0x39, (byte) 0x30, (byte) 0x33, (byte) 0x30, (byte) 0x36, (byte) 0x31,  -    (byte) 0x35, (byte) 0x32, (byte) 0x32, (byte) 0x33, (byte) 0x37, (byte) 0x5a, (byte) 0x17, (byte) 0x0d,  -    (byte) 0x31, (byte) 0x32, (byte) 0x30, (byte) 0x33, (byte) 0x30, (byte) 0x36, (byte) 0x31, (byte) 0x35,  -    (byte) 0x32, (byte) 0x32, (byte) 0x33, (byte) 0x37, (byte) 0x5a, (byte) 0x30, (byte) 0x72, (byte) 0x31,  -    (byte) 0x0b, (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x06,  -    (byte) 0x13, (byte) 0x02, (byte) 0x41, (byte) 0x54, (byte) 0x31, (byte) 0x20, (byte) 0x30, (byte) 0x1e,  -    (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x03, (byte) 0x0c, (byte) 0x17, (byte) 0x58,  -    (byte) 0x58, (byte) 0x58, (byte) 0xc5, (byte) 0x90, (byte) 0x7a, (byte) 0x67, (byte) 0xc3, (byte) 0xbc,  -    (byte) 0x72, (byte) 0x20, (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0x54, (byte) 0xc3, (byte) 0xbc,  -    (byte) 0x7a, (byte) 0x65, (byte) 0x6b, (byte) 0xc3, (byte) 0xa7, (byte) 0x69, (byte) 0x31, (byte) 0x15,  -    (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x04, (byte) 0x0c,  -    (byte) 0x0c, (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0x54, (byte) 0xc3, (byte) 0xbc, (byte) 0x7a,  -    (byte) 0x65, (byte) 0x6b, (byte) 0xc3, (byte) 0xa7, (byte) 0x69, (byte) 0x31, (byte) 0x13, (byte) 0x30,  -    (byte) 0x11, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x04, (byte) 0x2a, (byte) 0x0c, (byte) 0x0a,  -    (byte) 0x58, (byte) 0x58, (byte) 0x58, (byte) 0xc5, (byte) 0x90, (byte) 0x7a, (byte) 0x67, (byte) 0xc3,  -    (byte) 0xbc, (byte) 0x72, (byte) 0x31, (byte) 0x15, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03,  -    (byte) 0x55, (byte) 0x04, (byte) 0x05, (byte) 0x13, (byte) 0x0c, (byte) 0x37, (byte) 0x30, (byte) 0x34,  -    (byte) 0x38, (byte) 0x37, (byte) 0x31, (byte) 0x30, (byte) 0x35, (byte) 0x30, (byte) 0x30, (byte) 0x30,  -    (byte) 0x38, (byte) 0x30, (byte) 0x49, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x07, (byte) 0x2a,  -    (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06, (byte) 0x08,  -    (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x03, (byte) 0x01, (byte) 0x01,  -    (byte) 0x03, (byte) 0x32, (byte) 0x00, (byte) 0x04, (byte) 0xde, (byte) 0x75, (byte) 0x22, (byte) 0x4c,  -    (byte) 0xc4, (byte) 0xd4, (byte) 0x14, (byte) 0x16, (byte) 0x48, (byte) 0x4a, (byte) 0x65, (byte) 0x9d,  -    (byte) 0x5a, (byte) 0x39, (byte) 0x71, (byte) 0x11, (byte) 0x1c, (byte) 0x33, (byte) 0x7e, (byte) 0x7f,  -    (byte) 0xb4, (byte) 0x06, (byte) 0x33, (byte) 0x74, (byte) 0xe6, (byte) 0xf3, (byte) 0xc2, (byte) 0x56,  -    (byte) 0x46, (byte) 0x18, (byte) 0x39, (byte) 0xb9, (byte) 0xc4, (byte) 0x47, (byte) 0x84, (byte) 0xf5,  -    (byte) 0x46, (byte) 0x41, (byte) 0x60, (byte) 0x78, (byte) 0x81, (byte) 0x45, (byte) 0x4a, (byte) 0x0f,  -    (byte) 0x67, (byte) 0x77, (byte) 0x77, (byte) 0xb2, (byte) 0xa3, (byte) 0x82, (byte) 0x02, (byte) 0x33,  -    (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x2f, (byte) 0x30, (byte) 0x13, (byte) 0x06, (byte) 0x03,  -    (byte) 0x55, (byte) 0x1d, (byte) 0x23, (byte) 0x04, (byte) 0x0c, (byte) 0x30, (byte) 0x0a, (byte) 0x80,  -    (byte) 0x08, (byte) 0x46, (byte) 0x06, (byte) 0x9f, (byte) 0x8e, (byte) 0x41, (byte) 0x8e, (byte) 0x15,  -    (byte) 0xbd, (byte) 0x30, (byte) 0x27, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01,  -    (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x01, (byte) 0x03, (byte) 0x01, (byte) 0x01, (byte) 0xff,  -    (byte) 0x04, (byte) 0x18, (byte) 0x30, (byte) 0x16, (byte) 0x30, (byte) 0x08, (byte) 0x06, (byte) 0x06,  -    (byte) 0x04, (byte) 0x00, (byte) 0x8e, (byte) 0x46, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x0a,  -    (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07,  -    (byte) 0x0b, (byte) 0x01, (byte) 0x30, (byte) 0x81, (byte) 0x84, (byte) 0x06, (byte) 0x08, (byte) 0x2b,  -    (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x01, (byte) 0x01, (byte) 0x04,  -    (byte) 0x78, (byte) 0x30, (byte) 0x76, (byte) 0x30, (byte) 0x2c, (byte) 0x06, (byte) 0x08, (byte) 0x2b,  -    (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x30, (byte) 0x01, (byte) 0x86,  -    (byte) 0x20, (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f,  -    (byte) 0x6f, (byte) 0x63, (byte) 0x73, (byte) 0x70, (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73,  -    (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73,  -    (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x6f, (byte) 0x63, (byte) 0x73,  -    (byte) 0x70, (byte) 0x30, (byte) 0x46, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06, (byte) 0x01,  -    (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x30, (byte) 0x02, (byte) 0x86, (byte) 0x3a, (byte) 0x68,  -    (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x77, (byte) 0x77,  -    (byte) 0x77, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73,  -    (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x63, (byte) 0x65, (byte) 0x72,  -    (byte) 0x74, (byte) 0x73, (byte) 0x2f, (byte) 0x61, (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67,  -    (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72, (byte) 0x65, (byte) 0x6d, (byte) 0x69, (byte) 0x75,  -    (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x53,  -    (byte) 0x69, (byte) 0x67, (byte) 0x2d, (byte) 0x30, (byte) 0x32, (byte) 0x2e, (byte) 0x63, (byte) 0x72,  -    (byte) 0x74, (byte) 0x30, (byte) 0x81, (byte) 0x92, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d,  -    (byte) 0x20, (byte) 0x04, (byte) 0x81, (byte) 0x8a, (byte) 0x30, (byte) 0x81, (byte) 0x87, (byte) 0x30,  -    (byte) 0x7b, (byte) 0x06, (byte) 0x06, (byte) 0x2a, (byte) 0x28, (byte) 0x00, (byte) 0x11, (byte) 0x01,  -    (byte) 0x03, (byte) 0x30, (byte) 0x71, (byte) 0x30, (byte) 0x35, (byte) 0x06, (byte) 0x08, (byte) 0x2b,  -    (byte) 0x06, (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x02, (byte) 0x01, (byte) 0x16,  -    (byte) 0x29, (byte) 0x68, (byte) 0x74, (byte) 0x74, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f,  -    (byte) 0x77, (byte) 0x77, (byte) 0x77, (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72,  -    (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x64,  -    (byte) 0x6f, (byte) 0x63, (byte) 0x73, (byte) 0x2f, (byte) 0x63, (byte) 0x70, (byte) 0x2f, (byte) 0x61,  -    (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x74, (byte) 0x65,  -    (byte) 0x73, (byte) 0x74, (byte) 0x30, (byte) 0x38, (byte) 0x06, (byte) 0x08, (byte) 0x2b, (byte) 0x06,  -    (byte) 0x01, (byte) 0x05, (byte) 0x05, (byte) 0x07, (byte) 0x02, (byte) 0x02, (byte) 0x30, (byte) 0x2c,  -    (byte) 0x1a, (byte) 0x2a, (byte) 0x44, (byte) 0x69, (byte) 0x65, (byte) 0x73, (byte) 0x65, (byte) 0x73,  -    (byte) 0x20, (byte) 0x5a, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69,  -    (byte) 0x6b, (byte) 0x61, (byte) 0x74, (byte) 0x20, (byte) 0x64, (byte) 0x69, (byte) 0x65, (byte) 0x6e,  -    (byte) 0x74, (byte) 0x20, (byte) 0x6e, (byte) 0x75, (byte) 0x72, (byte) 0x20, (byte) 0x7a, (byte) 0x75,  -    (byte) 0x20, (byte) 0x54, (byte) 0x65, (byte) 0x73, (byte) 0x74, (byte) 0x7a, (byte) 0x77, (byte) 0x65,  -    (byte) 0x63, (byte) 0x6b, (byte) 0x65, (byte) 0x6e, (byte) 0x30, (byte) 0x08, (byte) 0x06, (byte) 0x06,  -    (byte) 0x04, (byte) 0x00, (byte) 0x8b, (byte) 0x30, (byte) 0x01, (byte) 0x01, (byte) 0x30, (byte) 0x81,  -    (byte) 0xa4, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x1f, (byte) 0x04, (byte) 0x81,  -    (byte) 0x9c, (byte) 0x30, (byte) 0x81, (byte) 0x99, (byte) 0x30, (byte) 0x81, (byte) 0x96, (byte) 0xa0,  -    (byte) 0x81, (byte) 0x93, (byte) 0xa0, (byte) 0x81, (byte) 0x90, (byte) 0x86, (byte) 0x81, (byte) 0x8d,  -    (byte) 0x6c, (byte) 0x64, (byte) 0x61, (byte) 0x70, (byte) 0x3a, (byte) 0x2f, (byte) 0x2f, (byte) 0x6c,  -    (byte) 0x64, (byte) 0x61, (byte) 0x70, (byte) 0x2d, (byte) 0x74, (byte) 0x65, (byte) 0x73, (byte) 0x74,  -    (byte) 0x2e, (byte) 0x61, (byte) 0x2d, (byte) 0x74, (byte) 0x72, (byte) 0x75, (byte) 0x73, (byte) 0x74,  -    (byte) 0x2e, (byte) 0x61, (byte) 0x74, (byte) 0x2f, (byte) 0x6f, (byte) 0x75, (byte) 0x3d, (byte) 0x61,  -    (byte) 0x2d, (byte) 0x73, (byte) 0x69, (byte) 0x67, (byte) 0x6e, (byte) 0x2d, (byte) 0x50, (byte) 0x72,  -    (byte) 0x65, (byte) 0x6d, (byte) 0x69, (byte) 0x75, (byte) 0x6d, (byte) 0x2d, (byte) 0x54, (byte) 0x65,  -    (byte) 0x73, (byte) 0x74, (byte) 0x2d, (byte) 0x53, (byte) 0x69, (byte) 0x67, (byte) 0x2d, (byte) 0x30,  -    (byte) 0x32, (byte) 0x2c, (byte) 0x6f, (byte) 0x3d, (byte) 0x41, (byte) 0x2d, (byte) 0x54, (byte) 0x72,  -    (byte) 0x75, (byte) 0x73, (byte) 0x74, (byte) 0x2c, (byte) 0x63, (byte) 0x3d, (byte) 0x41, (byte) 0x54,  -    (byte) 0x3f, (byte) 0x63, (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69,  -    (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x65, (byte) 0x72, (byte) 0x65, (byte) 0x76, (byte) 0x6f,  -    (byte) 0x63, (byte) 0x61, (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x6c, (byte) 0x69,  -    (byte) 0x73, (byte) 0x74, (byte) 0x3f, (byte) 0x62, (byte) 0x61, (byte) 0x73, (byte) 0x65, (byte) 0x3f,  -    (byte) 0x6f, (byte) 0x62, (byte) 0x6a, (byte) 0x65, (byte) 0x63, (byte) 0x74, (byte) 0x63, (byte) 0x6c,  -    (byte) 0x61, (byte) 0x73, (byte) 0x73, (byte) 0x3d, (byte) 0x65, (byte) 0x69, (byte) 0x64, (byte) 0x43,  -    (byte) 0x65, (byte) 0x72, (byte) 0x74, (byte) 0x69, (byte) 0x66, (byte) 0x69, (byte) 0x63, (byte) 0x61,  -    (byte) 0x74, (byte) 0x69, (byte) 0x6f, (byte) 0x6e, (byte) 0x41, (byte) 0x75, (byte) 0x74, (byte) 0x68,  -    (byte) 0x6f, (byte) 0x72, (byte) 0x69, (byte) 0x74, (byte) 0x79, (byte) 0x30, (byte) 0x11, (byte) 0x06,  -    (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0e, (byte) 0x04, (byte) 0x0a, (byte) 0x04, (byte) 0x08,  -    (byte) 0x47, (byte) 0x64, (byte) 0x6e, (byte) 0xbb, (byte) 0x92, (byte) 0xa0, (byte) 0xf6, (byte) 0xf4,  -    (byte) 0x30, (byte) 0x0e, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x0f, (byte) 0x01,  -    (byte) 0x01, (byte) 0xff, (byte) 0x04, (byte) 0x04, (byte) 0x03, (byte) 0x02, (byte) 0x06, (byte) 0xc0,  -    (byte) 0x30, (byte) 0x09, (byte) 0x06, (byte) 0x03, (byte) 0x55, (byte) 0x1d, (byte) 0x13, (byte) 0x04,  -    (byte) 0x02, (byte) 0x30, (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,  -    (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01, (byte) 0x01, (byte) 0x05,  -    (byte) 0x05, (byte) 0x00, (byte) 0x03, (byte) 0x82, (byte) 0x01, (byte) 0x01, (byte) 0x00, (byte) 0x06,  -    (byte) 0x63, (byte) 0x76, (byte) 0x0a, (byte) 0xd5, (byte) 0x54, (byte) 0xfa, (byte) 0x51, (byte) 0x2a,  -    (byte) 0xb0, (byte) 0x41, (byte) 0xdc, (byte) 0xa4, (byte) 0x9b, (byte) 0x52, (byte) 0x1c, (byte) 0x0e,  -    (byte) 0x1d, (byte) 0x65, (byte) 0x46, (byte) 0x2b, (byte) 0xa3, (byte) 0xcd, (byte) 0xd4, (byte) 0x46,  -    (byte) 0x36, (byte) 0x40, (byte) 0xc3, (byte) 0x49, (byte) 0xe8, (byte) 0xa4, (byte) 0xdc, (byte) 0x01,  -    (byte) 0xde, (byte) 0x70, (byte) 0x97, (byte) 0x31, (byte) 0xb0, (byte) 0xcd, (byte) 0xdf, (byte) 0x69,  -    (byte) 0xf8, (byte) 0xc3, (byte) 0x83, (byte) 0xee, (byte) 0xc6, (byte) 0xed, (byte) 0xe3, (byte) 0x18,  -    (byte) 0x1a, (byte) 0x80, (byte) 0xc1, (byte) 0x30, (byte) 0xa9, (byte) 0xd6, (byte) 0xb1, (byte) 0xb8,  -    (byte) 0xa8, (byte) 0xe0, (byte) 0x3d, (byte) 0xb1, (byte) 0x8e, (byte) 0x2c, (byte) 0xc9, (byte) 0xa6,  -    (byte) 0x05, (byte) 0x6e, (byte) 0x4a, (byte) 0xd2, (byte) 0xb2, (byte) 0x03, (byte) 0xa4, (byte) 0x2b,  -    (byte) 0xa2, (byte) 0xad, (byte) 0xad, (byte) 0xe5, (byte) 0xba, (byte) 0x0d, (byte) 0x54, (byte) 0x8d,  -    (byte) 0x92, (byte) 0x51, (byte) 0xda, (byte) 0x58, (byte) 0xed, (byte) 0xd3, (byte) 0x8d, (byte) 0x61,  -    (byte) 0xa1, (byte) 0xfc, (byte) 0x49, (byte) 0xf6, (byte) 0x80, (byte) 0xdb, (byte) 0x65, (byte) 0x92,  -    (byte) 0xe0, (byte) 0xd5, (byte) 0x23, (byte) 0x69, (byte) 0x0f, (byte) 0x38, (byte) 0x11, (byte) 0x61,  -    (byte) 0x1e, (byte) 0xcd, (byte) 0xa2, (byte) 0x8e, (byte) 0x68, (byte) 0xec, (byte) 0x70, (byte) 0xfb,  -    (byte) 0x55, (byte) 0x95, (byte) 0xcb, (byte) 0xb4, (byte) 0x18, (byte) 0x6b, (byte) 0x3a, (byte) 0x25,  -    (byte) 0x4a, (byte) 0x3e, (byte) 0x07, (byte) 0xb0, (byte) 0x18, (byte) 0x26, (byte) 0x51, (byte) 0x39,  -    (byte) 0x46, (byte) 0xfa, (byte) 0xe2, (byte) 0xae, (byte) 0xe6, (byte) 0x1c, (byte) 0xd2, (byte) 0xcb,  -    (byte) 0x28, (byte) 0xa1, (byte) 0x8b, (byte) 0x56, (byte) 0xbb, (byte) 0xe9, (byte) 0x6c, (byte) 0xf7,  -    (byte) 0x0b, (byte) 0x84, (byte) 0xdd, (byte) 0x7f, (byte) 0x64, (byte) 0x8b, (byte) 0x43, (byte) 0x93,  -    (byte) 0x62, (byte) 0x39, (byte) 0xfb, (byte) 0x91, (byte) 0xfa, (byte) 0x3a, (byte) 0x57, (byte) 0x56,  -    (byte) 0x4a, (byte) 0xaa, (byte) 0x99, (byte) 0x1e, (byte) 0x9b, (byte) 0xcc, (byte) 0xa4, (byte) 0xc0,  -    (byte) 0x18, (byte) 0x46, (byte) 0xae, (byte) 0x15, (byte) 0x24, (byte) 0xf5, (byte) 0xf3, (byte) 0xe6,  -    (byte) 0x36, (byte) 0x55, (byte) 0x29, (byte) 0xa8, (byte) 0xa9, (byte) 0xaf, (byte) 0x7b, (byte) 0x44,  -    (byte) 0x19, (byte) 0xda, (byte) 0x66, (byte) 0x4d, (byte) 0x11, (byte) 0x89, (byte) 0x28, (byte) 0x34,  -    (byte) 0x01, (byte) 0x15, (byte) 0x24, (byte) 0x93, (byte) 0x43, (byte) 0x6a, (byte) 0x8f, (byte) 0xe4,  -    (byte) 0x54, (byte) 0x3a, (byte) 0x3d, (byte) 0x9b, (byte) 0x2f, (byte) 0xc3, (byte) 0xdb, (byte) 0x7e,  -    (byte) 0x5e, (byte) 0x12, (byte) 0x00, (byte) 0xaa, (byte) 0xe7, (byte) 0xc1, (byte) 0x82, (byte) 0x1c,  -    (byte) 0x1d, (byte) 0x1d, (byte) 0x23, (byte) 0x1d, (byte) 0xa3, (byte) 0xcc, (byte) 0x59, (byte) 0xe4,  -    (byte) 0x7a, (byte) 0xf0, (byte) 0x14, (byte) 0x17, (byte) 0xfb, (byte) 0x96, (byte) 0x90, (byte) 0xc1,  -    (byte) 0xc0, (byte) 0xde, (byte) 0xdb, (byte) 0x91, (byte) 0xfb, (byte) 0x49, (byte) 0x39, (byte) 0x70,  -    (byte) 0x76, (byte) 0x2f, (byte) 0x7b, (byte) 0x22, (byte) 0xcd, (byte) 0x35, (byte) 0xcb, (byte) 0xed,  -    (byte) 0x8f, (byte) 0xb3, (byte) 0x66, (byte) 0xae, (byte) 0x95, (byte) 0x49, (byte) 0x75 -  }; -   -  protected static final int KID_PIN_SS = 0x81; - -  protected byte[] EF_C_X509_CH_DS = new byte[2000]; -   -  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(SS_pin, KID_PIN_SS, 3, pinState)); -  } - -  @Override -  public byte[] getAID() { -    return AID_SichereSignatur; -  } - -  @Override -  public byte[] getFID() { -    return FID_SichereSignatur; -  } - -  @Override -  public byte[] getFCI() { -    return FCI; -  } - -  @Override -  public ResponseAPDU cmdPERFORM_SECURITY_OPERATION(CommandAPDU command, CardChannelEmul channel) throws CardException { -     -    checkINS(command, 0x2A); -   -    if (command.getP1() == 0x90 && command.getP2() == 0xA0) { -       -      // HASH -      byte[] data = command.getData(); -      if (data[0] == (byte) 0x90 && data[1] == (byte) 0x14) { -        hash = Arrays.copyOfRange(data, 2, data.length); -        return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); -      } else { -        throw new CardException("HASH command only supports complete hash."); -      } -       -    } else if (command.getP1() == 0x9E && command.getP2() == 0x9A) { -       -      // COMPUTE DIGITAL SIGNATURE -      if (securityEnv == null) { -        // No security environment -        return new ResponseAPDU(new byte[] {(byte) 0x6F, (byte) 0x05}); -      } -      if (hash == null) { -        // Command sequence not correct -        return new ResponseAPDU(new byte[] {(byte) 0x6F, (byte) 0x03}); -      } -      if (hash.length != 20) { -        // Invalid hash length -        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); -      } -      if (pins.get(KID_PIN_SS).state != PIN.STATE_PIN_VERIFIED) { -        // Security Status not satisfied -        return new ResponseAPDU(new byte[] {(byte) 0x69, (byte) 0x82}); -      } -       -      byte[] signature = new byte[48];  -       -      // TODO replace by signature creation -      Random random = new Random(); -      random.nextBytes(signature); -       -      byte[] response = new byte[signature.length + 2]; -      System.arraycopy(signature, 0, response, 0, signature.length); -      response[signature.length] = (byte) 0x90; -      response[signature.length + 1] = (byte) 0x00; -       -      hash = null; -      pins.get(KID_PIN_SS).state = PIN.STATE_RESET; -       -      return new ResponseAPDU(response); -       -    } else { -      return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x00}); -    } -     -  } -   -  public void clearCert() { -    Arrays.fill(EF_C_X509_CH_DS, (byte) 0x00); -  } - -  @Override -  public ResponseAPDU cmdMANAGE_SECURITY_ENVIRONMENT(CommandAPDU command, CardChannelEmul channel) throws CardException { - -    checkINS(command, 0x22); - -    switch (command.getP2()) { -    case 0xA4: -      switch (command.getP1()) { -      case 0x41: -        // INTERNAL AUTHENTICATE -      case 0x81: -        // EXTERNAL AUTHENTICATE -      } -    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}); -        } else { -          return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); -        } -      } -      case 0x81: -        // PSO - VERIFY DGITAL SIGNATURE -      } -    case 0xB8: -      switch (command.getP1()) { -      case 0x41: -        // PSO � DECIPHER -      case 0x81: -        // PSO � ENCIPHER -      } -    default: -      return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x81}); -    } -   -  } - -  /** -   * 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 f37f12dd..7eecd7fc 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,43 +16,34 @@  */  package at.gv.egiz.smcc.starcos; +import java.util.ArrayList;  import java.util.Arrays;  import java.util.HashMap; +import java.util.List; -import javax.smartcardio.Card;  import javax.smartcardio.CardException;  import javax.smartcardio.CommandAPDU;  import javax.smartcardio.ResponseAPDU;  import at.gv.egiz.smcc.AbstractAppl;  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 {    public static final int KID_PIN_Glob = 0x01; -  /** -   *  -   */ -  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, byte[] Glob_PIN, int PIN_STATE) { -    this.cardEmul = cardEmul; -    globalPins.put(KID_PIN_Glob, new PIN(Glob_PIN, KID_PIN_Glob, 10, PIN_STATE)); - } +  protected List<File> globalFiles = new ArrayList<File>(); +   +  protected HashMap<Integer, PIN> globalPins = new HashMap<Integer, PIN>(); -  @Override -  public Card getCard() { -    return cardEmul; +  public void setGlobalFiles(List<File> globalFiles) { +    this.globalFiles = globalFiles; +  } +   +  public void setGlobalPins(HashMap<Integer, PIN> globalPins) { +    this.globalPins = globalPins;    }    protected ResponseAPDU cmdSELECT(CommandAPDU command) throws CardException { @@ -122,7 +113,7 @@ public class STARCOSCardChannelEmul extends CardChannelEmul {          }          currentAppl = appl; -        byte[] fci = currentAppl.getFCI(); +        byte[] fci = currentAppl.getFCX();          byte[] response = new byte[fci.length + 2];          System.arraycopy(fci, 0, response, 0, fci.length);          response[fci.length] = (byte) 0x90; 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 deleted file mode 100644 index 5963fb63..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardEmul.java +++ /dev/null @@ -1,54 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc.starcos; - - -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() { -    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, -            STARCOSApplGewoehnlicheSignatur.DST)); -  } - -  @Override -  public ATR getATR() { -    return ATR; -  } -}
\ 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 deleted file mode 100644 index 82e48d64..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSCardTest.java +++ /dev/null @@ -1,346 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc.starcos; - -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.security.NoSuchAlgorithmException; -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.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.PinInfo; -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 at.gv.egiz.smcc.SignatureCard.KeyboxName; -import org.junit.Ignore; - -public class STARCOSCardTest extends CardTest { - -  @Override -  protected SignatureCard createSignatureCard() -      throws CardNotSupportedException { -    SignatureCardFactory factory = SignatureCardFactory.getInstance(); -    STARCOSCardEmul card = new STARCOSCardEmul(); -    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(); -    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 { - -    char[] pin = "0000".toCharArray(); -     -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    STARCOSApplInfobox appl = (STARCOSApplInfobox) card.getApplication(STARCOSAppl.AID_Infobox); -    appl.clearInfobox(); - -    byte[] idlink = signatureCard.getInfobox("IdentityLink", -        new SMCCTestPINProvider(pin), null); -    assertNull(idlink); - -  } - -  @Test(expected = SignatureCardException.class) -  public void testGetInfoboxIdentityInvalid() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    char[] pin = "0000".toCharArray(); -     -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    STARCOSApplInfobox appl = (STARCOSApplInfobox) card.getApplication(STARCOSAppl.AID_Infobox); -    appl.setInfoboxHeader((byte) 0xFF); - -    signatureCard.getInfobox("IdentityLink", new SMCCTestPINProvider(pin), null); - -  } - -  @Test -  public void testGetCerts() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    SignatureCard signatureCard = createSignatureCard(); - -    byte[] cert; - -    cert = signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); -    assertNotNull(cert); -    assertTrue(Arrays.equals(cert, STARCOSApplSichereSignatur.C_X509_CH_DS)); - -    cert = signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); -    assertNotNull(cert); -    assertTrue(Arrays.equals(cert, STARCOSApplGewoehnlicheSignatur.C_X509_CH_AUT)); - -  } - -  @Test(expected = NotActivatedException.class) -  public void testGetDSCertEmpty() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    STARCOSApplSichereSignatur appl = (STARCOSApplSichereSignatur) card.getApplication(STARCOSApplSichereSignatur.AID_SichereSignatur); -    appl.clearCert(); - -    signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); - -  } - -  @Test(expected = NotActivatedException.class) -  public void testGetAUTCertEmpty() throws SignatureCardException, -      InterruptedException, CardNotSupportedException { - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    STARCOSApplGewoehnlicheSignatur appl = (STARCOSApplGewoehnlicheSignatur) card.getApplication(STARCOSApplGewoehnlicheSignatur.AID_GewoehnlicheSignatur); -    appl.clearCert(); - -    signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); - -  } - -  @Test -  public void testSignSichereSignatur() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    char[] pin = "123456".toCharArray(); - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    STARCOSApplSichereSignatur appl = (STARCOSApplSichereSignatur) card.getApplication(STARCOSApplSichereSignatur.AID_SichereSignatur); -    appl.setPin(STARCOSApplSichereSignatur.KID_PIN_SS, pin); - -    byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), -        KeyboxName.SECURE_SIGNATURE_KEYPAIR, new SMCCTestPINProvider(pin), null); - -    assertNotNull(signature); - -  } - -  @Test -  public void testSignGewoehnlicheSignatur() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    char[] pin = "1234".toCharArray(); - -    SignatureCard signatureCard = createSignatureCard(); -    CardEmul card = (CardEmul) signatureCard.getCard(); -    STARCOSCardChannelEmul channel = (STARCOSCardChannelEmul) card.getBasicChannel(); -    channel.setPin(STARCOSCardChannelEmul.KID_PIN_Glob, pin); - -    byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), -        KeyboxName.CERITIFIED_KEYPAIR, new SMCCTestPINProvider(pin), null); - -    assertNotNull(signature); - -  } - -  @Test(expected = LockedException.class) -  public void testSignSichereSignaturInvalidPin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    SignatureCard signatureCard = createSignatureCard(); - -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("000000".toCharArray()); - -    signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, -        pinProvider, null); - -  } - -  @Test(expected = LockedException.class) -  public void testSignGewoehnlicheSignaturInvalidPin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    SignatureCard signatureCard = createSignatureCard(); - -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("1234".toCharArray()); - -    signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), KeyboxName.CERITIFIED_KEYPAIR, -        pinProvider, null); - -  } - -  @Test(expected = LockedException.class) -  public void testSignSichereSignaturBlockedPin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    SignatureCard signatureCard = createSignatureCard(null, null, PIN.STATE_PIN_BLOCKED); - -    SMCCTestPINProvider pinProvider = new SMCCTestPINProvider("000000".toCharArray()); -    assertTrue(pinProvider.getProvided() <= 0); - -    signatureCard.createSignature(new ByteArrayInputStream("MOCCA" -        .getBytes("ASCII")), KeyboxName.SECURE_SIGNATURE_KEYPAIR, -        pinProvider, null); - -  } - -  @Test(expected = LockedException.class) -  public void testSignGewoehnlicheSignaturBlockedPin() throws SignatureCardException, -      InterruptedException, CardNotSupportedException, -      NoSuchAlgorithmException, IOException { - -    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 { - -    // 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 (PinInfo pinInfo : signatureCard.getPinInfos()) { - -      char[] pin = "123456".toCharArray(); - -      for (int i = pinInfo.getMinLength(); i <= pinInfo.getMaxLength(); i++) { -        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); -        char[] newPin = new char[i]; -        Arrays.fill(newPin, '0'); -        signatureCard -            .changePIN(pinInfo, new ChangePINProvider(pin, newPin)); -        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(newPin)); -        pin = newPin; -      } -    } -  } - -  @Test -  @Override -  public void testActivatePin() throws CardNotSupportedException, -      LockedException, NotActivatedException, CancelledException, -      PINFormatException, SignatureCardException, InterruptedException { - -    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard( -            null, null, PIN.STATE_PIN_NOTACTIVE); - -    for (PinInfo pinInfo : signatureCard.getPinInfos()) { - -      char[] pin = "1234567890".substring(0, pinInfo.getMinLength()).toCharArray(); - -      boolean notActive = false; -      try { -        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); -      } catch (NotActivatedException ex) { -        notActive = true; -      } -      assertTrue(notActive); - -      signatureCard.activatePIN(pinInfo, new ChangePINProvider(null, pin)); -      signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); -    } -  } - -  @Test -  public void testVerifyInvalidPin() throws CardNotSupportedException, -      LockedException, NotActivatedException, CancelledException, -      PINFormatException, SignatureCardException, InterruptedException { - -    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard(); - -    for (PinInfo pinInfo : signatureCard.getPinInfos()) { - -      char[] invalidPin = "999999".toCharArray(); -      int numInvalidTries = 2; -      InvalidPINProvider invalidPinProvider = new InvalidPINProvider(invalidPin, numInvalidTries); -      try { -        signatureCard.verifyPIN(pinInfo, invalidPinProvider); -      } catch (CancelledException ex) { -      } finally { -        assertTrue(invalidPinProvider.getProvided() == numInvalidTries); -      } -    } -  } - -  @Test -  public void testChangeInvalidPin() throws CardNotSupportedException, -      LockedException, NotActivatedException, CancelledException, -      PINFormatException, SignatureCardException, InterruptedException { - -    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) createSignatureCard(); -     -    for (PinInfo pinInfo : signatureCard.getPinInfos()) { - -      char[] invalidPin = "999999".toCharArray(); -      int numInvalidTries = 2; -      InvalidChangePINProvider invalidPinProvider = -              new InvalidChangePINProvider(invalidPin, invalidPin, numInvalidTries); - -      try { -        signatureCard.changePIN(pinInfo, invalidPinProvider); -      } catch (CancelledException ex) { -      } finally { -        assertTrue(invalidPinProvider.getProvided() == numInvalidTries); -      } -    } -  } -} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG2ApplSichereSignatur.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG2ApplSichereSignatur.java new file mode 100644 index 00000000..4e04baea --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG2ApplSichereSignatur.java @@ -0,0 +1,168 @@ +/* +* 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 java.util.Arrays; +import java.util.Random; + +import javax.smartcardio.CardException; +import javax.smartcardio.CommandAPDU; +import javax.smartcardio.ResponseAPDU; + +import at.gv.egiz.smcc.CardChannelEmul; +import at.gv.egiz.smcc.PIN; + +public class STARCOSG2ApplSichereSignatur extends STARCOSAppl { + +  protected static final int KID_PIN_SS = 0x81; + +  protected 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 void setDst(byte[] dst) { +    this.dst = dst; +  } + +  @Override +  public ResponseAPDU cmdPERFORM_SECURITY_OPERATION(CommandAPDU command, CardChannelEmul channel) throws CardException { +     +    checkINS(command, 0x2A); +   +    if (command.getP1() == 0x90 && command.getP2() == 0xA0) { +       +      // HASH +      byte[] data = command.getData(); +      if (data[0] == (byte) 0x90 && data[1] == (byte) 0x14) { +        hash = Arrays.copyOfRange(data, 2, data.length); +        return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); +      } else { +        throw new CardException("HASH command only supports complete hash."); +      } +       +    } else if (command.getP1() == 0x9E && command.getP2() == 0x9A) { +       +      // COMPUTE DIGITAL SIGNATURE +      if (securityEnv == null) { +        // No security environment +        return new ResponseAPDU(new byte[] {(byte) 0x6F, (byte) 0x05}); +      } +      if (hash == null) { +        // Command sequence not correct +        return new ResponseAPDU(new byte[] {(byte) 0x6F, (byte) 0x03}); +      } +      if (hash.length != 20) { +        // Invalid hash length +        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); +      } +      if (pins.get(KID_PIN_SS).state != PIN.STATE_PIN_VERIFIED) { +        // Security Status not satisfied +        return new ResponseAPDU(new byte[] {(byte) 0x69, (byte) 0x82}); +      } +       +      byte[] signature = new byte[48];  +       +      // TODO replace by signature creation +      Random random = new Random(); +      random.nextBytes(signature); +       +      byte[] response = new byte[signature.length + 2]; +      System.arraycopy(signature, 0, response, 0, signature.length); +      response[signature.length] = (byte) 0x90; +      response[signature.length + 1] = (byte) 0x00; +       +      hash = null; +      pins.get(KID_PIN_SS).state = PIN.STATE_RESET; +       +      return new ResponseAPDU(response); +       +    } else { +      return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x00}); +    } +     +  } +   +  @Override +  public ResponseAPDU cmdMANAGE_SECURITY_ENVIRONMENT(CommandAPDU command, CardChannelEmul channel) throws CardException { + +    checkINS(command, 0x22); + +    switch (command.getP2()) { +    case 0xA4: +      switch (command.getP1()) { +      case 0x41: +        // INTERNAL AUTHENTICATE +      case 0x81: +        // EXTERNAL AUTHENTICATE +      } +    case 0xB6: +      switch (command.getP1()) { +      case 0x41: { +        // PSO - COMPUTE DIGITAL SIGNATURE +        if (Arrays.equals(dst, command.getData())) { +          securityEnv = command.getData(); +          return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); +        } else { +          return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); +        } +      } +      case 0x81: +        // PSO - VERIFY DGITAL SIGNATURE +      } +    case 0xB8: +      switch (command.getP1()) { +      case 0x41: +        // PSO - DECIPHER +      case 0x81: +        // PSO - ENCIPHER +      } +    default: +      return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x81}); +    } +   +  } + +  /** +   * 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/STARCOSG3ApplSichereSignatur.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3ApplSichereSignatur.java new file mode 100644 index 00000000..0f474a36 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3ApplSichereSignatur.java @@ -0,0 +1,189 @@ +/* +* 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 java.util.Arrays; +import java.util.Random; + +import javax.smartcardio.CardException; +import javax.smartcardio.CommandAPDU; +import javax.smartcardio.ResponseAPDU; + +import at.gv.egiz.smcc.CardChannelEmul; +import at.gv.egiz.smcc.PIN; + +public class STARCOSG3ApplSichereSignatur extends STARCOSAppl { + +  protected static final int KID_PIN_SS = 0x81; + +  protected byte[] dst = { (byte) 0x84, (byte) 0x03, (byte) 0x80, (byte) 0x02, +      (byte) 0x00, (byte) 0x80, (byte) 0x01, (byte) 0x04 }; +   +  protected byte[] ht = { (byte) 0x80, (byte) 0x01, (byte) 0x10 }; +   +  public void setHt1(byte[] ht) { +    this.ht = ht; +  } + +  public void setDst1(byte[] dst) { +    this.dst = dst; +  } + +  @Override +  public ResponseAPDU cmdPERFORM_SECURITY_OPERATION(CommandAPDU command, CardChannelEmul channel) throws CardException { +     +    checkINS(command, 0x2A); +   +    if (command.getP1() == 0x90 && command.getP2() == 0xA0) { +       +      // HASH +      byte[] data = command.getData(); +      if (data[0] == (byte) 0x90 && data[1] == (byte) 0x14) { +        hash = Arrays.copyOfRange(data, 2, data.length); +        return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); +      } else { +        throw new CardException("HASH command only supports complete hash."); +      } +       +    } else if (command.getP1() == 0x9E && command.getP2() == 0x9A) { +       +      // COMPUTE DIGITAL SIGNATURE +      if (securityEnv == null) { +        // No security environment +        return new ResponseAPDU(new byte[] {(byte) 0x6F, (byte) 0x05}); +      } +       +      if (command.getData() != null) { +        hash = command.getData(); +      } +       +      if (hash == null) { +        // Command sequence not correct +        return new ResponseAPDU(new byte[] {(byte) 0x6F, (byte) 0x03}); +      } +      if (hash.length != 20) { +        // Invalid hash length +        return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); +      } +      if (pins.get(KID_PIN_SS).state != PIN.STATE_PIN_VERIFIED) { +        // Security Status not satisfied +        return new ResponseAPDU(new byte[] {(byte) 0x69, (byte) 0x82}); +      } +       +      byte[] signature = new byte[48];  +       +      // TODO replace by signature creation +      Random random = new Random(); +      random.nextBytes(signature); +       +      byte[] response = new byte[signature.length + 2]; +      System.arraycopy(signature, 0, response, 0, signature.length); +      response[signature.length] = (byte) 0x90; +      response[signature.length + 1] = (byte) 0x00; +       +      hash = null; +      pins.get(KID_PIN_SS).state = PIN.STATE_RESET; +       +      return new ResponseAPDU(response); +       +    } else { +      return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x00}); +    } +     +  } +   +  @Override +  public ResponseAPDU cmdMANAGE_SECURITY_ENVIRONMENT(CommandAPDU command, CardChannelEmul channel) throws CardException { + +    checkINS(command, 0x22); + +    switch (command.getP2()) { +    case 0xA4: +      switch (command.getP1()) { +      case 0x41: +        // INTERNAL AUTHENTICATE +      case 0x81: +        // EXTERNAL AUTHENTICATE +      } +    case 0xAA: +      switch (command.getP1()) { +      case 0x41: +        // SET HT +        if (Arrays.equals(ht, command.getData())) { +          return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); +        } else { +          return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); +        } +      } +    case 0xB6: +      switch (command.getP1()) { +      case 0x41: { +        // PSO - COMPUTE DIGITAL SIGNATURE +        if (Arrays.equals(dst, command.getData())) { +          securityEnv = command.getData(); +          return new ResponseAPDU(new byte[] {(byte) 0x90, (byte) 0x00}); +        } else { +          return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x80}); +        } +      } +      case 0x81: +        // PSO - VERIFY DGITAL SIGNATURE +      } +    case 0xB8: +      switch (command.getP1()) { +      case 0x41: +        // PSO - DECIPHER +      case 0x81: +        // PSO - ENCIPHER +      } +    default: +      return new ResponseAPDU(new byte[] {(byte) 0x6A, (byte) 0x81}); +    } +   +  } + +  /** +   * 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/STARCOSG3CardChannelEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardChannelEmul.java deleted file mode 100644 index dc6836ae..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardChannelEmul.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2008 Federal Chancellery Austria and - * Graz University of Technology - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *     http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package at.gv.egiz.smcc.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 deleted file mode 100644 index 7583b3ad..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardEmul.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2008 Federal Chancellery Austria and - * Graz University of Technology - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *     http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package at.gv.egiz.smcc.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 deleted file mode 100644 index 1d8507b2..00000000 --- a/smcc/src/test/java/at/gv/egiz/smcc/starcos/STARCOSG3CardTest.java +++ /dev/null @@ -1,117 +0,0 @@ -/* -* Copyright 2008 Federal Chancellery Austria and -* Graz University of Technology -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -*     http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -package at.gv.egiz.smcc.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.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.PinInfo; -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; - -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 (PinInfo pinInfo : signatureCard.getPinInfos()) { - -      char[] pin = "123456".toCharArray(); - -      for (int i = pinInfo.getMinLength(); i <= pinInfo.getMaxLength(); i++) { -        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); -        char[] newPin = new char[i]; -        Arrays.fill(newPin, '0'); -        signatureCard -            .changePIN(pinInfo, new ChangePINProvider(pin, newPin)); -        signatureCard.verifyPIN(pinInfo, 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 (PinInfo pinInfo : signatureCard.getPinInfos()) { - -      char[] pin = "123456789".substring(0, pinInfo.getMinLength()).toCharArray(); -      char[] transportPIN = "123456".toCharArray(); - -      boolean notActive = false; -      try { -        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); -      } catch (NotActivatedException ex) { -        notActive = true; -      } -      assertTrue(notActive); - -      signatureCard.activatePIN(pinInfo, new ChangePINProvider(transportPIN, pin)); -      signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); -    } -  } - -   -} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractCardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractCardTest.java new file mode 100644 index 00000000..ca3efa38 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractCardTest.java @@ -0,0 +1,228 @@ +/* +* Copyright 2009 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.test; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; + +import org.junit.Test; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.CardNotSupportedException; +import at.gv.egiz.smcc.LockedException; +import at.gv.egiz.smcc.PINMgmtSignatureCard; +import at.gv.egiz.smcc.PinInfo; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.SignatureCard.KeyboxName; +import at.gv.egiz.smcc.pin.gui.CancelPINProvider; +import at.gv.egiz.smcc.pin.gui.DummyPINGUI; +import at.gv.egiz.smcc.pin.gui.InterruptPINProvider; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; + +public abstract class AbstractCardTest extends AbstractCardTestBase { +   +  @Test +  public void testGetCertificates() throws SignatureCardException, InterruptedException { +     +    byte[] certificateSSRef = (byte[]) applicationContext.getBean("certificateSS", byte[].class); +     +    byte[] certificateSS = signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); +     +    assertArrayEquals(certificateSSRef, certificateSS); +     +    byte[] certificateGSRef = (byte[]) applicationContext.getBean("certificateGS", byte[].class); +     +    byte[] certificateGS = signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); +     +    assertArrayEquals(certificateGSRef, certificateGS); +     +  } +   +  @Test +  public void testSignSIG() throws UnsupportedEncodingException, SignatureCardException, InterruptedException, IOException { +     +    char[] pin = "123456".toCharArray(); + +    byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA" +        .getBytes("ASCII")), +        KeyboxName.SECURE_SIGNATURE_KEYPAIR, new SMCCTestPINProvider(pin), null); + +    assertNotNull(signature); +     +  } + +  @Test(expected = LockedException.class) +  public void testSignSIGWrongPIN() throws UnsupportedEncodingException, SignatureCardException, InterruptedException, IOException { +     +    char[] pin = "00000".toCharArray(); + +    byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA" +        .getBytes("ASCII")), +        KeyboxName.SECURE_SIGNATURE_KEYPAIR, new SMCCTestPINProvider(pin), null); + +    assertNotNull(signature); +     +  } +   +  @Test(expected = CancelledException.class) +  public void testSignSIGCancel() throws SignatureCardException, +      InterruptedException, CardNotSupportedException, +      NoSuchAlgorithmException, IOException { + +    PINGUI pinProvider = new CancelPINProvider(); + +    signatureCard.createSignature(new ByteArrayInputStream(MOCCA), +        KeyboxName.SECURE_SIGNATURE_KEYPAIR, pinProvider, null); + +  } + +  @Test +  public void testSignDEC() throws UnsupportedEncodingException, SignatureCardException, InterruptedException, IOException { +     +    char[] pin = "1234".toCharArray(); + +    byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA" +        .getBytes("ASCII")), +        KeyboxName.CERITIFIED_KEYPAIR, new SMCCTestPINProvider(pin), null); + +    assertNotNull(signature); +     +  } +   +  @Test(expected = LockedException.class) +  public void testSignDECWrongPIN() throws UnsupportedEncodingException, SignatureCardException, InterruptedException, IOException { +     +    char[] pin = "00000".toCharArray(); + +    byte[] signature = signatureCard.createSignature(new ByteArrayInputStream("MOCCA" +        .getBytes("ASCII")), +        KeyboxName.CERITIFIED_KEYPAIR, new SMCCTestPINProvider(pin), null); + +    assertNotNull(signature); +     +  } +   +  @Test(expected = CancelledException.class) +  public void testSignDECCancel() throws SignatureCardException, +      InterruptedException, CardNotSupportedException, +      NoSuchAlgorithmException, IOException { + +    PINGUI pinProvider = new CancelPINProvider(); + +    signatureCard.createSignature(new ByteArrayInputStream(MOCCA), +        KeyboxName.CERITIFIED_KEYPAIR, pinProvider, null); + +  } +   +  @Test(expected = InterruptedException.class) +  public void testSignSIGInterrrupted() throws SignatureCardException, +      InterruptedException, CardNotSupportedException, +      NoSuchAlgorithmException, IOException { + +    PINGUI pinProvider = new InterruptPINProvider(); + +    signatureCard.createSignature(new ByteArrayInputStream(MOCCA), +        KeyboxName.SECURE_SIGNATURE_KEYPAIR, pinProvider, null); + +  } + +  @Test(expected = InterruptedException.class) +  public void testSignDECInterrrupted() throws SignatureCardException, +      InterruptedException, CardNotSupportedException, +      NoSuchAlgorithmException, IOException { + +    PINGUI pinProvider = new InterruptPINProvider(); + +    signatureCard.createSignature(new ByteArrayInputStream(MOCCA), +        KeyboxName.CERITIFIED_KEYPAIR, pinProvider, null); + +  } +   +  @Test(expected = CancelledException.class) +  public void testSignSIGConcurrent() throws SignatureCardException, +      InterruptedException, CardNotSupportedException, +      NoSuchAlgorithmException, IOException { + +    PINGUI pinProvider = new DummyPINGUI() { +      @Override +      public char[] providePIN(PinInfo spec, int retries) +          throws CancelledException, InterruptedException { + +        try { +          signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); +          assertTrue(false); +          return null; +        } catch (SignatureCardException e) { +          // expected +          throw new CancelledException(); +        } + +      } +    }; + +    signatureCard.createSignature(new ByteArrayInputStream(MOCCA), +        KeyboxName.SECURE_SIGNATURE_KEYPAIR, pinProvider, null); + +  } + +  @Test(expected = CancelledException.class) +  public void testSignDECConcurrent() throws SignatureCardException, +      InterruptedException, CardNotSupportedException, +      NoSuchAlgorithmException, IOException { + +    PINGUI pinProvider = new DummyPINGUI() { +      @Override +      public char[] providePIN(PinInfo spec, int retries) +          throws CancelledException, InterruptedException { + +        try { +          signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); +          assertTrue(false); +          return null; +        } catch (SignatureCardException e) { +          // expected +          throw new CancelledException(); +        } +      } +    }; + +    signatureCard.createSignature(new ByteArrayInputStream(MOCCA), +        KeyboxName.CERITIFIED_KEYPAIR, pinProvider, null); + +  } +   +  @Test +  public void testGetPinSpecs() throws CardNotSupportedException, +      SignatureCardException { + +    assertTrue(signatureCard instanceof PINMgmtSignatureCard); + +    PinInfo[] specs = ((PINMgmtSignatureCard) signatureCard).getPinInfos(); +    assertNotNull(specs); +    assertTrue(specs.length > 0); + +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractCardTestBase.java b/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractCardTestBase.java new file mode 100644 index 00000000..f809ca71 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractCardTestBase.java @@ -0,0 +1,62 @@ +/* +* Copyright 2009 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.test; + +import static org.junit.Assert.assertNotNull; +import iaik.security.provider.IAIK; + +import javax.smartcardio.Card; + +import org.junit.Before; +import org.junit.BeforeClass; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import at.gv.egiz.smcc.CardNotSupportedException; +import at.gv.egiz.smcc.CardTerminalEmul; +import at.gv.egiz.smcc.SignatureCard; +import at.gv.egiz.smcc.SignatureCardFactory; + +public abstract class AbstractCardTestBase { +   +  public static byte[] MOCCA = { 'M', 'O', 'C', 'C', 'A' }; + +  protected ApplicationContext applicationContext; +   +  protected Card card; +   +  protected SignatureCard signatureCard; +   +  @BeforeClass +  public static void setupClass() { +    IAIK.addAsJDK14Provider(); +  } +   +  @Before +  public void setup() throws CardNotSupportedException { +    applicationContext = new ClassPathXmlApplicationContext(getClass().getSimpleName() + ".xml", getClass()); + +    card = (Card) applicationContext.getBean("card", Card.class); +    assertNotNull(card); + +    SignatureCardFactory factory = SignatureCardFactory.getInstance(); +    signatureCard = factory.createSignatureCard(card, new CardTerminalEmul(card)); +    assertNotNull(signatureCard); +  } +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractInvalidCardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractInvalidCardTest.java new file mode 100644 index 00000000..7b9f9f83 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractInvalidCardTest.java @@ -0,0 +1,66 @@ +/* +* Copyright 2009 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.test; + +import static org.junit.Assert.assertNull; +import static org.junit.Assert.fail; + +import org.junit.Test; + +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.SignatureCard.KeyboxName; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; + +public abstract class AbstractInvalidCardTest extends AbstractCardTestBase { + +  @Test +  public void testGetCertificates() throws SignatureCardException, InterruptedException { +     +    try { +      signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); +      fail(); +    } catch (SignatureCardException e) { +      // expected +    } catch (Exception e) { +      fail(); +    } +     +    try { +      signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); +      fail(); +    } catch (SignatureCardException e) { +      // expected +    } catch (Exception e) { +      fail(); +    } +     +  } + +  @Test(expected = SignatureCardException.class) +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    PINGUI pinProvider = new SMCCTestPINProvider("0000".toCharArray()); +     +    byte[] idlink = signatureCard.getInfobox("IdentityLink", pinProvider, null); +     +    assertNull(idlink); +     +  } +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractNotActivatedCardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractNotActivatedCardTest.java new file mode 100644 index 00000000..9736531f --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/AbstractNotActivatedCardTest.java @@ -0,0 +1,69 @@ +/* +* Copyright 2009 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.test; + +import static org.junit.Assert.fail; + +import org.junit.Test; + +import at.gv.egiz.smcc.NotActivatedException; +import at.gv.egiz.smcc.PINMgmtSignatureCard; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.SignatureCard.KeyboxName; + +public abstract class AbstractNotActivatedCardTest extends AbstractCardTestBase { + +  @Test(expected = NotActivatedException.class) +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    signatureCard.getInfobox("IdentityLink", null, null); +     +  } +   +  @Test +  public void testGetCertificates() throws SignatureCardException, InterruptedException { +     +    try { +      signatureCard.getCertificate(KeyboxName.SECURE_SIGNATURE_KEYPAIR); +      fail(); +    } catch (NotActivatedException e) { +      // expected +    } catch (Exception e) { +      fail(); +    } + +    try { +      signatureCard.getCertificate(KeyboxName.CERITIFIED_KEYPAIR); +      fail(); +    } catch (NotActivatedException e) { +      // expected +    } catch (Exception e) { +      fail(); +    } +     +  } + +  @Test (expected = NotActivatedException.class) +  public void getPINInfos() throws SignatureCardException { + +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; +    signatureCard.getPinInfos(); + +  } +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA03Test.java b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA03Test.java new file mode 100644 index 00000000..ccb46b4b --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA03Test.java @@ -0,0 +1,87 @@ +/* + * Copyright 2009 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.test.acos; + +import static org.junit.Assert.assertArrayEquals; + +import java.util.Arrays; + +import org.junit.Test; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.CardNotSupportedException; +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.PinInfo; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.pin.gui.ChangePINProvider; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; + + +public class ACOSA03Test extends ACOSTest { + +  @Test +  public void testChangePins() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    byte[] referenceData = { (byte) 0x31, (byte) 0x32, (byte) 0x33, +        (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x00, (byte) 0x00 }; +     +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; +    PIN signaturPIN = (PIN) applicationContext.getBean("signaturPIN"); +    signaturPIN.setPin(referenceData); +    PIN infoboxPIN = (PIN) applicationContext.getBean("infoboxPIN"); +    infoboxPIN.setPin(referenceData); +    PIN geheimhaltungsPIN = (PIN) applicationContext.getBean("geheimhaltungsPIN"); +    geheimhaltungsPIN.setPin(referenceData); +     +    for (PinInfo pinInfo : signatureCard.getPinInfos()) { + +      char[] pin = "123456".toCharArray(); + +      for (int i = pinInfo.getMinLength(); i <= pinInfo.getMaxLength(); i++) { +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); +        char[] newPin = new char[i]; +        Arrays.fill(newPin, '0'); +        signatureCard +            .changePIN(pinInfo, new ChangePINProvider(pin, newPin)); +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(newPin)); +        pin = newPin; +      } +    } +  } +   +  @Test +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    PINGUI pinProvider = new SMCCTestPINProvider("0000".toCharArray()); +     +    byte[] idlinkRef = (byte[]) applicationContext.getBean("identityLink", byte[].class); + +    byte[] idlink = signatureCard.getInfobox("IdentityLink", pinProvider, null); +     +    assertArrayEquals(idlinkRef, idlink); +     +  } +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04InfoboxContainerEncryptedTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04InfoboxContainerEncryptedTest.java new file mode 100644 index 00000000..d22c45a0 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04InfoboxContainerEncryptedTest.java @@ -0,0 +1,44 @@ +/* +* Copyright 2009 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.test.acos; + +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; + +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; +import at.gv.egiz.smcc.test.AbstractCardTestBase; + +public class ACOSA04InfoboxContainerEncryptedTest extends AbstractCardTestBase { + +  @Test +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    PINGUI pinProvider = new SMCCTestPINProvider("1234".toCharArray()); +     +    byte[] idlinkRef = (byte[]) applicationContext.getBean("identityLink", byte[].class); + +    byte[] idlink = signatureCard.getInfobox("IdentityLink", pinProvider, null); +     +    assertArrayEquals(idlinkRef, idlink); +     +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardTestSuite.java b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04InvalidTest.java index 101f7edc..9696cb7d 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/ACOSCardTestSuite.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04InvalidTest.java @@ -1,5 +1,5 @@  /* -* Copyright 2008 Federal Chancellery Austria and +* Copyright 2009 Federal Chancellery Austria and  * Graz University of Technology  *  * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,14 +14,11 @@  * See the License for the specific language governing permissions and  * limitations under the License.  */ -package at.gv.egiz.smcc.acos; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; +package at.gv.egiz.smcc.test.acos; -@RunWith(Suite.class) -@SuiteClasses( { A03CardTest.class, A04CardTest.class }) -public class ACOSCardTestSuite { +import at.gv.egiz.smcc.test.AbstractInvalidCardTest; + +public class ACOSA04InvalidTest extends AbstractInvalidCardTest {  } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04NotActivatedTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04NotActivatedTest.java new file mode 100644 index 00000000..56ce476c --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04NotActivatedTest.java @@ -0,0 +1,24 @@ +/* + * Copyright 2009 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.test.acos; + +import at.gv.egiz.smcc.test.AbstractNotActivatedCardTest; + +public class ACOSA04NotActivatedTest extends AbstractNotActivatedCardTest { + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04Test.java b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04Test.java new file mode 100644 index 00000000..a5645da6 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSA04Test.java @@ -0,0 +1,85 @@ +/* + * Copyright 2009 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.test.acos; + +import static org.junit.Assert.assertArrayEquals; + +import java.util.Arrays; + +import org.junit.Test; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.CardNotSupportedException; +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.PinInfo; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.pin.gui.ChangePINProvider; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; + + +public class ACOSA04Test extends ACOSTest { + +  @Test +  public void testChangePins() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    byte[] referenceData = { (byte) 0x31, (byte) 0x32, (byte) 0x33, +        (byte) 0x34, (byte) 0x35, (byte) 0x36, (byte) 0x00, (byte) 0x00 }; +     +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; +    PIN signaturPIN = (PIN) applicationContext.getBean("signaturPIN"); +    signaturPIN.setPin(referenceData); +    PIN infoboxPIN = (PIN) applicationContext.getBean("geheimhaltungsPIN"); +    infoboxPIN.setPin(referenceData); +     +    for (PinInfo pinInfo : signatureCard.getPinInfos()) { + +      char[] pin = "123456".toCharArray(); + +      for (int i = pinInfo.getMinLength(); i <= pinInfo.getMaxLength(); i++) { +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); +        char[] newPin = new char[i]; +        Arrays.fill(newPin, '0'); +        signatureCard +            .changePIN(pinInfo, new ChangePINProvider(pin, newPin)); +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(newPin)); +        pin = newPin; +      } +    } +  } +   +  @Test +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    PINGUI pinProvider = new SMCCTestPINProvider("0000".toCharArray()); +     +    byte[] idlinkRef = (byte[]) applicationContext.getBean("identityLink", byte[].class); + +    byte[] idlink = signatureCard.getInfobox("IdentityLink", pinProvider, null); +     +    assertArrayEquals(idlinkRef, idlink); +     +  } +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSTest.java index 7394bae7..d8d07393 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A03CardEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/acos/ACOSTest.java @@ -1,5 +1,5 @@  /* -* Copyright 2008 Federal Chancellery Austria and +* Copyright 2009 Federal Chancellery Austria and  * Graz University of Technology  *  * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,18 +14,17 @@  * See the License for the specific language governing permissions and  * limitations under the License.  */ -package at.gv.egiz.smcc.acos; -import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.CardEmul; +package at.gv.egiz.smcc.test.acos; +import org.junit.Test; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.test.AbstractCardTest; -public class A03CardEmul extends ACOSCardEmul { +public abstract class ACOSTest extends AbstractCardTest { -  public A03CardEmul(A03ApplSIG applSIG, A03ApplDEC applDEC) { -    channel = new A03CardChannelEmul(this); -    applications.add(applSIG); -    applications.add(applDEC); -  } +  @Test +  public abstract void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException; +    } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG2Test.java b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG2Test.java new file mode 100644 index 00000000..904c8c06 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG2Test.java @@ -0,0 +1,85 @@ +/* + * Copyright 2009 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.test.ecard; + +import static org.junit.Assert.assertArrayEquals; + +import java.util.Arrays; + +import org.junit.Test; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.CardNotSupportedException; +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.PinInfo; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.pin.gui.ChangePINProvider; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; + + +public class ECardG2Test extends ECardTest { + +  @Test +  public void testChangeCardPin() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    byte[] referenceData = { (byte) 0x26, (byte) 0x12, (byte) 0x34, +        (byte) 0x56, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff }; +     +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; +    PIN signaturPIN = (PIN) applicationContext.getBean("signaturPIN"); +    signaturPIN.setPin(referenceData); +    PIN kartenPIN = (PIN) applicationContext.getBean("kartenPIN"); +    kartenPIN.setPin(referenceData); +     +    for (PinInfo pinInfo : signatureCard.getPinInfos()) { + +      char[] pin = "123456".toCharArray(); + +      for (int i = pinInfo.getMinLength(); i <= pinInfo.getMaxLength(); i++) { +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); +        char[] newPin = new char[i]; +        Arrays.fill(newPin, '0'); +        signatureCard +            .changePIN(pinInfo, new ChangePINProvider(pin, newPin)); +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(newPin)); +        pin = newPin; +      } +    } +  } +   +  @Test +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    PINGUI pinProvider = new SMCCTestPINProvider("1234".toCharArray()); +     +    byte[] idlinkRef = (byte[]) applicationContext.getBean("identityLink", byte[].class); + +    byte[] idlink = signatureCard.getInfobox("IdentityLink", pinProvider, null); +     +    assertArrayEquals(idlinkRef, idlink); +     +  } +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3ActivateTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3ActivateTest.java new file mode 100644 index 00000000..6270e3b8 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3ActivateTest.java @@ -0,0 +1,64 @@ +/* +* Copyright 2009 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.test.ecard; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.CardNotSupportedException; +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.PinInfo; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.pin.gui.ChangePINProvider; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; +import at.gv.egiz.smcc.test.AbstractCardTestBase; + +public class ECardG3ActivateTest extends AbstractCardTestBase { + +  @Test +  public void testActivatePin() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; +     +    for (PinInfo pinInfo : signatureCard.getPinInfos()) { + +      char[] pin = "123456789".substring(0, pinInfo.getMinLength()).toCharArray(); +      char[] transportPIN = "123456".toCharArray(); + +      boolean notActive = false; +      try { +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); +      } catch (NotActivatedException ex) { +        notActive = true; +      } +      assertTrue(notActive); + +      signatureCard.activatePIN(pinInfo, new ChangePINProvider(transportPIN, pin)); +      signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); +    } +  } + +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3InfoboxContainerEncryptedTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3InfoboxContainerEncryptedTest.java new file mode 100644 index 00000000..2f240729 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3InfoboxContainerEncryptedTest.java @@ -0,0 +1,44 @@ +/* +* Copyright 2009 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.test.ecard; + +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; + +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; +import at.gv.egiz.smcc.test.AbstractCardTestBase; + +public class ECardG3InfoboxContainerEncryptedTest extends AbstractCardTestBase { + +  @Test +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    PINGUI pinProvider = new SMCCTestPINProvider("1234".toCharArray()); +     +    byte[] idlinkRef = (byte[]) applicationContext.getBean("identityLink", byte[].class); + +    byte[] idlink = signatureCard.getInfobox("IdentityLink", pinProvider, null); +     +    assertArrayEquals(idlinkRef, idlink); +     +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3InfoboxContainerTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3InfoboxContainerTest.java new file mode 100644 index 00000000..112556a6 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3InfoboxContainerTest.java @@ -0,0 +1,55 @@ +/* +* Copyright 2009 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.test.ecard; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import at.gv.egiz.smcc.CancelledException; +import at.gv.egiz.smcc.PinInfo; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.pin.gui.DummyPINGUI; +import at.gv.egiz.smcc.pin.gui.PINGUI; +import at.gv.egiz.smcc.test.AbstractCardTestBase; + +public class ECardG3InfoboxContainerTest extends AbstractCardTestBase { + +  @Test +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    PINGUI pinProvider = new DummyPINGUI() { +      @Override +      public char[] providePIN(PinInfo pinSpec, int retries) +          throws CancelledException, InterruptedException { +        // must not require a PIN! +        fail(); +        return null; +      } +    }; +     +    byte[] idlinkRef = (byte[]) applicationContext.getBean("identityLink", byte[].class); + +    byte[] idlink = signatureCard.getInfobox("IdentityLink", pinProvider, null); +     +    assertArrayEquals(idlinkRef, idlink); +     +  } + +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/CardTestSuite.java b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3InvalidTest.java index 3c275a8d..f5a78448 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/CardTestSuite.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3InvalidTest.java @@ -1,5 +1,5 @@  /* -* Copyright 2008 Federal Chancellery Austria and +* Copyright 2009 Federal Chancellery Austria and  * Graz University of Technology  *  * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,16 +14,11 @@  * See the License for the specific language governing permissions and  * limitations under the License.  */ -package at.gv.egiz.smcc; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; +package at.gv.egiz.smcc.test.ecard; -import at.gv.egiz.smcc.acos.ACOSCardTestSuite; +import at.gv.egiz.smcc.test.AbstractInvalidCardTest; -@RunWith(Suite.class) -@SuiteClasses( { ACOSCardTestSuite.class, at.gv.egiz.smcc.starcos.STARCOSCardTest.class }) -public class CardTestSuite { +public class ECardG3InvalidTest extends AbstractInvalidCardTest {  } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3NotActivatedTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3NotActivatedTest.java new file mode 100644 index 00000000..5dfcfb21 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3NotActivatedTest.java @@ -0,0 +1,38 @@ +/* + * Copyright 2009 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.test.ecard; + +import org.junit.Test; + +import at.gv.egiz.smcc.NotActivatedException; +import at.gv.egiz.smcc.PINMgmtSignatureCard; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.test.AbstractNotActivatedCardTest; + +public class ECardG3NotActivatedTest extends AbstractNotActivatedCardTest { + +  @Test(expected = NotActivatedException.class) +  public void getPINInfos() throws SignatureCardException { + +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; +    signatureCard.getPinInfos(); + +  } + +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3Test.java b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3Test.java new file mode 100644 index 00000000..d8528b62 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardG3Test.java @@ -0,0 +1,132 @@ +/* + * Copyright 2009 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.test.ecard; + +import static org.junit.Assert.assertArrayEquals; +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.CardNotSupportedException; +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.PinInfo; +import at.gv.egiz.smcc.SignatureCardException; +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.pin.gui.PINGUI; +import at.gv.egiz.smcc.pin.gui.SMCCTestPINProvider; + + +public class ECardG3Test extends ECardTest { + +  @Test +  public void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException { + +    PINGUI pinProvider = new SMCCTestPINProvider("1234".toCharArray()); +     +    byte[] idlinkRef = (byte[]) applicationContext.getBean("identityLink", byte[].class); + +    byte[] idlink = signatureCard.getInfobox("IdentityLink", pinProvider, null); +     +    assertArrayEquals(idlinkRef, idlink); +     +  } +   +  @Test +  public void testChangePin() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    byte[] referenceData = { (byte) 0x26, (byte) 0x12, (byte) 0x34, +        (byte) 0x56, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff }; +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; +    PIN signaturPIN = (PIN) applicationContext.getBean("signaturPIN"); +    signaturPIN.setPin(referenceData); +    PIN kartenPIN = (PIN) applicationContext.getBean("kartenPIN"); +    kartenPIN.setPin(referenceData); + +    for (PinInfo pinInfo : signatureCard.getPinInfos()) { + +      char[] pin = "123456".toCharArray(); + +      for (int i = pinInfo.getMinLength(); i <= pinInfo.getMaxLength(); i++) { +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(pin)); +        char[] newPin = new char[i]; +        Arrays.fill(newPin, '0'); +        signatureCard +            .changePIN(pinInfo, new ChangePINProvider(pin, newPin)); +        signatureCard.verifyPIN(pinInfo, new SMCCTestPINProvider(newPin)); +        pin = newPin; +      } +    } +  } + +  @Test +  public void testVerifyInvalidPin() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; + +    for (PinInfo pinInfo : signatureCard.getPinInfos()) { + +      char[] invalidPin = "999999".toCharArray(); +      int numInvalidTries = 2; +      InvalidPINProvider invalidPinProvider = new InvalidPINProvider(invalidPin, numInvalidTries); +      try { +        signatureCard.verifyPIN(pinInfo, invalidPinProvider); +      } catch (CancelledException ex) { +      } finally { +        assertTrue(invalidPinProvider.getProvided() == numInvalidTries); +      } +    } +  } + +  @Test +  public void testChangeInvalidPin() throws CardNotSupportedException, +      LockedException, NotActivatedException, CancelledException, +      PINFormatException, SignatureCardException, InterruptedException { + +    PINMgmtSignatureCard signatureCard = (PINMgmtSignatureCard) this.signatureCard; +     +    for (PinInfo pinInfo : signatureCard.getPinInfos()) { + +      char[] invalidPin = "999999".toCharArray(); +      int numInvalidTries = 2; +      InvalidChangePINProvider invalidPinProvider = +              new InvalidChangePINProvider(invalidPin, invalidPin, numInvalidTries); + +      try { +        signatureCard.changePIN(pinInfo, invalidPinProvider); +      } catch (CancelledException ex) { +      } finally { +        assertTrue(invalidPinProvider.getProvided() == numInvalidTries); +      } +    } +  } + +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardTest.java new file mode 100644 index 00000000..e95a1615 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/ecard/ECardTest.java @@ -0,0 +1,54 @@ +/* +* Copyright 2009 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.test.ecard; + +import static org.junit.Assert.assertTrue; + +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; + +import org.junit.Test; + +import at.gv.egiz.smcc.CardNotSupportedException; +import at.gv.egiz.smcc.PINMgmtSignatureCard; +import at.gv.egiz.smcc.PinInfo; +import at.gv.egiz.smcc.SignatureCardException; +import at.gv.egiz.smcc.pin.gui.CancelChangePINProvider; +import at.gv.egiz.smcc.pin.gui.ModifyPINGUI; +import at.gv.egiz.smcc.test.AbstractCardTest; + +public abstract class ECardTest extends AbstractCardTest { + +  @Test +  public abstract void testGetInfoboxIdentityLink() throws SignatureCardException, InterruptedException; +   +  @Test(expected = SignatureCardException.class) +  public void testActivatePin() throws SignatureCardException, +      InterruptedException, CardNotSupportedException, +      NoSuchAlgorithmException, UnsupportedEncodingException { + +    assertTrue(signatureCard instanceof PINMgmtSignatureCard); + +    ModifyPINGUI pinProvider = new CancelChangePINProvider(); + +    PinInfo[] specs = ((PINMgmtSignatureCard) signatureCard).getPinInfos(); + +    ((PINMgmtSignatureCard) signatureCard).activatePIN(specs[0], pinProvider); +  } +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayFactoryBean.java new file mode 100644 index 00000000..91cb7cfb --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayFactoryBean.java @@ -0,0 +1,48 @@ +/* +* Copyright 2009 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.test.spring; + +import org.springframework.beans.factory.FactoryBean; + +public class ByteArrayFactoryBean implements FactoryBean { + +  private byte[] bytes; +   +  /** +   * @param bytes the bytes to set +   */ +  public void setBytes(byte[] bytes) { +    this.bytes = bytes; +  } + +  @Override +  public Object getObject() throws Exception { +    return bytes; +  } + +  @Override +  public Class<?> getObjectType() { +    return byte[].class; +  } + +  @Override +  public boolean isSingleton() { +    return false; +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardEmul.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyDependable.java index dd44d05b..dcae3391 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/acos/A04CardEmul.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyDependable.java @@ -1,5 +1,5 @@  /* -* Copyright 2008 Federal Chancellery Austria and +* Copyright 2009 Federal Chancellery Austria and  * Graz University of Technology  *  * Licensed under the Apache License, Version 2.0 (the "License"); @@ -14,19 +14,25 @@  * See the License for the specific language governing permissions and  * limitations under the License.  */ -package at.gv.egiz.smcc.acos; - -import at.gv.egiz.smcc.CardChannelEmul; -import at.gv.egiz.smcc.CardEmul; +package at.gv.egiz.smcc.test.spring; +public class ByteArrayPropertyDependable { +   +  private byte[] bytes; -public class A04CardEmul extends ACOSCardEmul { +  /** +   * @return the bytes +   */ +  public byte[] getBytes() { +    return bytes; +  } -  public A04CardEmul(A04ApplSIG applSIG, A04ApplDEC applDEC) { -    channel = new A04CardChannelEmul(this); -    applications.add(applSIG); -    applications.add(applDEC); +  /** +   * @param bytes the bytes to set +   */ +  public void setBytes(byte[] bytes) { +    this.bytes = bytes;    } -   +  } diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditor.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditor.java new file mode 100644 index 00000000..78dd3f88 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditor.java @@ -0,0 +1,49 @@ +/* +* Copyright 2009 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.test.spring; + +import java.beans.PropertyEditorSupport; +import java.io.ByteArrayOutputStream; + +public class ByteArrayPropertyEditor extends PropertyEditorSupport { + +  @Override +  public void setAsText(String text) throws IllegalArgumentException { +     +    ByteArrayOutputStream os = new ByteArrayOutputStream(); +     +    int hi = 0, n = 0; +    for (int i = 0; i < text.length(); i++) { +      int digit = Character.digit(text.charAt(i), 16); +      if (digit != -1) { +        if (n++ % 2 == 0) { +          hi = digit << 4;  +        } else { +          os.write(hi + digit); +        } +      } +    } +     +    if (n % 2 != 0) { +      throw new IllegalArgumentException(); +    } +     +    setValue(os.toByteArray()); +  } +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorRegistrar.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorRegistrar.java new file mode 100644 index 00000000..7a2bb30c --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorRegistrar.java @@ -0,0 +1,32 @@ +/* +* Copyright 2009 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.test.spring; + +import org.springframework.beans.PropertyEditorRegistrar; +import org.springframework.beans.PropertyEditorRegistry; + + +public class ByteArrayPropertyEditorRegistrar implements +    PropertyEditorRegistrar { + +  @Override +  public void registerCustomEditors(PropertyEditorRegistry registry) { +    registry.registerCustomEditor(byte[].class, new ByteArrayPropertyEditor()); +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorTest.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorTest.java new file mode 100644 index 00000000..6c10c705 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/ByteArrayPropertyEditorTest.java @@ -0,0 +1,53 @@ +/* +* Copyright 2009 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.test.spring; + +import static org.junit.Assert.*; + +import org.junit.Test; +import org.springframework.context.support.ClassPathXmlApplicationContext; + + +public class ByteArrayPropertyEditorTest { + +  public byte[] bytes = { (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, +      (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, +      (byte) 0x09, (byte) 0x0a, (byte) 0x0b, (byte) 0x0c, (byte) 0x0d, +      (byte) 0x0e, (byte) 0x0f, (byte) 0xf0, (byte) 0xe0, (byte) 0xd0, +      (byte) 0xc0, (byte) 0xb0, (byte) 0xa0, (byte) 0x90, (byte) 0x80, +      (byte) 0x70, (byte) 0x60, (byte) 0x50, (byte) 0x40, (byte) 0x30, +      (byte) 0x20, (byte) 0x10, (byte) 0x00 }; +   +  @Test +  public void testByteArrayPropertyEditor() { +     +    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext( +        "at/gv/egiz/smcc/spring/PropertyEditorTest.xml"); +     +    ByteArrayPropertyDependable testBean = (ByteArrayPropertyDependable) applicationContext +        .getBean("testBean", ByteArrayPropertyDependable.class); +    assertNotNull(testBean); +     +    assertArrayEquals(bytes, testBean.getBytes()); +     +    System.out.println("" + byte[].class); +     +  } +   +   +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/CertificateFileFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/CertificateFileFactoryBean.java new file mode 100644 index 00000000..8bfd5bd4 --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/CertificateFileFactoryBean.java @@ -0,0 +1,118 @@ +/* +* Copyright 2009 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.test.spring; + +import org.springframework.beans.factory.FactoryBean; + +import at.gv.egiz.smcc.File; + +public class CertificateFileFactoryBean implements FactoryBean { + +  private byte[] fid; +   +  private byte[] fcx; +   +  private byte[] certificate; +   +  private int fileSize; +   +  /** +   * @return the certificate +   */ +  public byte[] getCertificate() { +    return certificate; +  } + +  /** +   * @param certificate the certificate to set +   */ +  public void setCertificate(byte[] certificate) { +    this.certificate = certificate; +  } + +  /** +   * @return the fid +   */ +  public byte[] getFid() { +    return fid; +  } + +  /** +   * @param fid the fid to set +   */ +  public void setFid(byte[] fid) { +    this.fid = fid; +  } + +  /** +   * @return the fcx +   */ +  public byte[] getFcx() { +    return fcx; +  } + +  /** +   * @param fcx the fcx to set +   */ +  public void setFcx(byte[] fcx) { +    this.fcx = fcx; +  } + +  /** +   * @return the fileSize +   */ +  public int getFileSize() { +    return fileSize; +  } + +  /** +   * @param fileSize the fileSize to set +   */ +  public void setFileSize(int fileSize) { +    this.fileSize = fileSize; +  } + +  @Override +  public Object getObject() throws Exception { + +    byte[] file = new byte[fileSize]; +     +    if (certificate != null) { +      System.arraycopy(certificate, 0, file, 0, Math.min(certificate.length, file.length)); +    } +     +    File f = new File(); +    f.setFile(file); +    f.setFid(fid); +    f.setFcx(fcx); +     +    return f; +    +  } + +  @Override +  public Class<?> getObjectType() { +    return File.class; +  } + +  @Override +  public boolean isSingleton() { +    return false; +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/InfoboxContainerFileFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/InfoboxContainerFileFactoryBean.java new file mode 100644 index 00000000..6dbccc2a --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/InfoboxContainerFileFactoryBean.java @@ -0,0 +1,236 @@ +/* +* Copyright 2009 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.test.spring; + +import java.nio.charset.Charset; +import java.security.GeneralSecurityException; +import java.security.PublicKey; +import java.util.Arrays; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; + +import org.springframework.beans.factory.FactoryBean; + +import at.gv.egiz.smcc.File; + +public class InfoboxContainerFileFactoryBean implements FactoryBean { + +  private byte[] fid; +   +  private byte[] fcx; +   +  private int kid = -1; +   +  private PublicKey publicKey; +   +  private boolean container; +   +  private byte[] identityLink; +   +  private int fileSize; +   +  /** +   * @return the container +   */ +  public boolean isContainer() { +    return container; +  } + +  /** +   * @param container the container to set +   */ +  public void setContainer(boolean container) { +    this.container = container; +  } + +  /** +   * @return the identityLink +   */ +  public byte[] getIdentityLink() { +    return identityLink; +  } + +  /** +   * @param identityLink the identityLink to set +   */ +  public void setIdentityLink(byte[] identityLink) { +    this.identityLink = identityLink; +  } + +  /** +   * @return the fid +   */ +  public byte[] getFid() { +    return fid; +  } + +  /** +   * @param fid the fid to set +   */ +  public void setFid(byte[] fid) { +    this.fid = fid; +  } + +  /** +   * @return the fcx +   */ +  public byte[] getFcx() { +    return fcx; +  } + +  /** +   * @param fcx the fcx to set +   */ +  public void setFcx(byte[] fcx) { +    this.fcx = fcx; +  } + +  /** +   * @return the kid +   */ +  public int getKid() { +    return kid; +  } + +  /** +   * @param kid the kid to set +   */ +  public void setKid(int kid) { +    this.kid = kid; +  } + +  /** +   * @return the publicKey +   */ +  public PublicKey getPublicKey() { +    return publicKey; +  } + +  /** +   * @param publicKey the publicKey to set +   */ +  public void setPublicKey(PublicKey publicKey) { +    this.publicKey = publicKey; +  } + +  /** +   * @return the fileSize +   */ +  public int getFileSize() { +    return fileSize; +  } + +  /** +   * @param fileSize the fileSize to set +   */ +  public void setFileSize(int fileSize) { +    this.fileSize = fileSize; +  } + +  @Override +  public Object getObject() throws Exception { + +    byte[] file = new byte[fileSize]; +     +    if (container) { +       +      int offset = 0; +       +      // HEADER 'AIK' + version +      byte[] header = "AIK".getBytes(Charset.forName("ASCII")); +      System.arraycopy(header, 0, file, offset, header.length); +      offset += header.length; +      file[offset++] = 1;  +       +      // HEADER identity link +      file[offset++] = (byte) 0x01; // Personenbindung +      if (publicKey != null) { +        file[offset++] = (byte) 0x01; // Modifier + +        byte[] cipherText; +        byte[] encKey; +        try { +          KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); +          SecretKey secretKey = keyGenerator.generateKey(); +           +          byte[] keyBytes = secretKey.getEncoded(); +           +          Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); +          byte[] iv = new byte[8]; +          Arrays.fill(iv, (byte) 0x00); +          IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); +          cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec); +          cipherText = cipher.doFinal(identityLink); +           +          cipher = Cipher.getInstance(publicKey.getAlgorithm()); +          cipher.init(Cipher.ENCRYPT_MODE, publicKey); +          encKey = cipher.doFinal(keyBytes); +           +        } catch (GeneralSecurityException e) { +          throw new RuntimeException(e); +        } +         +        int len = encKey.length + cipherText.length + 2; +         +        file[offset++] = (byte) (0xFF & len); +        file[offset++] = (byte) (0xFF & len >> 8); +         +        file[offset++] = (byte) (0xFF & encKey.length); +        file[offset++] = (byte) (0xFF & encKey.length >> 8); +         +        System.arraycopy(encKey, 0, file, offset, encKey.length); +        offset += encKey.length; +         +        System.arraycopy(cipherText, 0, file, offset, cipherText.length); +         +      } else { +        file[offset++] = (byte) 0x00; // Modifier +        file[offset++] = (byte) (0xFF & identityLink.length); +        file[offset++] = (byte) (0xFF & identityLink.length >> 8); +        System.arraycopy(identityLink, 0, file, offset, identityLink.length); +        offset += identityLink.length; +      } + +    } else if (identityLink != null) { +      System.arraycopy(identityLink, 0, file, 0, Math.min(identityLink.length, file.length)); +    } +     +    File f = new File(); +    f.setFile(file); +    f.setFid(fid); +    f.setFcx(fcx); +    f.setKid(kid); +     +    return f; +    +  } + +  @Override +  public Class<?> getObjectType() { +    return File.class; +  } + +  @Override +  public boolean isSingleton() { +    return false; +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PrivateKeyFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PrivateKeyFactoryBean.java new file mode 100644 index 00000000..6470b5ca --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PrivateKeyFactoryBean.java @@ -0,0 +1,62 @@ +/* +* Copyright 2009 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.test.spring; + +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; + +import org.springframework.beans.factory.FactoryBean; + +public class PrivateKeyFactoryBean implements FactoryBean { + +  private byte[] encodedKey; +   +  private String algorithm; + +  /** +   * @param encodedKey the encodedKey to set +   */ +  public void setEncodedKey(byte[] encodedKey) { +    this.encodedKey = encodedKey; +  } + +  /** +   * @param algorithm the algorithm to set +   */ +  public void setAlgorithm(String algorithm) { +    this.algorithm = algorithm; +  } + +  @Override +  public Object getObject() throws Exception { +    KeyFactory keyFactory = KeyFactory.getInstance(algorithm); +    return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey)); +  } + +  @Override +  public Class<?> getObjectType() { +    return PrivateKey.class; +  } + +  @Override +  public boolean isSingleton() { +    return false; +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PublicKeyFactoryBean.java b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PublicKeyFactoryBean.java new file mode 100644 index 00000000..83b552cf --- /dev/null +++ b/smcc/src/test/java/at/gv/egiz/smcc/test/spring/PublicKeyFactoryBean.java @@ -0,0 +1,62 @@ +/* +* Copyright 2009 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.test.spring; + +import java.security.KeyFactory; +import java.security.PublicKey; +import java.security.spec.X509EncodedKeySpec; + +import org.springframework.beans.factory.FactoryBean; + +public class PublicKeyFactoryBean implements FactoryBean { + +  private byte[] encodedKey; +   +  private String algorithm; + +  /** +   * @param encodedKey the encodedKey to set +   */ +  public void setEncodedKey(byte[] encodedKey) { +    this.encodedKey = encodedKey; +  } + +  /** +   * @param algorithm the algorithm to set +   */ +  public void setAlgorithm(String algorithm) { +    this.algorithm = algorithm; +  } + +  @Override +  public Object getObject() throws Exception { +    KeyFactory keyFactory = KeyFactory.getInstance(algorithm); +    return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey)); +  } + +  @Override +  public Class<?> getObjectType() { +    return PublicKey.class; +  } + +  @Override +  public boolean isSingleton() { +    return false; +  } + +} diff --git a/smcc/src/test/java/at/gv/egiz/smcc/util/ISO7816UtilsTest.java b/smcc/src/test/java/at/gv/egiz/smcc/util/ISO7816UtilsTest.java index 679f2c02..b629f133 100644 --- a/smcc/src/test/java/at/gv/egiz/smcc/util/ISO7816UtilsTest.java +++ b/smcc/src/test/java/at/gv/egiz/smcc/util/ISO7816UtilsTest.java @@ -16,20 +16,15 @@  */  package at.gv.egiz.smcc.util; +import static org.junit.Assert.assertTrue; +  import java.util.Arrays;  import javax.smartcardio.CommandAPDU; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Ignore;  import org.junit.Test;  import at.gv.egiz.smcc.VerifyAPDUSpec; -import at.gv.egiz.smcc.util.ISO7816Utils; -import static org.junit.Assert.*;  public class ISO7816UtilsTest { @@ -156,20 +151,5 @@ public class ISO7816UtilsTest {      assertTrue(Arrays.equals(apdu.getBytes(), ref));    } -   -  private String toString(byte[] b) { -    StringBuffer sb = new StringBuffer(); -    if (b != null && b.length > 0) { -      sb.append(Integer.toHexString((b[0] & 240) >> 4)); -      sb.append(Integer.toHexString(b[0] & 15)); -    } -    for (int i = 1; i < b.length; i++) { -      sb.append(':'); -      sb.append(Integer.toHexString((b[i] & 240) >> 4)); -      sb.append(Integer.toHexString(b[i] & 15)); -    } -    return sb.toString(); -  } -  } | 
