diff options
Diffstat (limited to 'smcc')
| -rw-r--r-- | smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java | 58 | 
1 files changed, 53 insertions, 5 deletions
| diff --git a/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java b/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java index 1e337f50..2091e253 100644 --- a/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java +++ b/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java @@ -116,6 +116,10 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu    public static final byte[] AID_DF_SS = new byte[] { (byte) 0xd0, (byte) 0x40,        (byte) 0x00, (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x12,        (byte) 0x01 }; +   +  public static final byte[] AID_DF_SS_ASIGN = new byte[] { (byte) 0xd0, (byte) 0x40, +          (byte) 0x00, (byte) 0x00, (byte) 0x22, (byte) 0x00, (byte) 0x01 }; +    public static final byte[] EF_C_X509_CH_DS = new byte[] { (byte) 0xc0,        (byte) 0x00 }; @@ -130,7 +134,11 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu    public static final byte[] AID_DF_GS = new byte[] { (byte) 0xd0, (byte) 0x40,        (byte) 0x00, (byte) 0x00, (byte) 0x17, (byte) 0x00, (byte) 0x13,        (byte) 0x01 }; +   +  public static final byte[] AID_DF_GS_ASIGN = new byte[] { (byte) 0xd0, (byte) 0x40, +          (byte) 0x00, (byte) 0x00, (byte) 0x22, (byte) 0x00, (byte) 0x02 }; +      public static final byte[] EF_C_X509_CH_AUT = new byte[] { (byte) 0x2f,        (byte) 0x01 }; @@ -167,6 +175,7 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu        execSELECT_FID(channel, EF_VERSION);        // READ BINARY        byte[] ver = ISO7816Utils.readRecord(channel, 1); +      byte[] cardATR = card.getATR().getBytes();        if (ver[0] == (byte) 0xa5 && ver[2] == (byte) 0x53) {          version = (0x0F & ver[4]) + (0xF0 & ver[5])/160.0 + (0x0F & ver[5])/100.0;          friendlyName = (version < 1.2) ? "<= G2" : "G3+"; @@ -198,6 +207,21 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu            }          }          log.info("e-card version=" + version + " (" + friendlyName + ")"); +      } else if ((cardATR[12]) == 0x41) { // checking if there is a-trust a.sign premium card present +          // data taken from a-trust cardos5.3 specification v0.05 +friendlyName = "a.sign premium"; +if (cardATR[13] == 0x01) { +version = 1.2; +generation = 4; +if (((cardATR[16] & 0xFF) == 0xc9 ) && ((cardATR[17] & 0xFF )== 0x03)) { +friendlyName += " (G1 CardOS5.3)"; +log.info("A-TRUST a.sign premium found, first generation with CardOS 5.3"); +} else { +friendlyName += " (G1)"; +log.info("A-TRUST a.sign premium found, first generation"); +} +} +        }      } catch (CardException e) {        log.warn("Failed to execute command.", e); @@ -212,9 +236,14 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu      //   cardPukInfo = new PinInfo(8, 12, "[0-9]",      //       "at/gv/egiz/smcc/STARCOSCard", "card.puk", KID_PUK_CARD, null, 10);      // } +    if (friendlyName.matches("^a.sign premium.*")) { +        ssPinInfo = new PinInfo(6, 12, "[0-9]", +                "at/gv/egiz/smcc/STARCOSCard", "sig.pin", KID_PIN_SS, AID_DF_SS_ASIGN, +                (version < 1.2) ? 3 : 10); +      } else {      ssPinInfo = new PinInfo(6, 12, "[0-9]",          "at/gv/egiz/smcc/STARCOSCard", "sig.pin", KID_PIN_SS, AID_DF_SS, -        (version < 1.2) ? 3 : 10); +        (version < 1.2) ? 3 : 10);}      if (SignatureCardFactory.ENFORCE_RECOMMENDED_PIN_LENGTH) {        cardPinInfo.setRecLength(4); @@ -232,10 +261,17 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu      byte[] aid;      byte[] fid;      if (keyboxName == KeyboxName.SECURE_SIGNATURE_KEYPAIR) { -      aid = AID_DF_SS; +    	if (friendlyName.matches("^a.sign premium.*")) { +            aid = AID_DF_SS_ASIGN; +          } else { +      aid = AID_DF_SS;}        fid = EF_C_X509_CH_DS;      } else if (keyboxName == KeyboxName.CERTIFIED_KEYPAIR) { -      aid = AID_DF_GS; +    	 // check if we are using a-trust card, then change the application +        if (friendlyName.matches("^a.sign premium.*")) { +          aid = AID_DF_GS_ASIGN; +        } else { +      aid = AID_DF_GS;}        fid = EF_C_X509_CH_AUT;      } else {        throw new IllegalArgumentException("Keybox " + keyboxName @@ -305,8 +341,12 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu          for (Infobox box : infoboxContainer.getInfoboxes()) {            if (box.getTag() == 0x01) {              if (box.isEncrypted()) { +            	  // SELECT application +                if (friendlyName.matches("^a.sign premium.*")) {  // check if we are using a.sign premium card +                  execSELECT_AID(channel, AID_DF_GS_ASIGN); +                } else { -              execSELECT_AID(channel, AID_DF_GS); +              execSELECT_AID(channel, AID_DF_GS);}                byte[] tlv;                if (generation < 4) @@ -540,7 +580,12 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu          // SELECT MF          execSELECT_MF(channel);          // SELECT application +        if (friendlyName.matches("^a.sign premium.*")) {  // check if we are using a.sign premium card +            execSELECT_AID(channel, AID_DF_SS_ASIGN); +          } else {          execSELECT_AID(channel, AID_DF_SS); +        } +                  // VERIFY          verifyPINLoop(channel, ssPinInfo, provider);          // MANAGE SECURITY ENVIRONMENT : SET DST @@ -564,7 +609,10 @@ public class STARCOSCard extends AbstractSignatureCard implements PINMgmtSignatu        } else if (KeyboxName.CERTIFIED_KEYPAIR.equals(keyboxName)) {          // SELECT application -        execSELECT_AID(channel, AID_DF_GS); +    	  if (friendlyName.matches("^a.sign premium.*")) {  // check if we are using a.sign premium card +              execSELECT_AID(channel, AID_DF_GS_ASIGN); +            } else { +        execSELECT_AID(channel, AID_DF_GS);}          // MANAGE SECURITY ENVIRONMENT : SET DST          execMSE(channel, 0x41, 0xb6, dst.toByteArray());          if (version >= 1.2 && ht != null) { | 
