Title: [974] trunk/jopenssl: Fix an NPE in Ciphers
Revision
974
Author
olabini
Date
2008-04-28 09:06:11 -0400 (Mon, 28 Apr 2008)

Log Message

Fix an NPE in Ciphers

Modified Paths


Added Paths

Diff

Modified: trunk/jopenssl/lib/jopenssl/version.rb (973 => 974)


--- trunk/jopenssl/lib/jopenssl/version.rb	2008-04-24 15:43:01 UTC (rev 973)
+++ trunk/jopenssl/lib/jopenssl/version.rb	2008-04-28 13:06:11 UTC (rev 974)
@@ -1,5 +1,5 @@
 module Jopenssl
   module Version
-    VERSION = "0.2.1"
+    VERSION = "0.2.2"
   end
 end

Modified: trunk/jopenssl/src/java/org/jruby/ext/openssl/Cipher.java (973 => 974)


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/Cipher.java	2008-04-24 15:43:01 UTC (rev 973)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/Cipher.java	2008-04-28 13:06:11 UTC (rev 974)
@@ -44,6 +44,7 @@
 import org.jruby.RubyObject;
 import org.jruby.RubyString;
 import org.jruby.common.IRubyWarnings;
+import org.jruby.common.IRubyWarnings.ID;
 import org.jruby.exceptions.RaiseException;
 import org.jruby.runtime.Block;
 import org.jruby.runtime.CallbackFactory;
@@ -373,21 +374,60 @@
         return getRuntime().newFixnum(ciph.getBlockSize());
     }
 
-    public IRubyObject encrypt(IRubyObject[] args) {
-        //TODO: implement backwards compat
+    protected void init(IRubyObject[] args, boolean encrypt) {
         org.jruby.runtime.Arity.checkArgumentCount(getRuntime(),args,0,2);
-        encryptMode = true;
-        //modeParams = args;
+        
+        encryptMode = encrypt;
         ciphInited = false;
+
+        if(args.length > 0) {
+            /*
+             * oops. this code mistakes salt for IV.
+             * We deprecated the arguments for this method, but we decided
+             * keeping this behaviour for backward compatibility.
+             */
+            byte[] pass = args[0].convertToString().getBytes();
+            byte[] iv = null;
+            try {
+                iv = "OpenSSL for Ruby rulez!".getBytes("ISO8859-1");
+                byte[] iv2 = new byte[this.ivLen];
+                System.arraycopy(iv, 0, iv2, 0, this.ivLen);
+                iv = iv2;
+            } catch(Exception e) {}
+
+            if(args.length > 1 && !args[1].isNil()) {
+                getRuntime().getWarnings().warn(ID.MISCELLANEOUS, "key derivation by " + getMetaClass().getRealClass().getName() + "#encrypt is deprecated; use " + getMetaClass().getRealClass().getName() + "::pkcs5_keyivgen instead");
+                iv = args[1].convertToString().getBytes();
+                if(iv.length > this.ivLen) {
+                    byte[] iv2 = new byte[this.ivLen];
+                    System.arraycopy(iv, 0, iv2, 0, this.ivLen);
+                    iv = iv2;
+                }
+            }
+
+            MessageDigest digest = (MessageDigest)OpenSSLReal.getWithBCProvider(new Callable() {
+                    public Object call() {
+                        try {
+                            return MessageDigest.getInstance("MD5", "BC");
+                        } catch (Exception e) {
+                            throw new RaiseException(getRuntime(), ciphErr, e.getMessage(), true);
+                        }
+                    }
+                });
+
+            OpenSSLImpl.KeyAndIv result = OpenSSLImpl.EVP_BytesToKey(keyLen,ivLen,digest,iv,pass,2048);
+            this.key = result.getKey();
+            this.iv = iv;
+        }
+    }
+
+    public IRubyObject encrypt(IRubyObject[] args) {
+        init(args, true);
         return this;
     }
 
     public IRubyObject decrypt(IRubyObject[] args) {
-        //TODO: implement backwards compat
-        org.jruby.runtime.Arity.checkArgumentCount(getRuntime(),args,0,2);
-        encryptMode = false;
-        //modeParams = args;
-        ciphInited = false;
+        init(args, false);
         return this;
     }
 

Added: trunk/jopenssl/test/test_cipher.rb (0 => 974)


--- trunk/jopenssl/test/test_cipher.rb	                        (rev 0)
+++ trunk/jopenssl/test/test_cipher.rb	2008-04-28 13:06:11 UTC (rev 974)
@@ -0,0 +1,15 @@
+begin
+  require "openssl"
+rescue LoadError
+end
+
+require "test/unit"
+
+class TestCipher < Test::Unit::TestCase
+  def test_encrypt_takes_parameter
+    enc = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC')
+    enc.encrypt("123")
+    data = ""
+    data << enc.final
+  end
+end

Modified: trunk/jopenssl/test/test_openssl.rb (973 => 974)


--- trunk/jopenssl/test/test_openssl.rb	2008-04-24 15:43:01 UTC (rev 973)
+++ trunk/jopenssl/test/test_openssl.rb	2008-04-28 13:06:11 UTC (rev 974)
@@ -1,21 +1,25 @@
 
 require 'java' if RUBY_PLATFORM =~ /java/
-begin
-  require 'openssl/test_asn1'
-  require 'openssl/test_cipher'
-  require 'openssl/test_digest'
-  require 'openssl/test_hmac'
-  require 'openssl/test_ns_spki'
-  require 'openssl/test_pair'
-  require 'openssl/test_pkey_rsa'
-  require 'openssl/test_ssl'
-  require 'openssl/test_x509cert'
-  require 'openssl/test_x509crl'
-  require 'openssl/test_x509ext'
-  require 'openssl/test_x509name'
-  require 'openssl/test_x509req'
-  require 'openssl/test_x509store'
+
+def protect_require(name)
+  require name
 rescue Exception => e
-  $stderr.puts "Had exception: #{e.inspect}"
+  $stderr.puts "Had exception in #{name}: #{e.inspect}"
   $stderr.puts(*(e.backtrace))
 end
+
+protect_require 'openssl/test_asn1'
+protect_require 'openssl/test_cipher'
+protect_require 'openssl/test_digest'
+protect_require 'openssl/test_hmac'
+protect_require 'openssl/test_ns_spki'
+protect_require 'openssl/test_pair'
+protect_require 'openssl/test_pkey_rsa'
+protect_require 'openssl/test_ssl'
+protect_require 'openssl/test_x509cert'
+protect_require 'openssl/test_x509crl'
+protect_require 'openssl/test_x509ext'
+protect_require 'openssl/test_x509name'
+protect_require 'openssl/test_x509req'
+protect_require 'openssl/test_x509store'
+protect_require 'test_cipher'
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to