jruby-openssl-maven 0.7.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/History.txt +171 -0
  2. data/License.txt +30 -0
  3. data/Manifest.txt +115 -0
  4. data/README.txt +13 -0
  5. data/Rakefile +79 -0
  6. data/lib/jopenssl.jar +0 -0
  7. data/lib/jopenssl/version.rb +5 -0
  8. data/lib/openssl.rb +76 -0
  9. data/lib/openssl/bn.rb +35 -0
  10. data/lib/openssl/buffering.rb +239 -0
  11. data/lib/openssl/cipher.rb +65 -0
  12. data/lib/openssl/config.rb +316 -0
  13. data/lib/openssl/digest.rb +61 -0
  14. data/lib/openssl/dummy.rb +33 -0
  15. data/lib/openssl/dummyssl.rb +14 -0
  16. data/lib/openssl/pkcs7.rb +25 -0
  17. data/lib/openssl/ssl.rb +179 -0
  18. data/lib/openssl/x509.rb +154 -0
  19. data/test/cert_with_ec_pk.cer +27 -0
  20. data/test/fixture/ca-bundle.crt +2794 -0
  21. data/test/fixture/ca_path/72fa7371.0 +19 -0
  22. data/test/fixture/ca_path/verisign.pem +19 -0
  23. data/test/fixture/cacert.pem +23 -0
  24. data/test/fixture/cert_localhost.pem +19 -0
  25. data/test/fixture/common.pem +48 -0
  26. data/test/fixture/imaps/cacert.pem +60 -0
  27. data/test/fixture/imaps/server.crt +61 -0
  28. data/test/fixture/imaps/server.key +15 -0
  29. data/test/fixture/key_then_cert.pem +34 -0
  30. data/test/fixture/keypair.pem +27 -0
  31. data/test/fixture/localhost_keypair.pem +18 -0
  32. data/test/fixture/max.pem +29 -0
  33. data/test/fixture/purpose/b70a5bc1.0 +24 -0
  34. data/test/fixture/purpose/ca/PASSWD_OF_CA_KEY_IS_1234 +0 -0
  35. data/test/fixture/purpose/ca/ca_config.rb +37 -0
  36. data/test/fixture/purpose/ca/cacert.pem +24 -0
  37. data/test/fixture/purpose/ca/newcerts/2_cert.pem +19 -0
  38. data/test/fixture/purpose/ca/newcerts/3_cert.pem +19 -0
  39. data/test/fixture/purpose/ca/private/cakeypair.pem +30 -0
  40. data/test/fixture/purpose/ca/serial +1 -0
  41. data/test/fixture/purpose/cacert.pem +24 -0
  42. data/test/fixture/purpose/scripts/gen_cert.rb +127 -0
  43. data/test/fixture/purpose/scripts/gen_csr.rb +50 -0
  44. data/test/fixture/purpose/scripts/init_ca.rb +66 -0
  45. data/test/fixture/purpose/sslclient.pem +19 -0
  46. data/test/fixture/purpose/sslclient/csr.pem +10 -0
  47. data/test/fixture/purpose/sslclient/keypair.pem +15 -0
  48. data/test/fixture/purpose/sslclient/sslclient.pem +19 -0
  49. data/test/fixture/purpose/sslserver.pem +19 -0
  50. data/test/fixture/purpose/sslserver/csr.pem +10 -0
  51. data/test/fixture/purpose/sslserver/keypair.pem +15 -0
  52. data/test/fixture/purpose/sslserver/sslserver.pem +19 -0
  53. data/test/fixture/selfcert.pem +23 -0
  54. data/test/fixture/verisign.pem +19 -0
  55. data/test/fixture/verisign_c3.pem +14 -0
  56. data/test/java/pkcs7_mime_enveloped.message +19 -0
  57. data/test/java/pkcs7_mime_signed.message +30 -0
  58. data/test/java/pkcs7_multipart_signed.message +45 -0
  59. data/test/java/test_java_attribute.rb +25 -0
  60. data/test/java/test_java_bio.rb +42 -0
  61. data/test/java/test_java_mime.rb +173 -0
  62. data/test/java/test_java_pkcs7.rb +772 -0
  63. data/test/java/test_java_smime.rb +177 -0
  64. data/test/openssl/ssl_server.rb +99 -0
  65. data/test/openssl/test_asn1.rb +197 -0
  66. data/test/openssl/test_cipher.rb +193 -0
  67. data/test/openssl/test_config.rb +290 -0
  68. data/test/openssl/test_digest.rb +88 -0
  69. data/test/openssl/test_ec.rb +128 -0
  70. data/test/openssl/test_hmac.rb +46 -0
  71. data/test/openssl/test_ns_spki.rb +59 -0
  72. data/test/openssl/test_pair.rb +141 -0
  73. data/test/openssl/test_pkcs7.rb +489 -0
  74. data/test/openssl/test_pkey_rsa.rb +49 -0
  75. data/test/openssl/test_ssl.rb +1035 -0
  76. data/test/openssl/test_x509cert.rb +277 -0
  77. data/test/openssl/test_x509crl.rb +253 -0
  78. data/test/openssl/test_x509ext.rb +99 -0
  79. data/test/openssl/test_x509name.rb +290 -0
  80. data/test/openssl/test_x509req.rb +195 -0
  81. data/test/openssl/test_x509store.rb +246 -0
  82. data/test/openssl/utils.rb +144 -0
  83. data/test/ref/a.out +0 -0
  84. data/test/ref/compile.rb +8 -0
  85. data/test/ref/pkcs1 +0 -0
  86. data/test/ref/pkcs1.c +21 -0
  87. data/test/test_all.rb +1 -0
  88. data/test/test_certificate.rb +123 -0
  89. data/test/test_cipher.rb +197 -0
  90. data/test/test_imaps.rb +107 -0
  91. data/test/test_integration.rb +144 -0
  92. data/test/test_java.rb +98 -0
  93. data/test/test_openssl.rb +4 -0
  94. data/test/test_parse_certificate.rb +27 -0
  95. data/test/test_pkcs7.rb +40 -0
  96. data/test/test_pkey.rb +204 -0
  97. data/test/test_ssl.rb +97 -0
  98. data/test/test_x509store.rb +160 -0
  99. data/test/ut_eof.rb +128 -0
  100. metadata +161 -0
@@ -0,0 +1,61 @@
1
+ =begin
2
+ = $RCSfile$ -- Ruby-space predefined Digest subclasses
3
+
4
+ = Info
5
+ 'OpenSSL for Ruby 2' project
6
+ Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz>
7
+ All rights reserved.
8
+
9
+ = Licence
10
+ This program is licenced under the same licence as Ruby.
11
+ (See the file 'LICENCE'.)
12
+
13
+ = Version
14
+ $Id: digest.rb 15600 2008-02-25 08:48:57Z technorama $
15
+ =end
16
+
17
+ ##
18
+ # Should we care what if somebody require this file directly?
19
+ #require 'openssl'
20
+
21
+ module OpenSSL
22
+ class Digest
23
+
24
+ alg = %w(DSS DSS1 MD2 MD4 MD5 MDC2 RIPEMD160 SHA SHA1)
25
+ if OPENSSL_VERSION_NUMBER > 0x00908000
26
+ alg += %w(SHA224 SHA256 SHA384 SHA512)
27
+ end
28
+
29
+ def self.digest(name, data)
30
+ super(data, name)
31
+ end
32
+
33
+ alg.each{|name|
34
+ klass = Class.new(Digest){
35
+ define_method(:initialize){|*data|
36
+ if data.length > 1
37
+ raise ArgumentError,
38
+ "wrong number of arguments (#{data.length} for 1)"
39
+ end
40
+ super(name, data.first)
41
+ }
42
+ }
43
+ singleton = (class <<klass; self; end)
44
+ singleton.class_eval{
45
+ define_method(:digest){|data| Digest.digest(name, data) }
46
+ define_method(:hexdigest){|data| Digest.hexdigest(name, data) }
47
+ }
48
+ const_set(name, klass)
49
+ }
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
+
59
+ end # Digest
60
+ end # OpenSSL
61
+
@@ -0,0 +1,33 @@
1
+ warn "OpenSSL ASN1/PKey/X509/Netscape/PKCS7 implementation unavailable"
2
+ warn "gem install bouncy-castle-java for full support."
3
+ module OpenSSL
4
+ module ASN1
5
+ class ASN1Error < OpenSSLError; end
6
+ class ASN1Data; end
7
+ class Primitive; end
8
+ class Constructive; end
9
+ end
10
+ module X509
11
+ class Name; end
12
+ class Certificate; end
13
+ class Extension; end
14
+ class CRL; end
15
+ class Revoked; end
16
+ class Store
17
+ def set_default_paths; end
18
+ end
19
+ class Request; end
20
+ class Attribute; end
21
+ end
22
+ module Netscape
23
+ class SPKI; end
24
+ end
25
+ class PKCS7
26
+ # this definition causes TypeError "superclass mismatch for class PKCS7"
27
+ # MRI also crashes following definition;
28
+ # class Foo; class Foo < Foo; end; end
29
+ # class Foo; class Foo < Foo; end; end
30
+ #
31
+ # class PKCS7 < PKCS7; end
32
+ end
33
+ end
@@ -0,0 +1,14 @@
1
+ warn "Warning: OpenSSL SSL implementation unavailable"
2
+ warn "You must run on JDK 1.5 (Java 5) or higher to use SSL"
3
+ module OpenSSL
4
+ module SSL
5
+ class SSLError < OpenSSLError; end
6
+ class SSLContext; end
7
+ class SSLSocket; end
8
+ VERIFY_NONE = 0
9
+ VERIFY_PEER = 1
10
+ VERIFY_FAIL_IF_NO_PEER_CERT = 2
11
+ VERIFY_CLIENT_ONCE = 4
12
+ OP_ALL = 0x00000FFF
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
+
@@ -0,0 +1,179 @@
1
+ =begin
2
+ = $RCSfile$ -- Ruby-space definitions that completes C-space funcs for SSL
3
+
4
+ = Info
5
+ 'OpenSSL for Ruby 2' project
6
+ Copyright (C) 2001 GOTOU YUUZOU <gotoyuzo@notwork.org>
7
+ All rights reserved.
8
+
9
+ = Licence
10
+ This program is licenced under the same licence as Ruby.
11
+ (See the file 'LICENCE'.)
12
+
13
+ = Version
14
+ $Id: ssl.rb 16193 2008-04-25 06:51:21Z knu $
15
+ =end
16
+
17
+ require "openssl"
18
+ require "openssl/buffering"
19
+ require "fcntl"
20
+
21
+ module OpenSSL
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
+
50
+ module SocketForwarder
51
+ def addr
52
+ to_io.addr
53
+ end
54
+
55
+ def peeraddr
56
+ to_io.peeraddr
57
+ end
58
+
59
+ def setsockopt(level, optname, optval)
60
+ to_io.setsockopt(level, optname, optval)
61
+ end
62
+
63
+ def getsockopt(level, optname)
64
+ to_io.getsockopt(level, optname)
65
+ end
66
+
67
+ def fcntl(*args)
68
+ to_io.fcntl(*args)
69
+ end
70
+
71
+ def closed?
72
+ to_io.closed?
73
+ end
74
+
75
+ def do_not_reverse_lookup=(flag)
76
+ to_io.do_not_reverse_lookup = flag
77
+ end
78
+ end
79
+
80
+ module Nonblock
81
+ def initialize(*args)
82
+ flag = File::NONBLOCK
83
+ flag |= @io.fcntl(Fcntl::F_GETFL) if defined?(Fcntl::F_GETFL)
84
+ @io.fcntl(Fcntl::F_SETFL, flag)
85
+ super
86
+ end
87
+ end
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
+
116
+ class SSLSocket
117
+ include Buffering
118
+ include SocketForwarder
119
+ include Nonblock
120
+
121
+ def post_connection_check(hostname)
122
+ unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
123
+ raise SSLError, "hostname was not match with the server certificate"
124
+ end
125
+ return true
126
+ end
127
+
128
+ def session
129
+ SSL::Session.new(self)
130
+ rescue SSL::Session::SessionError
131
+ nil
132
+ end
133
+ end
134
+
135
+ class SSLServer
136
+ include SocketForwarder
137
+ attr_accessor :start_immediately
138
+
139
+ def initialize(svr, ctx)
140
+ @svr = svr
141
+ @ctx = ctx
142
+ unless ctx.session_id_context
143
+ session_id = OpenSSL::Digest::MD5.hexdigest($0)
144
+ @ctx.session_id_context = session_id
145
+ end
146
+ @start_immediately = true
147
+ end
148
+
149
+ def to_io
150
+ @svr
151
+ end
152
+
153
+ def listen(backlog=5)
154
+ @svr.listen(backlog)
155
+ end
156
+
157
+ def shutdown(how=Socket::SHUT_RDWR)
158
+ @svr.shutdown(how)
159
+ end
160
+
161
+ def accept
162
+ sock = @svr.accept
163
+ begin
164
+ ssl = OpenSSL::SSL::SSLSocket.new(sock, @ctx)
165
+ ssl.sync_close = true
166
+ ssl.accept if @start_immediately
167
+ ssl
168
+ rescue SSLError => ex
169
+ sock.close
170
+ raise ex
171
+ end
172
+ end
173
+
174
+ def close
175
+ @svr.close
176
+ end
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,154 @@
1
+ =begin
2
+ = $RCSfile$ -- Ruby-space definitions that completes C-space funcs for X509 and subclasses
3
+
4
+ = Info
5
+ 'OpenSSL for Ruby 2' project
6
+ Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz>
7
+ All rights reserved.
8
+
9
+ = Licence
10
+ This program is licenced under the same licence as Ruby.
11
+ (See the file 'LICENCE'.)
12
+
13
+ = Version
14
+ $Id: x509.rb 11708 2007-02-12 23:01:19Z shyouhei $
15
+ =end
16
+
17
+ require "openssl"
18
+
19
+ module OpenSSL
20
+ module X509
21
+ class ExtensionFactory
22
+ def create_extension(*arg)
23
+ if arg.size > 1
24
+ create_ext(*arg)
25
+ else
26
+ send("create_ext_from_"+arg[0].class.name.downcase, arg[0])
27
+ end
28
+ end
29
+
30
+ def create_ext_from_array(ary)
31
+ raise ExtensionError, "unexpected array form" if ary.size > 3
32
+ create_ext(ary[0], ary[1], ary[2])
33
+ end
34
+
35
+ def create_ext_from_string(str) # "oid = critical, value"
36
+ oid, value = str.split(/=/, 2)
37
+ oid.strip!
38
+ value.strip!
39
+ create_ext(oid, value)
40
+ end
41
+
42
+ def create_ext_from_hash(hash)
43
+ create_ext(hash["oid"], hash["value"], hash["critical"])
44
+ end
45
+ end
46
+
47
+ class Extension
48
+ def to_s # "oid = critical, value"
49
+ str = self.oid
50
+ str << " = "
51
+ str << "critical, " if self.critical?
52
+ str << self.value.gsub(/\n/, ", ")
53
+ end
54
+
55
+ def to_h # {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}
56
+ {"oid"=>self.oid,"value"=>self.value,"critical"=>self.critical?}
57
+ end
58
+
59
+ def to_a
60
+ [ self.oid, self.value, self.critical? ]
61
+ end
62
+ end
63
+
64
+ class Name
65
+ module RFC2253DN
66
+ Special = ',=+<>#;'
67
+ HexChar = /[0-9a-fA-F]/
68
+ HexPair = /#{HexChar}#{HexChar}/
69
+ HexString = /#{HexPair}+/
70
+ Pair = /\\(?:[#{Special}]|\\|"|#{HexPair})/
71
+ StringChar = /[^#{Special}\\"]/
72
+ QuoteChar = /[^\\"]/
73
+ AttributeType = /[a-zA-Z][0-9a-zA-Z]*|[0-9]+(?:\.[0-9]+)*/
74
+ AttributeValue = /
75
+ (?!["#])((?:#{StringChar}|#{Pair})*)|
76
+ \#(#{HexString})|
77
+ "((?:#{QuoteChar}|#{Pair})*)"
78
+ /x
79
+ TypeAndValue = /\A(#{AttributeType})=#{AttributeValue}/
80
+
81
+ module_function
82
+
83
+ def expand_pair(str)
84
+ return nil unless str
85
+ return str.gsub(Pair){|pair|
86
+ case pair.size
87
+ when 2 then pair[1,1]
88
+ when 3 then Integer("0x#{pair[1,2]}").chr
89
+ else raise OpenSSL::X509::NameError, "invalid pair: #{str}"
90
+ end
91
+ }
92
+ end
93
+
94
+ def expand_hexstring(str)
95
+ return nil unless str
96
+ der = str.gsub(HexPair){|hex| Integer("0x#{hex}").chr }
97
+ a1 = OpenSSL::ASN1.decode(der)
98
+ return a1.value, a1.tag
99
+ end
100
+
101
+ def expand_value(str1, str2, str3)
102
+ value = expand_pair(str1)
103
+ value, tag = expand_hexstring(str2) unless value
104
+ value = expand_pair(str3) unless value
105
+ return value, tag
106
+ end
107
+
108
+ def scan(dn)
109
+ str = dn
110
+ ary = []
111
+ while true
112
+ if md = TypeAndValue.match(str)
113
+ matched = md.to_s
114
+ remain = md.post_match
115
+ type = md[1]
116
+ value, tag = expand_value(md[2], md[3], md[4]) rescue nil
117
+ if value
118
+ type_and_value = [type, value]
119
+ type_and_value.push(tag) if tag
120
+ ary.unshift(type_and_value)
121
+ if remain.length > 2 && remain[0] == ?,
122
+ str = remain[1..-1]
123
+ next
124
+ elsif remain.length > 2 && remain[0] == ?+
125
+ raise OpenSSL::X509::NameError,
126
+ "multi-valued RDN is not supported: #{dn}"
127
+ elsif remain.empty?
128
+ break
129
+ end
130
+ end
131
+ end
132
+ msg_dn = dn[0, dn.length - str.length] + " =>" + str
133
+ raise OpenSSL::X509::NameError, "malformed RDN: #{msg_dn}"
134
+ end
135
+ return ary
136
+ end
137
+ end
138
+
139
+ class <<self
140
+ def parse_rfc2253(str, template=OBJECT_TYPE_TEMPLATE)
141
+ ary = OpenSSL::X509::Name::RFC2253DN.scan(str)
142
+ self.new(ary, template)
143
+ end
144
+
145
+ def parse_openssl(str, template=OBJECT_TYPE_TEMPLATE)
146
+ ary = str.scan(/\s*([^\/,]+)\s*/).collect{|i| i[0].split("=", 2) }
147
+ self.new(ary, template)
148
+ end
149
+
150
+ alias parse parse_openssl
151
+ end
152
+ end
153
+ end
154
+ end