added SSL
[org.ibex.net.git] / src / org / ibex / net / ssl / GenCompactCAList.java
diff --git a/src/org/ibex/net/ssl/GenCompactCAList.java b/src/org/ibex/net/ssl/GenCompactCAList.java
new file mode 100644 (file)
index 0000000..e15a194
--- /dev/null
@@ -0,0 +1,98 @@
+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);
+    }
+    */
+}