Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Various fixes #9

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/java/org/jruby/ext/openssl/PKCS7.java
Expand Up @@ -260,6 +260,7 @@ public IRubyObject getData() {
public IRubyObject _initialize(IRubyObject[] args) {
IRubyObject arg = null;
if(Arity.checkArgumentCount(getRuntime(), args, 0, 1) == 0) {
p7 = new org.jruby.ext.openssl.impl.PKCS7();
return this;
}
arg = args[0];
Expand Down Expand Up @@ -288,9 +289,10 @@ public IRubyObject initialize_copy(IRubyObject obj) {
}

@JRubyMethod(name="type=")
public IRubyObject set_type(IRubyObject obj) {
System.err.println("WARNING: unimplemented method called PKCS7#type=");
return getRuntime().getNil();
public IRubyObject set_type(IRubyObject obj) throws PKCS7Exception {
String str = obj.convertToString().asJavaString();
p7.setTypeByName(str);
return obj;
}

@JRubyMethod(name="type")
Expand Down
17 changes: 14 additions & 3 deletions src/java/org/jruby/ext/openssl/Request.java
Expand Up @@ -138,9 +138,20 @@ public Object call() throws GeneralSecurityException {
}
ASN1Set in_attrs = req.getCertificationRequestInfo().getAttributes();
for(Enumeration enm = in_attrs.getObjects();enm.hasMoreElements();) {
DERSet obj = (DERSet)enm.nextElement();
for(Enumeration enm2 = obj.getObjects();enm2.hasMoreElements();) {
DERSequence val = (DERSequence)enm2.nextElement();
Enumeration enm2;
Object next = enm.nextElement();
if (next instanceof DERSet) {
enm2 = ((DERSet)next).getObjects();
while(enm2.hasMoreElements()) {
DERSequence val = (DERSequence)enm2.nextElement();
DERObjectIdentifier v0 = (DERObjectIdentifier)val.getObjectAt(0);
DERObject v1 = (DERObject)val.getObjectAt(1);
IRubyObject a1 = getRuntime().newString(ASN1.getSymLookup(getRuntime()).get(v0));
IRubyObject a2 = ASN1.decode(getRuntime().getClassFromPath("OpenSSL::ASN1"), RubyString.newString(getRuntime(), v1.getDEREncoded()));
add_attribute(Utils.newRubyInstance(getRuntime(), "OpenSSL::X509::Attribute", new IRubyObject[] { a1, a2 }));
}
} else if (next instanceof DERSequence) {
DERSequence val = (DERSequence)next;
DERObjectIdentifier v0 = (DERObjectIdentifier)val.getObjectAt(0);
DERObject v1 = (DERObject)val.getObjectAt(1);
IRubyObject a1 = getRuntime().newString(ASN1.getSymLookup(getRuntime()).get(v0));
Expand Down
23 changes: 22 additions & 1 deletion src/java/org/jruby/ext/openssl/impl/EncContent.java
Expand Up @@ -27,12 +27,14 @@
***** END LICENSE BLOCK *****/
package org.jruby.ext.openssl.impl;

import java.util.Enumeration;
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.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
Expand Down Expand Up @@ -157,7 +159,26 @@ public static EncContent fromASN1(DEREncodable content) {
ec.setAlgorithm(AlgorithmIdentifier.getInstance(sequence.getObjectAt(1)));
if(sequence.size() > 2 && sequence.getObjectAt(2) instanceof DERTaggedObject && ((DERTaggedObject)(sequence.getObjectAt(2))).getTagNo() == 0) {
DEREncodable ee = ((DERTaggedObject)(sequence.getObjectAt(2))).getObject();
if(ee instanceof ASN1Sequence) {
if(ee instanceof ASN1Sequence) { // OctetString split into multiple OctetStrings in a Sequence
if (((ASN1Sequence)ee).size() > 0) {
// merge back into single OctetString
int totalSize = 0;
Enumeration e = ((ASN1Sequence)ee).getObjects();
while (e.hasMoreElements()) {
byte[] octets = ((ASN1OctetString)e.nextElement()).getOctets();
totalSize += octets.length;
}
byte[] data = new byte[totalSize];

int current = 0;
e = ((ASN1Sequence)ee).getObjects();
while (e.hasMoreElements()) {
byte[] octets = ((ASN1OctetString)e.nextElement()).getOctets();
System.arraycopy(octets, 0, data, current, octets.length);
current += octets.length;
}
ec.setEncData(new DEROctetString(data));
}
} else {
ec.setEncData((ASN1OctetString)ee);
}
Expand Down
28 changes: 28 additions & 0 deletions src/java/org/jruby/ext/openssl/impl/PKCS7.java
Expand Up @@ -104,6 +104,12 @@ private void initiateWith(Integer nid, DEREncodable content) throws PKCS7Excepti
this.data = PKCS7Data.fromASN1(nid, content);
}

public static PKCS7 newEmpty() {
PKCS7 p7 = new PKCS7();
p7.data = new PKCS7DataData();
return p7;
}

/**
* ContentInfo ::= SEQUENCE {
* contentType ContentType,
Expand Down Expand Up @@ -493,6 +499,21 @@ public void decrypt(PrivateKey pkey, X509AuxCertificate cert, BIO data, int flag
}
}

public void setTypeByName(String type) throws PKCS7Exception {
if (TYPE_signed.equals(type))
this.data = new PKCS7DataSigned();
else if (TYPE_data.equals(type))
this.data = new PKCS7DataData();
else if (TYPE_signedAndEnveloped.equals(type))
this.data = new PKCS7DataSignedAndEnveloped();
else if (TYPE_enveloped.equals(type))
this.data = new PKCS7DataEnveloped();
else if (TYPE_encrypted.equals(type))
this.data = new PKCS7DataEncrypted();
else
throw new PKCS7Exception(F_PKCS7_SET_TYPE,R_UNSUPPORTED_CONTENT_TYPE);
}

/** c: PKCS7_set_type
*
*/
Expand Down Expand Up @@ -1261,5 +1282,12 @@ public ASN1OctetString getOctetString() {
}
return null;
}

public final static String TYPE_signed = "signed";
public final static String TYPE_encrypted = "encrypted";
public final static String TYPE_enveloped = "enveloped";
public final static String TYPE_signedAndEnveloped = "signedAndEnveloped";
public final static String TYPE_data = "data";

}// PKCS7

3 changes: 3 additions & 0 deletions src/java/org/jruby/ext/openssl/impl/Signed.java
Expand Up @@ -199,6 +199,9 @@ public ASN1Encodable asASN1() {
ASN1EncodableVector vector = new ASN1EncodableVector();
vector.add(new DERInteger(version));
vector.add(digestAlgorithmsToASN1Set());
if (contents == null) {
contents = PKCS7.newEmpty();
}
vector.add(contents.asASN1());
if (cert != null && cert.size() > 0) {
if (cert.size() > 1) {
Expand Down