mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 609103dbb5
			
		
	
	
		609103dbb5
		
	
	
	
	
		
			
			Import Ruby/OpenSSL 2.1.0.beta1. The full commit log since v2.0.5 (imported by r59567) can be found at: https://github.com/ruby/openssl/compare/v2.0.5...v2.1.0.beta1 ---------------------------------------------------------------- Antonio Terceiro (1): test/test_ssl: explicitly accept TLS 1.1 in corresponding test Colby Swandale (1): document using secure protocol to fetch git master in Bundler Colton Jenkins (1): Add fips_mode_get to return fips_mode Kazuki Yamaguchi (85): Start preparing for 2.1.0 Remove support for OpenSSL 0.9.8 and 1.0.0 bn: refine tests bn: implement unary {plus,minus} operators for OpenSSL::BN bn: implement OpenSSL::BN#negative? Don't define main() when built with --enable-debug test: let OpenSSL::TestCase include OpenSSL::TestUtils test: prepare test PKey instances on demand Add OpenSSL.print_mem_leaks Enable OSSL_MDEBUG on CI builds ssl: move default DH parameters from OpenSSL::PKey::DH Make exceptions with the same format regardless of OpenSSL.debug ssl: show reason of 'certificate verify error' in exception message ssl: remove OpenSSL::ExtConfig::TLS_DH_anon_WITH_AES_256_GCM_SHA384 ssl: do not confuse different ex_data index registries ssl: assume SSL/SSL_CTX always have a valid reference to the Ruby object Fix RDoc markup ssl: suppress compiler warning ext/openssl/deprecation.rb: remove broken-apple-openssl extconf.rb: print informative message if OpenSSL can't be found Rakefile: compile the extension before test kdf: introduce OpenSSL::KDF module ossl.h: add NUM2UINT64T() macro kdf: add scrypt Expand rb_define_copy_func() macro Expand FPTR_TO_FD() macro Remove SafeGet*() macros cipher: rename GetCipherPtr() to ossl_evp_get_cipherbyname() digest: rename GetDigestPtr() to ossl_evp_get_digestbyname() Add ossl_str_new(), an exception-safe rb_str_new() bio: simplify ossl_membio2str() using ossl_str_new() Remove unused functions and macros Drop support for LibreSSL 2.3 ocsp: add OpenSSL::OCSP::Request#signed? asn1: infinite length -> indefinite length asn1: rearrange tests ssl: remove a needless NULL check in SSL::SSLContext#ciphers ssl: return nil in SSL::SSLSocket#cipher if session is not started asn1: remove an unnecessary function prototype asn1: require tag information when instantiating generic type asn1: initialize 'unused_bits' attribute of BitString with 0 asn1: check for illegal 'unused_bits' value of BitString asn1: disallow NULL to be passed to asn1time_to_time() asn1: avoid truncating OID in OpenSSL::ASN1::ObjectId#oid asn1: allow constructed encoding with definite length form asn1: prohibit indefinite length form for primitive encoding asn1: allow tag number to be >= 32 for universal tag class asn1: use ossl_asn1_tag() asn1: clean up OpenSSL::ASN1::Constructive#to_der asn1: harmonize OpenSSL::ASN1::*#to_der asn1: prevent EOC octets from being in the middle of the content asn1: do not treat EOC octets as part of content octets x509name: add 'loc' and 'set' kwargs to OpenSSL::X509::Name#add_entry ssl: do not call session_remove_cb during GC Backport "Merge branch 'topic/test-memory-leak'" to maint cipher: update the documentation for Cipher#auth_tag= Rakefile: let sync:to_ruby know about test/openssl/fixtures test: fix formatting test/utils: remove OpenSSL::TestUtils.silent test/utils: add SSLTestCase#tls12_supported? test/utils: have start_server yield only the port number test/utils: do not set ecdh_curves in start_server test/utils: let server_loop close socket test/utils: improve error handling in start_server test/utils: add OpenSSL::TestUtils.openssl? and .libressl? test/utils: do not use DSA certificates in SSL tests test/test_ssl: remove test_invalid_shutdown_by_gc test/test_ssl: move test_multibyte_read_write to test_pair test/test_ssl_session: rearrange tests test/test_pair, test/test_ssl: fix for TLS 1.3 ssl: remove useless call to rb_thread_wait_fd() ssl: fix NPN support ssl: mark OpenSSL::SSL::SSLContext::DEFAULT_{1024,2048} as private ssl: use 2048-bit group in the default tmp_dh_cb ssl: ensure that SSL option flags are non-negative ssl: update OpenSSL::SSL::OP_* flags ssl: prefer TLS_method() over SSLv23_method() ssl: add SSLContext#min_version= and #max_version= ssl: rework SSLContext#ssl_version= test/test_x509name: change script encoding to ASCII-8BIT x509name: refactor OpenSSL::X509::Name#to_s x509name: add OpenSSL::X509::Name#to_utf8 x509name: add OpenSSL::X509::Name#inspect x509name: update regexp in OpenSSL::X509::Name.parse Ruby/OpenSSL 2.1.0.beta1 Marcus Stollsteimer (1): Fix rdoc for core Integer class nobu (4): [DOC] {read,write}_nonblock with exception: false [DOC] keyword argument _exception_ [DOC] mark up literals Revert r57690 except for read_nonblock git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59734 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			200 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: false
 | |
| require_relative 'utils'
 | |
| 
 | |
| if defined?(OpenSSL) && defined?(OpenSSL::PKey::DSA)
 | |
| 
 | |
| class OpenSSL::TestPKeyDSA < OpenSSL::PKeyTestCase
 | |
|   def test_private
 | |
|     key = OpenSSL::PKey::DSA.new(256)
 | |
|     assert(key.private?)
 | |
|     key2 = OpenSSL::PKey::DSA.new(key.to_der)
 | |
|     assert(key2.private?)
 | |
|     key3 = key.public_key
 | |
|     assert(!key3.private?)
 | |
|     key4 = OpenSSL::PKey::DSA.new(key3.to_der)
 | |
|     assert(!key4.private?)
 | |
|   end
 | |
| 
 | |
|   def test_new
 | |
|     key = OpenSSL::PKey::DSA.new 256
 | |
|     pem  = key.public_key.to_pem
 | |
|     OpenSSL::PKey::DSA.new pem
 | |
|     if $0 == __FILE__
 | |
|       assert_nothing_raised {
 | |
|         key = OpenSSL::PKey::DSA.new 2048
 | |
|       }
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def test_new_break
 | |
|     assert_nil(OpenSSL::PKey::DSA.new(512) { break })
 | |
|     assert_raise(RuntimeError) do
 | |
|       OpenSSL::PKey::DSA.new(512) { raise }
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def test_sign_verify
 | |
|     dsa512 = Fixtures.pkey("dsa512")
 | |
|     data = "Sign me!"
 | |
|     if defined?(OpenSSL::Digest::DSS1)
 | |
|       signature = dsa512.sign(OpenSSL::Digest::DSS1.new, data)
 | |
|       assert_equal true, dsa512.verify(OpenSSL::Digest::DSS1.new, signature, data)
 | |
|     end
 | |
| 
 | |
|     signature = dsa512.sign("SHA1", data)
 | |
|     assert_equal true, dsa512.verify("SHA1", signature, data)
 | |
| 
 | |
|     signature0 = (<<~'end;').unpack("m")[0]
 | |
|       MCwCFH5h40plgU5Fh0Z4wvEEpz0eE9SnAhRPbkRB8ggsN/vsSEYMXvJwjGg/
 | |
|       6g==
 | |
|     end;
 | |
|     assert_equal true, dsa512.verify("SHA256", signature0, data)
 | |
|     signature1 = signature0.succ
 | |
|     assert_equal false, dsa512.verify("SHA256", signature1, data)
 | |
|   end
 | |
| 
 | |
|   def test_sys_sign_verify
 | |
|     key = Fixtures.pkey("dsa256")
 | |
|     data = 'Sign me!'
 | |
|     digest = OpenSSL::Digest::SHA1.digest(data)
 | |
|     sig = key.syssign(digest)
 | |
|     assert(key.sysverify(digest, sig))
 | |
|   end
 | |
| 
 | |
|   def test_DSAPrivateKey
 | |
|     # OpenSSL DSAPrivateKey format; similar to RSAPrivateKey
 | |
|     dsa512 = Fixtures.pkey("dsa512")
 | |
|     asn1 = OpenSSL::ASN1::Sequence([
 | |
|       OpenSSL::ASN1::Integer(0),
 | |
|       OpenSSL::ASN1::Integer(dsa512.p),
 | |
|       OpenSSL::ASN1::Integer(dsa512.q),
 | |
|       OpenSSL::ASN1::Integer(dsa512.g),
 | |
|       OpenSSL::ASN1::Integer(dsa512.pub_key),
 | |
|       OpenSSL::ASN1::Integer(dsa512.priv_key)
 | |
|     ])
 | |
|     key = OpenSSL::PKey::DSA.new(asn1.to_der)
 | |
|     assert_predicate key, :private?
 | |
|     assert_same_dsa dsa512, key
 | |
| 
 | |
|     pem = <<~EOF
 | |
|     -----BEGIN DSA PRIVATE KEY-----
 | |
|     MIH4AgEAAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgTYiEEHaOYhkIxv0Ok
 | |
|     RZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB4DZGH7UyarcaGy6D
 | |
|     AkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqoji3/lHdKoVdTQNuR
 | |
|     S/m6DlCwhjRjiQ/lBRgCLCcaAkEAjN891JBjzpMj4bWgsACmMggFf57DS0Ti+5++
 | |
|     Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxXoXi9OAIUBG98h4tilg6S
 | |
|     55jreJD3Se3slps=
 | |
|     -----END DSA PRIVATE KEY-----
 | |
|     EOF
 | |
|     key = OpenSSL::PKey::DSA.new(pem)
 | |
|     assert_same_dsa dsa512, key
 | |
| 
 | |
|     assert_equal asn1.to_der, dsa512.to_der
 | |
|     assert_equal pem, dsa512.export
 | |
|   end
 | |
| 
 | |
|   def test_DSAPrivateKey_encrypted
 | |
|     # key = abcdef
 | |
|     dsa512 = Fixtures.pkey("dsa512")
 | |
|     pem = <<~EOF
 | |
|     -----BEGIN DSA PRIVATE KEY-----
 | |
|     Proc-Type: 4,ENCRYPTED
 | |
|     DEK-Info: AES-128-CBC,F8BB7BFC7EAB9118AC2E3DA16C8DB1D9
 | |
| 
 | |
|     D2sIzsM9MLXBtlF4RW42u2GB9gX3HQ3prtVIjWPLaKBYoToRUiv8WKsjptfZuLSB
 | |
|     74ZPdMS7VITM+W1HIxo/tjS80348Cwc9ou8H/E6WGat8ZUk/igLOUEII+coQS6qw
 | |
|     QpuLMcCIavevX0gjdjEIkojBB81TYDofA1Bp1z1zDI/2Zhw822xapI79ZF7Rmywt
 | |
|     OSyWzFaGipgDpdFsGzvT6//z0jMr0AuJVcZ0VJ5lyPGQZAeVBlbYEI4T72cC5Cz7
 | |
|     XvLiaUtum6/sASD2PQqdDNpgx/WA6Vs1Po2kIUQIM5TIwyJI0GdykZcYm6xIK/ta
 | |
|     Wgx6c8K+qBAIVrilw3EWxw==
 | |
|     -----END DSA PRIVATE KEY-----
 | |
|     EOF
 | |
|     key = OpenSSL::PKey::DSA.new(pem, "abcdef")
 | |
|     assert_same_dsa dsa512, key
 | |
|     key = OpenSSL::PKey::DSA.new(pem) { "abcdef" }
 | |
|     assert_same_dsa dsa512, key
 | |
| 
 | |
|     cipher = OpenSSL::Cipher.new("aes-128-cbc")
 | |
|     exported = dsa512.to_pem(cipher, "abcdef\0\1")
 | |
|     assert_same_dsa dsa512, OpenSSL::PKey::DSA.new(exported, "abcdef\0\1")
 | |
|     assert_raise(OpenSSL::PKey::DSAError) {
 | |
|       OpenSSL::PKey::DSA.new(exported, "abcdef")
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   def test_PUBKEY
 | |
|     dsa512 = Fixtures.pkey("dsa512")
 | |
|     asn1 = OpenSSL::ASN1::Sequence([
 | |
|       OpenSSL::ASN1::Sequence([
 | |
|         OpenSSL::ASN1::ObjectId("DSA"),
 | |
|         OpenSSL::ASN1::Sequence([
 | |
|           OpenSSL::ASN1::Integer(dsa512.p),
 | |
|           OpenSSL::ASN1::Integer(dsa512.q),
 | |
|           OpenSSL::ASN1::Integer(dsa512.g)
 | |
|         ])
 | |
|       ]),
 | |
|       OpenSSL::ASN1::BitString(
 | |
|         OpenSSL::ASN1::Integer(dsa512.pub_key).to_der
 | |
|       )
 | |
|     ])
 | |
|     key = OpenSSL::PKey::DSA.new(asn1.to_der)
 | |
|     assert_not_predicate key, :private?
 | |
|     assert_same_dsa dup_public(dsa512), key
 | |
| 
 | |
|     pem = <<~EOF
 | |
|     -----BEGIN PUBLIC KEY-----
 | |
|     MIHxMIGoBgcqhkjOOAQBMIGcAkEA5lB4GvEwjrsMlGDqGsxrbqeFRh6o9OWt6FgT
 | |
|     YiEEHaOYhkIxv0OkRZPDNwOG997mDjBnvDJ1i56OmS3MbTnovwIVAJgub/aDrSDB
 | |
|     4DZGH7UyarcaGy6DAkB9HdFw/3td8K4l1FZHv7TCZeJ3ZLb7dF3TWoGUP003RCqo
 | |
|     ji3/lHdKoVdTQNuRS/m6DlCwhjRjiQ/lBRgCLCcaA0QAAkEAjN891JBjzpMj4bWg
 | |
|     sACmMggFf57DS0Ti+5++Q1VB8qkJN7rA7/2HrCR3gTsWNb1YhAsnFsoeRscC+LxX
 | |
|     oXi9OA==
 | |
|     -----END PUBLIC KEY-----
 | |
|     EOF
 | |
|     key = OpenSSL::PKey::DSA.new(pem)
 | |
|     assert_same_dsa dup_public(dsa512), key
 | |
| 
 | |
|     assert_equal asn1.to_der, dup_public(dsa512).to_der
 | |
|     assert_equal pem, dup_public(dsa512).export
 | |
|   end
 | |
| 
 | |
|   def test_read_DSAPublicKey_pem
 | |
|     # TODO: where is the standard? PKey::DSA.new can read only PEM
 | |
|     p = 12260055936871293565827712385212529106400444521449663325576634579961635627321079536132296996623400607469624537382977152381984332395192110731059176842635699
 | |
|     q = 979494906553787301107832405790107343409973851677
 | |
|     g = 3731695366899846297271147240305742456317979984190506040697507048095553842519347835107669437969086119948785140453492839427038591924536131566350847469993845
 | |
|     y = 10505239074982761504240823422422813362721498896040719759460296306305851824586095328615844661273887569281276387605297130014564808567159023649684010036304695
 | |
|     pem = <<-EOF
 | |
| -----BEGIN DSA PUBLIC KEY-----
 | |
| MIHfAkEAyJSJ+g+P/knVcgDwwTzC7Pwg/pWs2EMd/r+lYlXhNfzg0biuXRul8VR4
 | |
| VUC/phySExY0PdcqItkR/xYAYNMbNwJBAOoV57X0FxKO/PrNa/MkoWzkCKV/hzhE
 | |
| p0zbFdsicw+hIjJ7S6Sd/FlDlo89HQZ2FuvWJ6wGLM1j00r39+F2qbMCFQCrkhIX
 | |
| SG+is37hz1IaBeEudjB2HQJAR0AloavBvtsng8obsjLb7EKnB+pSeHr/BdIQ3VH7
 | |
| fWLOqqkzFeRrYMDzUpl36XktY6Yq8EJYlW9pCMmBVNy/dQ==
 | |
| -----END DSA PUBLIC KEY-----
 | |
|     EOF
 | |
|     key = OpenSSL::PKey::DSA.new(pem)
 | |
|     assert(key.public?)
 | |
|     assert(!key.private?)
 | |
|     assert_equal(p, key.p)
 | |
|     assert_equal(q, key.q)
 | |
|     assert_equal(g, key.g)
 | |
|     assert_equal(y, key.pub_key)
 | |
|     assert_equal(nil, key.priv_key)
 | |
|   end
 | |
| 
 | |
|   def test_dup
 | |
|     key = OpenSSL::PKey::DSA.new(256)
 | |
|     key2 = key.dup
 | |
|     assert_equal key.params, key2.params
 | |
|     key2.set_pqg(key2.p + 1, key2.q, key2.g)
 | |
|     assert_not_equal key.params, key2.params
 | |
|   end
 | |
| 
 | |
|   private
 | |
|   def assert_same_dsa(expected, key)
 | |
|     check_component(expected, key, [:p, :q, :g, :pub_key, :priv_key])
 | |
|   end
 | |
| end
 | |
| 
 | |
| end
 |