jruby-jruby-openssl 0.5.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. data/History.txt +34 -0
  2. data/License.txt +30 -0
  3. data/README.txt +24 -0
  4. data/lib/bcmail-jdk14-139.jar +0 -0
  5. data/lib/bcprov-jdk14-139.jar +0 -0
  6. data/lib/jopenssl.jar +0 -0
  7. data/lib/jopenssl/version.rb +5 -0
  8. data/lib/openssl.rb +24 -0
  9. data/lib/openssl/bn.rb +35 -0
  10. data/lib/openssl/buffering.rb +239 -0
  11. data/lib/openssl/cipher.rb +58 -0
  12. data/lib/openssl/digest.rb +48 -0
  13. data/lib/openssl/dummy.rb +34 -0
  14. data/lib/openssl/dummyssl.rb +13 -0
  15. data/lib/openssl/ssl.rb +135 -0
  16. data/lib/openssl/x509.rb +154 -0
  17. data/test/fixture/cacert.pem +23 -0
  18. data/test/fixture/cert_localhost.pem +19 -0
  19. data/test/fixture/localhost_keypair.pem +18 -0
  20. data/test/openssl/ssl_server.rb +99 -0
  21. data/test/openssl/test_asn1.rb +199 -0
  22. data/test/openssl/test_cipher.rb +174 -0
  23. data/test/openssl/test_digest.rb +88 -0
  24. data/test/openssl/test_hmac.rb +44 -0
  25. data/test/openssl/test_ns_spki.rb +69 -0
  26. data/test/openssl/test_pair.rb +149 -0
  27. data/test/openssl/test_pkcs7.rb +159 -0
  28. data/test/openssl/test_pkey_rsa.rb +49 -0
  29. data/test/openssl/test_ssl.rb +307 -0
  30. data/test/openssl/test_x509cert.rb +236 -0
  31. data/test/openssl/test_x509crl.rb +234 -0
  32. data/test/openssl/test_x509ext.rb +74 -0
  33. data/test/openssl/test_x509name.rb +265 -0
  34. data/test/openssl/test_x509req.rb +178 -0
  35. data/test/openssl/test_x509store.rb +245 -0
  36. data/test/openssl/utils.rb +135 -0
  37. data/test/pkcs7_mime_enveloped.message +19 -0
  38. data/test/pkcs7_mime_signed.message +30 -0
  39. data/test/pkcs7_multipart_signed.message +45 -0
  40. data/test/ref/a.out +0 -0
  41. data/test/ref/compile.rb +8 -0
  42. data/test/ref/pkcs1 +0 -0
  43. data/test/ref/pkcs1.c +21 -0
  44. data/test/test_cipher.rb +81 -0
  45. data/test/test_integration.rb +100 -0
  46. data/test/test_java.rb +98 -0
  47. data/test/test_java_attribute.rb +25 -0
  48. data/test/test_java_bio.rb +42 -0
  49. data/test/test_java_mime.rb +173 -0
  50. data/test/test_java_pkcs7.rb +769 -0
  51. data/test/test_java_smime.rb +177 -0
  52. data/test/test_openssl.rb +34 -0
  53. data/test/test_openssl_x509.rb +34 -0
  54. data/test/test_pkey.rb +46 -0
  55. data/test/ut_eof.rb +128 -0
  56. metadata +120 -0
@@ -0,0 +1,88 @@
1
+ begin
2
+ require "openssl"
3
+ rescue LoadError
4
+ end
5
+ require "digest/md5"
6
+ require "test/unit"
7
+
8
+ if defined?(OpenSSL)
9
+
10
+ class OpenSSL::TestDigest < Test::Unit::TestCase
11
+ def setup
12
+ @d1 = OpenSSL::Digest::Digest::new("MD5")
13
+ @d2 = OpenSSL::Digest::MD5.new
14
+ @md = Digest::MD5.new
15
+ @data = "DATA"
16
+ end
17
+
18
+ def teardown
19
+ @d1 = @d2 = @md = nil
20
+ end
21
+
22
+ def test_digest
23
+ assert_equal(@md.digest, @d1.digest)
24
+ assert_equal(@md.hexdigest, @d1.hexdigest)
25
+ @d1 << @data
26
+ @d2 << @data
27
+ @md << @data
28
+ assert_equal(@md.digest, @d1.digest)
29
+ assert_equal(@md.hexdigest, @d1.hexdigest)
30
+ assert_equal(@d1.digest, @d2.digest)
31
+ assert_equal(@d1.hexdigest, @d2.hexdigest)
32
+ assert_equal(@md.digest, OpenSSL::Digest::MD5.digest(@data))
33
+ assert_equal(@md.hexdigest, OpenSSL::Digest::MD5.hexdigest(@data))
34
+ end
35
+
36
+ def test_eql
37
+ assert(@d1 == @d2, "==")
38
+ d = @d1.clone
39
+ assert(d == @d1, "clone")
40
+ end
41
+
42
+ def test_info
43
+ assert_equal("MD5", @d1.name, "name")
44
+ assert_equal("MD5", @d2.name, "name")
45
+ assert_equal(16, @d1.size, "size")
46
+ end
47
+
48
+ def test_dup
49
+ @d1.update(@data)
50
+ assert_equal(@d1.name, @d1.dup.name, "dup")
51
+ assert_equal(@d1.name, @d1.clone.name, "clone")
52
+ assert_equal(@d1.digest, @d1.clone.digest, "clone .digest")
53
+ end
54
+
55
+ def test_reset
56
+ @d1.update(@data)
57
+ dig1 = @d1.digest
58
+ @d1.reset
59
+ @d1.update(@data)
60
+ dig2 = @d1.digest
61
+ assert_equal(dig1, dig2, "reset")
62
+ end
63
+
64
+ if OpenSSL::OPENSSL_VERSION_NUMBER > 0x00908000
65
+ def encode16(str)
66
+ str.unpack("H*").first
67
+ end
68
+
69
+ def test_098_features
70
+ sha224_a = "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5"
71
+ sha256_a = "ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb"
72
+ sha384_a = "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31"
73
+ sha512_a = "1f40fc92da241694750979ee6cf582f2d5d7d28e18335de05abc54d0560e0f5302860c652bf08d560252aa5e74210546f369fbbbce8c12cfc7957b2652fe9a75"
74
+
75
+ assert_equal(sha224_a, OpenSSL::Digest::SHA224.hexdigest("a"))
76
+ assert_equal(sha256_a, OpenSSL::Digest::SHA256.hexdigest("a"))
77
+ assert_equal(sha384_a, OpenSSL::Digest::SHA384.hexdigest("a"))
78
+ assert_equal(sha512_a, OpenSSL::Digest::SHA512.hexdigest("a"))
79
+
80
+ assert_equal(sha224_a, encode16(OpenSSL::Digest::SHA224.digest("a")))
81
+ assert_equal(sha256_a, encode16(OpenSSL::Digest::SHA256.digest("a")))
82
+ assert_equal(sha384_a, encode16(OpenSSL::Digest::SHA384.digest("a")))
83
+ assert_equal(sha512_a, encode16(OpenSSL::Digest::SHA512.digest("a")))
84
+ end
85
+ end
86
+ end
87
+
88
+ end
@@ -0,0 +1,44 @@
1
+ begin
2
+ require "openssl"
3
+ rescue LoadError
4
+ end
5
+ require "test/unit"
6
+
7
+ if defined?(OpenSSL)
8
+
9
+ class OpenSSL::TestHMAC < Test::Unit::TestCase
10
+ def setup
11
+ @digest = OpenSSL::Digest::MD5.new
12
+ @key = "KEY"
13
+ @data = "DATA"
14
+ @h1 = OpenSSL::HMAC.new(@key, @digest)
15
+ @h2 = OpenSSL::HMAC.new(@key, @digest)
16
+ end
17
+
18
+ def teardown
19
+ end
20
+
21
+ def test_hmac
22
+ @h1.update(@data)
23
+ assert_equal(OpenSSL::HMAC.digest(@digest, @key, @data), @h1.digest, "digest")
24
+ assert_equal(OpenSSL::HMAC.hexdigest(@digest, @key, @data), @h1.hexdigest, "hexdigest")
25
+ end
26
+
27
+ def test_dup
28
+ @h1.update(@data)
29
+ h = @h1.dup
30
+ assert_equal(@h1.digest, h.digest, "dup digest")
31
+ end
32
+
33
+ def test_sha256
34
+ digest256 = OpenSSL::Digest::Digest.new("sha256")
35
+ assert_equal(
36
+ "\210\236-\3270\331Yq\265\177sE\266\231hXa\332\250\026\235O&c*\307\001\227~\260n\362",
37
+ OpenSSL::HMAC.digest(digest256, 'blah', "blah"))
38
+ assert_equal(
39
+ "889e2dd730d95971b57f7345b699685861daa8169d4f26632ac701977eb06ef2",
40
+ OpenSSL::HMAC.hexdigest(digest256, 'blah', "blah"))
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,69 @@
1
+ begin
2
+ require "openssl"
3
+ require File.join(File.dirname(__FILE__), "utils.rb")
4
+ rescue LoadError
5
+ end
6
+ require "test/unit"
7
+
8
+ if defined?(OpenSSL)
9
+
10
+
11
+ class OpenSSL::TestNSSPI < Test::Unit::TestCase
12
+ def setup
13
+ # This request data is adopt from the specification of
14
+ # "Netscape Extensions for User Key Generation".
15
+ # -- http://wp.netscape.com/eng/security/comm4-keygen.html
16
+ @b64 = "MIHFMHEwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAnX0TILJrOMUue+PtwBRE6XfV"
17
+ @b64 << "WtKQbsshxk5ZhcUwcwyvcnIq9b82QhJdoACdD34rqfCAIND46fXKQUnb0mvKzQID"
18
+ @b64 << "AQABFhFNb3ppbGxhSXNNeUZyaWVuZDANBgkqhkiG9w0BAQQFAANBAAKv2Eex2n/S"
19
+ @b64 << "r/7iJNroWlSzSMtTiQTEB+ADWHGj9u1xrUrOilq/o2cuQxIfZcNZkYAkWP4DubqW"
20
+ @b64 << "i0//rgBvmco="
21
+ end
22
+
23
+ def teardown
24
+ end
25
+ def pr(obj, ind=0)
26
+ if obj.respond_to?(:value)
27
+ puts((" "*ind) + obj.class.to_s + ":")
28
+ pr(obj.value,(ind+1))
29
+ elsif obj.respond_to?(:each) && !(String===obj)
30
+ obj.each {|v| pr(v,ind+1) }
31
+ else
32
+ puts((" "*ind) + obj.inspect)
33
+ end
34
+ end
35
+
36
+ def test_build_data
37
+ key1 = OpenSSL::TestUtils::TEST_KEY_RSA1024
38
+ key2 = OpenSSL::TestUtils::TEST_KEY_RSA2048
39
+ spki = OpenSSL::Netscape::SPKI.new
40
+ spki.challenge = "RandomString"
41
+ spki.public_key = key1.public_key
42
+ spki.sign(key1, OpenSSL::Digest::SHA1.new)
43
+ assert(spki.verify(spki.public_key))
44
+ assert(spki.verify(key1.public_key))
45
+ assert(!spki.verify(key2.public_key))
46
+
47
+ der = spki.to_der
48
+ spki = OpenSSL::Netscape::SPKI.new(der)
49
+ assert_equal("RandomString", spki.challenge)
50
+ assert_equal(key1.public_key.to_der, spki.public_key.to_der)
51
+ assert(spki.verify(spki.public_key))
52
+ end
53
+
54
+ def test_decode_data
55
+ spki = OpenSSL::Netscape::SPKI.new(@b64)
56
+ assert_equal(@b64, spki.to_pem)
57
+ assert_equal(@b64.unpack("m").first, spki.to_der)
58
+ assert_equal("MozillaIsMyFriend", spki.challenge)
59
+ assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
60
+
61
+ spki = OpenSSL::Netscape::SPKI.new(@b64.unpack("m").first)
62
+ assert_equal(@b64, spki.to_pem)
63
+ assert_equal(@b64.unpack("m").first, spki.to_der)
64
+ assert_equal("MozillaIsMyFriend", spki.challenge)
65
+ assert_equal(OpenSSL::PKey::RSA, spki.public_key.class)
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,149 @@
1
+ begin
2
+ require "openssl"
3
+ rescue LoadError
4
+ end
5
+ require 'test/unit'
6
+
7
+ if defined?(OpenSSL)
8
+
9
+ require 'socket'
10
+ dir = File.expand_path(__FILE__)
11
+ 2.times {dir = File.dirname(dir)}
12
+ $:.replace([File.join(dir, "ruby")] | $:)
13
+ require 'ut_eof'
14
+
15
+ module SSLPair
16
+ def server
17
+ host = "127.0.0.1"
18
+ port = 0
19
+ ctx = OpenSSL::SSL::SSLContext.new()
20
+ ctx.ciphers = "ADH"
21
+ tcps = TCPServer.new(host, port)
22
+ ssls = OpenSSL::SSL::SSLServer.new(tcps, ctx)
23
+ return ssls
24
+ end
25
+
26
+ def client(port)
27
+ host = "127.0.0.1"
28
+ ctx = OpenSSL::SSL::SSLContext.new()
29
+ ctx.ciphers = "ADH"
30
+ s = TCPSocket.new(host, port)
31
+ ssl = OpenSSL::SSL::SSLSocket.new(s, ctx)
32
+ ssl.connect
33
+ ssl.sync_close = true
34
+ ssl
35
+ end
36
+
37
+ def ssl_pair
38
+ ssls = server
39
+ tv = nil
40
+ th = Thread.new {
41
+ ns = ssls.accept
42
+ ssls.close
43
+ tv = ns
44
+ }
45
+ port = ssls.to_io.addr[1]
46
+ c = client(port)
47
+ th.join
48
+ s = tv
49
+ if block_given?
50
+ begin
51
+ yield c, s
52
+ ensure
53
+ c.close unless c.closed?
54
+ s.close unless s.closed?
55
+ end
56
+ else
57
+ return c, s
58
+ end
59
+ end
60
+ end
61
+
62
+ class OpenSSL::TestEOF1 < Test::Unit::TestCase
63
+ include TestEOF
64
+ include SSLPair
65
+
66
+ def open_file(content)
67
+ s1, s2 = ssl_pair
68
+ Thread.new {
69
+ s2 << content;
70
+ s2.close
71
+ }
72
+ yield s1
73
+ end
74
+ end
75
+
76
+ class OpenSSL::TestEOF2 < Test::Unit::TestCase
77
+ include TestEOF
78
+ include SSLPair
79
+
80
+ def open_file(content)
81
+ s1, s2 = ssl_pair
82
+ Thread.new { s1 << content; s1.close }
83
+ yield s2
84
+ end
85
+ end
86
+
87
+ class OpenSSL::TestPair < Test::Unit::TestCase
88
+ include SSLPair
89
+
90
+ def test_getc
91
+ ssl_pair {|s1, s2|
92
+ s1 << "a"
93
+ assert_equal(?a, s2.getc)
94
+ }
95
+ end
96
+
97
+ def test_readpartial
98
+ ssl_pair {|s1, s2|
99
+ s2.write "a\nbcd"
100
+ assert_equal("a\n", s1.gets)
101
+ assert_equal("bcd", s1.readpartial(10))
102
+ s2.write "efg"
103
+ assert_equal("efg", s1.readpartial(10))
104
+ s2.close
105
+ assert_raise(EOFError) { s1.readpartial(10) }
106
+ assert_raise(EOFError) { s1.readpartial(10) }
107
+ assert_equal("", s1.readpartial(0))
108
+ }
109
+ end
110
+
111
+ def test_readall
112
+ ssl_pair {|s1, s2|
113
+ s2.close
114
+ assert_equal("", s1.read)
115
+ }
116
+ end
117
+
118
+ def test_readline
119
+ ssl_pair {|s1, s2|
120
+ s2.close
121
+ assert_raise(EOFError) { s1.readline }
122
+ }
123
+ end
124
+
125
+ def test_puts_meta
126
+ ssl_pair {|s1, s2|
127
+ begin
128
+ old = $/
129
+ $/ = '*'
130
+ s1.puts 'a'
131
+ ensure
132
+ $/ = old
133
+ end
134
+ s1.close
135
+ assert_equal("a\n", s2.read)
136
+ }
137
+ end
138
+
139
+ def test_puts_empty
140
+ ssl_pair {|s1, s2|
141
+ s1.puts
142
+ s1.close
143
+ assert_equal("\n", s2.read)
144
+ }
145
+ end
146
+
147
+ end
148
+
149
+ end
@@ -0,0 +1,159 @@
1
+ if defined?(JRUBY_VERSION)
2
+ require "java"
3
+ $CLASSPATH << 'pkg/classes'
4
+ $CLASSPATH << 'lib/bcprov-jdk14-139.jar'
5
+ end
6
+ begin
7
+ require "openssl"
8
+ require File.join(File.dirname(__FILE__), "utils.rb")
9
+ rescue LoadError
10
+ end
11
+ require "test/unit"
12
+
13
+ if defined?(OpenSSL)
14
+
15
+ class OpenSSL::TestPKCS7 < Test::Unit::TestCase
16
+ def setup
17
+ @rsa1024 = OpenSSL::TestUtils::TEST_KEY_RSA1024
18
+ @rsa2048 = OpenSSL::TestUtils::TEST_KEY_RSA2048
19
+ ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA")
20
+ ee1 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE1")
21
+ ee2 = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=EE2")
22
+
23
+ now = Time.now
24
+ ca_exts = [
25
+ ["basicConstraints","CA:TRUE",true],
26
+ ["keyUsage","keyCertSign, cRLSign",true],
27
+ ["subjectKeyIdentifier","hash",false],
28
+ ["authorityKeyIdentifier","keyid:always",false],
29
+ ]
30
+ @ca_cert = issue_cert(ca, @rsa2048, 1, Time.now, Time.now+3600, ca_exts,
31
+ nil, nil, OpenSSL::Digest::SHA1.new)
32
+ ee_exts = [
33
+ ["keyUsage","Non Repudiation, Digital Signature, Key Encipherment",true],
34
+ ["authorityKeyIdentifier","keyid:always",false],
35
+ ["extendedKeyUsage","clientAuth, emailProtection, codeSigning",false],
36
+ ]
37
+ @ee1_cert = issue_cert(ee1, @rsa1024, 2, Time.now, Time.now+1800, ee_exts,
38
+ @ca_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
39
+ @ee2_cert = issue_cert(ee2, @rsa1024, 3, Time.now, Time.now+1800, ee_exts,
40
+ @ca_cert, @rsa2048, OpenSSL::Digest::SHA1.new)
41
+ end
42
+
43
+ def issue_cert(*args)
44
+ OpenSSL::TestUtils.issue_cert(*args)
45
+ end
46
+
47
+ def test_signed
48
+ store = OpenSSL::X509::Store.new
49
+ store.add_cert(@ca_cert)
50
+ ca_certs = [@ca_cert]
51
+
52
+ data = "aaaaa\r\nbbbbb\r\nccccc\r\n"
53
+ tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs)
54
+ p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
55
+ certs = p7.certificates
56
+ signers = p7.signers
57
+ assert(p7.verify([], store))
58
+ assert_equal(data, p7.data)
59
+ assert_equal(2, certs.size)
60
+ assert_equal(@ee1_cert.subject.to_s, certs[0].subject.to_s)
61
+ assert_equal(@ca_cert.subject.to_s, certs[1].subject.to_s)
62
+ assert_equal(1, signers.size)
63
+ assert_equal(@ee1_cert.serial, signers[0].serial)
64
+ assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
65
+
66
+ # Normaly OpenSSL tries to translate the supplied content into canonical
67
+ # MIME format (e.g. a newline character is converted into CR+LF).
68
+ # If the content is a binary, PKCS7::BINARY flag should be used.
69
+
70
+ data = "aaaaa\nbbbbb\nccccc\n"
71
+ flag = OpenSSL::PKCS7::BINARY
72
+ tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs, flag)
73
+ p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
74
+ certs = p7.certificates
75
+ signers = p7.signers
76
+ assert(p7.verify([], store))
77
+ assert_equal(data, p7.data)
78
+ assert_equal(2, certs.size)
79
+ assert_equal(@ee1_cert.subject.to_s, certs[0].subject.to_s)
80
+ assert_equal(@ca_cert.subject.to_s, certs[1].subject.to_s)
81
+ assert_equal(1, signers.size)
82
+ assert_equal(@ee1_cert.serial, signers[0].serial)
83
+ assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
84
+
85
+ # A signed-data which have multiple signatures can be created
86
+ # through the following steps.
87
+ # 1. create two signed-data
88
+ # 2. copy signerInfo and certificate from one to another
89
+
90
+ tmp1 = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, [], flag)
91
+ tmp2 = OpenSSL::PKCS7.sign(@ee2_cert, @rsa1024, data, [], flag)
92
+ tmp1.add_signer(tmp2.signers[0])
93
+ tmp1.add_certificate(@ee2_cert)
94
+
95
+ p7 = OpenSSL::PKCS7::PKCS7.new(tmp1.to_der)
96
+ certs = p7.certificates
97
+ signers = p7.signers
98
+ assert(p7.verify([], store))
99
+ assert_equal(data, p7.data)
100
+ assert_equal(2, certs.size)
101
+ assert_equal(2, signers.size)
102
+ assert_equal(@ee1_cert.serial, signers[0].serial)
103
+ assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
104
+ assert_equal(@ee2_cert.serial, signers[1].serial)
105
+ assert_equal(@ee2_cert.issuer.to_s, signers[1].issuer.to_s)
106
+ end
107
+
108
+ def test_detached_sign
109
+ store = OpenSSL::X509::Store.new
110
+ store.add_cert(@ca_cert)
111
+ ca_certs = [@ca_cert]
112
+
113
+ data = "aaaaa\nbbbbb\nccccc\n"
114
+ flag = OpenSSL::PKCS7::BINARY|OpenSSL::PKCS7::DETACHED
115
+ tmp = OpenSSL::PKCS7.sign(@ee1_cert, @rsa1024, data, ca_certs, flag)
116
+ p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
117
+ a1 = OpenSSL::ASN1.decode(p7)
118
+
119
+ certs = p7.certificates
120
+ signers = p7.signers
121
+ assert(!p7.verify([], store))
122
+ assert(p7.verify([], store, data))
123
+ assert_equal(data, p7.data)
124
+ assert_equal(2, certs.size)
125
+ assert_equal(@ee1_cert.subject.to_s, certs[0].subject.to_s)
126
+ assert_equal(@ca_cert.subject.to_s, certs[1].subject.to_s)
127
+ assert_equal(1, signers.size)
128
+ assert_equal(@ee1_cert.serial, signers[0].serial)
129
+ assert_equal(@ee1_cert.issuer.to_s, signers[0].issuer.to_s)
130
+ end
131
+
132
+ def test_enveloped
133
+ if OpenSSL::OPENSSL_VERSION_NUMBER <= 0x0090704f
134
+ # PKCS7_encrypt() of OpenSSL-0.9.7d goes to SEGV.
135
+ # http://www.mail-archive.com/openssl-dev@openssl.org/msg17376.html
136
+ return
137
+ end
138
+
139
+ certs = [@ee1_cert, @ee2_cert]
140
+ cipher = OpenSSL::Cipher::AES.new("128-CBC")
141
+ data = "aaaaa\nbbbbb\nccccc\n"
142
+
143
+ tmp = OpenSSL::PKCS7.encrypt(certs, data, cipher, OpenSSL::PKCS7::BINARY)
144
+ p7 = OpenSSL::PKCS7::PKCS7.new(tmp.to_der)
145
+ recip = p7.recipients
146
+ assert_equal(:enveloped, p7.type)
147
+ assert_equal(2, recip.size)
148
+
149
+ assert_equal(@ca_cert.subject.to_s, recip[0].issuer.to_s)
150
+ assert_equal(2, recip[0].serial)
151
+ assert_equal(data, p7.decrypt(@rsa1024, @ee1_cert))
152
+
153
+ assert_equal(@ca_cert.subject.to_s, recip[1].issuer.to_s)
154
+ assert_equal(3, recip[1].serial)
155
+ assert_equal(data, p7.decrypt(@rsa1024, @ee2_cert))
156
+ end
157
+ end
158
+
159
+ end