File tree Expand file tree Collapse file tree
main/java/org/jruby/ext/openssl Expand file tree Collapse file tree Original file line number Diff line number Diff 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 ) ) ) {
Original file line number Diff line number Diff 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 \xAD 0\x82 \x01 \xA1 \xA0 \x03 \x02 \x01 \x02 \x02 \x01 \x01 0\x03 \x06 \x01 \x00 0g1\v 0\t \x06 \x03 U\x04 \x06 \x13 \x02 US1\x13 0\x11 \x06 \x03 U\x04 \b \f \n California1\x15 0\x13 \x06 \x03 U\x04 \a \f \f Santa Monica1\x11 0\x0F \x06 \x03 U\x04 \n \f \b OneLogin1\x19 0\x17 \x06 \x03 U\x04 \x03 \f \x10 app.onelogin.com0\x1E \x17 \r 100309095845Z\x17 \r 150309095845Z0g1\v 0\t \x06 \x03 U\x04 \x06 \x13 \x02 US1\x13 0\x11 \x06 \x03 U\x04 \b \f \n California1\x15 0\x13 \x06 \x03 U\x04 \a \f \f Santa Monica1\x11 0\x0F \x06 \x03 U\x04 \n \f \b OneLogin1\x19 0\x17 \x06 \x03 U\x04 \x03 \f \x10 app.onelogin.com0\x81 \x9F 0\r \x06 \t *\x86 H\x86 \xF7 \r \x01 \x01 \x01 \x05 \x00 \x03 \x81 \x8D \x00 0\x81 \x89 \x02 \x81 \x81 \x00 \xE8 \xD2 \xBB W\xE3 ?/\x1D \xE7 \x0E \x10 \xC8 \xBD ~\xCD \xDE !#\r L\x92 G\xDF \xE1 f?L\xB1 \xBC 9\x99 \x14 \xE5 \x84 \xD2 Zi\x87 <>d\xBD \x81 \xF9 \xBA \x85 \xD2 \xFF \xAA \x90 \xF3 Z\x97 \xA5 \x1D \xB0 W\xC0 \x93 \xA3 \x06 IP\xB8 4\xF5 \xD7 Qu\x19 \xFC B\xCA \xA3 \xD4 \\ \x8E \v \x9B %\x13 |\xB6 m\x9D \xA8 \x16 \xE6 \xBB \xDA \x87 \xFF \xE3 \xD7 \xE9 \xBA 9\xC5 O\xA2 \xA7 C\xAD B\x04 \xCA \xA5 \x0E \x84 \xD0 \xA8 \xE4 \xFA \xDA \xF1 \x89 \xF2 s\xFA 1\x95 \xAF \x03 \xAB 1\xAA \xE7 y\x02 \x03 \x01 \x00 \x01 0\x03 \x06 \x01 \x00 \x03 \x01 \x00 "
366398 assert cert = OpenSSL ::X509 ::Certificate . new ( cert_text )
You can’t perform that action at this time.
0 commit comments