Skip to content

Commit

Permalink
Merge pull request #185 from cunnie/IPv6_SAN_verification
Browse files Browse the repository at this point in the history
Correctly verify abbreviated IPv6 SANs
  • Loading branch information
rhenium authored Feb 19, 2018
2 parents f707996 + 9322a10 commit 5c5bf71
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 6 deletions.
11 changes: 6 additions & 5 deletions lib/openssl/ssl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

require "openssl/buffering"
require "io/nonblock"
require "ipaddr"

module OpenSSL
module SSL
Expand Down Expand Up @@ -272,11 +273,11 @@ def verify_certificate_identity(cert, hostname)
return true if verify_hostname(hostname, san.value)
when 7 # iPAddress in GeneralName (RFC5280)
should_verify_common_name = false
# follows GENERAL_NAME_print() in x509v3/v3_alt.c
if san.value.size == 4
return true if san.value.unpack('C*').join('.') == hostname
elsif san.value.size == 16
return true if san.value.unpack('n*').map { |e| sprintf("%X", e) }.join(':') == hostname
if san.value.size == 4 || san.value.size == 16
begin
return true if san.value == IPAddr.new(hostname).hton
rescue IPAddr::InvalidAddressError
end
end
end
}
Expand Down
1 change: 1 addition & 0 deletions openssl.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Gem::Specification.new do |spec|

spec.required_ruby_version = ">= 2.3.0"

spec.add_runtime_dependency "ipaddr"
spec.add_development_dependency "rake"
spec.add_development_dependency "rake-compiler"
spec.add_development_dependency "test-unit", "~> 3.0"
Expand Down
6 changes: 5 additions & 1 deletion test/test_ssl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -516,8 +516,12 @@ def test_verify_certificate_identity
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(cert, "www.example.com\0.evil.com"))
assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '192.168.7.255'))
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(cert, '192.168.7.1'))
assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '13::17'))
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(cert, '13::17'))
assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '13::18'))
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(cert, '13:0:0:0:0:0:0:17'))
assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '44:0:0:0:0:0:0:17'))
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(cert, '0013:0000:0000:0000:0000:0000:0000:0017'))
assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '1313:0000:0000:0000:0000:0000:0000:0017'))
end
end

Expand Down

0 comments on commit 5c5bf71

Please sign in to comment.