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