jruby-openssl 0.6 → 0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/History.txt +45 -0
  2. data/Manifest.txt +19 -11
  3. data/README.txt +1 -12
  4. data/Rakefile +12 -5
  5. data/lib/bcmail-jdk15-144.jar +0 -0
  6. data/lib/bcprov-jdk15-144.jar +0 -0
  7. data/lib/jopenssl/version.rb +1 -1
  8. data/lib/jopenssl.jar +0 -0
  9. data/lib/openssl/bn.rb +5 -3
  10. data/lib/openssl/buffering.rb +2 -2
  11. data/lib/openssl/cipher.rb +27 -18
  12. data/lib/openssl/digest.rb +19 -4
  13. data/lib/openssl/dummy.rb +11 -11
  14. data/lib/openssl/dummyssl.rb +2 -1
  15. data/lib/openssl/pkcs7.rb +25 -0
  16. data/lib/openssl/ssl.rb +70 -26
  17. data/lib/openssl/x509.rb +2 -2
  18. data/lib/openssl.rb +47 -2
  19. data/test/fixture/ca-bundle.crt +2794 -0
  20. data/test/fixture/keypair.pem +27 -0
  21. data/test/fixture/selfcert.pem +23 -0
  22. data/test/{pkcs7_mime_enveloped.message → java/pkcs7_mime_enveloped.message} +0 -0
  23. data/test/{pkcs7_mime_signed.message → java/pkcs7_mime_signed.message} +0 -0
  24. data/test/{pkcs7_multipart_signed.message → java/pkcs7_multipart_signed.message} +0 -0
  25. data/test/{test_java_attribute.rb → java/test_java_attribute.rb} +2 -2
  26. data/test/{test_java_bio.rb → java/test_java_bio.rb} +0 -0
  27. data/test/{test_java_mime.rb → java/test_java_mime.rb} +0 -0
  28. data/test/{test_java_pkcs7.rb → java/test_java_pkcs7.rb} +35 -32
  29. data/test/{test_java_smime.rb → java/test_java_smime.rb} +0 -0
  30. data/test/openssl/test_asn1.rb +1 -3
  31. data/test/openssl/test_cipher.rb +7 -10
  32. data/test/openssl/test_ec.rb +113 -0
  33. data/test/openssl/test_pair.rb +3 -8
  34. data/test/openssl/test_pkcs7.rb +339 -11
  35. data/test/openssl/test_ssl.rb +728 -100
  36. data/test/openssl/test_x509cert.rb +5 -5
  37. data/test/openssl/test_x509crl.rb +1 -2
  38. data/test/openssl/test_x509ext.rb +3 -3
  39. data/test/openssl/test_x509name.rb +1 -0
  40. data/test/openssl/test_x509req.rb +5 -7
  41. data/test/openssl/test_x509store.rb +3 -2
  42. data/test/test_all.rb +1 -0
  43. data/test/{test_openssl_x509.rb → test_certificate.rb} +33 -3
  44. data/test/test_cipher.rb +85 -7
  45. data/test/test_integration.rb +7 -8
  46. data/test/test_java.rb +9 -9
  47. data/test/test_openssl.rb +3 -33
  48. data/test/test_parse_certificate.rb +8 -1
  49. data/test/test_pkcs7.rb +40 -0
  50. data/test/test_pkey.rb +165 -7
  51. data/test/test_x509store.rb +8 -7
  52. metadata +31 -30
  53. data/lib/bcmail-jdk14-139.jar +0 -0
  54. data/lib/bcprov-jdk14-139.jar +0 -0
data/History.txt CHANGED
@@ -1,3 +1,48 @@
1
+ == 0.7
2
+
3
+ - Follow MRI 1.8.7 openssl API changes
4
+ - Fixes so that jruby-openssl can run on appengine
5
+ - Many bug and compatibility fixes, see below.
6
+ - This is the last release that will be compatible with JRuby 1.4.x.
7
+ - Compatibility issues
8
+ -- JRUBY-4342: Follow ruby-openssl of CRuby 1.8.7.
9
+ -- JRUBY-4346: Sync tests with tests for ruby-openssl of CRuby 1.8.7.
10
+ -- JRUBY-4444: OpenSSL crash running RubyGems tests
11
+ -- JRUBY-4075: Net::SSH gives OpenSSL::Cipher::CipherError "No message available"
12
+ -- JRUBY-4076: Net::SSH padding error using 3des-cbc on Solaris
13
+ -- JRUBY-4541: jruby-openssl doesn't load on App Engine.
14
+ -- JRUBY-4077: Net::SSH "all authorization methods failed" Solaris -> Solaris
15
+ -- JRUBY-4535: Issues with the BouncyCastle provider
16
+ -- JRUBY-4510: JRuby-OpenSSL crashes when JCE fails a initialise bcprov
17
+ -- JRUBY-4343: Update BouncyCastle jar to upstream version; jdk14-139 -> jdk15-144
18
+ - Cipher issues
19
+ -- JRUBY-4012: Initialization vector length handled differently than in MRI (longer IV sequence are trimmed to fit the required)
20
+ -- JRUBY-4473: Implemented DSA key generation
21
+ -- JRUBY-4472: Cipher does not support RC4 and CAST
22
+ -- JRUBY-4577: InvalidParameterException 'Wrong keysize: must be equal to 112 or 168' for DES3 + SunJCE
23
+ - SSL and X.509(PKIX) issues
24
+ -- JRUBY-4384: TCP socket connection causes busy loop of SSL server
25
+ -- JRUBY-4370: Implement SSLContext#ciphers
26
+ -- JRUBY-4688: SSLContext#ciphers does not accept 'DEFAULT'
27
+ -- JRUBY-4357: SSLContext#{setup,ssl_version=} are not implemented
28
+ -- JRUBY-4397: SSLContext#extra_chain_cert and SSLContext#client_ca
29
+ -- JRUBY-4684: SSLContext#verify_depth is ignored
30
+ -- JRUBY-4398: SSLContext#options does not affect to SSL sessions
31
+ -- JRUBY-4360: Implement SSLSocket#verify_result and dependents
32
+ -- JRUBY-3829: SSLSocket#read should clear given buffer before concatenating (ByteBuffer.java:328:in `allocate': java.lang.IllegalArgumentException when returning SOAP queries over a certain size)
33
+ -- JRUBY-4686: SSLSocket can drop last chunk of data just before inbound channel close
34
+ -- JRUBY-4369: X509Store#verify_callback is not called
35
+ -- JRUBY-4409: OpenSSL::X509::Store#add_file corrupts when it includes certificates which have the same subject (problem with ruby-openid-apps-discovery (github jruby-openssl issue #2))
36
+ -- JRUBY-4333: PKCS#8 formatted privkey read
37
+ -- JRUBY-4454: Loading Key file as a Certificate causes NPE
38
+ -- JRUBY-4455: calling X509::Certificate#sign for the Certificate initialized from PEM causes IllegalStateException
39
+ - PKCS#7 issues
40
+ -- JRUBY-4379: PKCS7#sign failed for DES3 cipher algorithm
41
+ -- JRUBY-4428: Allow to use DES-EDE3-CBC in PKCS#7 w/o the Policy Files (rake test doesn't finish on JDK5 w/o policy files update)
42
+ - Misc
43
+ -- JRUBY-4574: jruby-openssl deprecation warning cleanup
44
+ -- JRUBY-4591: jruby-1.4 support
45
+
1
46
  == 0.6
2
47
 
3
48
  - This is a recommended upgrade to jruby-openssl. A security problem
data/Manifest.txt CHANGED
@@ -4,8 +4,8 @@ Manifest.txt
4
4
  README.txt
5
5
  License.txt
6
6
  lib/jopenssl.jar
7
- lib/bcmail-jdk14-139.jar
8
- lib/bcprov-jdk14-139.jar
7
+ lib/bcmail-jdk15-144.jar
8
+ lib/bcprov-jdk15-144.jar
9
9
  lib/jopenssl
10
10
  lib/jopenssl.jar
11
11
  lib/openssl
@@ -17,36 +17,35 @@ lib/openssl/cipher.rb
17
17
  lib/openssl/digest.rb
18
18
  lib/openssl/dummy.rb
19
19
  lib/openssl/dummyssl.rb
20
+ lib/openssl/pkcs7.rb
20
21
  lib/openssl/ssl.rb
21
22
  lib/openssl/x509.rb
22
23
  test/cert_with_ec_pk.cer
23
24
  test/fixture
25
+ test/java
24
26
  test/openssl
25
- test/pkcs7_mime_enveloped.message
26
- test/pkcs7_mime_signed.message
27
- test/pkcs7_multipart_signed.message
28
27
  test/ref
28
+ test/test_all.rb
29
+ test/test_certificate.rb
29
30
  test/test_cipher.rb
30
31
  test/test_integration.rb
31
32
  test/test_java.rb
32
- test/test_java_attribute.rb
33
- test/test_java_bio.rb
34
- test/test_java_mime.rb
35
- test/test_java_pkcs7.rb
36
- test/test_java_smime.rb
37
33
  test/test_openssl.rb
38
- test/test_openssl_x509.rb
39
34
  test/test_parse_certificate.rb
35
+ test/test_pkcs7.rb
40
36
  test/test_pkey.rb
41
37
  test/test_x509store.rb
42
38
  test/ut_eof.rb
39
+ test/fixture/ca-bundle.crt
43
40
  test/fixture/ca_path
44
41
  test/fixture/cacert.pem
45
42
  test/fixture/cert_localhost.pem
46
43
  test/fixture/common.pem
44
+ test/fixture/keypair.pem
47
45
  test/fixture/localhost_keypair.pem
48
46
  test/fixture/max.pem
49
47
  test/fixture/purpose
48
+ test/fixture/selfcert.pem
50
49
  test/fixture/verisign.pem
51
50
  test/fixture/verisign_c3.pem
52
51
  test/fixture/ca_path/72fa7371.0
@@ -77,10 +76,19 @@ test/fixture/purpose/sslclient/sslclient.pem
77
76
  test/fixture/purpose/sslserver/csr.pem
78
77
  test/fixture/purpose/sslserver/keypair.pem
79
78
  test/fixture/purpose/sslserver/sslserver.pem
79
+ test/java/pkcs7_mime_enveloped.message
80
+ test/java/pkcs7_mime_signed.message
81
+ test/java/pkcs7_multipart_signed.message
82
+ test/java/test_java_attribute.rb
83
+ test/java/test_java_bio.rb
84
+ test/java/test_java_mime.rb
85
+ test/java/test_java_pkcs7.rb
86
+ test/java/test_java_smime.rb
80
87
  test/openssl/ssl_server.rb
81
88
  test/openssl/test_asn1.rb
82
89
  test/openssl/test_cipher.rb
83
90
  test/openssl/test_digest.rb
91
+ test/openssl/test_ec.rb
84
92
  test/openssl/test_hmac.rb
85
93
  test/openssl/test_ns_spki.rb
86
94
  test/openssl/test_pair.rb
data/README.txt CHANGED
@@ -6,19 +6,8 @@
6
6
 
7
7
  JRuby-OpenSSL is an add-on gem for JRuby that emulates the Ruby OpenSSL native library.
8
8
 
9
- JRuby offers *just enough* compatibility for most Ruby applications that use OpenSSL.
10
-
11
- Libraries that appear to work fine:
12
-
13
- Rails, Net::HTTPS
14
-
15
- Notable libraries that do *not* yet work include:
16
-
17
- Net::SSH, Net::SFTP, etc.
18
-
19
9
  Please report bugs and incompatibilities (preferably with testcases) to either the JRuby
20
10
  mailing list [1] or the JRuby bug tracker [2].
21
11
 
22
12
  [1]: http://xircles.codehaus.org/projects/jruby/lists
23
-
24
- [2]: http://jira.codehaus.org/browse/JRUBY
13
+ [2]: http://jira.codehaus.org/browse/JRUBY
data/Rakefile CHANGED
@@ -18,7 +18,7 @@ def java_classpath_arg # myriad of ways to discover JRuby classpath
18
18
  FileList["#{ENV['JRUBY_HOME']}/lib/*.jar"].join(File::PATH_SEPARATOR)
19
19
  end
20
20
  bc_jars = BC_JARS.join(File::PATH_SEPARATOR)
21
- jruby_cpath ? "-cp #{jruby_cpath}#{File::PATH_SEPARATOR}#{bc_jars}" : "-cp #{bc_jars}"
21
+ jruby_cpath ? "-cp \"#{jruby_cpath.gsub('\\', '/')}#{File::PATH_SEPARATOR}#{bc_jars}\"" : "-cp \"#{bc_jars}\""
22
22
  end
23
23
 
24
24
  desc "Compile the native Java code."
@@ -53,7 +53,8 @@ File.open("Manifest.txt", "w") {|f| MANIFEST.each {|n| f.puts n } }
53
53
  require File.dirname(__FILE__) + "/lib/jopenssl/version"
54
54
  begin
55
55
  require 'hoe'
56
- Hoe.spec("jruby-openssl") do |p|
56
+ Hoe.plugin :gemcutter
57
+ hoe = Hoe.spec("jruby-openssl") do |p|
57
58
  p.version = Jopenssl::Version::VERSION
58
59
  p.rubyforge_name = "jruby-extras"
59
60
  p.url = "http://jruby-extras.rubyforge.org/jruby-openssl"
@@ -61,9 +62,15 @@ begin
61
62
  p.email = "ola.bini@gmail.com"
62
63
  p.summary = "OpenSSL add-on for JRuby"
63
64
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
64
- p.description = p.paragraphs_of('README.txt', 0...1).join("\n\n")
65
- p.test_globs = ENV["TEST"] || ["test/test_*.rb"]
66
- end.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
65
+ p.description = p.paragraphs_of('README.txt', 3...4).join("\n\n")
66
+ p.test_globs = ENV["TEST"] || ["test/test_all.rb"]
67
+ end
68
+ hoe.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
69
+
70
+ task :gemspec do
71
+ File.open("#{hoe.name}.gemspec", "w") {|f| f << hoe.spec.to_ruby }
72
+ end
73
+ task :package => :gemspec
67
74
  rescue LoadError
68
75
  puts "You really need Hoe installed to be able to package this gem"
69
76
  rescue => e
Binary file
Binary file
@@ -1,5 +1,5 @@
1
1
  module Jopenssl
2
2
  module Version
3
- VERSION = "0.6"
3
+ VERSION = "0.7"
4
4
  end
5
5
  end
data/lib/jopenssl.jar CHANGED
Binary file
data/lib/openssl/bn.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  =begin
2
- = $RCSfile: bn.rb,v $ -- Ruby-space definitions that completes C-space funcs for BN
2
+ = $RCSfile$ -- Ruby-space definitions that completes C-space funcs for BN
3
3
 
4
4
  = Info
5
5
  'OpenSSL for Ruby 2' project
@@ -11,10 +11,12 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: bn.rb,v 1.1 2003/07/23 16:11:30 gotoyuzo Exp $
14
+ $Id: bn.rb 11708 2007-02-12 23:01:19Z shyouhei $
15
15
  =end
16
16
 
17
- require 'openssl'
17
+ ##
18
+ # Should we care what if somebody require this file directly?
19
+ #require 'openssl'
18
20
 
19
21
  module OpenSSL
20
22
  class BN
@@ -1,5 +1,5 @@
1
1
  =begin
2
- = $RCSfile: buffering.rb,v $ -- Buffering mix-in module.
2
+ = $RCSfile$ -- Buffering mix-in module.
3
3
 
4
4
  = Info
5
5
  'OpenSSL for Ruby 2' project
@@ -11,7 +11,7 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: buffering.rb,v 1.5.2.4 2005/09/04 22:03:24 gotoyuzo Exp $
14
+ $Id: buffering.rb 13706 2007-10-15 08:29:08Z usa $
15
15
  =end
16
16
 
17
17
  module Buffering
@@ -1,5 +1,5 @@
1
1
  =begin
2
- = $RCSfile: cipher.rb,v $ -- Ruby-space predefined Cipher subclasses
2
+ = $RCSfile$ -- Ruby-space predefined Cipher subclasses
3
3
 
4
4
  = Info
5
5
  'OpenSSL for Ruby 2' project
@@ -11,27 +11,15 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: cipher.rb,v 1.1.2.2 2006/06/20 11:18:15 gotoyuzo Exp $
14
+ $Id: cipher.rb 12496 2007-06-08 15:02:04Z technorama $
15
15
  =end
16
16
 
17
- require 'openssl'
17
+ ##
18
+ # Should we care what if somebody require this file directly?
19
+ #require 'openssl'
18
20
 
19
21
  module OpenSSL
20
- module Cipher
21
- class Cipher
22
- def random_key
23
- str = OpenSSL::Random.random_bytes(self.key_len)
24
- self.key = str
25
- return str
26
- end
27
-
28
- def random_iv
29
- str = OpenSSL::Random.random_bytes(self.iv_len)
30
- self.iv = str
31
- return str
32
- end
33
- end
34
-
22
+ class Cipher
35
23
  %w(AES CAST5 BF DES IDEA RC2 RC4 RC5).each{|name|
36
24
  klass = Class.new(Cipher){
37
25
  define_method(:initialize){|*args|
@@ -52,5 +40,26 @@ module OpenSSL
52
40
  }
53
41
  const_set("AES#{keylen}", klass)
54
42
  }
43
+
44
+ # Generate, set, and return a random key.
45
+ # You must call cipher.encrypt or cipher.decrypt before calling this method.
46
+ def random_key
47
+ str = OpenSSL::Random.random_bytes(self.key_len)
48
+ self.key = str
49
+ return str
50
+ end
51
+
52
+ # Generate, set, and return a random iv.
53
+ # You must call cipher.encrypt or cipher.decrypt before calling this method.
54
+ def random_iv
55
+ str = OpenSSL::Random.random_bytes(self.iv_len)
56
+ self.iv = str
57
+ return str
58
+ end
59
+
60
+ # This class is only provided for backwards compatibility. Use OpenSSL::Digest in the future.
61
+ class Cipher < Cipher
62
+ # add warning
63
+ end
55
64
  end # Cipher
56
65
  end # OpenSSL
@@ -1,5 +1,5 @@
1
1
  =begin
2
- = $RCSfile: digest.rb,v $ -- Ruby-space predefined Digest subclasses
2
+ = $RCSfile$ -- Ruby-space predefined Digest subclasses
3
3
 
4
4
  = Info
5
5
  'OpenSSL for Ruby 2' project
@@ -11,18 +11,25 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: digest.rb,v 1.1.2.2 2006/06/20 11:18:15 gotoyuzo Exp $
14
+ $Id: digest.rb 15600 2008-02-25 08:48:57Z technorama $
15
15
  =end
16
16
 
17
- require 'openssl'
17
+ ##
18
+ # Should we care what if somebody require this file directly?
19
+ #require 'openssl'
18
20
 
19
21
  module OpenSSL
20
- module Digest
22
+ class Digest
21
23
 
22
24
  alg = %w(DSS DSS1 MD2 MD4 MD5 MDC2 RIPEMD160 SHA SHA1)
23
25
  if OPENSSL_VERSION_NUMBER > 0x00908000
24
26
  alg += %w(SHA224 SHA256 SHA384 SHA512)
25
27
  end
28
+
29
+ def self.digest(name, data)
30
+ super(data, name)
31
+ end
32
+
26
33
  alg.each{|name|
27
34
  klass = Class.new(Digest){
28
35
  define_method(:initialize){|*data|
@@ -41,6 +48,14 @@ module OpenSSL
41
48
  const_set(name, klass)
42
49
  }
43
50
 
51
+ # This class is only provided for backwards compatibility. Use OpenSSL::Digest in the future.
52
+ class Digest < Digest
53
+ def initialize(*args)
54
+ # add warning
55
+ super(*args)
56
+ end
57
+ end
58
+
44
59
  end # Digest
45
60
  end # OpenSSL
46
61
 
data/lib/openssl/dummy.rb CHANGED
@@ -8,27 +8,27 @@ module OpenSSL
8
8
  class Primitive; end
9
9
  class Constructive; end
10
10
  end
11
- module PKey
12
- class PKeyError < OpenSSLError; end
13
- class PKey; def initialize(*args); end; end
14
- class RSA < PKey; end
15
- class DSA < PKey; end
16
- class DH < PKey; end
17
- end
18
11
  module X509
19
12
  class Name; end
20
13
  class Certificate; end
21
14
  class Extension; end
22
15
  class CRL; end
23
16
  class Revoked; end
24
- class Store; end
17
+ class Store
18
+ def set_default_paths; end
19
+ end
25
20
  class Request; end
26
21
  class Attribute; end
27
22
  end
28
23
  module Netscape
29
24
  class SPKI; end
30
25
  end
31
- module PKCS7
32
- class PKCS7; end
26
+ class PKCS7
27
+ # this definition causes TypeError "superclass mismatch for class PKCS7"
28
+ # MRI also crashes following definition;
29
+ # class Foo; class Foo < Foo; end; end
30
+ # class Foo; class Foo < Foo; end; end
31
+ #
32
+ # class PKCS7 < PKCS7; end
33
33
  end
34
- end
34
+ end
@@ -9,5 +9,6 @@ module OpenSSL
9
9
  VERIFY_PEER = 1
10
10
  VERIFY_FAIL_IF_NO_PEER_CERT = 2
11
11
  VERIFY_CLIENT_ONCE = 4
12
+ OP_ALL = 0x00000FFF
12
13
  end
13
- end
14
+ end
@@ -0,0 +1,25 @@
1
+ =begin
2
+ = $RCSfile$ -- PKCS7
3
+
4
+ = Licence
5
+ This program is licenced under the same licence as Ruby.
6
+ (See the file 'LICENCE'.)
7
+
8
+ = Version
9
+ $Id: digest.rb 12148 2007-04-05 05:59:22Z technorama $
10
+ =end
11
+
12
+ module OpenSSL
13
+ class PKCS7
14
+ # This class is only provided for backwards compatibility. Use OpenSSL::PKCS7 in the future.
15
+ class PKCS7 < PKCS7
16
+ def initialize(*args)
17
+ super(*args)
18
+
19
+ warn("Warning: OpenSSL::PKCS7::PKCS7 is deprecated after Ruby 1.9; use OpenSSL::PKCS7 instead")
20
+ end
21
+ end
22
+
23
+ end # PKCS7
24
+ end # OpenSSL
25
+
data/lib/openssl/ssl.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  =begin
2
- = $RCSfile: ssl.rb,v $ -- Ruby-space definitions that completes C-space funcs for SSL
2
+ = $RCSfile$ -- Ruby-space definitions that completes C-space funcs for SSL
3
3
 
4
4
  = Info
5
5
  'OpenSSL for Ruby 2' project
@@ -11,7 +11,7 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: ssl.rb,v 1.5.2.6 2006/05/23 18:14:05 gotoyuzo Exp $
14
+ $Id: ssl.rb 16193 2008-04-25 06:51:21Z knu $
15
15
  =end
16
16
 
17
17
  require "openssl"
@@ -20,6 +20,33 @@ require "fcntl"
20
20
 
21
21
  module OpenSSL
22
22
  module SSL
23
+ class SSLContext
24
+ DEFAULT_PARAMS = {
25
+ :ssl_version => "SSLv23",
26
+ :verify_mode => OpenSSL::SSL::VERIFY_PEER,
27
+ :ciphers => "ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW",
28
+ :options => OpenSSL::SSL::OP_ALL,
29
+ }
30
+
31
+ DEFAULT_CERT_STORE = OpenSSL::X509::Store.new
32
+ DEFAULT_CERT_STORE.set_default_paths
33
+ if defined?(OpenSSL::X509::V_FLAG_CRL_CHECK_ALL)
34
+ DEFAULT_CERT_STORE.flags = OpenSSL::X509::V_FLAG_CRL_CHECK_ALL
35
+ end
36
+
37
+ def set_params(params={})
38
+ params = DEFAULT_PARAMS.merge(params)
39
+ self.ssl_version = params.delete(:ssl_version)
40
+ params.each{|name, value| self.__send__("#{name}=", value) }
41
+ if self.verify_mode != OpenSSL::SSL::VERIFY_NONE
42
+ unless self.ca_file or self.ca_path or self.cert_store
43
+ self.cert_store = DEFAULT_CERT_STORE
44
+ end
45
+ end
46
+ return params
47
+ end
48
+ end
49
+
23
50
  module SocketForwarder
24
51
  def addr
25
52
  to_io.addr
@@ -53,42 +80,55 @@ module OpenSSL
53
80
  module Nonblock
54
81
  def initialize(*args)
55
82
  flag = File::NONBLOCK
56
- flag |= @io.fcntl(Fcntl::F_GETFL, nil) if defined?(Fcntl::F_GETFL)
83
+ flag |= @io.fcntl(Fcntl::F_GETFL) if defined?(Fcntl::F_GETFL)
57
84
  @io.fcntl(Fcntl::F_SETFL, flag)
58
85
  super
59
86
  end
60
87
  end
61
88
 
89
+ def verify_certificate_identity(cert, hostname)
90
+ should_verify_common_name = true
91
+ cert.extensions.each{|ext|
92
+ next if ext.oid != "subjectAltName"
93
+ ext.value.split(/,\s+/).each{|general_name|
94
+ if /\ADNS:(.*)/ =~ general_name
95
+ should_verify_common_name = false
96
+ reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+")
97
+ return true if /\A#{reg}\z/i =~ hostname
98
+ elsif /\AIP Address:(.*)/ =~ general_name
99
+ should_verify_common_name = false
100
+ return true if $1 == hostname
101
+ end
102
+ }
103
+ }
104
+ if should_verify_common_name
105
+ cert.subject.to_a.each{|oid, value|
106
+ if oid == "CN"
107
+ reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
108
+ return true if /\A#{reg}\z/i =~ hostname
109
+ end
110
+ }
111
+ end
112
+ return false
113
+ end
114
+ module_function :verify_certificate_identity
115
+
62
116
  class SSLSocket
63
117
  include Buffering
64
118
  include SocketForwarder
65
119
  include Nonblock
66
120
 
67
121
  def post_connection_check(hostname)
68
- check_common_name = true
69
- cert = peer_cert
70
- cert.extensions.each{|ext|
71
- next if ext.oid != "subjectAltName"
72
- ext.value.split(/,\s+/).each{|general_name|
73
- if /\ADNS:(.*)/ =~ general_name
74
- check_common_name = false
75
- reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+")
76
- return true if /\A#{reg}\z/i =~ hostname
77
- elsif /\AIP Address:(.*)/ =~ general_name
78
- check_common_name = false
79
- return true if $1 == hostname
80
- end
81
- }
82
- }
83
- if check_common_name
84
- cert.subject.to_a.each{|oid, value|
85
- if oid == "CN"
86
- reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
87
- return true if /\A#{reg}\z/i =~ hostname
88
- end
89
- }
122
+ unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
123
+ raise SSLError, "hostname was not match with the server certificate"
90
124
  end
91
- raise SSLError, "hostname not match"
125
+ return true
126
+ end
127
+
128
+ def session
129
+ SSL::Session.new(self)
130
+ rescue SSL::Session::SessionError
131
+ nil
92
132
  end
93
133
  end
94
134
 
@@ -114,6 +154,10 @@ module OpenSSL
114
154
  @svr.listen(backlog)
115
155
  end
116
156
 
157
+ def shutdown(how=Socket::SHUT_RDWR)
158
+ @svr.shutdown(how)
159
+ end
160
+
117
161
  def accept
118
162
  sock = @svr.accept
119
163
  begin
data/lib/openssl/x509.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  =begin
2
- = $RCSfile: x509.rb,v $ -- Ruby-space definitions that completes C-space funcs for X509 and subclasses
2
+ = $RCSfile$ -- Ruby-space definitions that completes C-space funcs for X509 and subclasses
3
3
 
4
4
  = Info
5
5
  'OpenSSL for Ruby 2' project
@@ -11,7 +11,7 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: x509.rb,v 1.4.2.2 2004/12/19 08:28:33 gotoyuzo Exp $
14
+ $Id: x509.rb 11708 2007-02-12 23:01:19Z shyouhei $
15
15
  =end
16
16
 
17
17
  require "openssl"
data/lib/openssl.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  =begin
2
- = $RCSfile: openssl.rb,v $ -- Loader for all OpenSSL C-space and Ruby-space definitions
2
+ = $RCSfile$ -- Loader for all OpenSSL C-space and Ruby-space definitions
3
3
 
4
4
  = Info
5
5
  'OpenSSL for Ruby 2' project
@@ -11,14 +11,59 @@
11
11
  (See the file 'LICENCE'.)
12
12
 
13
13
  = Version
14
- $Id: openssl.rb,v 1.1 2003/07/23 16:11:29 gotoyuzo Exp $
14
+ $Id: openssl.rb 12496 2007-06-08 15:02:04Z technorama $
15
15
  =end
16
16
 
17
+ # TODO: remove this chunk after 1.4 support is dropped
18
+ require 'digest'
19
+ unless defined?(::Digest::Class)
20
+ # restricted support for jruby <= 1.4 (1.8.6 Digest compat)
21
+ module Digest
22
+ class Class
23
+ def self.hexdigest(name, data)
24
+ digest(name, data).unpack('H*')[0]
25
+ end
26
+
27
+ def self.digest(data, name)
28
+ digester = const_get(name).new
29
+ digester.update(data)
30
+ digester.finish
31
+ end
32
+
33
+ def hexdigest
34
+ digest.unpack('H*')[0]
35
+ end
36
+
37
+ def digest
38
+ dup.finish
39
+ end
40
+
41
+ def ==(oth)
42
+ digest == oth.digest
43
+ end
44
+
45
+ def to_s
46
+ hexdigest
47
+ end
48
+
49
+ def size
50
+ digest_length
51
+ end
52
+
53
+ def length
54
+ digest_length
55
+ end
56
+ end
57
+ end
58
+ end
59
+ # end of compat chunk.
60
+
17
61
  require 'jopenssl'
18
62
 
19
63
  require 'openssl/bn'
20
64
  require 'openssl/cipher'
21
65
  require 'openssl/digest'
66
+ require 'openssl/pkcs7'
22
67
  require 'openssl/ssl'
23
68
  require 'openssl/x509'
24
69