Title: [1098] trunk/jopenssl/src/java/org/jruby/ext/openssl: Handle turning stuff into ASN1 more correctly, for more objects.

Diff

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/PKCS7.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/PKCS7.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/PKCS7.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -58,6 +58,7 @@
 import org.jruby.Ruby;
 import org.jruby.RubyArray;
 import org.jruby.RubyClass;
+import org.jruby.RubyFile;
 import org.jruby.RubyModule;
 import org.jruby.RubyNumeric;
 import org.jruby.RubyObject;
@@ -65,6 +66,7 @@
 import org.jruby.anno.JRubyMethod;
 import org.jruby.exceptions.RaiseException;
 import org.jruby.ext.openssl.impl.BIO;
+import org.jruby.ext.openssl.impl.MemBIO;
 import org.jruby.ext.openssl.impl.Mime;
 import org.jruby.ext.openssl.impl.SMIME;
 import org.jruby.ext.openssl.x509store.PEMInputOutput;
@@ -113,7 +115,18 @@
     }
 
     public static BIO obj2bio(IRubyObject obj) {
-        return null;
+        if(obj instanceof RubyFile) {
+            throw new IllegalArgumentException("TODO: handle RubyFile correctly");
+//     if (TYPE(obj) == T_FILE) {
+//         OpenFile *fptr;
+//         GetOpenFile(obj, fptr);
+//         rb_io_check_readable(fptr);
+//         bio = BIO_new_fp(fptr->f, BIO_NOCLOSE);
+        } else {
+            RubyString str = obj.convertToString();
+            ByteList bl = str.getByteList();
+            return BIO.memBuf(bl.bytes, bl.begin, bl.realSize);
+        }
     }
 
     public static PKCS7 wrap(RubyClass klass, org.jruby.ext.openssl.impl.PKCS7 p7) {
@@ -123,7 +136,7 @@
     }
 
     public static IRubyObject membio2str(Ruby runtime, BIO bio) {
-        return null;
+        return runtime.newString(new ByteList(((MemBIO)bio).getMemCopy(), false));
     }
 
     public static class ModuleMethods {
@@ -218,30 +231,14 @@
         arg = args[0];
 
         arg = OpenSSLImpl.to_der_if_possible(arg);
-        
+        BIO input = obj2bio(arg);
+        p7 = org.jruby.ext.openssl.impl.PKCS7.readPEM(input);
+        if(p7 == null) {
+            input.reset();
+            p7 = org.jruby.ext.openssl.impl.PKCS7.fromASN1(input);
+        }
 
-//     PKCS7 *p7;
-//     BIO *in;
-//     VALUE arg;
-
-//     if(rb_scan_args(argc, argv, "01", &arg) == 0)
-//         return self;
-//     arg = ossl_to_der_if_possible(arg);
-//     in = ossl_obj2bio(arg);
-//     p7 = PEM_read_bio_PKCS7(in, (PKCS7 **)&DATA_PTR(self), NULL, NULL);
-//     if (!p7) {
-//         BIO_reset(in);
-//         p7 = d2i_PKCS7_bio(in, (PKCS7 **)&DATA_PTR(self));
-//     }
-//     BIO_free(in);
-//     ossl_pkcs7_set_data(self, Qnil);
-//     ossl_pkcs7_set_err_string(self, Qnil);
-
-//     return self;
-
-
-
-        System.err.println("WARNING: un-implemented method called PKCS7#initialize");
+        setData(getRuntime().getNil());
         return this;
     }
 

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/BIO.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/BIO.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/BIO.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -166,10 +166,17 @@
      *
      */
     public static BIO memBuf(byte[] arr) {
+        return memBuf(arr, 0, arr.length);
+    }
+
+    /** c: BIO_new_mem_buf
+     *
+     */
+    public static BIO memBuf(byte[] arr, int offset, int length) {
         // TODO: create real readonly version of MemBIO.
         try {
             BIO bio = new MemBIO();
-            bio.write(arr, 0, arr.length);
+            bio.write(arr, offset, length);
             return bio;
         } catch(IOException e) {
             return null;
@@ -314,4 +321,11 @@
     public int getType() {
         return TYPE_BIO;
     }
+
+    /** c: BIO_reset
+     *
+     */
+    public void reset() {
+        throw new UnsupportedOperationException();
+    }
 }// BIO

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/EncContent.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/EncContent.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/EncContent.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -28,10 +28,13 @@
 package org.jruby.ext.openssl.impl;
 
 import javax.crypto.Cipher;
+import org.bouncycastle.asn1.ASN1Encodable;
+import org.bouncycastle.asn1.ASN1EncodableVector;
 import org.bouncycastle.asn1.ASN1OctetString;
 import org.bouncycastle.asn1.ASN1Sequence;
 import org.bouncycastle.asn1.DEREncodable;
 import org.bouncycastle.asn1.DERObjectIdentifier;
+import org.bouncycastle.asn1.DERSequence;
 import org.bouncycastle.asn1.DERTaggedObject;
 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
 
@@ -162,4 +165,14 @@
         }
         return ec;
     }
+
+    public ASN1Encodable asASN1() {
+        ASN1EncodableVector vector = new ASN1EncodableVector();
+        vector.add(ASN1Registry.nid2obj(contentType).toASN1Object());
+        vector.add(algorithm.toASN1Object());
+        if(encData != null) {
+            vector.add(new DERTaggedObject(0, encData).toASN1Object());
+        }
+        return new DERSequence(vector);
+   }
 }// EncContent

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/Envelope.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/Envelope.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/Envelope.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -32,10 +32,14 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import org.bouncycastle.asn1.ASN1Encodable;
+import org.bouncycastle.asn1.ASN1EncodableVector;
 import org.bouncycastle.asn1.ASN1Sequence;
 import org.bouncycastle.asn1.ASN1Set;
 import org.bouncycastle.asn1.DEREncodable;
 import org.bouncycastle.asn1.DERInteger;
+import org.bouncycastle.asn1.DERSequence;
+import org.bouncycastle.asn1.DERSet;
 
 /** PKCS7_ENVELOPE
  *
@@ -138,7 +142,22 @@
         return envelope;
     }
 
+    public ASN1Encodable asASN1() {
+        ASN1EncodableVector vector = new ASN1EncodableVector();
+        vector.add(new DERInteger(version));
+        vector.add(receipientInfosToASN1Set());
+        vector.add(encData.asASN1());
+        return new DERSequence(vector);
+    }
 
+    private ASN1Set receipientInfosToASN1Set() {
+        ASN1EncodableVector vector = new ASN1EncodableVector();
+        for(RecipInfo ri : getRecipientInfo()) {
+            vector.add(ri.asASN1());
+        }
+        return new DERSet(vector);
+    }
+
     private static Set<RecipInfo> recipientInfosFromASN1Set(DEREncodable content) {
         ASN1Set set = (ASN1Set)content;
         Set<RecipInfo> result = new HashSet<RecipInfo>();

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/MemBIO.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/MemBIO.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/MemBIO.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -110,4 +110,8 @@
         System.arraycopy(buffer, 0, nbuf, 0, slen);
         return nbuf;
     }
+
+    public void reset() {
+        this.rpointer = 0;
+    }
 }// MemBIO

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -135,10 +135,12 @@
         return fromASN1(ais.readObject());
     }
 
-    protected ASN1Encodable asASN1() {
+    public ASN1Encodable asASN1() {
         ASN1EncodableVector vector = new ASN1EncodableVector();
         DERObjectIdentifier contentType = ASN1Registry.nid2obj(getType());
         vector.add(contentType);
+        vector.add(data.asASN1());
+
         return new DERSequence(vector);
     }
 
@@ -292,14 +294,13 @@
                 if(Arrays.equals(PEM_STRING_PKCS7_START, tmp)) {
                     return fromASN1(BIO.base64Filter(input));
                 } else {
-                    /// TODO: err
                     return null;
                 }
             } else {
                 return null;
             }
         } catch(IOException e) {
-            throw new PKCS7Exception(F_SMIME_READ_PKCS7, -1, e.toString());
+            return null;
         }
     }
 

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7Data.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7Data.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7Data.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -162,4 +162,8 @@
             throw new UnsupportedOperationException("can't handle PKCS#7 with content type " + ASN1Registry.nid2ln(nid));
         }
     }
+
+    public ASN1Encodable asASN1() {
+        throw new UnsupportedOperationException("can't ASN1 PKCS#7 with content type " + ASN1Registry.nid2ln(getType()));
+    }
 }// PKCS7Data

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataEnveloped.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataEnveloped.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataEnveloped.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -27,8 +27,9 @@
  ***** END LICENSE BLOCK *****/
 package org.jruby.ext.openssl.impl;
 
+
 import javax.crypto.Cipher;
-
+import org.bouncycastle.asn1.ASN1Encodable;
 import org.bouncycastle.asn1.DEREncodable;
 
 /**
@@ -77,4 +78,8 @@
     public static PKCS7DataEnveloped fromASN1(DEREncodable content) {
         return new PKCS7DataEnveloped(Envelope.fromASN1(content));
     }
+
+    public ASN1Encodable asASN1() {
+        return enveloped.asASN1();
+    }
 }// PKCS7DataEnveloped

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/RecipInfo.java (1097 => 1098)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/RecipInfo.java	2008-08-08 10:54:37 UTC (rev 1097)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/impl/RecipInfo.java	2008-08-08 10:54:41 UTC (rev 1098)
@@ -31,6 +31,8 @@
 import java.io.IOException;
 import java.math.BigInteger;
 import java.security.cert.X509Certificate;
+import org.bouncycastle.asn1.ASN1Encodable;
+import org.bouncycastle.asn1.ASN1EncodableVector;
 import org.bouncycastle.asn1.ASN1InputStream;
 import org.bouncycastle.asn1.ASN1OctetString;
 import org.bouncycastle.asn1.DEREncodable;
@@ -219,4 +221,13 @@
         ri.setEncKey((ASN1OctetString)sequence.getObjectAt(3));
         return ri;
     }
+
+    public ASN1Encodable asASN1() {
+        ASN1EncodableVector vector = new ASN1EncodableVector();
+        vector.add(new DERInteger(getVersion()));
+        vector.add(issuerAndSerial.toASN1Object()); 
+        vector.add(keyEncAlgor.toASN1Object());
+        vector.add(encKey.toASN1Object());
+        return new DERSequence(vector);
+    }
 }// RecipInfo
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to