Skip to content

Commit 8f58e70

Browse files
committed
[fix] invalid Cert#sign handling -> raise
instead of simply causing a ClassCastException
1 parent 8fdf6a9 commit 8f58e70

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

src/main/java/org/jruby/ext/openssl/X509Cert.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -564,16 +564,23 @@ else if ( "DSA".equalsIgnoreCase(algorithm) ) {
564564
public IRubyObject sign(final ThreadContext context, final IRubyObject key, final IRubyObject digest) {
565565
final Ruby runtime = context.runtime;
566566

567+
if (!(key instanceof PKey)) { // MRI: NoMethodError: undefined method `private?' for nil:NilClass
568+
throw runtime.newTypeError(key, PKey._PKey(runtime).getClass("PKey"));
569+
}
570+
567571
// Have to obey some artificial constraints of the OpenSSL implementation. Stupid.
568572
final String keyAlg = ((PKey) key).getAlgorithm();
569573
final String digAlg; final String digName;
570574
if (digest instanceof Digest) {
571575
digAlg = ((Digest) digest).getShortAlgorithm();
572-
digName = ((Digest) digest).name().toString();
576+
digName = ((Digest) digest).getName();
573577
}
574-
else {
578+
else if (digest instanceof RubyString) {
575579
digAlg = digest.asJavaString(); digName = null;
576580
}
581+
else { // MRI: TypeError: wrong argument type nil (expected OpenSSL/Digest)
582+
throw runtime.newTypeError(digest, Digest._Digest(runtime));
583+
}
577584

578585
if( ( "DSA".equalsIgnoreCase(keyAlg) && "MD5".equalsIgnoreCase(digAlg) ) ||
579586
( "RSA".equalsIgnoreCase(keyAlg) && "DSS1".equals(digName) ) ) {

src/test/ruby/x509/test_x509cert.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,38 @@ def test_to_text_npe_regression
361361
assert_equal OpenSSL::BN.new(1), cert.serial
362362
end
363363

364+
def test_sign_invalid_arg
365+
issuer = subject = OpenSSL::X509::Name.new
366+
subject.add_entry('C', 'JP')
367+
subject.add_entry('ST', 'Tokyo')
368+
subject.add_entry('L', 'Chiyoda')
369+
subject.add_entry('CN', 'demo.example.com')
370+
371+
cert = OpenSSL::X509::Certificate.new
372+
cert.not_before = Time.at(0)
373+
cert.not_after = Time.now + 1 * 365 * 86400
374+
cert.public_key = pkey = OpenSSL::PKey::RSA.generate(1024)
375+
cert.serial = 1
376+
cert.issuer = issuer
377+
cert.subject = subject
378+
cert.add_extension OpenSSL::X509::Extension.new('basicConstraints', OpenSSL::ASN1.Sequence([OpenSSL::ASN1::Boolean(true)]))
379+
380+
digest = OpenSSL::Digest::SHA1.new
381+
begin
382+
cert.sign(nil, digest)
383+
fail 'expected sign to fail (on pkey)'
384+
rescue StandardError # expected
385+
assert :ok
386+
end
387+
388+
begin
389+
cert.sign(pkey, nil)
390+
fail 'expected sign to fail (on digest)'
391+
rescue TypeError # expected
392+
assert :ok
393+
end
394+
end
395+
364396
def test_cert_loading_regression
365397
cert_text = "0\x82\x01\xAD0\x82\x01\xA1\xA0\x03\x02\x01\x02\x02\x01\x010\x03\x06\x01\x000g1\v0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\b\f\nCalifornia1\x150\x13\x06\x03U\x04\a\f\fSanta Monica1\x110\x0F\x06\x03U\x04\n\f\bOneLogin1\x190\x17\x06\x03U\x04\x03\f\x10app.onelogin.com0\x1E\x17\r100309095845Z\x17\r150309095845Z0g1\v0\t\x06\x03U\x04\x06\x13\x02US1\x130\x11\x06\x03U\x04\b\f\nCalifornia1\x150\x13\x06\x03U\x04\a\f\fSanta Monica1\x110\x0F\x06\x03U\x04\n\f\bOneLogin1\x190\x17\x06\x03U\x04\x03\f\x10app.onelogin.com0\x81\x9F0\r\x06\t*\x86H\x86\xF7\r\x01\x01\x01\x05\x00\x03\x81\x8D\x000\x81\x89\x02\x81\x81\x00\xE8\xD2\xBBW\xE3?/\x1D\xE7\x0E\x10\xC8\xBD~\xCD\xDE!#\rL\x92G\xDF\xE1f?L\xB1\xBC9\x99\x14\xE5\x84\xD2Zi\x87<>d\xBD\x81\xF9\xBA\x85\xD2\xFF\xAA\x90\xF3Z\x97\xA5\x1D\xB0W\xC0\x93\xA3\x06IP\xB84\xF5\xD7Qu\x19\xFCB\xCA\xA3\xD4\\\x8E\v\x9B%\x13|\xB6m\x9D\xA8\x16\xE6\xBB\xDA\x87\xFF\xE3\xD7\xE9\xBA9\xC5O\xA2\xA7C\xADB\x04\xCA\xA5\x0E\x84\xD0\xA8\xE4\xFA\xDA\xF1\x89\xF2s\xFA1\x95\xAF\x03\xAB1\xAA\xE7y\x02\x03\x01\x00\x010\x03\x06\x01\x00\x03\x01\x00"
366398
assert cert = OpenSSL::X509::Certificate.new(cert_text)

0 commit comments

Comments
 (0)