--- /dev/null
+package org.ibex.net.ssl;
+
+import java.io.*;
+//import org.bouncycastle.asn1.*;
+//import org.bouncycastle.asn1.x509.*;
+
+public class GenCompactCAList {
+ /*
+ public static void main(String[] args) throws Exception {
+ if(args.length < 2) throw new Exception("Usage: GenCAList format file(s)");
+ String format = args[0];
+ DER.EncodableVector vec = new DEREncodableVector();
+ for(int i=1;i<args.length;i++) {
+ X509.CertificateStructure x509 = new X509.CertificateStructure((ASN1Sequence) new ASN1InputStream(new FileInputStream(args[i])).readObject());
+ X509.Name subject = x509.getSubject();
+ SubjectPublicKeyInfo pki = x509.getSubjectPublicKeyInfo();
+ RSA.PublicKeyStructure rsa = new RSA.PublicKeyStructure((ASN1Sequence) pki.getPublicKey());
+ DER.EncodableVector vec2 = new DEREncodableVector();
+ vec2.add(subject);
+ vec2.add(rsa);
+ vec.add(new DERSequence(vec2));
+ }
+ if(format.equals("binary")) {
+ DER.OutputStream dos = new DEROutputStream(System.out);
+ dos.writeObject(new DERSequence(vec));
+ dos.close();
+ } else if(format.equals("class")){
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ DER.OutputStream dos = new DEROutputStream(baos);
+ dos.writeObject(new DERSequence(vec));
+ dos.close();
+ baos.close();
+ byte[] buf = baos.toByteArray();
+ StringBuffer sb = new StringBuffer();
+ for(int i=0;i<buf.length;i+=7) {
+ long l = 0;
+ for(int j=0;j<7;j++) {
+ l <<= 8;
+ byte b = (i+j < buf.length) ? buf[i+j] : -1;
+ l |= (b & 0xffL);
+ }
+ for(int j=0;j<8;j++) {
+ char c = (char) ((l>>>(7*(7-j)))&0x7f);
+ if(c=='\n') sb.append("\\n");
+ else if(c=='\r') sb.append("\\r");
+ else if(c=='\\') sb.append("\\\\");
+ else if(c=='"') sb.append("\\\"");
+ else if(c >= 32 && c <= 126) sb.append(c);
+ else sb.append("\\" + toOctal3(c));
+ }
+ }
+ System.out.println("package org.ibex.net.ssl;");
+ System.out.println("public final class RootCerts {");
+ System.out.println(" private final static String DATA = \"" + sb.toString() + "\";");
+ System.out.print(
+ " static {\n" +
+ " try {\n" +
+ " org.ibex.net.SSL.addCompactCAKeys(new java.io.ByteArrayInputStream(unpack(DATA)));\n" +
+ " } catch(Exception e) {\n" +
+ " System.err.println(\"Error loading root CA keys: \" + e.getMessage());\n" +
+ " }\n" +
+ " }\n");
+ System.out.println(" public static void load() { }"); // force clinit
+ System.out.print(
+ " private static byte[] unpack(String s) {\n" +
+ " int len = s.length();\n" +
+ " if(len % 8 != 0) throw new IllegalArgumentException(\"not a multiple of 8\");\n" +
+ " byte[] ret = new byte[(len / 8) * 7];\n" +
+ " for(int i=0; i<len; i += 8) {\n" +
+ " long l = 0;\n" +
+ " for(int j=0;j<8;j++) {\n" +
+ " l <<= 7;\n" +
+ " l |= (s.charAt(i + j) & 0x7fL);\n" +
+ " }\n" +
+ " int base = (i / 8) * 7;\n" +
+ " for(int j=6; j>=0; j--) {\n" +
+ " ret[base + j] = (byte)(l & 0xff);\n" +
+ " l >>>= 8;\n" +
+ " }\n" +
+ " }\n" +
+ " return ret;\n" +
+ " }");
+ System.out.println("}");
+ } else {
+ throw new Error("unknown format");
+ }
+ }
+
+ private final static String toOctal3(int n) {
+ char[] buf = new char[3];
+ for(int i=2;i>=0;i--) {
+ buf[i] = (char) ('0' + (n & 7));
+ n >>= 3;
+ }
+ return new String(buf);
+ }
+ */
+}