package org.jruby.ext.openssl; import org.junit.*; import static org.junit.Assert.*; /** * @author kares */ public class CipherTest { @Test public void ciphersGetLazyInitialized() { assertTrue( Cipher.Algorithm.supportedCiphers.isEmpty() ); assertFalse( Cipher.isSupportedCipher("UNKNOWN") ); assertFalse( Cipher.Algorithm.supportedCiphers.isEmpty() ); assertTrue( Cipher.Algorithm.supportedCiphers.get("DES") != null ); assertTrue( Cipher.isSupportedCipher("DES") ); assertTrue( Cipher.isSupportedCipher("des") ); assertTrue( Cipher.isSupportedCipher("AES") ); assertTrue( Cipher.isSupportedCipher("BF") ); assertTrue( Cipher.isSupportedCipher("des3") ); } @Test public void jsseToOssl() { String alg; alg = Cipher.Algorithm.javaToOssl("RC2/CBC/PKCS5Padding", 40); assertEquals("RC2-40-CBC", alg); alg = Cipher.Algorithm.javaToOssl("RC2/CFB/PKCS5Padding", 40); assertEquals("RC2-40-CFB", alg); alg = Cipher.Algorithm.javaToOssl("Blowfish", 60); assertEquals("BF-60-CBC", alg); alg = Cipher.Algorithm.javaToOssl("DESede", 24); assertEquals("DES-EDE3-CBC", alg); } @Test public void osslToJsse() { Cipher.Algorithm.supportedCiphers.clear(); Cipher.Algorithm.supportedCiphersAll = false; doTestOsslToJsse(); } @Test public void osslToJsseWithAllLoaded() { Cipher.Algorithm.allSupportedCiphers(); doTestOsslToJsse(); } private void doTestOsslToJsse() { Cipher.Algorithm alg; alg = Cipher.Algorithm.osslToJava("RC2-40-CBC"); assertEquals("RC2", alg.base); assertEquals("40", alg.version); assertEquals("CBC", alg.mode); assertEquals("RC2/CBC/PKCS5Padding", alg.getRealName()); System.out.println("running ..."); alg = Cipher.Algorithm.osslToJava("DES-EDE3-CBC"); assertEquals("DES", alg.base); assertEquals("EDE3", alg.version); assertEquals("CBC", alg.mode); assertEquals("DESede/CBC/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("DES3"); assertEquals("DES", alg.base); assertEquals("EDE3", alg.version); assertEquals("CBC", alg.mode); assertEquals("DESede/CBC/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("DES-EDE"); assertEquals("DES", alg.base); assertEquals("EDE", alg.version); assertEquals("ECB", alg.mode); assertEquals("DESede/ECB/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("DES-EDE3"); assertEquals("DES", alg.base); assertEquals("EDE3", alg.version); assertEquals("ECB", alg.mode); assertEquals("DESede/ECB/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("DES-EDE-CBC"); assertEquals("DES", alg.base); assertEquals("EDE", alg.version); assertEquals("CBC", alg.mode); assertEquals("DESede/CBC/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("DES-EDE3-CBC"); assertEquals("DES", alg.base); assertEquals("EDE3", alg.version); assertEquals("CBC", alg.mode); assertEquals("DESede/CBC/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("DES-EDE3-CFB"); assertEquals("DES", alg.base); assertEquals("EDE3", alg.version); assertEquals("CFB", alg.mode); assertEquals("DESede/CFB/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("DES-CFB"); assertEquals("DES", alg.base); assertEquals(null, alg.version); assertEquals("CFB", alg.mode); assertEquals("DES/CFB/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("DES3"); assertEquals("DES", alg.base); //assertEquals("EDE", alg.version); assertEquals("CBC", alg.mode); assertEquals("DESede/CBC/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("BF"); assertEquals("BF", alg.base); assertEquals("Blowfish/CBC/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("AES-128-XTS"); assertEquals("AES", alg.base); assertEquals("128", alg.version); assertEquals("XTS", alg.mode); assertEquals("PKCS5Padding", alg.getPadding()); assertEquals("AES/XTS/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("AES256"); assertEquals("AES", alg.base); assertEquals("256", alg.version); assertEquals("CBC", alg.mode); assertEquals("PKCS5Padding", alg.getPadding()); assertEquals("AES/CBC/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("AES-256-CBC-HMAC-SHA1"); assertEquals("AES", alg.base); assertEquals("CBC", alg.mode); assertEquals("256", alg.version); assertEquals("PKCS5Padding", alg.getPadding()); assertEquals("AES/CBC/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("RC4"); assertEquals("RC4", alg.base); assertEquals(null, alg.version); assertEquals(null, alg.mode); assertEquals(null, alg.getPadding()); assertEquals("RC4", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("RC4-40"); assertEquals("RC4", alg.base); assertEquals("40", alg.version); assertEquals(null, alg.mode); assertEquals(null, alg.getPadding()); assertEquals("RC4", alg.getRealName()); // keeps "invalid" modes : alg = Cipher.Algorithm.osslToJava("DES-3X3"); assertEquals("DES", alg.base); assertEquals(null, alg.version); assertEquals("3X3", alg.mode); assertEquals("DES/3X3/PKCS5Padding", alg.getRealName()); alg = Cipher.Algorithm.osslToJava("MES-123-XXX"); assertEquals("MES", alg.base); assertEquals("123", alg.version); assertEquals("XXX", alg.mode); assertEquals("MES/XXX/PKCS5Padding", alg.getRealName()); } @Test public void osslKeyIvLength() { int[] len; len = Cipher.Algorithm.osslKeyIvLength("RC2-40-CBC"); assertEquals(5, len[0]); assertEquals(8, len[1]); len = Cipher.Algorithm.osslKeyIvLength("DES-EDE3-CBC"); assertEquals(24, len[0]); assertEquals(8, len[1]); len = Cipher.Algorithm.osslKeyIvLength("DES"); assertEquals(8, len[0]); assertEquals(8, len[1]); len = Cipher.Algorithm.osslKeyIvLength("BF"); assertEquals(16, len[0]); assertEquals(8, len[1]); len = Cipher.Algorithm.osslKeyIvLength("CAST"); assertEquals(16, len[0]); assertEquals(8, len[1]); } @Test public void getAlgorithmBase() throws Exception { javax.crypto.Cipher cipher; String algBase; cipher = javax.crypto.Cipher.getInstance("DES/CBC/PKCS5Padding"); algBase = Cipher.Algorithm.getAlgorithmBase(cipher); assertEquals("DES", algBase); cipher = javax.crypto.Cipher.getInstance("DES"); algBase = Cipher.Algorithm.getAlgorithmBase(cipher); assertEquals("DES", algBase); } }