summaryrefslogtreecommitdiff
path: root/smcc
diff options
context:
space:
mode:
Diffstat (limited to 'smcc')
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java10
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/ccid/CherrySmartBoardXX44.java42
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/ccid/DefaultReader.java162
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/ccid/GemplusGemPCPinpad.java23
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/ccid/OMNIKEYCardMan3621.java11
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/ccid/ReaderFactory.java16
-rw-r--r--smcc/src/main/java/at/gv/egiz/smcc/ccid/SCMMicrosystemsSPRx32.java51
7 files changed, 142 insertions, 173 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 b9c68b06..e622f65a 100644
--- a/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java
+++ b/smcc/src/main/java/at/gv/egiz/smcc/STARCOSCard.java
@@ -700,9 +700,9 @@ public class STARCOSCard extends AbstractSignatureCard {
// ^-------- 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;
+ byte wPINMaxExtraDigitL = // Max=12 digits
+ (reader.getwPINMaxExtraDigitL() < (byte) 0x0c) ?
+ reader.getwPINMaxExtraDigitL() : (byte) 0x0c;
byte wPINMaxExtraDigitH = // Min=4/6 digits TODO card/ss pin (min: 4/6)
(reader.getwPINMaxExtraDigitH() > (byte) 0x04) ?
reader.getwPINMaxExtraDigitH() : (byte) 0x04;
@@ -757,8 +757,8 @@ public class STARCOSCard extends AbstractSignatureCard {
byte bInsertionOffsetOld = (byte) 0x00; // insertion position offset in bytes
byte bInsertionOffsetNew = (byte) 0x08; // (add 1 from bmFormatString b3)
byte wPINMaxExtraDigitL =
- (reader.getwPINMaxExtraDigitL() < (byte) 0x12) ?
- reader.getwPINMaxExtraDigitL() : (byte) 0x12;
+ (reader.getwPINMaxExtraDigitL() < (byte) 0x0c) ?
+ reader.getwPINMaxExtraDigitL() : (byte) 0x0c;
byte wPINMaxExtraDigitH = // Min=4/6 digits TODO card/ss pin (min: 4/6)
(reader.getwPINMaxExtraDigitH() > (byte) 0x04) ?
reader.getwPINMaxExtraDigitH() : (byte) 0x04;
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/ccid/CherrySmartBoardXX44.java b/smcc/src/main/java/at/gv/egiz/smcc/ccid/CherrySmartBoardXX44.java
new file mode 100644
index 00000000..a7e45765
--- /dev/null
+++ b/smcc/src/main/java/at/gv/egiz/smcc/ccid/CherrySmartBoardXX44.java
@@ -0,0 +1,42 @@
+/*
+ * 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.ccid;
+
+import javax.smartcardio.Card;
+import javax.smartcardio.CardTerminal;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ *
+ * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
+ */
+public class CherrySmartBoardXX44 extends DefaultReader {
+
+ protected static final Log log = LogFactory.getLog(CherrySmartBoardXX44.class);
+
+ public static final byte wPINMaxExtraDigitH = 0x01;
+
+ public CherrySmartBoardXX44(Card icc, CardTerminal ct) {
+ super(icc, ct);
+ }
+
+ @Override
+ public byte getwPINMaxExtraDigitH() {
+ return wPINMaxExtraDigitH;
+ }
+}
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/ccid/DefaultReader.java b/smcc/src/main/java/at/gv/egiz/smcc/ccid/DefaultReader.java
index 9b1787a0..b203ae52 100644
--- a/smcc/src/main/java/at/gv/egiz/smcc/ccid/DefaultReader.java
+++ b/smcc/src/main/java/at/gv/egiz/smcc/ccid/DefaultReader.java
@@ -20,8 +20,6 @@ import at.gv.egiz.smcc.*;
import at.gv.egiz.smcc.util.SMCCHelper;
import java.util.HashMap;
import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import javax.smartcardio.Card;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
@@ -34,6 +32,12 @@ import org.apache.commons.logging.LogFactory;
*/
public class DefaultReader implements CCID {
+ public static final byte bEntryValidationCondition = 0x02; // validation key pressed
+ public static final byte bTimeOut = 0x3c; // 60sec (= max on ReinerSCT)
+ public static final byte bTimeOut2 = 0x00; // default (attention with SCM)
+ public static final byte wPINMaxExtraDigitH = 0x00; // min pin length zero digits
+ public static final byte wPINMaxExtraDigitL = 0x0c; // max pin length 12 digits
+
protected final static Log log = LogFactory.getLog(DefaultReader.class);
private static int CTL_CODE(int code) {
@@ -60,9 +64,17 @@ public class DefaultReader implements CCID {
if (icc == null || ct == null) {
throw new NullPointerException("no card or card terminal provided");
}
+ log.info("Initializing " + ct.getName());
+
this.icc = icc;
this.ct = ct;
- features = queryFeatures();
+ features = queryFeatures();
+
+ log.debug("setting pin timeout: " + getbTimeOut());
+ log.debug("setting pin timeout (after key pressed): " + getbTimeOut2());
+ log.debug("setting pin entry validation condition: " + getbEntryValidationCondition());
+ log.debug("setting min pin length: " + getwPINMaxExtraDigitH());
+ log.debug("setting max pin length: " + getwPINMaxExtraDigitL());
}
/**
@@ -103,11 +115,10 @@ public class DefaultReader implements CCID {
// control code value for supported feature (in big endian)
for (int i = 0; i < resp.length; i += 6) {
Byte feature = new Byte(resp[i]);
- int ioctlBigEndian = ((0xff & resp[i + 2]) << 24) |
+ Integer ioctl = new Integer((0xff & resp[i + 2]) << 24) |
((0xff & resp[i + 3]) << 16) |
((0xff & resp[i + 4]) << 8) |
(0xff & resp[i + 5]);
- Integer ioctl = new Integer(ioctlBigEndian);
if (log.isInfoEnabled()) {
log.info("CCID supports " + FEATURES[feature.intValue()] +
": " + Integer.toHexString(ioctl.intValue()));
@@ -131,54 +142,29 @@ public class DefaultReader implements CCID {
return false;
}
-// protected byte[] transmitControlCommand(Byte feature, byte[] ctrlCommand)
-// throws CardException {
-// try {
-// if (!features.containsKey(feature)) {
-// throw new CardException(FEATURES[feature.intValue()] + " not supported");
-// }
-// int ioctl = features.get(feature);
-// if (log.isTraceEnabled()) {
-// log.trace("CtrlCommand (" + Integer.toHexString(ioctl) +
-// ") " + SMCCHelper.toString(ctrlCommand));
-// }
-// byte[] resp = icc.transmitControlCommand(ioctl, ctrlCommand);
-// if (log.isTraceEnabled()) {
-// log.trace("CtrlCommand Response " + SMCCHelper.toString(resp));
-// }
-// return resp;
-// } catch (CardException ex) {
-// log.error(ex.getMessage());
-// throw new SignatureCardException("Failed to transmit CtrlCommand for " +
-// FEATURES[feature.intValue()]);
-// }
-// }
-
-
@Override
public byte getbTimeOut() {
- return (byte) 0x3c; // (max 1min on ReinerSCT),
- // 0x00=default, 0x1e = 30sec
+ return bTimeOut;
}
@Override
public byte getbTimeOut2() {
- return (byte) 0x00; // default
+ return bTimeOut2;
}
@Override
public byte getwPINMaxExtraDigitL() {
- return (byte) 0x12; // signed int
+ return wPINMaxExtraDigitL;
}
@Override
public byte getwPINMaxExtraDigitH() {
- return (byte) 0x00;
+ return wPINMaxExtraDigitH;
}
@Override
public byte getbEntryValidationCondition() {
- return (byte) 0x02; // validation key pressed
+ return bEntryValidationCondition;
}
void verifyPinStart(byte[] PIN_VERIFY) throws CardException {
@@ -275,9 +261,6 @@ public class DefaultReader implements CCID {
throw new CardException("FEATURE_GET_KEY_PRESSED not supported");
}
int ioctl = features.get(FEATURE_GET_KEY_PRESSED);
-// if (log.isTraceEnabled()) {
-// log.trace("GET_KEY_PRESSED (" + Integer.toHexString(ioctl) + ")");
-// }
byte[] resp = icc.transmitControlCommand(ioctl, new byte[0]);
if (resp != null && resp.length == 1) {
// if (log.isTraceEnabled()) {
@@ -349,7 +332,7 @@ public class DefaultReader implements CCID {
throw new CardException("unexpected response to GET_KEY_PRESSED: " +
Integer.toHexString(resp));
}
- } while (true); //resp != (byte) 0x0d);
+ } while (true);
return verifyPinFinish();
}
@@ -404,7 +387,6 @@ public class DefaultReader implements CCID {
}
/**
- * NOT SUPPORTED FOR ACOS ON OMNIKEY CardMan 3621
*
* @param PIN_MODIFY
* @return
@@ -426,104 +408,4 @@ public class DefaultReader implements CCID {
}
return resp;
}
-
-
-//[TRACE] SmartCardIO - terminal 'PC/SC terminal OMNIKEY CardMan 3621 0' card inserted : PC/SC card in OMNIKEY CardMan 3621 0, protocol T=1, state OK
-//[TRACE] DefaultReader - GET_FEATURE_REQUEST 313520 on OMNIKEY CardMan 3621 0
-//[TRACE] DefaultReader - Response TLV [01:04:00:31:30:00:02:04:00:31:2f:d4:03:04:00:31:30:04:04:04:00:31:2f:dc:05:04:00:31:2f:e0:0a:04
-//00:31:30:08]
-//[INFO] DefaultReader - CCID supports FEATURE_VERIFY_PIN_START: 313000
-//[INFO] DefaultReader - CCID supports FEATURE_VERIFY_PIN_FINISH: ffffffd4
-//[INFO] DefaultReader - CCID supports FEATURE_MODIFY_PIN_START: 313004
-//[INFO] DefaultReader - CCID supports FEATURE_MODIFY_PIN_FINISH: ffffffdc
-//[INFO] DefaultReader - CCID supports FEATURE_GET_KEY_PRESSED: ffffffe0
-//[INFO] DefaultReader - CCID supports FEATURE_IFD_PIN_PROPERTIES: 313008
-//[TRACE] AbstractSignatureCard - Setting IFS (information field size) to 254
-
-
- // protected byte ifdGetKeyPressed() throws CardException {
-// if (ifdSupportsFeature(FEATURE_VERIFY_PIN_DIRECT)) {
-//
-// Long controlCode = (Long) IFD_IOCTL.get(new Byte((byte) 0x05));
-//
-// byte key = 0x00;
-// while (key == 0x00) {
-//
-// byte[] resp = card_.transmitControlCommand(controlCode.intValue(), new byte[] {});
-//
-// if (resp != null && resp.length > 0) {
-// key = resp[0];
-// }
-// }
-//
-// System.out.println("Key: " + key);
-//
-// }
-//
-// return 0x00;
-// }
-//
-// protected byte[] ifdVerifyPINFinish() throws CardException {
-// if (ifdSupportsFeature(FEATURE_VERIFY_PIN_DIRECT)) {
-//
-// Long controlCode = (Long) IFD_IOCTL.get(new Byte((byte) 0x02));
-//
-// byte[] resp = card_.transmitControlCommand(controlCode.intValue(), new byte[] {});
-//
-// System.out.println("CommandResp: " + toString(resp));
-//
-// return resp;
-//
-// }
-//
-// return null;
-// }
-
-
- /**
- * assumes ifdSupportsVerifyPIN() == true
- * @param pinVerifyStructure
- * @return
- * @throws javax.smartcardio.CardException
- */
-// protected byte[] ifdVerifyPIN(byte[] pinVerifyStructure) throws CardException {
-//
-//// Long ctrlCode = (Long) ifdFeatures.get(FEATURE_IFD_PIN_PROPERTIES);
-//// if (ctrlCode != null) {
-//// if (log.isTraceEnabled()) {
-//// log.trace("PIN_PROPERTIES CtrlCode " + Integer.toHexString(ctrlCode.intValue()));
-//// }
-//// byte[] resp = card_.transmitControlCommand(ctrlCode.intValue(), new byte[] {});
-////
-//// if (log.isTraceEnabled()) {
-//// log.trace("PIN_PROPERTIES Response " + SMCCHelper.toString(resp));
-//// }
-//// }
-//
-//
-// Long ctrlCode = (Long) ifdFeatures.get(FEATURE_VERIFY_PIN_DIRECT);
-// if (ctrlCode == null) {
-// throw new NullPointerException("no CtrlCode for FEATURE_VERIFY_PIN_DIRECT");
-// }
-//
-// if (log.isTraceEnabled()) {
-// log.trace("VERIFY_PIN_DIRECT CtrlCode " + Integer.toHexString(ctrlCode.intValue()) +
-// ", PIN_VERIFY_STRUCTURE " + SMCCHelper.toString(pinVerifyStructure));
-// }
-// byte[] resp = card_.transmitControlCommand(ctrlCode.intValue(), pinVerifyStructure);
-//
-// if (log.isTraceEnabled()) {
-// log.trace("VERIFY_PIN_DIRECT Response " + SMCCHelper.toString(resp));
-// }
-// return resp;
-// }
-
-// protected Long getControlCode(Byte feature) {
-// if (ifdFeatures != null) {
-// return ifdFeatures.get(feature);
-// }
-// return null;
-// }
-
-
}
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/ccid/GemplusGemPCPinpad.java b/smcc/src/main/java/at/gv/egiz/smcc/ccid/GemplusGemPCPinpad.java
index 903b11fc..ff6d004b 100644
--- a/smcc/src/main/java/at/gv/egiz/smcc/ccid/GemplusGemPCPinpad.java
+++ b/smcc/src/main/java/at/gv/egiz/smcc/ccid/GemplusGemPCPinpad.java
@@ -22,7 +22,8 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
- *
+ * bTimeOut = 15sec (too short, leave value from DefaultRearder),
+ * however, max is something near 40sec
* @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
*/
public class GemplusGemPCPinpad extends DefaultReader {
@@ -31,20 +32,6 @@ public class GemplusGemPCPinpad extends DefaultReader {
public GemplusGemPCPinpad(Card icc, CardTerminal ct) {
super(icc, ct);
- log.info("Initializing Gemplus GemPC Pinpad reader");
- log.info("Gemplus GemPC Pinpad allows PINs to have 4-8 digits");
-
- }
-
- @Override
- public byte getbTimeOut() {
- return (byte) 0x3c; // 0x00 default = 15sec
- // max 40sec (?)
- }
-
- @Override
- public byte getbTimeOut2() {
- return (byte) 0x00; // 0x00 default = 15sec
}
@Override
@@ -56,10 +43,4 @@ public class GemplusGemPCPinpad extends DefaultReader {
public byte getwPINMaxExtraDigitH() {
return (byte) 0x04;
}
-
- @Override
- public byte getbEntryValidationCondition() {
- return (byte) 0x02; // validation key pressed
- }
-
}
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/ccid/OMNIKEYCardMan3621.java b/smcc/src/main/java/at/gv/egiz/smcc/ccid/OMNIKEYCardMan3621.java
index 35dd4f99..d8a6b40d 100644
--- a/smcc/src/main/java/at/gv/egiz/smcc/ccid/OMNIKEYCardMan3621.java
+++ b/smcc/src/main/java/at/gv/egiz/smcc/ccid/OMNIKEYCardMan3621.java
@@ -28,12 +28,17 @@ import org.apache.commons.logging.LogFactory;
* @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
*/
public class OMNIKEYCardMan3621 extends DefaultReader {
+
+ public static final byte wPINMaxExtraDigitH = 0x01;
protected static final Log log = LogFactory.getLog(OMNIKEYCardMan3621.class);
-
+
public OMNIKEYCardMan3621(Card icc, CardTerminal ct) {
super(icc, ct);
- log.warn("This card reader does not support ACOS cards.");
- log.debug("TODO: fall back to software pin entry");
+ }
+
+ @Override
+ public byte getwPINMaxExtraDigitH() {
+ return wPINMaxExtraDigitH;
}
}
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/ccid/ReaderFactory.java b/smcc/src/main/java/at/gv/egiz/smcc/ccid/ReaderFactory.java
index 07c16c3e..1e3bdce2 100644
--- a/smcc/src/main/java/at/gv/egiz/smcc/ccid/ReaderFactory.java
+++ b/smcc/src/main/java/at/gv/egiz/smcc/ccid/ReaderFactory.java
@@ -27,10 +27,18 @@ import javax.smartcardio.CardTerminal;
public class ReaderFactory {
public static CCID getReader(Card icc, CardTerminal ct) {
- if ("Gemplus GemPC Pinpad 00 00".equals(ct.getName())) {
- return new GemplusGemPCPinpad(icc, ct);
- } else if ("OmniKey CardMan 3621 00 00".equals(ct.getName())) {
- return new OMNIKEYCardMan3621(icc, ct);
+ String name = ct.getName();
+ if (name != null) {
+ name = name.toLowerCase();
+ if(name.startsWith("gemplus gempc pinpad")) {
+ return new GemplusGemPCPinpad(icc, ct);
+ } else if (name.startsWith("omnikey cardman 3621")) {
+ return new OMNIKEYCardMan3621(icc, ct);
+ } else if (name.startsWith("scm microsystems inc. sprx32 usb smart card reader")) {
+ return new SCMMicrosystemsSPRx32(icc, ct);
+ } else if (name.startsWith("cherry smartboard xx44")) {
+ return new CherrySmartBoardXX44(icc, ct);
+ }
}
return new DefaultReader(icc, ct);
}
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/ccid/SCMMicrosystemsSPRx32.java b/smcc/src/main/java/at/gv/egiz/smcc/ccid/SCMMicrosystemsSPRx32.java
new file mode 100644
index 00000000..133bc350
--- /dev/null
+++ b/smcc/src/main/java/at/gv/egiz/smcc/ccid/SCMMicrosystemsSPRx32.java
@@ -0,0 +1,51 @@
+/*
+ * 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.ccid;
+
+import javax.smartcardio.Card;
+import javax.smartcardio.CardTerminal;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * bTimeOut: spr532 (win driver) interprets 0x00 as zero sec
+ * instead of default
+ *
+ * @author Clemens Orthacker <clemens.orthacker@iaik.tugraz.at>
+ */
+public class SCMMicrosystemsSPRx32 extends DefaultReader {
+
+ public static final byte bTimeOut = 0x3c;
+ public static final byte bTimeOut2 = 0x0f;
+
+ protected final static Log log = LogFactory.getLog(SCMMicrosystemsSPRx32.class);
+
+ public SCMMicrosystemsSPRx32(Card icc, CardTerminal ct) {
+ super(icc, ct);
+ }
+
+ @Override
+ public byte getbTimeOut() {
+ return bTimeOut;
+ }
+
+ @Override
+ public byte getbTimeOut2() {
+ return bTimeOut2;
+ }
+
+}