Title: [1035] trunk/jopenssl: Start adding tests for pkcs7 and add basis of implementation
Revision
1035
Author
olabini
Date
2008-07-06 11:06:14 -0400 (Sun, 06 Jul 2008)

Log Message

Start adding tests for pkcs7 and add basis of implementation

Modified Paths


Added Paths

Diff

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


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/PKCS7.java	2008-07-02 16:18:23 UTC (rev 1034)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/PKCS7.java	2008-07-06 15:06:14 UTC (rev 1035)
@@ -250,10 +250,21 @@
         return getRuntime().getNil();
     }
 
+    /** ossl_pkcs7_get_signer
+     * 
+     * This seems to return a list of SignerInfo objects.
+     *
+     */
     @JRubyMethod
     public IRubyObject signers() {
-        System.err.println("WARNING: un.implemented method called PKCS7#signers");
-        return getRuntime().getNil();
+        Collection signers = this.signedData.getSignerInfos().getSigners();
+
+        List<IRubyObject> ary = new ArrayList<IRubyObject>(signers.size());
+        for(Object signer : signers) {
+            ary.add(SignerInfo.create(getRuntime(), (SignerInformation)signer));
+        }
+
+        return getRuntime().newArray(ary);
     }
 
     @JRubyMethod
@@ -374,7 +385,6 @@
   
         while(it.hasNext()) {
             final SignerInformation   signer = (SignerInformation)it.next();
-            System.err.println(signer.getSignedAttributes().toHashtable());
 
             Collection          certCollection = _x509s.getCertificates(signer.getSID());
             Iterator        certIt = certCollection.iterator();
@@ -400,6 +410,7 @@
                                 result[0] = signer.verify(cert2, "BC");
                             } catch(GeneralSecurityException e) {
                             } catch(CMSException e) {
+                            } catch(NullPointerException e) {
                             }
                         }
                     });
@@ -445,10 +456,20 @@
             cPKCS7Signer.defineAnnotatedMethods(SignerInfo.class);
         }
 
+        public static SignerInfo create(Ruby runtime, SignerInformation info) {
+            SignerInfo sinfo = new SignerInfo(runtime, (RubyClass)(((RubyModule)(runtime.getModule("OpenSSL").getConstant("PKCS7"))).getConstant("SignerInfo")));
+            sinfo.initWithSignerInformation(info);
+            return sinfo;
+        }
+
         public SignerInfo(Ruby runtime, RubyClass type) {
             super(runtime,type);
         }
 
+        private void initWithSignerInformation(SignerInformation info) {
+        
+        }
+
         @JRubyMethod
         public IRubyObject initialize(IRubyObject arg1, IRubyObject arg2, IRubyObject arg3) {
             System.err.println("WARNING: un-implemented method called SignerInfo#initialize");

Added: trunk/jopenssl/test/openssl/test_pkcs7.rb (0 => 1035)


--- trunk/jopenssl/test/openssl/test_pkcs7.rb	                        (rev 0)
+++ trunk/jopenssl/test/openssl/test_pkcs7.rb	2008-07-06 15:06:14 UTC (rev 1035)
@@ -0,0 +1,154 @@
+begin
+  require "openssl"
+  require File.join(File.dirname(__FILE__), "utils.rb")
+rescue LoadError
+end
+require "test/unit"
+
+if defined?(OpenSSL)
+
+class OpenSSL::TestPKCS7 < Test::Unit::TestCase
+  def setup
+    @rsa1024 = OpenSSL::TestUtils::TEST_KEY_RSA1024
+    @rsa2048 = OpenSSL::TestUtils::TEST_KEY_RSA2048
+    ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA")
+    ee1 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE1")
+    ee2 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE2")
+
+    now = Time.now
+    ca_exts = [
+      ["basicConstraints","CA:TRUE",true],
+      ["keyUsage","keyCertSign, cRLSign",true],
+      ["subjectKeyIdentifier","hash",false],
+      ["authorityKeyIdentifier","keyid:always",false],
+    ]
+    @ca_cert = issue_cert(ca, @rsa2048, 1, Time.now, Time.now+3600, ca_exts,
+                           nil, nil, OpenSSL::Digest::SHA1.new)
+    ee_exts = [
+      ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true],
+      ["authorityKeyIdentifier","keyid:always",false],
+      ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false],
+    ]
+    @ee1_cert = issue_cert(ee1, @rsa1024, 2, Time.now, Time.now+1800, ee_exts,
+                           @ca_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
+    @ee2_cert = issue_cert(ee2, @rsa1024, 3, Time.now, Time.now+1800, ee_exts,
+                           @ca_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
+  end
+
+  def issue_cert(*args)             
+    OpenSSL::TestUtils.issue_cert(*args)
+  end
+
+  def test_signed
+    store = OpenSSL::X509::Store.new
+    store.add_cert(@ca_cert)
+    ca_certs = [EMAIL PROTECTED]
+
+    data = ""
+    tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs)
+    p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
+    certs = p7.certificates
+    signers = p7.signers
+    assert(p7.verify([], store))
+    assert_equal(data, p7.data)
+    assert_equal(2, certs.size)
+    assert_equal(@ee1_cert.subject.to_s, certs[0].subject.to_s)
+    assert_equal(@ca_cert.subject.to_s, certs[1].subject.to_s)
+    assert_equal(1, signers.size)
+    assert_equal(@ee1_cert.serial, signers[0].serial)
+    assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
+
+    # Normaly OpenSSL tries to translate the supplied content into canonical
+    # MIME format (e.g. a newline character is converted into CR+LF).
+    # If the content is a binary, PKCS7::BINARY flag should be used.
+
+    data = ""
+    flag = OpenSSL::PKCS7::BINARY
+    tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs, flag)
+    p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
+    certs = p7.certificates
+    signers = p7.signers
+    assert(p7.verify([], store))
+    assert_equal(data, p7.data)
+    assert_equal(2, certs.size)
+    assert_equal(@ee1_cert.subject.to_s, certs[0].subject.to_s)
+    assert_equal(@ca_cert.subject.to_s, certs[1].subject.to_s)
+    assert_equal(1, signers.size)
+    assert_equal(@ee1_cert.serial, signers[0].serial)
+    assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
+
+    # A signed-data which have multiple signatures can be created 
+    # through the following steps.
+    #   1. create two signed-data
+    #   2. copy signerInfo and certificate from one to another
+
+    tmp1 = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, [], flag)
+    tmp2 = OpenSSL::PKCS7.sign(@ee2_cert, @rsa1024, data, [], flag)
+    tmp1.add_signer(tmp2.signers[0])
+    tmp1.add_certificate(@ee2_cert)  
+
+    p7 = OpenSSL::PKCS7::PKCS7.new(tmp1.to_der)
+    certs = p7.certificates
+    signers = p7.signers
+    assert(p7.verify([], store))
+    assert_equal(data, p7.data)
+    assert_equal(2, certs.size)
+    assert_equal(2, signers.size)
+    assert_equal(@ee1_cert.serial, signers[0].serial)
+    assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
+    assert_equal(@ee2_cert.serial, signers[1].serial)
+    assert_equal(@ee2_cert.issuer.to_s, signers[1].issuer.to_s)
+  end
+
+  def test_detached_sign
+    store = OpenSSL::X509::Store.new
+    store.add_cert(@ca_cert)
+    ca_certs = [EMAIL PROTECTED]
+
+    data = ""
+    flag = OpenSSL::PKCS7::BINARY|OpenSSL::PKCS7::DETACHED
+    tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs, flag)
+    p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
+    a1 = OpenSSL::ASN1.decode(p7)
+
+    certs = p7.certificates
+    signers = p7.signers
+    assert(!p7.verify([], store))
+    assert(p7.verify([], store, data))
+    assert_equal(data, p7.data)
+    assert_equal(2, certs.size)
+    assert_equal(@ee1_cert.subject.to_s, certs[0].subject.to_s)
+    assert_equal(@ca_cert.subject.to_s, certs[1].subject.to_s)
+    assert_equal(1, signers.size)
+    assert_equal(@ee1_cert.serial, signers[0].serial)
+    assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
+  end
+
+  def test_enveloped
+    if OpenSSL::OPENSSL_VERSION_NUMBER <= 0x0090704f
+      # PKCS7_encrypt() of OpenSSL-0.9.7d goes to SEGV.
+      # http://www.mail-archive.com/[EMAIL PROTECTED]/msg17376.html
+      return
+    end
+
+    certs = [EMAIL PROTECTED], @ee2_cert]
+    cipher = OpenSSL::Cipher::AES.new("128-CBC")
+    data = ""
+
+    tmp = OpenSSL::PKCS7.encrypt(certs, data, cipher, OpenSSL::PKCS7::BINARY)
+    p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
+    recip = p7.recipients
+    assert_equal(:enveloped, p7.type)
+    assert_equal(2, recip.size)
+
+    assert_equal(@ca_cert.subject.to_s, recip[0].issuer.to_s)
+    assert_equal(2, recip[0].serial)
+    assert_equal(data, p7.decrypt(@rsa1024, @ee1_cert))
+
+    assert_equal(@ca_cert.subject.to_s, recip[1].issuer.to_s)
+    assert_equal(3, recip[1].serial)
+    assert_equal(data, p7.decrypt(@rsa1024, @ee2_cert))
+  end
+end
+
+end

Modified: trunk/jopenssl/test/test_openssl.rb (1034 => 1035)


--- trunk/jopenssl/test/test_openssl.rb	2008-07-02 16:18:23 UTC (rev 1034)
+++ trunk/jopenssl/test/test_openssl.rb	2008-07-06 15:06:14 UTC (rev 1035)
@@ -14,6 +14,7 @@
 protect_require 'openssl/test_hmac'
 protect_require 'openssl/test_ns_spki'
 protect_require 'openssl/test_pair'
+protect_require 'openssl/test_pkcs7'
 protect_require 'openssl/test_pkey_rsa'
 protect_require 'openssl/test_ssl'
 protect_require 'openssl/test_x509cert'
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to