Title: [806] trunk/jopenssl/src/java/org/jruby/ext/openssl/Cipher.java: Fix for JRUBY-1324, allowing changing of padding
Revision
806
Author
olabini
Date
2007-11-28 07:39:40 -0500 (Wed, 28 Nov 2007)

Log Message

Fix for JRUBY-1324, allowing changing of padding

Modified Paths


Diff

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


--- trunk/jopenssl/src/java/org/jruby/ext/openssl/Cipher.java	2007-11-28 12:33:58 UTC (rev 805)
+++ trunk/jopenssl/src/java/org/jruby/ext/openssl/Cipher.java	2007-11-28 12:39:40 UTC (rev 806)
@@ -99,14 +99,24 @@
         BLOCK_MODES.add("OFB");
     }
 
-    private static String[] rubyToJavaCipher(String inName) {
+    private static String[] rubyToJavaCipher(String inName, String padding) {
         String[] split = inName.split("-");
         String cryptoBase = split[0];
         String cryptoVersion = null;
         String cryptoMode = null;
         String realName = null;
-        String padding_type = "PKCS5Padding";
 
+        String padding_type;
+        if (padding == null || padding.equalsIgnoreCase("PKCS5Padding")) {
+            padding_type = "PKCS5Padding";
+        } else if (padding.equals("0") || padding.equalsIgnoreCase("NoPadding")) {
+            padding_type = "NoPadding";
+        } else if (padding.equalsIgnoreCase("ISO10126Padding")) {
+            padding_type = "ISO10126Padding";
+        } else {
+            padding_type = "PKCS5Padding";
+        }
+
         if("bf".equalsIgnoreCase(cryptoBase)) {
             cryptoBase = "Blowfish";
         }
@@ -140,7 +150,7 @@
 
     private static boolean tryCipher(String rubyName) {
         try {
-            javax.crypto.Cipher.getInstance(rubyToJavaCipher(rubyName)[3],"BC");
+            javax.crypto.Cipher.getInstance(rubyToJavaCipher(rubyName, null)[3],"BC");
             return true;
         } catch(Exception e) {
             return false;
@@ -194,7 +204,7 @@
 
     public IRubyObject initialize(IRubyObject str, Block unusedBlock) {
         name = str.toString();
-        String[] values = rubyToJavaCipher(name);
+        String[] values = rubyToJavaCipher(name, padding);
         cryptoBase = values[0];
         cryptoVersion = values[1];
         cryptoMode = values[2];
@@ -410,6 +420,8 @@
     private void doInitialize() {
         ciphInited = true;
         try {
+            assert key.length * 8 == keyLen : "Key wrong length";
+            assert iv.length * 8 == ivLen : "IV wrong length";
             if(!"ECB".equalsIgnoreCase(cryptoMode) && this.iv != null) {
                 this.ciph.init(encryptMode ? javax.crypto.Cipher.ENCRYPT_MODE : javax.crypto.Cipher.DECRYPT_MODE, new SimpleSecretKey(this.key), new IvParameterSpec(this.iv));
             } else {
@@ -473,6 +485,7 @@
 
     public IRubyObject set_padding(IRubyObject padding) {
         this.padding = padding.toString();
+        initialize(RubyString.newString(getRuntime(), name), Block.NULL_BLOCK);
         return padding;
     }
 
_______________________________________________
Jruby-extras-devel mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/jruby-extras-devel

Reply via email to