summaryrefslogtreecommitdiff
path: root/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java
diff options
context:
space:
mode:
Diffstat (limited to 'smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java')
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java59
1 files changed, 38 insertions, 21 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 bc6a2316..b9c68b06 100644
--- a/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java
+++ b/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java
@@ -28,7 +28,7 @@
//
package at.gv.egiz.smcc;
-import at.gv.egiz.smcc.ccid.DefaultReader;
+import at.gv.egiz.smcc.ccid.CCID;
import at.gv.egiz.smcc.util.SMCCHelper;
import java.util.Arrays;
import javax.smartcardio.CardChannel;
@@ -319,6 +319,8 @@ public class STARCOSCard extends AbstractSignatureCard {
return createSignature(hash, AID_DF_SS, pin, KID_PIN_SS, DST_SS);
} catch (VerificationFailedException e) {
retries = e.getRetries();
+ } catch (PINFormatException e) {
+ log.debug("wrong pin size entered, retry");
} finally {
getCard().endExclusive();
}
@@ -454,15 +456,16 @@ public class STARCOSCard extends AbstractSignatureCard {
@Override
protected int verifyPIN(byte kid, char[] pin)
- throws LockedException, NotActivatedException, SignatureCardException {
+ throws LockedException, NotActivatedException, TimeoutException, CancelledException, PINFormatException, PINOperationAbortedException, SignatureCardException {
try {
byte[] sw;
- if (reader.hasFeature(DefaultReader.FEATURE_VERIFY_PIN_DIRECT)) {
- log.debug("verify PIN on IFD");
- sw = reader.transmitControlCommand(
- DefaultReader.FEATURE_VERIFY_PIN_DIRECT,
- getPINVerifyStructure(kid));
+ if (reader.hasFeature(CCID.FEATURE_VERIFY_PIN_DIRECT)) {
+ log.debug("verify pin on cardreader");
+ sw = reader.verifyPinDirect(getPINVerifyStructure(kid));
// int sw = (resp[resp.length-2] & 0xff) << 8 | resp[resp.length-1] & 0xff;
+ } else if (reader.hasFeature(CCID.FEATURE_VERIFY_PIN_START)) {
+ log.debug("verify pin on cardreader");
+ sw = reader.verifyPin(getPINVerifyStructure(kid));
} else {
byte[] pinBlock = encodePINBlock(pin);
CardChannel channel = getCardChannel();
@@ -492,6 +495,8 @@ public class STARCOSCard extends AbstractSignatureCard {
throw new TimeoutException("[64:00]");
} else if (sw[0] == (byte) 0x64 && sw[1] == (byte) 0x01) {
throw new CancelledException("[64:01]");
+ } else if (sw[0] == (byte) 0x64 && sw[1] == (byte) 0x03) {
+ throw new PINFormatException("[64:03]");
}
log.error("Failed to verify pin: SW="
+ SMCCHelper.toString(sw));
@@ -539,15 +544,15 @@ public class STARCOSCard extends AbstractSignatureCard {
@Override
protected int changePIN(byte kid, char[] oldPin, char[] newPin)
- throws LockedException, NotActivatedException, CancelledException, TimeoutException, SignatureCardException {
+ throws LockedException, CancelledException, PINFormatException, PINConfirmationException, TimeoutException, PINOperationAbortedException, SignatureCardException {
try {
byte[] sw;
- if (reader.hasFeature(DefaultReader.FEATURE_MODIFY_PIN_DIRECT)) {
- log.debug("modify PIN on IFD");
- sw = reader.transmitControlCommand(
- DefaultReader.FEATURE_MODIFY_PIN_DIRECT,
- getPINModifyStructure(kid));
-// int sw = (resp[resp.length-2] & 0xff) << 8 | resp[resp.length-1] & 0xff;
+ if (reader.hasFeature(CCID.FEATURE_MODIFY_PIN_DIRECT)) {
+ log.debug("modify pin on cardreader");
+ sw = reader.modifyPinDirect(getPINModifyStructure(kid));
+ } else if (reader.hasFeature(CCID.FEATURE_MODIFY_PIN_START)) {
+ log.debug("modify pin on cardreader");
+ sw = reader.modifyPin(getPINModifyStructure(kid));
} else {
byte[] cmd = new byte[16];
System.arraycopy(encodePINBlock(oldPin), 0, cmd, 0, 8);
@@ -583,6 +588,13 @@ public class STARCOSCard extends AbstractSignatureCard {
throw new TimeoutException("[64:00]");
} else if (sw[0] == (byte) 0x64 && sw[1] == (byte) 0x01) {
throw new CancelledException("[64:01]");
+ } else if (sw[0] == (byte) 0x64 && sw[1] == (byte) 0x02) {
+ throw new PINConfirmationException("[64:02]");
+ } else if (sw[0] == (byte) 0x64 && sw[1] == (byte) 0x03) {
+ throw new PINFormatException("[64:03]");
+ } else if (sw[0] == (byte) 0x6a && sw[1] == (byte) 0x80) {
+ log.info("invalid parameter, assume wrong pin size");
+ throw new PINFormatException("[6a:80]");
}
log.error("Failed to change pin: SW="
+ SMCCHelper.toString(sw));
@@ -595,15 +607,15 @@ public class STARCOSCard extends AbstractSignatureCard {
@Override
protected void activatePIN(byte kid, char[] pin)
- throws CancelledException, TimeoutException, SignatureCardException {
+ throws CancelledException, PINFormatException, PINConfirmationException, TimeoutException, PINOperationAbortedException, SignatureCardException {
try {
byte[] sw;
- if (reader.hasFeature(DefaultReader.FEATURE_MODIFY_PIN_DIRECT)) {
- log.debug("activate PIN on IFD");
- sw = reader.transmitControlCommand(
- DefaultReader.FEATURE_MODIFY_PIN_DIRECT,
- getActivatePINModifyStructure(kid));
-// int sw = (resp[resp.length-2] & 0xff) << 8 | resp[resp.length-1] & 0xff;
+ if (reader.hasFeature(CCID.FEATURE_MODIFY_PIN_DIRECT)) {
+ log.debug("activate pin on cardreader");
+ sw = reader.modifyPinDirect(getActivatePINModifyStructure(kid));
+ } else if (reader.hasFeature(CCID.FEATURE_MODIFY_PIN_START)) {
+ log.debug("activate pin on cardreader");
+ sw = reader.modifyPin(getActivatePINModifyStructure(kid));
} else {
CardChannel channel = getCardChannel();
ResponseAPDU resp = transmit(channel,
@@ -630,6 +642,10 @@ public class STARCOSCard extends AbstractSignatureCard {
throw new TimeoutException("[64:00]");
} else if (sw[0] == (byte) 0x64 && sw[1] == (byte) 0x01) {
throw new CancelledException("[64:01]");
+ } else if (sw[0] == (byte) 0x64 && sw[1] == (byte) 0x02) {
+ throw new PINConfirmationException("[64:02]");
+ } else if (sw[0] == (byte) 0x64 && sw[1] == (byte) 0x03) {
+ throw new PINFormatException("[64:03]");
}
log.error("Failed to activate pin: SW="
+ SMCCHelper.toString(sw));
@@ -683,6 +699,7 @@ public class STARCOSCard extends AbstractSignatureCard {
byte bmPINLengthFormat = (byte) 0x04; // 000 0 0100
// ^-------- System bit units is bit
// ^^^^--- PIN length is at the 4th position bit
+ //TODO compare ints, not bytes
byte wPINMaxExtraDigitL = // Max=12 digits (Gemplus support max 8)
(reader.getwPINMaxExtraDigitL() < (byte) 0x12) ?
reader.getwPINMaxExtraDigitL() : (byte) 0x12;