working along to decode the DEROctetString
This commit is contained in:
parent
5a3abc75a1
commit
b07f5a05e8
6 changed files with 285 additions and 24 deletions
|
@ -18,7 +18,12 @@
|
|||
<target name="compile" depends="init"
|
||||
description="compile the source " >
|
||||
<!-- Compile the java code from ${src.dir} into ${build.dir} -->
|
||||
<javac srcdir="${src.dir}" destdir="${build.dir}"/>
|
||||
<javac includeantruntime="false" srcdir="${src.dir}" destdir="${build.dir}">
|
||||
<classpath>
|
||||
<pathelement path="${classpath}"/>
|
||||
<pathelement location="lib/bcprov-jdk16-1.46.jar"/>
|
||||
</classpath>
|
||||
</javac>
|
||||
</target>
|
||||
|
||||
<target name="dist" depends="compile"
|
||||
|
|
70
data/test-certv3.pem
Normal file
70
data/test-certv3.pem
Normal file
|
@ -0,0 +1,70 @@
|
|||
-----BEGIN CERTIFICATE-----
|
||||
MIIDrjCCAxegAwIBAgIIPjHvQ1mahX4wDQYJKoZIhvcNAQEFBQAwUjExMC8GA1UE
|
||||
AwwoanNlZmxlci1mMTQtY2FuZGxlcGluLnVzZXJzeXMucmVkaGF0LmNvbTELMAkG
|
||||
A1UEBhMCVVMxEDAOBgNVBAcMB1JhbGVpZ2gwHhcNMTIwOTI0MDAwMDAwWhcNMTMw
|
||||
OTI0MDAwMDAwWjArMSkwJwYDVQQDEyA4YTkwZjgxZDM5ZmFjMGVlMDEzOWZlMzhl
|
||||
NGY2MzE3ZjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK+Dq57Pnq5i
|
||||
IvRT+nyvSMvhxTyzoBQ67Do3AKG0LvRopKLq0gNjouuJCUrLSGIVy2yEnbM+HPnX
|
||||
Nkh/QLsOc6QUcBSVlnFV/Xd/sXB+GtWoy1GzcmMNUUoNDbdIZjj+Omdm0/8ueofG
|
||||
1QDOH4RZHR25lquDovkZU/WzSv5XKyiqPqFiHt+D8QFRXiHb7i6+yLThF4nNdtkk
|
||||
97yai3xHRrRVqWhqR8nYIF7dPHsTByMUSaoRz5iKO5rmg9BBrZE4+kDZLFE+28wR
|
||||
xtzD/Die2GdJwe7mQ5m0HUJC+1g9lyOruAyUKbJxl95HxGObBQZmVMddOZjNC14W
|
||||
Dwt4kLf/qXECAwEAAaOCAS4wggEqMBEGCWCGSAGG+EIBAQQEAwIFoDALBgNVHQ8E
|
||||
BAMCBLAwgYIGA1UdIwR7MHmAFIwL3uxPnqv0NKLwhuL/TkX149zOoVakVDBSMTEw
|
||||
LwYDVQQDDChqc2VmbGVyLWYxNC1jYW5kbGVwaW4udXNlcnN5cy5yZWRoYXQuY29t
|
||||
MQswCQYDVQQGEwJVUzEQMA4GA1UEBwwHUmFsZWlnaIIJAMZok6HSfyb6MB0GA1Ud
|
||||
DgQWBBQH/TRkcUo2VBq+LlvyqSpAMaEQiDATBgNVHSUEDDAKBggrBgEFBQcDAjAS
|
||||
BgkrBgEEAZIICQYEBQwDMy4wMDsGCSsGAQQBkggJBwQuBCx42stLLUstYkjLz2dQ
|
||||
KUrNSU0sBvMTc8oTK4sZChJLMhgA1NoL9QX6yNyT6DANBgkqhkiG9w0BAQUFAAOB
|
||||
gQAMWeuSinQawzoJ8TvcbuC/d3dmJQIPPGNFbFNwADoBEfW4S9bblroMTgms1W5n
|
||||
yFwoJo9WNjnDJbnHFdmesXeA07YkdklMkzfbTtTE+GiTLfd5gjYIkTLka8CaYVpw
|
||||
6kWfcQe8CI7/15rhjCukzTJvguAMDNlGFNlHwXRA+NWTPw==
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN ENTITLEMENT DATA-----
|
||||
eJy1VV1vmzAU/SvI2iM0NuSD8NZO2l4ybVL6tCqqjLmhqGBTY7eLovz3XUNa0jVk
|
||||
2dZFkcDcyzn3nHtttkQo2dgKNElIGM/G8QTSIBLxOhiHGQ3SSUiD6VRkDKYQ80wQ
|
||||
nzxYLk1hNiRhPmls2ghd1KZQkiRb0txbROJP0KgKVBM0oB8R3CeSV4CRyy7ifV16
|
||||
yzbkXVmZlZBhyhPXspA5SSKKwErcg2lIEvqk4pLnUIE0JDHaAkbx3UKAYyzhEUpE
|
||||
/qahKmyFOGZTO6qFC3gR2e18onTmJG6JtFXaio35nK5jlkXzNRcUgLL2jqWzGaU0
|
||||
nrwSOkFGw7VxJlEWBnQehONrSpP2/x1zQWZdMDoSRI+N5sK9PsUlF0JZp4WwMIoY
|
||||
i/DCCFZZa5VZ4UTfbEnhAKMZnU569z6WtjGg0STvqsA8n6CDTWs9YRfUYWtxVxgQ
|
||||
xmpwOORysSCrroTWv5vVzj8Apydb8yvH9IKdxbEnCKNJ345N25s91z41gKo2m7zO
|
||||
MVLytO3jc6hddwlBl/GIJivXOwONCfYrdI2bO3w4Wis1au99gvm3Vjs0XFRgeMYN
|
||||
v4UfdaGRnb44wAbK4+UT3zQBSJ7iaAbPwvoiBxPOrHHUAYw+aCiBN9Dtkb7sN4md
|
||||
A2+khLQXQwfESId+QstQ/Fwpcl/9HoEka142cFxNmzskZnogJozGvxkdqU7NjVT/
|
||||
bWjCgcIMz/OjBr8J/NmQnDMYGh4slpndIle7Ja8vP7vhxktI+h3P8Hfa1iFD/9LJ
|
||||
vlx8Njru66sDaXZwIC0Uz7wrXnIp3vHEiw8IuM7B+1SU4C1tXStt3otk1pMs7zg2
|
||||
xlsapfEj9l4E857gy8vX8V/AV7ufwASTMQ==
|
||||
-----END ENTITLEMENT DATA-----
|
||||
-----BEGIN RSA SIGNATURE-----
|
||||
cN+DtEyAEoB6VRj3JQUiF++Yn/jDEAXpEkU5jtILZmWVBCTm/IgBSoEh8+idrZSF
|
||||
nkAyrw5JB7YbKwmcfhyDU4/tE/x4WLZhd7e4Fs3IndY/S/YzYL8mafOK2PbVGxeA
|
||||
ZyAnDZPe/CYX/FzNEgk4z62EbvYAtMMx4I3aif5qce8=
|
||||
-----END RSA SIGNATURE-----
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIIEowIBAAKCAQEAr4Orns+ermIi9FP6fK9Iy+HFPLOgFDrsOjcAobQu9GikourS
|
||||
A2Oi64kJSstIYhXLbISdsz4c+dc2SH9Auw5zpBRwFJWWcVX9d3+xcH4a1ajLUbNy
|
||||
Yw1RSg0Nt0hmOP46Z2bT/y56h8bVAM4fhFkdHbmWq4Oi+RlT9bNK/lcrKKo+oWIe
|
||||
34PxAVFeIdvuLr7ItOEXic122ST3vJqLfEdGtFWpaGpHydggXt08exMHIxRJqhHP
|
||||
mIo7muaD0EGtkTj6QNksUT7bzBHG3MP8OJ7YZ0nB7uZDmbQdQkL7WD2XI6u4DJQp
|
||||
snGX3kfEY5sFBmZUx105mM0LXhYPC3iQt/+pcQIDAQABAoIBABHAG0dAcCfqvOZA
|
||||
6ABcKdyUxMHS2Mmy+9kXXvT7qBQH0T64yOyW0w9HGK17yaJB2gTrlJdgHMYXweGr
|
||||
HPzOBVv+xScPydtEexHu1B8wYb5iB84He/YQjrwSfeSfadcxvu5eM+qG5NV+gmRG
|
||||
dGGKMauj7V0DPyQ6L4eVzmvSnQbLpYGmfB8wQFuNRFYCYZ90SyuBn2CcC20sAEYZ
|
||||
p76q0qzfdrRjkg//saoh4sU38NgOY3tYSok/14SI+g9EkIHGNFV9/Rq3mvlLcwi/
|
||||
m98Mg69Yt0SF6PNTPwF6ZgsH1yWpvK9laycbEYZ44g7nIQOewQ0aKVHfDQt52rrA
|
||||
/P2rV1ECgYEA+TevV8QdJei5TFpF8ERvbrFJn64SmqD/u5Wamki0QEoZ+SkdioWj
|
||||
1C6jolHj85yVgC5nKBIlNm8f5hqp4p4E0b7BwvH5QbDRg5VDQfV5MBk87LC4Rj7Q
|
||||
WQNhcicWF5pdAdgrmy0uZ2q3J386DS9y2dCm3bItIueKC132H4KzpHMCgYEAtEp9
|
||||
kAqzmG3QJ+aI37e3OeL2XzUNDP47RaZicH5n3mmIVbffkgYu+wHkv7zukl3kdpsx
|
||||
TWTuffjtcueMXmdHsqOukB+XkvcBXsWfweJq66uoxeZhYUQr04NEvapcZ/6wud5t
|
||||
ZvMF/ASLL1zXAZ8IT7Xaufzbld1UT4MItYwcZYsCgYA760yIMInFjI/IsMex/fJA
|
||||
zfVipAqrDNyPsGeMgsB72JUoF9+XZ4w9Pr1vEHtbHiG/wOhidQJndQ5ZV73S06Va
|
||||
/J8/jMgeKDInjeKu4CM0Ek1YpyCXGxEi5bIvLQCdyipkgCHz3EgU605/+5Hsi6T0
|
||||
g7srAGTjyIGjPAMqDlW8ywKBgQCVowXYGam6J9qOY17TH+4pU2Dc4HE2iYO0aUZm
|
||||
y+N1y+1mB7i9v/gaSRYMtcjlHpzSfDhNXio7z/F0Xw44BEyTzhrCcBYj2nL+r9PK
|
||||
3huUAuOPbYkBa81cPiU9rjoH7nHLsvrmaWpcI4FKDCo/pDkHv44Ms/ukxRCG9eCy
|
||||
ndmrxQKBgGJiXMZnKjK9AUUDvsFBSp8Otrf20BoeCiq+tZF95S5jR9/I8nv4NBYp
|
||||
59zCR1DOxxbyAHbRCjqZxdpZVAqKBl1BP+cmw93sAwJ3v9m+V4wFHVUFLJGmkXXV
|
||||
X2mYlgErL9vzxIQrwfL5JdEo9f+PQ0eVs/lh9MPY2TliwEyXDrVp
|
||||
-----END RSA PRIVATE KEY-----
|
BIN
lib/bcprov-jdk16-1.46.jar
Normal file
BIN
lib/bcprov-jdk16-1.46.jar
Normal file
Binary file not shown.
4
run.sh
Executable file
4
run.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/bin/sh
|
||||
|
||||
java -cp ./lib/bcprov-jdk16-1.46.jar:$(ls -rt ./dist/*jar | tail -1) com.hashbangbash.trie.App ./data/test-certv3.pem
|
||||
|
|
@ -4,10 +4,13 @@ import java.util.List;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.File;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
|
@ -15,25 +18,127 @@ import java.io.IOException;
|
|||
import com.redhat.trie.PathNode;
|
||||
import com.redhat.trie.Util;
|
||||
|
||||
import java.util.zip.Inflater;
|
||||
import java.util.zip.InflaterOutputStream;
|
||||
import java.util.zip.Deflater;
|
||||
import java.util.zip.DeflaterOutputStream;
|
||||
import java.util.zip.DataFormatException;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
|
||||
import org.bouncycastle.asn1.*;
|
||||
//import org.bouncycastle.asn1.ASN1Encodable;
|
||||
//import org.bouncycastle.asn1.ASN1InputStream;
|
||||
import org.bouncycastle.x509.extension.X509ExtensionUtil;
|
||||
|
||||
|
||||
public class App {
|
||||
public static void main(String[] args) {
|
||||
public static ASN1InputStream toASN1Stream(byte[] b) {
|
||||
return new ASN1InputStream(new ByteArrayInputStream(b));
|
||||
}
|
||||
|
||||
public final static byte[] decompress(byte[] input) {
|
||||
Inflater inflator = new Inflater();
|
||||
inflator.setInput(input);
|
||||
ByteArrayOutputStream bos = new ByteArrayOutputStream(input.length);
|
||||
byte[] buf = new byte[1024];
|
||||
try {
|
||||
while (true) {
|
||||
int count = inflator.inflate(buf);
|
||||
if (count > 0) {
|
||||
bos.write(buf, 0, count);
|
||||
} else if (count == 0 && inflator.finished()) {
|
||||
break;
|
||||
} else {
|
||||
throw new RuntimeException("bad zip data, size:"
|
||||
+ input.length);
|
||||
}
|
||||
}
|
||||
} catch (DataFormatException t) {
|
||||
throw new RuntimeException(t);
|
||||
} finally {
|
||||
inflator.end();
|
||||
}
|
||||
return bos.toByteArray();
|
||||
}
|
||||
|
||||
public static byte[] getBytesFromFile(File file) throws IOException {
|
||||
InputStream is = new FileInputStream(file);
|
||||
|
||||
// Get the size of the file
|
||||
long length = file.length();
|
||||
|
||||
// You cannot create an array using a long type.
|
||||
// It needs to be an int type.
|
||||
// Before converting to an int type, check
|
||||
// to ensure that file is not larger than Integer.MAX_VALUE.
|
||||
if (length > Integer.MAX_VALUE) {
|
||||
// File is too large
|
||||
}
|
||||
|
||||
// Create the byte array to hold the data
|
||||
byte[] bytes = new byte[(int)length];
|
||||
|
||||
// Read in the bytes
|
||||
int offset = 0;
|
||||
int numRead = 0;
|
||||
while (offset < bytes.length
|
||||
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
|
||||
offset += numRead;
|
||||
}
|
||||
|
||||
// Ensure all the bytes have been read in
|
||||
if (offset < bytes.length) {
|
||||
throw new IOException("Could not completely read file "+file.getName());
|
||||
}
|
||||
|
||||
// Close the input stream and return bytes
|
||||
is.close();
|
||||
return bytes;
|
||||
}
|
||||
|
||||
|
||||
public static List<String> hydrateFromBytes(byte[] derblob) {
|
||||
Util util = new Util();
|
||||
|
||||
try {
|
||||
return util.hydrateContentPackage(derblob);
|
||||
} catch (IOException ex) {
|
||||
System.out.println(ex);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static List<String> hydrateFromFile(String filename) {
|
||||
try {
|
||||
return hydrateFromBytes(getBytesFromFile(new File(filename)));
|
||||
} catch (IOException ex) {
|
||||
System.out.println(ex);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void showTreeFromCSFIle(String filename) {
|
||||
FileInputStream fis;
|
||||
DataInputStream in;
|
||||
BufferedReader br;
|
||||
|
||||
String content;
|
||||
List<String> contentList;
|
||||
Util util = new Util();
|
||||
|
||||
for (String arg : args) {
|
||||
try {
|
||||
fis = new FileInputStream(arg);
|
||||
fis = new FileInputStream(filename);
|
||||
} catch (FileNotFoundException ex) {
|
||||
System.out.printf("ERROR: failed to find file %s\n", arg);
|
||||
continue;
|
||||
System.out.printf("ERROR: failed to find file %s\n", filename);
|
||||
return;
|
||||
} catch (Throwable t) {
|
||||
System.out.printf("ERROR: [%s] %s\n", arg, t);
|
||||
continue;
|
||||
System.out.printf("ERROR: [%s] %s\n", filename, t);
|
||||
return;
|
||||
}
|
||||
|
||||
in = new DataInputStream(fis);
|
||||
|
@ -45,17 +150,93 @@ public class App {
|
|||
contentList.add(content);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
System.out.printf("ERROR: [%s] - %s\n", arg, ex);
|
||||
continue;
|
||||
System.out.printf("ERROR: [%s] - %s\n", filename, ex);
|
||||
return;
|
||||
}
|
||||
|
||||
//System.out.println(contentList.toString());
|
||||
|
||||
PathNode root = new PathNode();
|
||||
util.makePathTree(contentList, root);
|
||||
|
||||
Util.printTree(root, 0);
|
||||
}
|
||||
|
||||
public static ASN1Encodable objectFromCertOid(String certFilename, String oid) {
|
||||
X509Certificate cert;
|
||||
cert = certFromFile(certFilename);
|
||||
if (cert == null) { return null; }
|
||||
|
||||
try {
|
||||
for (String thisOid : cert.getNonCriticalExtensionOIDs()) {
|
||||
if (thisOid.equals(oid)) {
|
||||
return X509ExtensionUtil.fromExtensionValue(cert.getExtensionValue(oid));
|
||||
}
|
||||
}
|
||||
} catch (IOException ex) { }
|
||||
return null;
|
||||
}
|
||||
|
||||
public static X509Certificate certFromFile(String certFilename) {
|
||||
FileInputStream fis;
|
||||
BufferedInputStream bis;
|
||||
CertificateFactory cf;
|
||||
X509Certificate cert;
|
||||
|
||||
try {
|
||||
fis = new FileInputStream(certFilename);
|
||||
} catch (FileNotFoundException ex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
bis = new BufferedInputStream(fis);
|
||||
|
||||
try {
|
||||
cf = CertificateFactory.getInstance("X.509");
|
||||
} catch (CertificateException ex) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
while (bis.available() > 0) {
|
||||
cert = (X509Certificate) cf.generateCertificate(bis);
|
||||
return cert;
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
} catch (CertificateException cex) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (String arg : args) {
|
||||
//showTreeFromCSFIle(arg);
|
||||
//showTreeFromCSFIle(arg);
|
||||
//bytesFromCertOid(arg, "1.3.6.1.4.1.2312.9.7");
|
||||
//System.out.println(objectFromCertOid(arg, "1.3.6.1.4.1.2312.9.7").toString());
|
||||
|
||||
//System.out.println(objectFromCertOid(arg, "1.3.6.1.4.1.2312.9.7").getClass().getName());
|
||||
DEROctetString dos;
|
||||
byte[] bytes;
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
List<String> contents;
|
||||
|
||||
dos = (DEROctetString)objectFromCertOid(arg, "1.3.6.1.4.1.2312.9.7");
|
||||
try {
|
||||
baos.write(dos.getOctets());
|
||||
} catch (IOException ex) {
|
||||
System.out.println(ex);
|
||||
}
|
||||
bytes = decompress(baos.toByteArray());
|
||||
contents = hydrateFromBytes(bytes);
|
||||
if (contents != null) {
|
||||
for (String content : contents) {
|
||||
System.out.println(content);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//X509Certificate cert = certFromFile(arg);
|
||||
//System.out.println(cert.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -521,6 +521,7 @@ public class Util {
|
|||
pathDictionary.add(new HuffNode(HuffNode.END_NODE, weight));
|
||||
HuffNode pathTrie = makeTrie(pathDictionary);
|
||||
|
||||
// setup input stream, offset by the dictionary, to the end
|
||||
StringBuffer nodeBits = new StringBuffer();
|
||||
ByteArrayInputStream bais = new ByteArrayInputStream(payload,
|
||||
(new Long(read)).intValue(), (new Long(payload.length - read).intValue()));
|
||||
|
|
Loading…
Reference in a new issue