summaryrefslogtreecommitdiff
path: root/smccTest/src/main/java/at/gv/egiz/smcctest/PKCS15Test.java
diff options
context:
space:
mode:
Diffstat (limited to 'smccTest/src/main/java/at/gv/egiz/smcctest/PKCS15Test.java')
-rw-r--r--smccTest/src/main/java/at/gv/egiz/smcctest/PKCS15Test.java110
1 files changed, 88 insertions, 22 deletions
diff --git a/smccTest/src/main/java/at/gv/egiz/smcctest/PKCS15Test.java b/smccTest/src/main/java/at/gv/egiz/smcctest/PKCS15Test.java
index 1f032554..d3035c8a 100644
--- a/smccTest/src/main/java/at/gv/egiz/smcctest/PKCS15Test.java
+++ b/smccTest/src/main/java/at/gv/egiz/smcctest/PKCS15Test.java
@@ -16,6 +16,7 @@ import iaik.security.provider.IAIK;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
@@ -102,7 +103,7 @@ public class PKCS15Test {
// @Test
// @Ignore
- public void getEFDIR() throws CardException, SignatureCardException, InstantiationException, CodingException {
+ public void getEFDIR() throws CardException, SignatureCardException, InstantiationException, CodingException, IOException {
CardChannel basicChannel = icc.getBasicChannel();
CommandAPDU cmdAPDU;
@@ -199,8 +200,13 @@ public class PKCS15Test {
System.out.println(" " + toString(efod));
for (TLV cio : new TLVSequence(efod)) {
-
- System.out.println("\n\nTag = " + cio.getTag());
+
+ byte[] val = cio.getValue();
+ System.out.println("val: "+ toString(val));
+ byte[] path = Arrays.copyOfRange(val, 4, 4+val[3]);
+ System.out.println("path: "+ toString(path));
+
+ System.out.println("\n\nTag = " + (cio.getTag() & 0x0f));
if (cio.getTag() == 0) {
System.out.println("cannot decode null data");
continue;
@@ -244,27 +250,40 @@ public class PKCS15Test {
byte[] ef = ISO7816Utils.readTransparentFile(basicChannel, -1);
// System.out.println(" " + toString(ef));
- int length;
int i = 0;
int j;
do {
System.out.println("tag: 0x" + Integer.toHexString(ef[i]) + ", length: 0x" + Integer.toHexString(ef[i+1]));
- if ((ef[i+1] & 0xff) == 0x81) {
- length = ef[i+2] & 0xff;
- j = 3;
-// System.out.println("ef["+(i+1)+"]=0x81, setting length=" + (ef[i+2] & 0xff));
-
- } else if ((ef[i+1] & 0xff) == 0x82) {
- length = ((ef[i+2] & 0xff) << 8) | (ef[i+3] & 0xff);
- j = 4;
-// System.out.println("ef["+(i+1)+"]=0x82, setting length=" + (((ef[i+2] & 0xff) << 8) | (ef[i+3] & 0xff)));
-
- } else {
- length = ef[i+1] & 0xff;
- j = 2;
-// System.out.println("ef["+(i+1)+"]=0x" + Integer.toBinaryString(ef[i+1] & 0xff));
- }
+
+ int length = 0;
+ int ll = 0;
+ if ((ef[i+1] & 0xf0) == 0x80) {
+ ll = ef[i+1] & 0x7f;
+ for (int it = 0; it < ll; it++) {
+ System.out.println(" + 0x" + Integer.toHexString(ef[i + it+2] & 0xff) );
+ length = (length << 8) + (ef[i+it+2] & 0xff);
+ System.out.println("length: " + length + " (0x" + Integer.toHexString(length) + ")");
+ }
+ } else {
+ length = (ef[i+1] & 0xff);
+ }
+
+// if ((ef[i+1] & 0xff) == 0x81) {
+// length = ef[i+2] & 0xff;
+// j = 3;
+//// System.out.println("ef["+(i+1)+"]=0x81, setting length=" + (ef[i+2] & 0xff));
+//
+// } else if ((ef[i+1] & 0xff) == 0x82) {
+// length = ((ef[i+2] & 0xff) << 8) | (ef[i+3] & 0xff);
+// j = 4;
+//// System.out.println("ef["+(i+1)+"]=0x82, setting length=" + (((ef[i+2] & 0xff) << 8) | (ef[i+3] & 0xff)));
+//
+// } else {
+// length = ef[i+1] & 0xff;
+// j = 2;
+//// System.out.println("ef["+(i+1)+"]=0x" + Integer.toBinaryString(ef[i+1] & 0xff));
+// }
System.out.println("setting length: 0x" + Integer.toHexString(length));
@@ -272,10 +291,53 @@ public class PKCS15Test {
// byte[] cert = Arrays.copyOfRange(ef, 0, ef.length-1);
//// System.out.println("cert 1: \n " + toString(cert));
- j = i + j + length;
+ j = i + 2 + ll + length;
System.out.println("reading ef[" + i +"-" + (j-1) + "]:\n" + toString(Arrays.copyOfRange(ef, i, j)) );
+
ASN1Object informationObject = DerCoder.decode(Arrays.copyOfRange(ef, i, j));
System.out.println(ASN1.print(informationObject));
+
+ if (Arrays.equals(fid, new byte[] { (byte)0x44, (byte)0x00})) {
+ byte[] id = (byte[]) informationObject.getComponentAt(1).getComponentAt(0).getValue();
+ byte[] usage = (byte[]) informationObject.getComponentAt(1).getComponentAt(1).getValue();
+ byte[] access= (byte[]) informationObject.getComponentAt(1).getComponentAt(2).getValue();
+ BigInteger keyRef = (BigInteger) informationObject.getComponentAt(1).getComponentAt(3).getValue();
+
+ System.out.println("key iD " + toString(id) );
+ System.out.println("key ref " + keyRef);
+ System.out.println("key usage " + toString(usage));
+ System.out.println("key access "+ toString(access) );
+ } else if (Arrays.equals(fid, new byte[] { (byte)0x44, (byte)0x04})) {
+ System.out.println("Certificate (" + informationObject.getComponentAt(0).getComponentAt(0).getValue() + ") path: " + toString((byte[]) informationObject.getComponentAt(2).getComponentAt(0).getComponentAt(0).getComponentAt(0).getValue()) + "\n");
+
+// iaik.me.asn1.ASN1 obj = new iaik.me.asn1.ASN1(Arrays.copyOfRange(ef, i, j));
+// byte[] contextSpecific = obj.getElementAt(2).getEncoded();
+// System.out.println("JCE ME ASN1 obj: " + toString(contextSpecific));
+// if ((contextSpecific[0] & 0xff) != 0xa1) {
+// System.out.println("WARNING: expected CONTEXTSPECIFIC structure 0xa1, got 0x" + Integer.toHexString(contextSpecific[0]));
+// }
+// System.out.println("(contextSpecific[1] & 0xf0) = 0x" + Integer.toHexString(contextSpecific[1] & 0xf0));
+// System.out.println("(contextSpecific[1] & 0xf0) == 0x80 " + ((contextSpecific[1] & 0xf0) == 0x80));
+// System.out.println("(contextSpecific[1] & 0x0f) = 0x" + Integer.toHexString(contextSpecific[1] & 0x0f) + " = " + (contextSpecific[1] & 0x0f));
+// System.out.println("(contextSpecific[1] & 0x0f) + 2 = 0x" + Integer.toHexString((contextSpecific[1] & 0x0f)+2) + " = " + ((contextSpecific[1] & 0x0f)+2));
+//
+// int ll = ((contextSpecific[1] & 0xf0) == 0x80) ? (contextSpecific[1] & 0x0f) + 2 : 2;
+// System.out.println("ll = " + ll);
+// System.out.println(toString(Arrays.copyOfRange(contextSpecific, ll, contextSpecific.length)));
+// if ((contextSpecific[1] & 0xff) == 0x81) {
+// iaik.me.asn1.ASN1 x509CertificateAttributes = new iaik.me.asn1.ASN1(
+// Arrays.copyOfRange(contextSpecific, ll, contextSpecific.length));
+// System.out.println("path?: " + toString(x509CertificateAttributes.getElementAt(0).getElementAt(0).gvByteArray()));
+//
+// }
+
+
+// byte[] ef_qcert = obj.getElementAt(2).getElementAt(0).getElementAt(0)
+// .getElementAt(0).gvByteArray();
+// System.out.println("reading certificate "
+// + obj.getElementAt(0).getElementAt(0).gvString()
+// + " from fid=" + toString(ef_qcert));
+ }
i = j;
} while (i<ef.length && ef[i]>0);
}
@@ -406,11 +468,14 @@ public class PKCS15Test {
Certificate certificate = null;
try {
- System.out.println("READ cert?");
CertificateFactory certificateFactory = CertificateFactory.getInstance("X509");
certificate = certificateFactory.generateCertificate(ISO7816Utils.openTransparentFileInputStream(basicChannel, -1));
// certificate = certificateFactory.generateCertificate(new BASE64DecoderStream(new ByteArrayInputStream(CERT.getBytes())));
- System.out.println("certificate: \n" + toString(certificate.getEncoded()));
+ System.out.println("Certificate: \n===================================\n"
+ + toString(certificate.getEncoded())
+ + "\n===================================\n"
+ + certificate
+ + "\n===================================\n");
} catch (CertificateException e) {
e.printStackTrace();
}
@@ -1021,6 +1086,7 @@ public class PKCS15Test {
PKCS15Test test = new PKCS15Test();
test.setUp();
test.getEFDIR();
+// test.sign();
// test.selectAndRead();
} catch (Exception ex) {
ex.printStackTrace();