diff options
Diffstat (limited to 'test/rubygems/test_gem_security_policy.rb')
-rw-r--r-- | test/rubygems/test_gem_security_policy.rb | 178 |
1 files changed, 92 insertions, 86 deletions
diff --git a/test/rubygems/test_gem_security_policy.rb b/test/rubygems/test_gem_security_policy.rb index 515b8ea00b..2f4fb1ce28 100644 --- a/test/rubygems/test_gem_security_policy.rb +++ b/test/rubygems/test_gem_security_policy.rb @@ -1,39 +1,39 @@ # frozen_string_literal: true -require_relative 'helper' +require_relative "helper" unless Gem::HAVE_OPENSSL - warn 'Skipping Gem::Security::Policy tests. openssl not found.' + warn "Skipping Gem::Security::Policy tests. openssl not found." end class TestGemSecurityPolicy < Gem::TestCase - ALTERNATE_KEY = load_key 'alternate' - INVALID_KEY = load_key 'invalid' - CHILD_KEY = load_key 'child' - GRANDCHILD_KEY = load_key 'grandchild' - INVALIDCHILD_KEY = load_key 'invalidchild' - - ALTERNATE_CERT = load_cert 'alternate' - CA_CERT = load_cert 'ca' - CHILD_CERT = load_cert 'child' - EXPIRED_CERT = load_cert 'expired' - FUTURE_CERT = load_cert 'future' - GRANDCHILD_CERT = load_cert 'grandchild' - INVALIDCHILD_CERT = load_cert 'invalidchild' - INVALID_ISSUER_CERT = load_cert 'invalid_issuer' - INVALID_SIGNER_CERT = load_cert 'invalid_signer' - WRONG_KEY_CERT = load_cert 'wrong_key' + ALTERNATE_KEY = load_key "alternate" + INVALID_KEY = load_key "invalid" + CHILD_KEY = load_key "child" + GRANDCHILD_KEY = load_key "grandchild" + INVALIDCHILD_KEY = load_key "invalidchild" + + ALTERNATE_CERT = load_cert "alternate" + CA_CERT = load_cert "ca" + CHILD_CERT = load_cert "child" + EXPIRED_CERT = load_cert "expired" + FUTURE_CERT = load_cert "future" + GRANDCHILD_CERT = load_cert "grandchild" + INVALIDCHILD_CERT = load_cert "invalidchild" + INVALID_ISSUER_CERT = load_cert "invalid_issuer" + INVALID_SIGNER_CERT = load_cert "invalid_signer" + WRONG_KEY_CERT = load_cert "wrong_key" def setup super - @spec = quick_gem 'a' do |s| - s.description = 'π' + @spec = quick_gem "a" do |s| + s.description = "π" s.files = %w[lib/code.rb] end @digest = OpenSSL::Digest.new Gem::Security::DIGEST_NAME - @trust_dir = Gem::Security.trust_dir.dir # HACK use the object + @trust_dir = Gem::Security.trust_dir.dir # HACK: use the object @no = Gem::Security::NoSecurity @almost_no = Gem::Security::AlmostNoSecurity @@ -42,28 +42,28 @@ class TestGemSecurityPolicy < Gem::TestCase @high = Gem::Security::HighSecurity @chain = Gem::Security::Policy.new( - 'Chain', - :verify_data => true, - :verify_signer => true, - :verify_chain => true, - :verify_root => false, - :only_trusted => false, - :only_signed => false + "Chain", + verify_data: true, + verify_signer: true, + verify_chain: true, + verify_root: false, + only_trusted: false, + only_signed: false ) @root = Gem::Security::Policy.new( - 'Root', - :verify_data => true, - :verify_signer => true, - :verify_chain => true, - :verify_root => true, - :only_trusted => false, - :only_signed => false + "Root", + verify_data: true, + verify_signer: true, + verify_chain: true, + verify_root: true, + only_trusted: false, + only_signed: false ) end def test_check_data - data = digest 'hello' + data = digest "hello" signature = sign data @@ -71,17 +71,17 @@ class TestGemSecurityPolicy < Gem::TestCase end def test_check_data_invalid - data = digest 'hello' + data = digest "hello" signature = sign data - invalid = digest 'hello!' + invalid = digest "hello!" e = assert_raise Gem::Security::Exception do @almost_no.check_data PUBLIC_KEY, @digest, signature, invalid end - assert_equal 'invalid signature', e.message + assert_equal "invalid signature", e.message end def test_check_chain @@ -95,7 +95,7 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_chain [], Time.now end - assert_equal 'empty signing chain', e.message + assert_equal "empty signing chain", e.message end def test_check_chain_invalid @@ -105,8 +105,8 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_chain chain, Time.now end - assert_equal "invalid signing chain: " + - "certificate #{INVALIDCHILD_CERT.subject} " + + assert_equal "invalid signing chain: " \ + "certificate #{INVALIDCHILD_CERT.subject} " \ "was not issued by #{CHILD_CERT.subject}", e.message end @@ -115,7 +115,7 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_chain nil, Time.now end - assert_equal 'missing signing chain', e.message + assert_equal "missing signing chain", e.message end def test_check_cert @@ -127,7 +127,7 @@ class TestGemSecurityPolicy < Gem::TestCase @low.check_cert EXPIRED_CERT, nil, Time.now end - assert_equal "certificate #{EXPIRED_CERT.subject} " + + assert_equal "certificate #{EXPIRED_CERT.subject} " \ "not valid after #{EXPIRED_CERT.not_after}", e.message end @@ -137,7 +137,7 @@ class TestGemSecurityPolicy < Gem::TestCase @low.check_cert FUTURE_CERT, nil, Time.now end - assert_equal "certificate #{FUTURE_CERT.subject} " + + assert_equal "certificate #{FUTURE_CERT.subject} " \ "not valid before #{FUTURE_CERT.not_before}", e.message end @@ -147,7 +147,7 @@ class TestGemSecurityPolicy < Gem::TestCase @low.check_cert INVALID_ISSUER_CERT, PUBLIC_CERT, Time.now end - assert_equal "certificate #{INVALID_ISSUER_CERT.subject} " + + assert_equal "certificate #{INVALID_ISSUER_CERT.subject} " \ "was not issued by #{PUBLIC_CERT.subject}", e.message end @@ -161,7 +161,7 @@ class TestGemSecurityPolicy < Gem::TestCase @high.check_cert(nil, nil, Time.now) end - assert_equal 'missing signing certificate', e.message + assert_equal "missing signing certificate", e.message end def test_check_key @@ -175,7 +175,7 @@ class TestGemSecurityPolicy < Gem::TestCase @high.check_key(nil, nil) end - assert_equal 'missing key or signature', e.message + assert_equal "missing key or signature", e.message end def test_check_key_wrong_key @@ -183,7 +183,7 @@ class TestGemSecurityPolicy < Gem::TestCase @almost_no.check_key(PUBLIC_CERT, ALTERNATE_KEY) end - assert_equal "certificate #{PUBLIC_CERT.subject} " + + assert_equal "certificate #{PUBLIC_CERT.subject} " \ "does not match the signing key", e.message end @@ -198,7 +198,7 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_root [], Time.now end - assert_equal 'missing root certificate', e.message + assert_equal "missing root certificate", e.message end def test_check_root_invalid_signer @@ -208,7 +208,7 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_root chain, Time.now end - assert_equal "certificate #{INVALID_SIGNER_CERT.subject} " + + assert_equal "certificate #{INVALID_SIGNER_CERT.subject} " \ "was not issued by #{INVALID_SIGNER_CERT.issuer}", e.message end @@ -220,7 +220,7 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_root chain, Time.now end - assert_equal "root certificate #{INVALID_ISSUER_CERT.subject} " + + assert_equal "root certificate #{INVALID_ISSUER_CERT.subject} " \ "is not self-signed (issuer #{INVALID_ISSUER_CERT.issuer})", e.message end @@ -230,7 +230,7 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_root nil, Time.now end - assert_equal 'missing signing chain', e.message + assert_equal "missing signing chain", e.message end def test_check_trust @@ -250,7 +250,7 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_trust [], @digest, @trust_dir end - assert_equal 'missing root certificate', e.message + assert_equal "missing root certificate", e.message end def test_check_trust_mismatch @@ -260,7 +260,7 @@ class TestGemSecurityPolicy < Gem::TestCase @high.check_trust [WRONG_KEY_CERT], @digest, @trust_dir end - assert_equal "trusted root certificate #{PUBLIC_CERT.subject} checksum " + + assert_equal "trusted root certificate #{PUBLIC_CERT.subject} checksum " \ "does not match signing root certificate checksum", e.message end @@ -269,7 +269,7 @@ class TestGemSecurityPolicy < Gem::TestCase @chain.check_trust nil, @digest, @trust_dir end - assert_equal 'missing signing chain', e.message + assert_equal "missing signing chain", e.message end def test_check_trust_no_trust @@ -285,13 +285,13 @@ class TestGemSecurityPolicy < Gem::TestCase @high.check_trust [PUBLIC_CERT, CHILD_CERT], @digest, @trust_dir end - assert_equal "root cert #{PUBLIC_CERT.subject} is not trusted " + + assert_equal "root cert #{PUBLIC_CERT.subject} is not trusted " \ "(root of signing cert #{CHILD_CERT.subject})", e.message end def test_subject - assert_equal 'email:nobody@example', @no.subject(PUBLIC_CERT) - assert_equal '/C=JP/ST=Tokyo/O=RubyGemsTest/CN=CA', @no.subject(CA_CERT) + assert_equal "email:nobody@example", @no.subject(PUBLIC_CERT) + assert_equal "/C=JP/ST=Tokyo/O=RubyGemsTest/CN=CA", @no.subject(CA_CERT) end def test_verify @@ -319,7 +319,7 @@ class TestGemSecurityPolicy < Gem::TestCase @almost_no.verify [PUBLIC_CERT], nil, {}, signatures end - assert_equal 'no digests provided (probable bug)', e.message + assert_equal "no digests provided (probable bug)", e.message end def test_verify_no_digests_no_security @@ -331,7 +331,7 @@ class TestGemSecurityPolicy < Gem::TestCase @no.verify [PUBLIC_CERT], nil, {}, signatures end - assert_equal 'missing digest for 0', e.message + assert_equal "missing digest for 0", e.message end def test_verify_no_signatures @@ -340,7 +340,7 @@ class TestGemSecurityPolicy < Gem::TestCase digests, = dummy_signatures use_ui @ui do - @no.verify [PUBLIC_CERT], nil, digests, {}, 'some_gem' + @no.verify [PUBLIC_CERT], nil, digests, {}, "some_gem" end assert_match "WARNING: some_gem is not signed\n", @ui.error @@ -354,7 +354,7 @@ class TestGemSecurityPolicy < Gem::TestCase Gem::Security.trust_dir.trust_cert PUBLIC_CERT use_ui @ui do - @no.verify [PUBLIC_CERT], nil, {}, {}, 'some_gem' + @no.verify [PUBLIC_CERT], nil, {}, {}, "some_gem" end assert_empty @ui.output @@ -366,7 +366,7 @@ class TestGemSecurityPolicy < Gem::TestCase digests, signatures = dummy_signatures - data = digest 'goodbye' + data = digest "goodbye" signatures[1] = PRIVATE_KEY.sign @digest.new, data.digest @@ -374,14 +374,14 @@ class TestGemSecurityPolicy < Gem::TestCase @almost_no.verify [PUBLIC_CERT], nil, digests, signatures end - assert_equal 'missing digest for 1', e.message + assert_equal "missing digest for 1", e.message end def test_verify_no_trust digests, signatures = dummy_signatures use_ui @ui do - @low.verify [PUBLIC_CERT], nil, digests, signatures, 'some_gem' + @low.verify [PUBLIC_CERT], nil, digests, signatures, "some_gem" end assert_equal "WARNING: email:nobody@example is not trusted for some_gem\n", @@ -395,18 +395,18 @@ class TestGemSecurityPolicy < Gem::TestCase def test_verify_wrong_digest_type Gem::Security.trust_dir.trust_cert PUBLIC_CERT - data = OpenSSL::Digest.new('SHA512') - data << 'hello' + data = OpenSSL::Digest.new("SHA512") + data << "hello" - digests = { 'SHA512' => { 0 => data } } - signature = PRIVATE_KEY.sign 'sha512', data.digest + digests = { "SHA512" => { 0 => data } } + signature = PRIVATE_KEY.sign "sha512", data.digest signatures = { 0 => signature } e = assert_raise Gem::Security::Exception do @almost_no.verify [PUBLIC_CERT], nil, digests, signatures end - assert_equal 'no digests provided (probable bug)', e.message + assert_equal "no digests provided (probable bug)", e.message end def test_verify_signatures_chain @@ -448,17 +448,19 @@ class TestGemSecurityPolicy < Gem::TestCase metadata_gz = Gem::Util.gzip @spec.to_yaml - package = Gem::Package.new 'nonexistent.gem' + package = Gem::Package.new "nonexistent.gem" package.checksums[Gem::Security::DIGEST_NAME] = {} s = StringIO.new metadata_gz - def s.full_name() 'metadata.gz' end + def s.full_name + "metadata.gz" + end digests = package.digest s - metadata_gz_digest = digests[Gem::Security::DIGEST_NAME]['metadata.gz'] + metadata_gz_digest = digests[Gem::Security::DIGEST_NAME]["metadata.gz"] signatures = {} - signatures['metadata.gz'] = + signatures["metadata.gz"] = PRIVATE_KEY.sign @digest.new, metadata_gz_digest.digest assert @high.verify_signatures @spec, digests, signatures @@ -471,26 +473,28 @@ class TestGemSecurityPolicy < Gem::TestCase metadata_gz = Gem::Util.gzip @spec.to_yaml - package = Gem::Package.new 'nonexistent.gem' + package = Gem::Package.new "nonexistent.gem" package.checksums[Gem::Security::DIGEST_NAME] = {} s = StringIO.new metadata_gz - def s.full_name() 'metadata.gz' end + def s.full_name + "metadata.gz" + end digests = package.digest s - digests[Gem::Security::DIGEST_NAME]['data.tar.gz'] = @digest.hexdigest 'hello' + digests[Gem::Security::DIGEST_NAME]["data.tar.gz"] = @digest.hexdigest "hello" - metadata_gz_digest = digests[Gem::Security::DIGEST_NAME]['metadata.gz'] + metadata_gz_digest = digests[Gem::Security::DIGEST_NAME]["metadata.gz"] signatures = {} - signatures['metadata.gz'] = + signatures["metadata.gz"] = PRIVATE_KEY.sign @digest.new, metadata_gz_digest.digest e = assert_raise Gem::Security::Exception do @high.verify_signatures @spec, digests, signatures end - assert_equal 'missing signature for data.tar.gz', e.message + assert_equal "missing signature for data.tar.gz", e.message end def test_verify_signatures_none @@ -500,14 +504,16 @@ class TestGemSecurityPolicy < Gem::TestCase metadata_gz = Gem::Util.gzip @spec.to_yaml - package = Gem::Package.new 'nonexistent.gem' + package = Gem::Package.new "nonexistent.gem" package.checksums[Gem::Security::DIGEST_NAME] = {} s = StringIO.new metadata_gz - def s.full_name() 'metadata.gz' end + def s.full_name + "metadata.gz" + end digests = package.digest s - digests[Gem::Security::DIGEST_NAME]['data.tar.gz'] = @digest.hexdigest 'hello' + digests[Gem::Security::DIGEST_NAME]["data.tar.gz"] = @digest.hexdigest "hello" assert_raise Gem::Security::Exception do @high.verify_signatures @spec, digests, {} @@ -525,11 +531,11 @@ class TestGemSecurityPolicy < Gem::TestCase end def dummy_signatures(key = PRIVATE_KEY) - data = digest 'hello' + data = digest "hello" digests = { Gem::Security::DIGEST_NAME => { 0 => data } } signatures = { 0 => sign(data, key) } - return digests, signatures + [digests, signatures] end end if Gem::HAVE_OPENSSL |