Skip to content

Commit f76ec2f

Browse files
dgolombekkares
authored andcommittedMar 6, 2018
Don't use padding for streaming cipher modes (#155)
OFB, CFB[8], CTR, and GCM cipher modes don't require padding, since they act in a streaming manner, working byte-by-byte. Adding padding to them makes the output incompatible with MRI, and unable to be decrypted with it (and OpenSSL, underneath it). GCM is added to NO_PADDING_BLOCK_MODES despite not being in KNOWN_BLOCK_MODES to keep backward compatibility in getPaddingType. I'm happy removing it if others agree, since there shouldn't be any way for it to be supported currently. Fixes #13
1 parent c52cf16 commit f76ec2f

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed
 

Diff for: ‎src/main/java/org/jruby/ext/openssl/Cipher.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,10 @@ public static final class Algorithm {
261261
KNOWN_BLOCK_MODES.add("NONE"); // valid to pass into JCE
262262
}
263263

264+
// Subset of KNOWN_BLOCK_MODES that do not require padding (and shouldn't have it by default).
265+
private static final List<String> NO_PADDING_BLOCK_MODES = Arrays.asList(
266+
"CFB", "CFB8", "OFB", "CTR", "GCM");
267+
264268
// Ruby to Java name String (or FALSE)
265269
static final HashMap<String, String[]> supportedCiphers = new LinkedHashMap<String, String[]>(120, 1);
266270
// we're _marking_ unsupported keys with a Boolean.FALSE mapping
@@ -557,12 +561,10 @@ String getPadding() {
557561
}
558562

559563
private static String getPaddingType(final String padding, final String cryptoMode) {
560-
//if ( "ECB".equals(cryptoMode) ) return "NoPadding";
561-
// TODO check cryptoMode CFB/OFB
562564
final String defaultPadding = "PKCS5Padding";
563565

564566
if ( padding == null ) {
565-
if ( "GCM".equalsIgnoreCase(cryptoMode) ) {
567+
if ( NO_PADDING_BLOCK_MODES.contains(cryptoMode) ) {
566568
return "NoPadding";
567569
}
568570
return defaultPadding;

Diff for: ‎src/test/java/org/jruby/ext/openssl/CipherTest.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
package org.jruby.ext.openssl;
32

43
import org.junit.*;
@@ -97,13 +96,13 @@ private void doTestOsslToJsse() {
9796
assertEquals("DES", alg.base);
9897
assertEquals("EDE3", alg.version);
9998
assertEquals("CFB", alg.mode);
100-
assertEquals("DESede/CFB/PKCS5Padding", alg.getRealName());
99+
assertEquals("DESede/CFB/NoPadding", alg.getRealName());
101100

102101
alg = Cipher.Algorithm.osslToJava("DES-CFB");
103102
assertEquals("DES", alg.base);
104103
assertEquals(null, alg.version);
105104
assertEquals("CFB", alg.mode);
106-
assertEquals("DES/CFB/PKCS5Padding", alg.getRealName());
105+
assertEquals("DES/CFB/NoPadding", alg.getRealName());
107106

108107
alg = Cipher.Algorithm.osslToJava("DES3");
109108
assertEquals("DES", alg.base);
@@ -129,6 +128,18 @@ private void doTestOsslToJsse() {
129128
assertEquals("PKCS5Padding", alg.getPadding());
130129
assertEquals("AES/CBC/PKCS5Padding", alg.getRealName());
131130

131+
alg = Cipher.Algorithm.osslToJava("AES-256-OFB");
132+
assertEquals("AES", alg.base);
133+
assertEquals("256", alg.version);
134+
assertEquals("OFB", alg.mode);
135+
assertEquals("AES/OFB/NoPadding", alg.getRealName());
136+
137+
alg = Cipher.Algorithm.osslToJava("AES-256-CTR");
138+
assertEquals("AES", alg.base);
139+
assertEquals("256", alg.version);
140+
assertEquals("CTR", alg.mode);
141+
assertEquals("AES/CTR/NoPadding", alg.getRealName());
142+
132143
alg = Cipher.Algorithm.osslToJava("AES-256-CBC-HMAC-SHA1");
133144
assertEquals("AES", alg.base);
134145
assertEquals("CBC", alg.mode);

0 commit comments

Comments
 (0)
Please sign in to comment.