10d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom/* 20d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * Copyright (C) 2011 The Android Open Source Project 30d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * 40d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 50d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * you may not use this file except in compliance with the License. 60d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * You may obtain a copy of the License at 70d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * 80d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 90d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * 100d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * Unless required by applicable law or agreed to in writing, software 110d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 120d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * See the License for the specific language governing permissions and 140d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom * limitations under the License. 150d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom */ 160d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 170d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrompackage libcore.javax.crypto; 180d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 190ac85ead96f1ba7d35f3acadd154de4ef0a8fd87Brian Carlstromimport com.android.org.bouncycastle.asn1.x509.KeyUsage; 2072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.io.ByteArrayOutputStream; 2172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.io.PrintStream; 22c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.math.BigInteger; 2372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.security.InvalidAlgorithmParameterException; 240d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstromimport java.security.InvalidKeyException; 25c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.security.Key; 26c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.security.KeyFactory; 27c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.security.PrivateKey; 280a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstromimport java.security.Provider; 29c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.security.PublicKey; 3072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.security.SecureRandom; 31c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.security.Security; 320d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstromimport java.security.cert.Certificate; 3372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.security.interfaces.RSAPrivateKey; 3472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.security.interfaces.RSAPublicKey; 3572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.security.spec.AlgorithmParameterSpec; 36c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.security.spec.RSAPrivateKeySpec; 37c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.security.spec.RSAPublicKeySpec; 3872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.util.ArrayList; 39c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.util.Arrays; 4072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.util.Collections; 410a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstromimport java.util.HashMap; 4272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.util.HashSet; 4372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.util.List; 4472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport java.util.Locale; 450a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstromimport java.util.Map; 46c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport java.util.Set; 470a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstromimport javax.crypto.BadPaddingException; 480d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstromimport javax.crypto.Cipher; 49c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Rootimport javax.crypto.IllegalBlockSizeException; 5072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport javax.crypto.KeyGenerator; 5172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport javax.crypto.SecretKey; 5272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport javax.crypto.SecretKeyFactory; 5372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport javax.crypto.ShortBufferException; 5472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport javax.crypto.spec.IvParameterSpec; 5572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport javax.crypto.spec.PBEKeySpec; 5672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport javax.crypto.spec.PBEParameterSpec; 5772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport javax.crypto.spec.SecretKeySpec; 580d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstromimport junit.framework.TestCase; 5972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstromimport libcore.java.security.StandardNames; 600d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstromimport libcore.java.security.TestKeyStore; 610d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 620d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrompublic final class CipherTest extends TestCase { 630d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 6472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final String[] RSA_PROVIDERS = ((StandardNames.IS_RI) 6572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom ? new String[] { "SunJCE" } 6672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom : new String[] { "BC" , "AndroidOpenSSL" }); 6772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 6872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final String[] AES_PROVIDERS = ((StandardNames.IS_RI) 6972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom ? new String[] { "SunJCE" } 7072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom : new String[] { "BC" }); // TOOD: , "AndroidOpenSSL" 7172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 7272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final boolean IS_UNLIMITED; 7372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom static { 7472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom boolean is_unlimited; 7572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (StandardNames.IS_RI) { 7672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 7772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom String algorithm = "PBEWITHMD5ANDTRIPLEDES"; 7872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher.getInstance(algorithm).init(getEncryptMode(algorithm), 7972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom getEncryptKey(algorithm), 8072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom getAlgorithmParameterSpec(algorithm)); 8172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom is_unlimited = true; 8272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (Exception e) { 8372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom is_unlimited = false; 8472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom System.out.println("WARNING: Some tests disabled due to lack of " 8572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom + "'Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files'"); 8672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 8772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 8872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom is_unlimited = true; 8972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 9072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom IS_UNLIMITED = is_unlimited; 9172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 9272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 930a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static boolean isUnsupported(String algorithm) { 9472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.equals("RC2")) { 9572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return true; 9672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 970a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHMD5ANDRC2")) { 980a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return true; 990a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 10072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.startsWith("PBEWITHSHA1ANDRC2")) { 1010a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return true; 1020a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1030a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND40BITRC2-CBC")) { 1040a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return true; 1050a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1060a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND128BITRC2-CBC")) { 1070a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return true; 1080a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1090a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAANDTWOFISH-CBC")) { 1100a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return true; 1110a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 11272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (!IS_UNLIMITED) { 11372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.equals("PBEWITHMD5ANDTRIPLEDES")) { 11472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return true; 11572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 11672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 1170a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return false; 1180a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1190a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 1200a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private synchronized static int getEncryptMode(String algorithm) throws Exception { 1210a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (isWrap(algorithm)) { 1220a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return Cipher.WRAP_MODE; 1230a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1240a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return Cipher.ENCRYPT_MODE; 1250a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1260a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 1270a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private synchronized static int getDecryptMode(String algorithm) throws Exception { 1280a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (isWrap(algorithm)) { 1290a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return Cipher.UNWRAP_MODE; 1300a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1310a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return Cipher.DECRYPT_MODE; 1320a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1330a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 13472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static String getBaseAlgorithm(String algorithm) { 1350a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("AESWRAP")) { 1360a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1370a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 13872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.startsWith("AES/")) { 13972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return "AES"; 14072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 1410a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHMD5AND128BITAES-CBC-OPENSSL")) { 1420a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1430a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1440a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHMD5AND192BITAES-CBC-OPENSSL")) { 1450a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1460a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1470a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHMD5AND256BITAES-CBC-OPENSSL")) { 1480a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1490a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1500a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHA256AND128BITAES-CBC-BC")) { 1510a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1520a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1530a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHA256AND192BITAES-CBC-BC")) { 1540a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1550a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1560a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHA256AND256BITAES-CBC-BC")) { 1570a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1580a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1590a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND128BITAES-CBC-BC")) { 1600a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1610a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1620a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND192BITAES-CBC-BC")) { 1630a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1640a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1650a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND256BITAES-CBC-BC")) { 1660a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "AES"; 1670a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1680a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHMD5ANDDES")) { 1690a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "DES"; 1700a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1710a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHA1ANDDES")) { 1720a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "DES"; 1730a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1740a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("DESEDEWRAP")) { 17572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return "DESEDE"; 1760a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1770a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND2-KEYTRIPLEDES-CBC")) { 17872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return "DESEDE"; 1790a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1800a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND3-KEYTRIPLEDES-CBC")) { 18172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return "DESEDE"; 18272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 18372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.equals("PBEWITHMD5ANDTRIPLEDES")) { 18472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return "DESEDE"; 1850a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 18672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.equals("PBEWITHSHA1ANDDESEDE")) { 18772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return "DESEDE"; 18872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 18972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.equals("RSA/ECB/NOPADDING")) { 1900a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "RSA"; 1910a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 19272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.equals("RSA/ECB/PKCS1PADDING")) { 1930a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "RSA"; 1940a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1950a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND40BITRC4")) { 1960a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "ARC4"; 1970a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 1980a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (algorithm.equals("PBEWITHSHAAND128BITRC4")) { 1990a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return "ARC4"; 2000a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 2010a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return algorithm; 2020a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 2030a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 2040a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static boolean isAsymmetric(String algorithm) { 20572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return getBaseAlgorithm(algorithm).equals("RSA"); 2060a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 2070a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 2080a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static boolean isWrap(String algorithm) { 2090a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return algorithm.endsWith("WRAP"); 2100a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 2110a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 21272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static boolean isPBE(String algorithm) { 21372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return algorithm.startsWith("PBE"); 21472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 21572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 2160a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static Map<String, Key> ENCRYPT_KEYS = new HashMap<String, Key>(); 2170a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private synchronized static Key getEncryptKey(String algorithm) throws Exception { 2180a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom Key key = ENCRYPT_KEYS.get(algorithm); 2190a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (key != null) { 2200a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return key; 2210a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 22272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.startsWith("RSA")) { 2230a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom KeyFactory kf = KeyFactory.getInstance("RSA"); 2240a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 2250a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom RSA_2048_privateExponent); 2260a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom key = kf.generatePrivate(keySpec); 22772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else if (isPBE(algorithm)) { 22872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm); 22972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom key = skf.generateSecret(new PBEKeySpec("secret".toCharArray())); 2300a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } else { 23172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom KeyGenerator kg = KeyGenerator.getInstance(getBaseAlgorithm(algorithm)); 23272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (StandardNames.IS_RI && algorithm.equals("AES")) { 23372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom kg.init(128); 23472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 2350a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom key = kg.generateKey(); 2360a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 2370a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom ENCRYPT_KEYS.put(algorithm, key); 2380a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return key; 2390a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 2400a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 2410a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static Map<String, Key> DECRYPT_KEYS = new HashMap<String, Key>(); 2420a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private synchronized static Key getDecryptKey(String algorithm) throws Exception { 2430a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom Key key = DECRYPT_KEYS.get(algorithm); 2440a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (key != null) { 2450a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return key; 2460a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 24772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.startsWith("RSA")) { 2480a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom KeyFactory kf = KeyFactory.getInstance("RSA"); 2490a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom RSAPublicKeySpec keySpec = new RSAPublicKeySpec(RSA_2048_modulus, 2500a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom RSA_2048_publicExponent); 2510a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom key = kf.generatePublic(keySpec); 2520a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } else { 2530a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom assertFalse(algorithm, isAsymmetric(algorithm)); 2540a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom key = getEncryptKey(algorithm); 2550a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 2560a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom DECRYPT_KEYS.put(algorithm, key); 2570a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return key; 2580a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 2590a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 2600a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static Map<String, Integer> EXPECTED_BLOCK_SIZE = new HashMap<String, Integer>(); 2610a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom static { 26272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("AES", 16); 26372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHMD5AND128BITAES-CBC-OPENSSL", 16); 26472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHMD5AND192BITAES-CBC-OPENSSL", 16); 26572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHMD5AND256BITAES-CBC-OPENSSL", 16); 26672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHA256AND128BITAES-CBC-BC", 16); 26772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHA256AND192BITAES-CBC-BC", 16); 26872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHA256AND256BITAES-CBC-BC", 16); 26972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHAAND128BITAES-CBC-BC", 16); 27072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHAAND192BITAES-CBC-BC", 16); 27172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHAAND256BITAES-CBC-BC", 16); 27272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 27372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (StandardNames.IS_RI) { 27472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("AESWRAP", 16); 27572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 27672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("AESWRAP", 0); 27772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 27872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 27972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("ARC4", 0); 28072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("ARCFOUR", 0); 28172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHAAND40BITRC4", 0); 28272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHAAND128BITRC4", 0); 28372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 28472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("BLOWFISH", 8); 28572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 28672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("DES", 8); 28772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHMD5ANDDES", 8); 28872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHA1ANDDES", 8); 28972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 29072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("DESEDE", 8); 29172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHAAND2-KEYTRIPLEDES-CBC", 8); 29272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHAAND3-KEYTRIPLEDES-CBC", 8); 29372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHMD5ANDTRIPLEDES", 8); 29472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("PBEWITHSHA1ANDDESEDE", 8); 29572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 29672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 29772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (StandardNames.IS_RI) { 29872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("DESEDEWRAP", 8); 29972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 30072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("DESEDEWRAP", 0); 30172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 30272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 30372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (StandardNames.IS_RI) { 30472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA", 0); 30572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA/ECB/NoPadding", 0); 30672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA/ECB/PKCS1Padding", 0); 30772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 30872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA", Cipher.ENCRYPT_MODE, 256); 30972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA/ECB/NoPadding", Cipher.ENCRYPT_MODE, 256); 31072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA/ECB/PKCS1Padding", Cipher.ENCRYPT_MODE, 245); 31172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 31272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // BC strips the leading 0 for us even when NoPadding is specified 31372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA", Cipher.ENCRYPT_MODE, "BC", 255); 31472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA/ECB/NoPadding", Cipher.ENCRYPT_MODE, "BC", 255); 31572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 31672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA", Cipher.DECRYPT_MODE, 256); 31772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA/ECB/NoPadding", Cipher.DECRYPT_MODE, 256); 31872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedBlockSize("RSA/ECB/PKCS1Padding", Cipher.DECRYPT_MODE, 256); 31972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 32072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 32172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 32272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static String modeKey(String algorithm, int mode) { 32372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return algorithm + ":" + mode; 32472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 32572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 32672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static String modeProviderKey(String algorithm, int mode, String provider) { 32772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return algorithm + ":" + mode + ":" + provider; 32872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 32972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 33072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedSize(Map<String, Integer> map, 33172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom String algorithm, int value) { 33272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom algorithm = algorithm.toUpperCase(Locale.US); 33372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom map.put(algorithm, value); 33472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 33572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 33672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedSize(Map<String, Integer> map, 33772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom String algorithm, int mode, int value) { 33872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedSize(map, modeKey(algorithm, mode), value); 33972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 34072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 34172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedSize(Map<String, Integer> map, 34272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom String algorithm, int mode, String provider, int value) { 34372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedSize(map, modeProviderKey(algorithm, mode, provider), value); 34472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 34572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 34672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static int getExpectedSize(Map<String, Integer> map, String algorithm, int mode, String provider) { 34772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Integer expected = map.get(modeProviderKey(algorithm, mode, provider)); 34872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (expected != null) { 34972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return expected; 35072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 35172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom expected = map.get(modeKey(algorithm, mode)); 35272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (expected != null) { 35372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return expected; 35472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 35572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom expected = map.get(algorithm); 35672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertNotNull("Algorithm " + algorithm + " not found in " + map, expected); 3570a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return expected; 3580a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 3590a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 36072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedBlockSize(String algorithm, int value) { 36172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedSize(EXPECTED_BLOCK_SIZE, algorithm, value); 36272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 36372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 36472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedBlockSize(String algorithm, int mode, int value) { 36572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedSize(EXPECTED_BLOCK_SIZE, algorithm, mode, value); 36672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 36772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 36872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedBlockSize(String algorithm, int mode, String provider, int value) { 36972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedSize(EXPECTED_BLOCK_SIZE, algorithm, mode, provider, value); 37072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 37172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 37272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static int getExpectedBlockSize(String algorithm, int mode, String provider) { 37372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return getExpectedSize(EXPECTED_BLOCK_SIZE, algorithm, mode, provider); 37472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 37572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 3760a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static Map<String, Integer> EXPECTED_OUTPUT_SIZE = new HashMap<String, Integer>(); 3770a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom static { 37872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("AES", Cipher.ENCRYPT_MODE, 16); 37972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5AND128BITAES-CBC-OPENSSL", 16); 38072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5AND192BITAES-CBC-OPENSSL", 16); 38172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5AND256BITAES-CBC-OPENSSL", 16); 38272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA256AND128BITAES-CBC-BC", 16); 38372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA256AND192BITAES-CBC-BC", 16); 38472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA256AND256BITAES-CBC-BC", 16); 38572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND128BITAES-CBC-BC", 16); 38672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND192BITAES-CBC-BC", 16); 38772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND256BITAES-CBC-BC", 16); 38872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 38972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("AES", Cipher.DECRYPT_MODE, 0); 39072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5AND128BITAES-CBC-OPENSSL", Cipher.DECRYPT_MODE, 0); 39172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5AND192BITAES-CBC-OPENSSL", Cipher.DECRYPT_MODE, 0); 39272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5AND256BITAES-CBC-OPENSSL", Cipher.DECRYPT_MODE, 0); 39372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA256AND128BITAES-CBC-BC", Cipher.DECRYPT_MODE, 0); 39472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA256AND192BITAES-CBC-BC", Cipher.DECRYPT_MODE, 0); 39572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA256AND256BITAES-CBC-BC", Cipher.DECRYPT_MODE, 0); 39672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND128BITAES-CBC-BC", Cipher.DECRYPT_MODE, 0); 39772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND192BITAES-CBC-BC", Cipher.DECRYPT_MODE, 0); 39872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND256BITAES-CBC-BC", Cipher.DECRYPT_MODE, 0); 39972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 40072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (StandardNames.IS_RI) { 40172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("AESWRAP", Cipher.WRAP_MODE, 8); 40272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("AESWRAP", Cipher.UNWRAP_MODE, 0); 40372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 40472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("AESWRAP", -1); 40572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 40672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 40772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("ARC4", 0); 40872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("ARCFOUR", 0); 40972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND40BITRC4", 0); 41072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND128BITRC4", 0); 41172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 41272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("BLOWFISH", Cipher.ENCRYPT_MODE, 8); 41372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("BLOWFISH", Cipher.DECRYPT_MODE, 0); 41472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 41572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("DES", Cipher.ENCRYPT_MODE, 8); 41672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5ANDDES", Cipher.ENCRYPT_MODE, 8); 41772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA1ANDDES", Cipher.ENCRYPT_MODE, 8); 41872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 41972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("DES", Cipher.DECRYPT_MODE, 0); 42072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5ANDDES", Cipher.DECRYPT_MODE, 0); 42172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA1ANDDES", Cipher.DECRYPT_MODE, 0); 42272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 42372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("DESEDE", Cipher.ENCRYPT_MODE, 8); 42472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND2-KEYTRIPLEDES-CBC", Cipher.ENCRYPT_MODE, 8); 42572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND3-KEYTRIPLEDES-CBC", Cipher.ENCRYPT_MODE, 8); 42672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5ANDTRIPLEDES", Cipher.ENCRYPT_MODE, 8); 42772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA1ANDDESEDE", Cipher.ENCRYPT_MODE, 8); 42872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 42972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("DESEDE", Cipher.DECRYPT_MODE, 0); 43072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND2-KEYTRIPLEDES-CBC", Cipher.DECRYPT_MODE, 0); 43172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHAAND3-KEYTRIPLEDES-CBC", Cipher.DECRYPT_MODE, 0); 43272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHMD5ANDTRIPLEDES", Cipher.DECRYPT_MODE, 0); 43372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("PBEWITHSHA1ANDDESEDE", Cipher.DECRYPT_MODE, 0); 43472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 43572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (StandardNames.IS_RI) { 43672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("DESEDEWRAP", Cipher.WRAP_MODE, 16); 43772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("DESEDEWRAP", Cipher.UNWRAP_MODE, 0); 43872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 43972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("DESEDEWRAP", -1); 44072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 44172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 44272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("RSA", Cipher.ENCRYPT_MODE, 256); 44372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("RSA/ECB/NoPadding", Cipher.ENCRYPT_MODE, 256); 44472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("RSA/ECB/PKCS1Padding", Cipher.ENCRYPT_MODE, 256); 44572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 44672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("RSA", Cipher.DECRYPT_MODE, 256); 44772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("RSA/ECB/NoPadding", Cipher.DECRYPT_MODE, 256); 44872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("RSA/ECB/PKCS1Padding", Cipher.DECRYPT_MODE, 245); 44972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 45072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // BC strips the leading 0 for us even when NoPadding is specified 45172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("RSA", Cipher.DECRYPT_MODE, "BC", 255); 45272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedOutputSize("RSA/ECB/NoPadding", Cipher.DECRYPT_MODE, "BC", 255); 45372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 45472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 45572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedOutputSize(String algorithm, int value) { 45672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedSize(EXPECTED_OUTPUT_SIZE, algorithm, value); 45772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 45872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 45972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedOutputSize(String algorithm, int mode, int value) { 46072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedSize(EXPECTED_OUTPUT_SIZE, algorithm, mode, value); 46172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 46272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 46372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void setExpectedOutputSize(String algorithm, int mode, String provider, int value) { 46472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom setExpectedSize(EXPECTED_OUTPUT_SIZE, algorithm, mode, provider, value); 46572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 46672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 46772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static int getExpectedOutputSize(String algorithm, int mode, String provider) { 46872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return getExpectedSize(EXPECTED_OUTPUT_SIZE, algorithm, mode, provider); 4690a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 4700a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 4710a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static byte[] ORIGINAL_PLAIN_TEXT = new byte[] { 0x0a, 0x0b, 0x0c }; 4720a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static byte[] PKCS1_BLOCK_TYPE_00_PADDED_PLAIN_TEXT = new byte[] { 4730a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4740a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4750a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4760a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4770a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4780a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4790a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4800a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4810a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4820a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4830a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4840a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4850a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4860a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4870a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4880a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x0a, 0x0b, 0x0c 4890a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom }; 4900a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static byte[] PKCS1_BLOCK_TYPE_01_PADDED_PLAIN_TEXT = new byte[] { 4910a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 4920a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 4930a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 4940a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 4950a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 4960a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 4970a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 4980a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 4990a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5000a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5010a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5020a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5030a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5040a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5050a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5060a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5070a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5080a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5090a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5100a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5110a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5120a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5130a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5140a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5150a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5160a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5170a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5180a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5190a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5200a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5210a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5220a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x00, (byte) 0x0a, (byte) 0x0b, (byte) 0x0c 5230a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom }; 5240a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static byte[] PKCS1_BLOCK_TYPE_02_PADDED_PLAIN_TEXT = new byte[] { 5250a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0x00, (byte) 0x02, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5260a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5270a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5280a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5290a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5300a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5310a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5320a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5330a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5340a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5350a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5360a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5370a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5380a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5390a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5400a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5410a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5420a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5430a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5440a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5450a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5460a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5470a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5480a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5490a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5500a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5510a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5520a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5530a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5540a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5550a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 5560a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x00, (byte) 0x0a, (byte) 0x0b, (byte) 0x0c 5570a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom }; 5580a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 5590a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private static byte[] getExpectedPlainText(String algorithm) { 56072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (algorithm.equals("RSA/ECB/NOPADDING")) { 5610a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return PKCS1_BLOCK_TYPE_00_PADDED_PLAIN_TEXT; 5620a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 5630a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return ORIGINAL_PLAIN_TEXT; 5640a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 5650a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 56672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static AlgorithmParameterSpec getAlgorithmParameterSpec(String algorithm) { 56772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (!isPBE(algorithm)) { 56872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return null; 56972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 57072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] salt = new byte[8]; 57172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom new SecureRandom().nextBytes(salt); 57272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return new PBEParameterSpec(salt, 1024); 57372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 57472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 5750a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom public void test_getInstance() throws Exception { 57672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final ByteArrayOutputStream errBuffer = new ByteArrayOutputStream(); 57772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom PrintStream out = new PrintStream(errBuffer); 57872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 57972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Set<String> seenBaseCipherNames = new HashSet<String>(); 58072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Set<String> seenCiphersWithModeAndPadding = new HashSet<String>(); 58172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 5820a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom Provider[] providers = Security.getProviders(); 5830a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom for (Provider provider : providers) { 5840a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom Set<Provider.Service> services = provider.getServices(); 5850a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom for (Provider.Service service : services) { 5860a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom String type = service.getType(); 5870a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (!type.equals("Cipher")) { 5880a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom continue; 5890a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 59072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 5910a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom String algorithm = service.getAlgorithm(); 59272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 59372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 59472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Any specific modes and paddings aren't tested directly here, 59572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * but we need to make sure we see the bare algorithm from some 59672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * provider. We will test each mode specifically when we get the 59772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * base cipher. 59872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 59972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final int firstSlash = algorithm.indexOf('/'); 60072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (firstSlash == -1) { 60172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom seenBaseCipherNames.add(algorithm); 60272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 60372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final String baseCipherName = algorithm.substring(0, firstSlash); 60472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (!seenBaseCipherNames.contains(baseCipherName)) { 60572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom seenCiphersWithModeAndPadding.add(baseCipherName); 60672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 60772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom continue; 60872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 60972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 6100a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom try { 61172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom test_Cipher_Algorithm(provider, algorithm); 6120a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } catch (Throwable e) { 61372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom out.append("Error encountered checking " + algorithm 61472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom + " with provider " + provider.getName() + "\n"); 61572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom e.printStackTrace(out); 61672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 61772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 61872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Set<String> modes = StandardNames.getModesForCipher(algorithm); 61972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (modes != null) { 62072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String mode : modes) { 62172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Set<String> paddings = StandardNames.getPaddingsForCipher(algorithm); 62272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (paddings != null) { 62372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String padding : paddings) { 62472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final String algorithmName = algorithm + "/" + mode + "/" + padding; 62572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 62672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom test_Cipher_Algorithm(provider, algorithmName); 62772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (Throwable e) { 62872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom out.append("Error encountered checking " + algorithmName 62972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom + " with provider " + provider.getName() + "\n"); 63072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom e.printStackTrace(out); 63172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 63272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 63372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 63472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 6350a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 6360a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 6370a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 63872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 63972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom seenCiphersWithModeAndPadding.removeAll(seenBaseCipherNames); 64072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals("Ciphers seen with mode and padding but not base cipher", 64172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Collections.EMPTY_SET, seenCiphersWithModeAndPadding); 64272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 64372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom out.flush(); 64472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (errBuffer.size() > 0) { 64572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom throw new Exception("Errors encountered:\n\n" + errBuffer.toString() + "\n\n"); 64672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 64772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 64872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 64972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void test_Cipher_Algorithm(Provider provider, String algorithm) throws Exception { 65072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // Cipher.getInstance(String) 65172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c1 = Cipher.getInstance(algorithm); 65272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(algorithm, c1.getAlgorithm()); 65372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom test_Cipher(c1); 65472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 65572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // Cipher.getInstance(String, Provider) 65672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c2 = Cipher.getInstance(algorithm, provider); 65772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(algorithm, c2.getAlgorithm()); 65872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(provider, c2.getProvider()); 65972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom test_Cipher(c2); 66072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 66172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // KeyGenerator.getInstance(String, String) 66272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c3 = Cipher.getInstance(algorithm, provider.getName()); 66372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(algorithm, c3.getAlgorithm()); 66472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(provider, c3.getProvider()); 66572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom test_Cipher(c3); 6660a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 6670a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 6680a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom private void test_Cipher(Cipher c) throws Exception { 66972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom String algorithm = c.getAlgorithm().toUpperCase(Locale.US); 6700a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (isUnsupported(algorithm)) { 6710a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom return; 6720a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 67372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom String providerName = c.getProvider().getName(); 67472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom String cipherID = algorithm + ":" + providerName; 6750a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 6760a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom try { 6770a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom c.getOutputSize(0); 6780a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } catch (IllegalStateException expected) { 6790a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 6800a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 6810a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom // TODO: test keys from different factories (e.g. OpenSSLRSAPrivateKey vs JCERSAPrivateKey) 6820a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom Key encryptKey = getEncryptKey(algorithm); 6830a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 68472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final AlgorithmParameterSpec spec = getAlgorithmParameterSpec(algorithm); 6850a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 68672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom int encryptMode = getEncryptMode(algorithm); 68772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(encryptMode, encryptKey, spec); 68872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(cipherID, getExpectedBlockSize(algorithm, encryptMode, providerName), c.getBlockSize()); 68972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(cipherID, getExpectedOutputSize(algorithm, encryptMode, providerName), c.getOutputSize(0)); 69072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom int decryptMode = getDecryptMode(algorithm); 69172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(decryptMode, encryptKey, spec); 69272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(cipherID, getExpectedBlockSize(algorithm, decryptMode, providerName), c.getBlockSize()); 69372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(cipherID, getExpectedOutputSize(algorithm, decryptMode, providerName), c.getOutputSize(0)); 6940a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 6950a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom // TODO: test Cipher.getIV() 6960a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 6970a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom // TODO: test Cipher.getParameters() 6980a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 69972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertNull(cipherID, c.getExemptionMechanism()); 7000a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 70172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(getEncryptMode(algorithm), encryptKey, spec); 7020a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (isWrap(algorithm)) { 7030a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom byte[] cipherText = c.wrap(encryptKey); 70472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(getDecryptMode(algorithm), getDecryptKey(algorithm), spec); 7050a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom int keyType = (isAsymmetric(algorithm)) ? Cipher.PRIVATE_KEY : Cipher.SECRET_KEY; 7060a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom Key decryptedKey = c.unwrap(cipherText, encryptKey.getAlgorithm(), keyType); 7070a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom assertEquals("encryptKey.getAlgorithm()=" + encryptKey.getAlgorithm() 7080a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom + " decryptedKey.getAlgorithm()=" + decryptedKey.getAlgorithm() 7090a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom + " encryptKey.getEncoded()=" + Arrays.toString(encryptKey.getEncoded()) 7100a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom + " decryptedKey.getEncoded()=" + Arrays.toString(decryptedKey.getEncoded()), 7110a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom encryptKey, decryptedKey); 7120a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } else { 7130a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom byte[] cipherText = c.doFinal(ORIGINAL_PLAIN_TEXT); 71472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(getDecryptMode(algorithm), getDecryptKey(algorithm), spec); 7150a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom byte[] decryptedPlainText = c.doFinal(cipherText); 71672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(cipherID, 71772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Arrays.toString(getExpectedPlainText(algorithm)), 7180a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom Arrays.toString(decryptedPlainText)); 7190a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 7200a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 7210a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 7220a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom public void testInputPKCS1Padding() throws Exception { 72372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 72472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testInputPKCS1Padding(provider); 72572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 72672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 72772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 72872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testInputPKCS1Padding(String provider) throws Exception { 72972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testInputPKCS1Padding(provider, PKCS1_BLOCK_TYPE_01_PADDED_PLAIN_TEXT, getEncryptKey("RSA"), getDecryptKey("RSA")); 7300a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom try { 73172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testInputPKCS1Padding(provider, PKCS1_BLOCK_TYPE_02_PADDED_PLAIN_TEXT, getEncryptKey("RSA"), getDecryptKey("RSA")); 7320a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom fail(); 7330a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } catch (BadPaddingException expected) { 7340a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 7350a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom try { 73672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testInputPKCS1Padding(provider, PKCS1_BLOCK_TYPE_01_PADDED_PLAIN_TEXT, getDecryptKey("RSA"), getEncryptKey("RSA")); 7370a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom fail(); 7380a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } catch (BadPaddingException expected) { 7390a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 74072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testInputPKCS1Padding(provider, PKCS1_BLOCK_TYPE_02_PADDED_PLAIN_TEXT, getDecryptKey("RSA"), getEncryptKey("RSA")); 7410a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 7420a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 74372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testInputPKCS1Padding(String provider, byte[] prePaddedPlainText, Key encryptKey, Key decryptKey) throws Exception { 74472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher encryptCipher = Cipher.getInstance("RSA/ECB/NoPadding", provider); 7450a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom encryptCipher.init(Cipher.ENCRYPT_MODE, encryptKey); 7460a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom byte[] cipherText = encryptCipher.doFinal(prePaddedPlainText); 74772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider); 7480a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom decryptCipher.init(Cipher.DECRYPT_MODE, decryptKey); 7490a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom byte[] plainText = decryptCipher.doFinal(cipherText); 7500a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom assertEquals(Arrays.toString(ORIGINAL_PLAIN_TEXT), 7510a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom Arrays.toString(plainText)); 7520a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 7530a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 7540a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom public void testOutputPKCS1Padding() throws Exception { 75572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 75672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testOutputPKCS1Padding(provider); 75772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 7580a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 7590a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 76072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testOutputPKCS1Padding(String provider) throws Exception { 76172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testOutputPKCS1Padding(provider, (byte) 1, getEncryptKey("RSA"), getDecryptKey("RSA")); 76272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testOutputPKCS1Padding(provider, (byte) 2, getDecryptKey("RSA"), getEncryptKey("RSA")); 76372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 76472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 76572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testOutputPKCS1Padding(String provider, byte expectedBlockType, Key encryptKey, Key decryptKey) throws Exception { 76672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider); 7670a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom encryptCipher.init(Cipher.ENCRYPT_MODE, encryptKey); 7680a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom byte[] cipherText = encryptCipher.doFinal(ORIGINAL_PLAIN_TEXT); 76972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher decryptCipher = Cipher.getInstance("RSA/ECB/NoPadding", provider); 7700a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom decryptCipher.init(Cipher.DECRYPT_MODE, decryptKey); 7710a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom byte[] plainText = decryptCipher.doFinal(cipherText); 77272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertPadding(provider, expectedBlockType, ORIGINAL_PLAIN_TEXT, plainText); 7730a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 7740a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 77572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void assertPadding(String provider, byte expectedBlockType, byte[] expectedData, byte[] actualDataWithPadding) { 77672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertNotNull(provider, actualDataWithPadding); 77772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom int expectedOutputSize = getExpectedOutputSize("RSA", Cipher.DECRYPT_MODE, provider); 77872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(provider, expectedOutputSize, actualDataWithPadding.length); 77972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom int expectedBlockTypeOffset; 78072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (provider.equals("BC")) { 78172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // BC strips the leading 0 for us on decrypt even when NoPadding is specified... 78272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom expectedBlockTypeOffset = 0; 78372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 78472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom expectedBlockTypeOffset = 1; 78572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(provider, 0, actualDataWithPadding[0]); 78672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 78772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom byte actualBlockType = actualDataWithPadding[expectedBlockTypeOffset]; 78872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(provider, expectedBlockType, actualBlockType); 7890a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom int actualDataOffset = actualDataWithPadding.length - expectedData.length; 7900a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom if (actualBlockType == 1) { 79172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom int expectedDataOffset = expectedBlockTypeOffset + 1; 79272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (int i = expectedDataOffset; i < actualDataOffset - 1; i++) { 79372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(provider, (byte) 0xFF, actualDataWithPadding[i]); 7940a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 7950a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 79672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(provider, 0x00, actualDataWithPadding[actualDataOffset-1]); 7970a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom byte[] actualData = new byte[expectedData.length]; 7980a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom System.arraycopy(actualDataWithPadding, actualDataOffset, actualData, 0, actualData.length); 79972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(provider, Arrays.toString(expectedData), Arrays.toString(actualData)); 8000a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom } 8010a156e0126e8015f2791e9a7dd48bbdaeae0c335Brian Carlstrom 8020d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom public void testCipherInitWithCertificate () throws Exception { 8030d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // no key usage specified, everything is fine 8040d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(0, true, true, true, true); 8050d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 8060d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // common case is that encrypt/wrap is prohibited when special usage is specified 8070d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.digitalSignature, false, true, false, true); 8080d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.nonRepudiation, false, true, false, true); 8090d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.keyAgreement, false, true, false, true); 8100d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.keyCertSign, false, true, false, true); 8110d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.cRLSign, false, true, false, true); 8120d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 8130d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // Note they encipherOnly/decipherOnly don't have to do with 8140d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // ENCRYPT_MODE or DECRYPT_MODE, but restrict usage relative 8150d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // to keyAgreement. There is not a *_MODE option that 8160d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // corresponds to this in Cipher, the RI does not enforce 8170d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // anything in Cipher. 8180d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // http://code.google.com/p/android/issues/detail?id=12955 8190d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.encipherOnly, false, true, false, true); 8200d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.decipherOnly, false, true, false, true); 8210d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.keyAgreement | KeyUsage.encipherOnly, 8220d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom false, true, false, true); 8230d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.keyAgreement | KeyUsage.decipherOnly, 8240d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom false, true, false, true); 8250d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 826101547d4a82ba21031dc7cb62018720dbd493758Jesse Wilson // except when wrapping a key is specifically allowed or 8270d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.keyEncipherment, false, true, true, true); 828101547d4a82ba21031dc7cb62018720dbd493758Jesse Wilson // except when wrapping data encryption is specifically allowed 8290d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(KeyUsage.dataEncipherment, true, true, false, true); 8300d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } 8310d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 8320d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom private void assertCipherInitWithKeyUsage (int keyUsage, 8330d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom boolean allowEncrypt, 8340d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom boolean allowDecrypt, 8350d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom boolean allowWrap, 8360d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom boolean allowUnwrap) throws Exception { 8370d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom Certificate certificate = certificateWithKeyUsage(keyUsage); 8380d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(certificate, allowEncrypt, Cipher.ENCRYPT_MODE); 8390d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(certificate, allowDecrypt, Cipher.DECRYPT_MODE); 8400d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(certificate, allowWrap, Cipher.WRAP_MODE); 8410d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom assertCipherInitWithKeyUsage(certificate, allowUnwrap, Cipher.UNWRAP_MODE); 8420d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } 8430d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 8440d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom private void assertCipherInitWithKeyUsage(Certificate certificate, 8450d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom boolean allowMode, 8460d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom int mode) throws Exception { 8470d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom Cipher cipher = Cipher.getInstance("RSA"); 8480d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom if (allowMode) { 8490d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom cipher.init(mode, certificate); 8500d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } else { 8510d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom try { 8520d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom cipher.init(mode, certificate); 8530d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom String modeString; 8540d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom switch (mode) { 8550d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom case Cipher.ENCRYPT_MODE: 8560d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom modeString = "ENCRYPT_MODE"; 8570d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom break; 8580d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom case Cipher.DECRYPT_MODE: 8590d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom modeString = "DECRYPT_MODE"; 8600d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom break; 8610d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom case Cipher.WRAP_MODE: 8620d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom modeString = "WRAP_MODE"; 8630d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom break; 8640d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom case Cipher.UNWRAP_MODE: 8650d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom modeString = "UNWRAP_MODE"; 8660d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom break; 8670d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom default: 8680d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom throw new AssertionError("Unknown Cipher.*_MODE " + mode); 8690d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } 8700d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom fail("Should have had InvalidKeyException for " + modeString 8710d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom + " for " + certificate); 8720d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } catch (InvalidKeyException expected) { 8730d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } 8740d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } 8750d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } 8760d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom 877101547d4a82ba21031dc7cb62018720dbd493758Jesse Wilson private Certificate certificateWithKeyUsage(int keyUsage) throws Exception { 8780d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom // note the rare usage of non-zero keyUsage 879101547d4a82ba21031dc7cb62018720dbd493758Jesse Wilson return new TestKeyStore.Builder() 880101547d4a82ba21031dc7cb62018720dbd493758Jesse Wilson .aliasPrefix("rsa-dsa-ec") 881101547d4a82ba21031dc7cb62018720dbd493758Jesse Wilson .keyUsage(keyUsage) 882101547d4a82ba21031dc7cb62018720dbd493758Jesse Wilson .build() 883101547d4a82ba21031dc7cb62018720dbd493758Jesse Wilson .getPrivateKey("RSA", "RSA").getCertificate(); 8840d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom } 885c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 886c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 887c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * Test vectors generated with this private key: 888c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * 889c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * -----BEGIN RSA PRIVATE KEY----- 890c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * MIIEpAIBAAKCAQEA4Ec+irjyKE/rnnQv+XSPoRjtmGM8kvUq63ouvg075gMpvnZq 891c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * 0Q62pRXQ0s/ZvqeTDwwwZTeJn3lYzT6FsB+IGFJNMSWEqUslHjYltUFB7b/uGYgI 892c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * 4buX/Hy0m56qr2jpyY19DtxTu8D6ADQ1bWMF+7zDxwAUBThqu8hzyw8+90JfPTPf 893c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * ezFa4DbSoLZq/UdQOxab8247UWJRW3Ff2oPeryxYrrmr+zCXw8yd2dvl7ylsF2E5 894c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * Ao6KZx5jBW1F9AGI0sQTNJCEXeUsJTTpxrJHjAe9rpKII7YtBmx3cPn2Pz26JH9T 895c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * CER0e+eqqF2FO4vSRKzsPePImrRkU6tNJMOsaQIDAQABAoIBADd4R3al8XaY9ayW 896c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * DfuDobZ1ZOZIvQWXz4q4CHGG8macJ6nsvdSA8Bl6gNBzCebGqW+SUzHlf4tKxvTU 897c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * XtpFojJpwJ/EKMB6Tm7fc4oV3sl/q9Lyu0ehTyDqcvz+TDbgGtp3vRN82NTaELsW 898c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * LpSkZilx8XX5hfoYjwVsuX7igW9Dq503R2Ekhs2owWGWwwgYqZXshdOEZ3kSZ7O/ 899c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * IfJzcQppJYYldoQcW2cSwS1L0govMpmtt8E12l6VFavadufK8qO+gFUdBzt4vxFi 900c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * xIrSt/R0OgI47k0lL31efmUzzK5kzLOTYAdaL9HgNOw65c6cQIzL8OJeQRQCFoez 901c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * 3UdUroECgYEA9UGIS8Nzeyki1BGe9F4t7izUy7dfRVBaFXqlAJ+Zxzot8HJKxGAk 902c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * MGMy6omBd2NFRl3G3x4KbxQK/ztzluaomUrF2qloc0cv43dJ0U6z4HXmKdvrNYMz 903c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * im82SdCiZUp6Qv2atr+krE1IHTkLsimwZL3DEcwb4bYxidp8QM3s8rECgYEA6hp0 904c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * LduIHO23KIyH442GjdekCdFaQ/RF1Td6C1cx3b/KLa8oqOE81cCvzsM0fXSjniNa 905c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * PNljPydN4rlPkt9DgzkR2enxz1jyfeLgj/RZZMcg0+whOdx8r8kSlTzeyy81Wi4s 906c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * NaUPrXVMs7IxZkJLo7bjESoriYw4xcFe2yOGkzkCgYBRgo8exv2ZYCmQG68dfjN7 907c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * pfCvJ+mE6tiVrOYr199O5FoiQInyzBUa880XP84EdLywTzhqLNzA4ANrokGfVFeS 908c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * YtRxAL6TGYSj76Bb7PFBV03AebOpXEqD5sQ/MhTW3zLVEt4ZgIXlMeYWuD/X3Z0f 909c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * TiYHwzM9B8VdEH0dOJNYcQKBgQDbT7UPUN6O21P/NMgJMYigUShn2izKBIl3WeWH 910c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * wkQBDa+GZNWegIPRbBZHiTAfZ6nweAYNg0oq29NnV1toqKhCwrAqibPzH8zsiiL+ 911c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * OVeVxcbHQitOXXSh6ajzDndZufwtY5wfFWc+hOk6XvFQb0MVODw41Fy9GxQEj0ch 912c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * 3IIyYQKBgQDYEUWTr0FfthLb8ZI3ENVNB0hiBadqO0MZSWjA3/HxHvD2GkozfV/T 913c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * dBu8lkDkR7i2tsR8OsEgQ1fTsMVbqShr2nP2KSlvX6kUbYl2NX08dR51FIaWpAt0 914c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * aFyCzjCQLWOdck/yTV4ulAfuNO3tLjtN9lqpvP623yjQe6aQPxZXaA== 915c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * -----END RSA PRIVATE KEY----- 916c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * 917c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 918c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 919c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final BigInteger RSA_2048_modulus = new BigInteger(new byte[] { 920c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0xe0, (byte) 0x47, (byte) 0x3e, (byte) 0x8a, (byte) 0xb8, (byte) 0xf2, (byte) 0x28, 921c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x4f, (byte) 0xeb, (byte) 0x9e, (byte) 0x74, (byte) 0x2f, (byte) 0xf9, (byte) 0x74, (byte) 0x8f, 922c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xa1, (byte) 0x18, (byte) 0xed, (byte) 0x98, (byte) 0x63, (byte) 0x3c, (byte) 0x92, (byte) 0xf5, 923c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x2a, (byte) 0xeb, (byte) 0x7a, (byte) 0x2e, (byte) 0xbe, (byte) 0x0d, (byte) 0x3b, (byte) 0xe6, 924c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x03, (byte) 0x29, (byte) 0xbe, (byte) 0x76, (byte) 0x6a, (byte) 0xd1, (byte) 0x0e, (byte) 0xb6, 925c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xa5, (byte) 0x15, (byte) 0xd0, (byte) 0xd2, (byte) 0xcf, (byte) 0xd9, (byte) 0xbe, (byte) 0xa7, 926c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x93, (byte) 0x0f, (byte) 0x0c, (byte) 0x30, (byte) 0x65, (byte) 0x37, (byte) 0x89, (byte) 0x9f, 927c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x79, (byte) 0x58, (byte) 0xcd, (byte) 0x3e, (byte) 0x85, (byte) 0xb0, (byte) 0x1f, (byte) 0x88, 928c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x18, (byte) 0x52, (byte) 0x4d, (byte) 0x31, (byte) 0x25, (byte) 0x84, (byte) 0xa9, (byte) 0x4b, 929c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x25, (byte) 0x1e, (byte) 0x36, (byte) 0x25, (byte) 0xb5, (byte) 0x41, (byte) 0x41, (byte) 0xed, 930c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xbf, (byte) 0xee, (byte) 0x19, (byte) 0x88, (byte) 0x08, (byte) 0xe1, (byte) 0xbb, (byte) 0x97, 931c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xfc, (byte) 0x7c, (byte) 0xb4, (byte) 0x9b, (byte) 0x9e, (byte) 0xaa, (byte) 0xaf, (byte) 0x68, 932c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xe9, (byte) 0xc9, (byte) 0x8d, (byte) 0x7d, (byte) 0x0e, (byte) 0xdc, (byte) 0x53, (byte) 0xbb, 933c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xc0, (byte) 0xfa, (byte) 0x00, (byte) 0x34, (byte) 0x35, (byte) 0x6d, (byte) 0x63, (byte) 0x05, 934c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xfb, (byte) 0xbc, (byte) 0xc3, (byte) 0xc7, (byte) 0x00, (byte) 0x14, (byte) 0x05, (byte) 0x38, 935c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x6a, (byte) 0xbb, (byte) 0xc8, (byte) 0x73, (byte) 0xcb, (byte) 0x0f, (byte) 0x3e, (byte) 0xf7, 936c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x42, (byte) 0x5f, (byte) 0x3d, (byte) 0x33, (byte) 0xdf, (byte) 0x7b, (byte) 0x31, (byte) 0x5a, 937c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xe0, (byte) 0x36, (byte) 0xd2, (byte) 0xa0, (byte) 0xb6, (byte) 0x6a, (byte) 0xfd, (byte) 0x47, 938c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x50, (byte) 0x3b, (byte) 0x16, (byte) 0x9b, (byte) 0xf3, (byte) 0x6e, (byte) 0x3b, (byte) 0x51, 939c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x62, (byte) 0x51, (byte) 0x5b, (byte) 0x71, (byte) 0x5f, (byte) 0xda, (byte) 0x83, (byte) 0xde, 940c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xaf, (byte) 0x2c, (byte) 0x58, (byte) 0xae, (byte) 0xb9, (byte) 0xab, (byte) 0xfb, (byte) 0x30, 941c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x97, (byte) 0xc3, (byte) 0xcc, (byte) 0x9d, (byte) 0xd9, (byte) 0xdb, (byte) 0xe5, (byte) 0xef, 942c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x29, (byte) 0x6c, (byte) 0x17, (byte) 0x61, (byte) 0x39, (byte) 0x02, (byte) 0x8e, (byte) 0x8a, 943c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x67, (byte) 0x1e, (byte) 0x63, (byte) 0x05, (byte) 0x6d, (byte) 0x45, (byte) 0xf4, (byte) 0x01, 944c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x88, (byte) 0xd2, (byte) 0xc4, (byte) 0x13, (byte) 0x34, (byte) 0x90, (byte) 0x84, (byte) 0x5d, 945c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xe5, (byte) 0x2c, (byte) 0x25, (byte) 0x34, (byte) 0xe9, (byte) 0xc6, (byte) 0xb2, (byte) 0x47, 946c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8c, (byte) 0x07, (byte) 0xbd, (byte) 0xae, (byte) 0x92, (byte) 0x88, (byte) 0x23, (byte) 0xb6, 947c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x2d, (byte) 0x06, (byte) 0x6c, (byte) 0x77, (byte) 0x70, (byte) 0xf9, (byte) 0xf6, (byte) 0x3f, 948c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x3d, (byte) 0xba, (byte) 0x24, (byte) 0x7f, (byte) 0x53, (byte) 0x08, (byte) 0x44, (byte) 0x74, 949c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x7b, (byte) 0xe7, (byte) 0xaa, (byte) 0xa8, (byte) 0x5d, (byte) 0x85, (byte) 0x3b, (byte) 0x8b, 950c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xd2, (byte) 0x44, (byte) 0xac, (byte) 0xec, (byte) 0x3d, (byte) 0xe3, (byte) 0xc8, (byte) 0x9a, 951c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xb4, (byte) 0x64, (byte) 0x53, (byte) 0xab, (byte) 0x4d, (byte) 0x24, (byte) 0xc3, (byte) 0xac, 952c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x69, 953c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }); 954c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 955c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final BigInteger RSA_2048_privateExponent = new BigInteger(new byte[] { 956c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x37, (byte) 0x78, (byte) 0x47, (byte) 0x76, (byte) 0xa5, (byte) 0xf1, (byte) 0x76, (byte) 0x98, 957c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xf5, (byte) 0xac, (byte) 0x96, (byte) 0x0d, (byte) 0xfb, (byte) 0x83, (byte) 0xa1, (byte) 0xb6, 958c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x75, (byte) 0x64, (byte) 0xe6, (byte) 0x48, (byte) 0xbd, (byte) 0x05, (byte) 0x97, (byte) 0xcf, 959c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8a, (byte) 0xb8, (byte) 0x08, (byte) 0x71, (byte) 0x86, (byte) 0xf2, (byte) 0x66, (byte) 0x9c, 960c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x27, (byte) 0xa9, (byte) 0xec, (byte) 0xbd, (byte) 0xd4, (byte) 0x80, (byte) 0xf0, (byte) 0x19, 961c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x7a, (byte) 0x80, (byte) 0xd0, (byte) 0x73, (byte) 0x09, (byte) 0xe6, (byte) 0xc6, (byte) 0xa9, 962c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x6f, (byte) 0x92, (byte) 0x53, (byte) 0x31, (byte) 0xe5, (byte) 0x7f, (byte) 0x8b, (byte) 0x4a, 963c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xc6, (byte) 0xf4, (byte) 0xd4, (byte) 0x5e, (byte) 0xda, (byte) 0x45, (byte) 0xa2, (byte) 0x32, 964c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x69, (byte) 0xc0, (byte) 0x9f, (byte) 0xc4, (byte) 0x28, (byte) 0xc0, (byte) 0x7a, (byte) 0x4e, 965c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x6e, (byte) 0xdf, (byte) 0x73, (byte) 0x8a, (byte) 0x15, (byte) 0xde, (byte) 0xc9, (byte) 0x7f, 966c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xab, (byte) 0xd2, (byte) 0xf2, (byte) 0xbb, (byte) 0x47, (byte) 0xa1, (byte) 0x4f, (byte) 0x20, 967c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xea, (byte) 0x72, (byte) 0xfc, (byte) 0xfe, (byte) 0x4c, (byte) 0x36, (byte) 0xe0, (byte) 0x1a, 968c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xda, (byte) 0x77, (byte) 0xbd, (byte) 0x13, (byte) 0x7c, (byte) 0xd8, (byte) 0xd4, (byte) 0xda, 969c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x10, (byte) 0xbb, (byte) 0x16, (byte) 0x2e, (byte) 0x94, (byte) 0xa4, (byte) 0x66, (byte) 0x29, 970c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x71, (byte) 0xf1, (byte) 0x75, (byte) 0xf9, (byte) 0x85, (byte) 0xfa, (byte) 0x18, (byte) 0x8f, 971c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x05, (byte) 0x6c, (byte) 0xb9, (byte) 0x7e, (byte) 0xe2, (byte) 0x81, (byte) 0x6f, (byte) 0x43, 972c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xab, (byte) 0x9d, (byte) 0x37, (byte) 0x47, (byte) 0x61, (byte) 0x24, (byte) 0x86, (byte) 0xcd, 973c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xa8, (byte) 0xc1, (byte) 0x61, (byte) 0x96, (byte) 0xc3, (byte) 0x08, (byte) 0x18, (byte) 0xa9, 974c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x95, (byte) 0xec, (byte) 0x85, (byte) 0xd3, (byte) 0x84, (byte) 0x67, (byte) 0x79, (byte) 0x12, 975c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x67, (byte) 0xb3, (byte) 0xbf, (byte) 0x21, (byte) 0xf2, (byte) 0x73, (byte) 0x71, (byte) 0x0a, 976c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x69, (byte) 0x25, (byte) 0x86, (byte) 0x25, (byte) 0x76, (byte) 0x84, (byte) 0x1c, (byte) 0x5b, 977c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x67, (byte) 0x12, (byte) 0xc1, (byte) 0x2d, (byte) 0x4b, (byte) 0xd2, (byte) 0x0a, (byte) 0x2f, 978c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x32, (byte) 0x99, (byte) 0xad, (byte) 0xb7, (byte) 0xc1, (byte) 0x35, (byte) 0xda, (byte) 0x5e, 979c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x95, (byte) 0x15, (byte) 0xab, (byte) 0xda, (byte) 0x76, (byte) 0xe7, (byte) 0xca, (byte) 0xf2, 980c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xa3, (byte) 0xbe, (byte) 0x80, (byte) 0x55, (byte) 0x1d, (byte) 0x07, (byte) 0x3b, (byte) 0x78, 981c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xbf, (byte) 0x11, (byte) 0x62, (byte) 0xc4, (byte) 0x8a, (byte) 0xd2, (byte) 0xb7, (byte) 0xf4, 982c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x74, (byte) 0x3a, (byte) 0x02, (byte) 0x38, (byte) 0xee, (byte) 0x4d, (byte) 0x25, (byte) 0x2f, 983c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x7d, (byte) 0x5e, (byte) 0x7e, (byte) 0x65, (byte) 0x33, (byte) 0xcc, (byte) 0xae, (byte) 0x64, 984c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xcc, (byte) 0xb3, (byte) 0x93, (byte) 0x60, (byte) 0x07, (byte) 0x5a, (byte) 0x2f, (byte) 0xd1, 985c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xe0, (byte) 0x34, (byte) 0xec, (byte) 0x3a, (byte) 0xe5, (byte) 0xce, (byte) 0x9c, (byte) 0x40, 986c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8c, (byte) 0xcb, (byte) 0xf0, (byte) 0xe2, (byte) 0x5e, (byte) 0x41, (byte) 0x14, (byte) 0x02, 987c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x16, (byte) 0x87, (byte) 0xb3, (byte) 0xdd, (byte) 0x47, (byte) 0x54, (byte) 0xae, (byte) 0x81, 988c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }); 989c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 990c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final BigInteger RSA_2048_publicExponent = new BigInteger(new byte[] { 991c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x01, (byte) 0x00, (byte) 0x01, 992c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }); 993c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 994c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final BigInteger RSA_2048_primeP = new BigInteger(new byte[] { 995c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0xf5, (byte) 0x41, (byte) 0x88, (byte) 0x4b, (byte) 0xc3, (byte) 0x73, (byte) 0x7b, 996c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x29, (byte) 0x22, (byte) 0xd4, (byte) 0x11, (byte) 0x9e, (byte) 0xf4, (byte) 0x5e, (byte) 0x2d, 997c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xee, (byte) 0x2c, (byte) 0xd4, (byte) 0xcb, (byte) 0xb7, (byte) 0x5f, (byte) 0x45, (byte) 0x50, 998c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x5a, (byte) 0x15, (byte) 0x7a, (byte) 0xa5, (byte) 0x00, (byte) 0x9f, (byte) 0x99, (byte) 0xc7, 999c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x3a, (byte) 0x2d, (byte) 0xf0, (byte) 0x72, (byte) 0x4a, (byte) 0xc4, (byte) 0x60, (byte) 0x24, 1000c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x30, (byte) 0x63, (byte) 0x32, (byte) 0xea, (byte) 0x89, (byte) 0x81, (byte) 0x77, (byte) 0x63, 1001c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x45, (byte) 0x46, (byte) 0x5d, (byte) 0xc6, (byte) 0xdf, (byte) 0x1e, (byte) 0x0a, (byte) 0x6f, 1002c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x14, (byte) 0x0a, (byte) 0xff, (byte) 0x3b, (byte) 0x73, (byte) 0x96, (byte) 0xe6, (byte) 0xa8, 1003c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x99, (byte) 0x4a, (byte) 0xc5, (byte) 0xda, (byte) 0xa9, (byte) 0x68, (byte) 0x73, (byte) 0x47, 1004c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x2f, (byte) 0xe3, (byte) 0x77, (byte) 0x49, (byte) 0xd1, (byte) 0x4e, (byte) 0xb3, (byte) 0xe0, 1005c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x75, (byte) 0xe6, (byte) 0x29, (byte) 0xdb, (byte) 0xeb, (byte) 0x35, (byte) 0x83, (byte) 0x33, 1006c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8a, (byte) 0x6f, (byte) 0x36, (byte) 0x49, (byte) 0xd0, (byte) 0xa2, (byte) 0x65, (byte) 0x4a, 1007c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x7a, (byte) 0x42, (byte) 0xfd, (byte) 0x9a, (byte) 0xb6, (byte) 0xbf, (byte) 0xa4, (byte) 0xac, 1008c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x4d, (byte) 0x48, (byte) 0x1d, (byte) 0x39, (byte) 0x0b, (byte) 0xb2, (byte) 0x29, (byte) 0xb0, 1009c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x64, (byte) 0xbd, (byte) 0xc3, (byte) 0x11, (byte) 0xcc, (byte) 0x1b, (byte) 0xe1, (byte) 0xb6, 1010c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x31, (byte) 0x89, (byte) 0xda, (byte) 0x7c, (byte) 0x40, (byte) 0xcd, (byte) 0xec, (byte) 0xf2, 1011c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xb1, 1012c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }); 1013c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1014c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final BigInteger RSA_2048_primeQ = new BigInteger(new byte[] { 1015c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0xea, (byte) 0x1a, (byte) 0x74, (byte) 0x2d, (byte) 0xdb, (byte) 0x88, (byte) 0x1c, 1016c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xed, (byte) 0xb7, (byte) 0x28, (byte) 0x8c, (byte) 0x87, (byte) 0xe3, (byte) 0x8d, (byte) 0x86, 1017c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8d, (byte) 0xd7, (byte) 0xa4, (byte) 0x09, (byte) 0xd1, (byte) 0x5a, (byte) 0x43, (byte) 0xf4, 1018c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x45, (byte) 0xd5, (byte) 0x37, (byte) 0x7a, (byte) 0x0b, (byte) 0x57, (byte) 0x31, (byte) 0xdd, 1019c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xbf, (byte) 0xca, (byte) 0x2d, (byte) 0xaf, (byte) 0x28, (byte) 0xa8, (byte) 0xe1, (byte) 0x3c, 1020c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xd5, (byte) 0xc0, (byte) 0xaf, (byte) 0xce, (byte) 0xc3, (byte) 0x34, (byte) 0x7d, (byte) 0x74, 1021c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xa3, (byte) 0x9e, (byte) 0x23, (byte) 0x5a, (byte) 0x3c, (byte) 0xd9, (byte) 0x63, (byte) 0x3f, 1022c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x27, (byte) 0x4d, (byte) 0xe2, (byte) 0xb9, (byte) 0x4f, (byte) 0x92, (byte) 0xdf, (byte) 0x43, 1023c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x83, (byte) 0x39, (byte) 0x11, (byte) 0xd9, (byte) 0xe9, (byte) 0xf1, (byte) 0xcf, (byte) 0x58, 1024c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xf2, (byte) 0x7d, (byte) 0xe2, (byte) 0xe0, (byte) 0x8f, (byte) 0xf4, (byte) 0x59, (byte) 0x64, 1025c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xc7, (byte) 0x20, (byte) 0xd3, (byte) 0xec, (byte) 0x21, (byte) 0x39, (byte) 0xdc, (byte) 0x7c, 1026c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xaf, (byte) 0xc9, (byte) 0x12, (byte) 0x95, (byte) 0x3c, (byte) 0xde, (byte) 0xcb, (byte) 0x2f, 1027c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x35, (byte) 0x5a, (byte) 0x2e, (byte) 0x2c, (byte) 0x35, (byte) 0xa5, (byte) 0x0f, (byte) 0xad, 1028c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x75, (byte) 0x4c, (byte) 0xb3, (byte) 0xb2, (byte) 0x31, (byte) 0x66, (byte) 0x42, (byte) 0x4b, 1029c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xa3, (byte) 0xb6, (byte) 0xe3, (byte) 0x11, (byte) 0x2a, (byte) 0x2b, (byte) 0x89, (byte) 0x8c, 1030c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x38, (byte) 0xc5, (byte) 0xc1, (byte) 0x5e, (byte) 0xdb, (byte) 0x23, (byte) 0x86, (byte) 0x93, 1031c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x39, 1032c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }); 1033c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1034c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /** 1035c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * Test data is PKCS#1 padded "Android.\n" which can be generated by: 1036c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * echo "Android." | openssl rsautl -inkey rsa.key -sign | openssl rsautl -inkey rsa.key -raw -verify | recode ../x1 1037c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1038c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final byte[] RSA_2048_Vector1 = new byte[] { 1039c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x01, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1040c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1041c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1042c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1043c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1044c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1045c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1046c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1047c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1048c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1049c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1050c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1051c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1052c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1053c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1054c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1055c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1056c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1057c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1058c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1059c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1060c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1061c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1062c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1063c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1064c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1065c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1066c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1067c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1068c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1069c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1070c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1071c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1072c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1073c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1074c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1075c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1076c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1077c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1078c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1079c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, 1080c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x41, (byte) 0x6E, (byte) 0x64, (byte) 0x72, (byte) 0x6F, 1081c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x69, (byte) 0x64, (byte) 0x2E, (byte) 0x0A, 1082c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }; 1083c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1084c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /** 1085c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * This vector is simply "Android.\n" which is too short. 1086c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1087c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final byte[] TooShort_Vector = new byte[] { 1088c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x41, (byte) 0x6E, (byte) 0x64, (byte) 0x72, (byte) 0x6F, (byte) 0x69, 1089c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x64, (byte) 0x2E, (byte) 0x0A, 1090c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }; 1091c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1092c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /** 1093c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * This vector is simply "Android.\n" padded with zeros. 1094c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1095c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final byte[] TooShort_Vector_Zero_Padded = new byte[] { 1096c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1097c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1098c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1099c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1100c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1101c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1102c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1103c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1104c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1105c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1106c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1107c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1108c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1109c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1110c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1111c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1112c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1113c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1114c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1115c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1116c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1117c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1118c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1119c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1120c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1121c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1122c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1123c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1124c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1125c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1126c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1127c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1128c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1129c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1130c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1131c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1132c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1133c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1134c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1135c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1136c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 1137c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x00, (byte) 0x41, (byte) 0x6e, (byte) 0x64, (byte) 0x72, (byte) 0x6f, 1138c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x69, (byte) 0x64, (byte) 0x2e, (byte) 0x0a, 1139c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }; 1140c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1141c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /** 1142c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * openssl rsautl -raw -sign -inkey rsa.key | recode ../x1 | sed 's/0x/(byte) 0x/g' 1143c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1144c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final byte[] RSA_Vector1_Encrypt_Private = new byte[] { 1145c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x35, (byte) 0x43, (byte) 0x38, (byte) 0x44, (byte) 0xAD, (byte) 0x3F, 1146c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x97, (byte) 0x02, (byte) 0xFB, (byte) 0x59, (byte) 0x1F, (byte) 0x4A, 1147c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x2B, (byte) 0xB9, (byte) 0x06, (byte) 0xEC, (byte) 0x66, (byte) 0xE6, 1148c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xD2, (byte) 0xC5, (byte) 0x8B, (byte) 0x7B, (byte) 0xE3, (byte) 0x18, 1149c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xBF, (byte) 0x07, (byte) 0xD6, (byte) 0x01, (byte) 0xF9, (byte) 0xD9, 1150c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x89, (byte) 0xC4, (byte) 0xDB, (byte) 0x00, (byte) 0x68, (byte) 0xFF, 1151c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x9B, (byte) 0x43, (byte) 0x90, (byte) 0xF2, (byte) 0xDB, (byte) 0x83, 1152c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xF4, (byte) 0x7E, (byte) 0xC6, (byte) 0x81, (byte) 0x01, (byte) 0x3A, 1153c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x0B, (byte) 0xE5, (byte) 0xED, (byte) 0x08, (byte) 0x73, (byte) 0x3E, 1154c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xE1, (byte) 0x3F, (byte) 0xDF, (byte) 0x1F, (byte) 0x07, (byte) 0x6D, 1155c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x22, (byte) 0x8D, (byte) 0xCC, (byte) 0x4E, (byte) 0xE3, (byte) 0x9A, 1156c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xBC, (byte) 0xCC, (byte) 0x8F, (byte) 0x9E, (byte) 0x9B, (byte) 0x02, 1157c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x48, (byte) 0x00, (byte) 0xAC, (byte) 0x9F, (byte) 0xA4, (byte) 0x8F, 1158c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x87, (byte) 0xA1, (byte) 0xA8, (byte) 0xE6, (byte) 0x9D, (byte) 0xCD, 1159c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8B, (byte) 0x05, (byte) 0xE9, (byte) 0xD2, (byte) 0x05, (byte) 0x8D, 1160c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xC9, (byte) 0x95, (byte) 0x16, (byte) 0xD0, (byte) 0xCD, (byte) 0x43, 1161c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x25, (byte) 0x8A, (byte) 0x11, (byte) 0x46, (byte) 0xD7, (byte) 0x74, 1162c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x4C, (byte) 0xCF, (byte) 0x58, (byte) 0xF9, (byte) 0xA1, (byte) 0x30, 1163c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x84, (byte) 0x52, (byte) 0xC9, (byte) 0x01, (byte) 0x5F, (byte) 0x24, 1164c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x4C, (byte) 0xB1, (byte) 0x9F, (byte) 0x7D, (byte) 0x12, (byte) 0x38, 1165c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x27, (byte) 0x0F, (byte) 0x5E, (byte) 0xFF, (byte) 0xE0, (byte) 0x55, 1166c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8B, (byte) 0xA3, (byte) 0xAD, (byte) 0x60, (byte) 0x35, (byte) 0x83, 1167c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x58, (byte) 0xAF, (byte) 0x99, (byte) 0xDE, (byte) 0x3F, (byte) 0x5D, 1168c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x80, (byte) 0x80, (byte) 0xFF, (byte) 0x9B, (byte) 0xDE, (byte) 0x5C, 1169c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xAB, (byte) 0x97, (byte) 0x43, (byte) 0x64, (byte) 0xD9, (byte) 0x9F, 1170c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xFB, (byte) 0x67, (byte) 0x65, (byte) 0xA5, (byte) 0x99, (byte) 0xE7, 1171c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xE6, (byte) 0xEB, (byte) 0x05, (byte) 0x95, (byte) 0xFC, (byte) 0x46, 1172c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x28, (byte) 0x4B, (byte) 0xD8, (byte) 0x8C, (byte) 0xF5, (byte) 0x0A, 1173c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xEB, (byte) 0x1F, (byte) 0x30, (byte) 0xEA, (byte) 0xE7, (byte) 0x67, 1174c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x11, (byte) 0x25, (byte) 0xF0, (byte) 0x44, (byte) 0x75, (byte) 0x74, 1175c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x94, (byte) 0x06, (byte) 0x78, (byte) 0xD0, (byte) 0x21, (byte) 0xF4, 1176c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x3F, (byte) 0xC8, (byte) 0xC4, (byte) 0x4A, (byte) 0x57, (byte) 0xBE, 1177c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x02, (byte) 0x3C, (byte) 0x93, (byte) 0xF6, (byte) 0x95, (byte) 0xFB, 1178c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xD1, (byte) 0x77, (byte) 0x8B, (byte) 0x43, (byte) 0xF0, (byte) 0xB9, 1179c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x7D, (byte) 0xE0, (byte) 0x32, (byte) 0xE1, (byte) 0x72, (byte) 0xB5, 1180c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x62, (byte) 0x3F, (byte) 0x86, (byte) 0xC3, (byte) 0xD4, (byte) 0x5F, 1181c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x5E, (byte) 0x54, (byte) 0x1B, (byte) 0x5B, (byte) 0xE6, (byte) 0x74, 1182c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xA1, (byte) 0x0B, (byte) 0xE5, (byte) 0x18, (byte) 0xD2, (byte) 0x4F, 1183c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x93, (byte) 0xF3, (byte) 0x09, (byte) 0x58, (byte) 0xCE, (byte) 0xF0, 1184c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xA3, (byte) 0x61, (byte) 0xE4, (byte) 0x6E, (byte) 0x46, (byte) 0x45, 1185c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x89, (byte) 0x50, (byte) 0xBD, (byte) 0x03, (byte) 0x3F, (byte) 0x38, 1186c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xDA, (byte) 0x5D, (byte) 0xD0, (byte) 0x1B, (byte) 0x1F, (byte) 0xB1, 1187c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xEE, (byte) 0x89, (byte) 0x59, (byte) 0xC5, 1188c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }; 1189c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1190c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root private static final byte[] RSA_Vector1_ZeroPadded_Encrypted = new byte[] { 1191c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x60, (byte) 0x4a, (byte) 0x12, (byte) 0xa3, (byte) 0xa7, (byte) 0x4a, 1192c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xa4, (byte) 0xbf, (byte) 0x6c, (byte) 0x36, (byte) 0xad, (byte) 0x66, 1193c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xdf, (byte) 0xce, (byte) 0xf1, (byte) 0xe4, (byte) 0x0f, (byte) 0xd4, 1194c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x54, (byte) 0x5f, (byte) 0x03, (byte) 0x15, (byte) 0x4b, (byte) 0x9e, 1195c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xeb, (byte) 0xfe, (byte) 0x9e, (byte) 0x24, (byte) 0xce, (byte) 0x8e, 1196c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xc3, (byte) 0x36, (byte) 0xa5, (byte) 0x76, (byte) 0xf6, (byte) 0x54, 1197c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xb7, (byte) 0x84, (byte) 0x48, (byte) 0x2f, (byte) 0xd4, (byte) 0x45, 1198c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x74, (byte) 0x48, (byte) 0x5f, (byte) 0x08, (byte) 0x4e, (byte) 0x9c, 1199c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x89, (byte) 0xcc, (byte) 0x34, (byte) 0x40, (byte) 0xb1, (byte) 0x5f, 1200c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xa7, (byte) 0x0e, (byte) 0x11, (byte) 0x4b, (byte) 0xb5, (byte) 0x94, 1201c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xbe, (byte) 0x14, (byte) 0xaa, (byte) 0xaa, (byte) 0xe0, (byte) 0x38, 1202c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x1c, (byte) 0xce, (byte) 0x40, (byte) 0x61, (byte) 0xfc, (byte) 0x08, 1203c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xcb, (byte) 0x14, (byte) 0x2b, (byte) 0xa6, (byte) 0x54, (byte) 0xdf, 1204c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x05, (byte) 0x5c, (byte) 0x9b, (byte) 0x4f, (byte) 0x14, (byte) 0x93, 1205c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xb0, (byte) 0x70, (byte) 0xd9, (byte) 0x32, (byte) 0xdc, (byte) 0x24, 1206c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xe0, (byte) 0xae, (byte) 0x48, (byte) 0xfc, (byte) 0x53, (byte) 0xee, 1207c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x7c, (byte) 0x9f, (byte) 0x69, (byte) 0x34, (byte) 0xf4, (byte) 0x76, 1208c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xee, (byte) 0x67, (byte) 0xb2, (byte) 0xa7, (byte) 0x33, (byte) 0x1c, 1209c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x47, (byte) 0xff, (byte) 0x5c, (byte) 0xf0, (byte) 0xb8, (byte) 0x04, 1210c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x2c, (byte) 0xfd, (byte) 0xe2, (byte) 0xb1, (byte) 0x4a, (byte) 0x0a, 1211c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x69, (byte) 0x1c, (byte) 0x80, (byte) 0x2b, (byte) 0xb4, (byte) 0x50, 1212c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x65, (byte) 0x5c, (byte) 0x76, (byte) 0x78, (byte) 0x9a, (byte) 0x0c, 1213c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x05, (byte) 0x62, (byte) 0xf0, (byte) 0xc4, (byte) 0x1c, (byte) 0x38, 1214c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x15, (byte) 0xd0, (byte) 0xe2, (byte) 0x5a, (byte) 0x3d, (byte) 0xb6, 1215c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xe0, (byte) 0x88, (byte) 0x85, (byte) 0xd1, (byte) 0x4f, (byte) 0x7e, 1216c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xfc, (byte) 0x77, (byte) 0x0d, (byte) 0x2a, (byte) 0x45, (byte) 0xd5, 1217c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xf8, (byte) 0x3c, (byte) 0x7b, (byte) 0x2d, (byte) 0x1b, (byte) 0x82, 1218c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xfe, (byte) 0x58, (byte) 0x22, (byte) 0x47, (byte) 0x06, (byte) 0x58, 1219c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8b, (byte) 0x4f, (byte) 0xfb, (byte) 0x9b, (byte) 0x1c, (byte) 0x70, 1220c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x36, (byte) 0x12, (byte) 0x04, (byte) 0x17, (byte) 0x47, (byte) 0x8a, 1221c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x0a, (byte) 0xec, (byte) 0x12, (byte) 0x3b, (byte) 0xf8, (byte) 0xd2, 1222c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xdc, (byte) 0x3c, (byte) 0xc8, (byte) 0x46, (byte) 0xc6, (byte) 0x51, 1223c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x06, (byte) 0x06, (byte) 0xcb, (byte) 0x84, (byte) 0x67, (byte) 0xb5, 1224c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x68, (byte) 0xd9, (byte) 0x9c, (byte) 0xd4, (byte) 0x16, (byte) 0x5c, 1225c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0xb4, (byte) 0xe2, (byte) 0x55, (byte) 0xe6, (byte) 0x3a, (byte) 0x73, 1226c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x01, (byte) 0x1d, (byte) 0x6f, (byte) 0x30, (byte) 0x31, (byte) 0x59, 1227c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8b, (byte) 0x2f, (byte) 0x4c, (byte) 0xe7, (byte) 0x86, (byte) 0x4c, 1228c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x39, (byte) 0x4e, (byte) 0x67, (byte) 0x3b, (byte) 0x22, (byte) 0x9b, 1229c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x85, (byte) 0x5a, (byte) 0xc3, (byte) 0x29, (byte) 0xaf, (byte) 0x8c, 1230c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x7c, (byte) 0x59, (byte) 0x4a, (byte) 0x24, (byte) 0xfa, (byte) 0xba, 1231c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x55, (byte) 0x40, (byte) 0x13, (byte) 0x64, (byte) 0xd8, (byte) 0xcb, 1232c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x4b, (byte) 0x98, (byte) 0x3f, (byte) 0xae, (byte) 0x20, (byte) 0xfd, 1233c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root (byte) 0x8a, (byte) 0x50, (byte) 0x73, (byte) 0xe4, 1234c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root }; 1235c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1236c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Private_OnlyDoFinal_Success() throws Exception { 123772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 123872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Private_OnlyDoFinal_Success(provider); 123972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 124072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 124172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 124272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Private_OnlyDoFinal_Success(String provider) throws Exception { 1243c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1244c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 1245c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_privateExponent); 1246c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1247c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PrivateKey privKey = kf.generatePrivate(keySpec); 1248c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 124972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1250c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1251c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1252c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually decrypting with private keys, but there is no 1253c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1254c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1255c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1256c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1257c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] encrypted = c.doFinal(RSA_2048_Vector1); 1258c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertTrue("Encrypted should match expected", 1259c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root Arrays.equals(RSA_Vector1_Encrypt_Private, encrypted)); 1260c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1261c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1262c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root encrypted = c.doFinal(RSA_2048_Vector1); 1263c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertTrue("Encrypted should match expected", 1264c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root Arrays.equals(RSA_Vector1_Encrypt_Private, encrypted)); 1265c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1266c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1267c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Private_UpdateThenEmptyDoFinal_Success() throws Exception { 126872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 126972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Private_UpdateThenEmptyDoFinal_Success(provider); 127072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 127172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 127272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 127372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Private_UpdateThenEmptyDoFinal_Success(String provider) throws Exception { 1274c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1275c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 1276c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_privateExponent); 1277c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1278c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PrivateKey privKey = kf.generatePrivate(keySpec); 1279c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 128072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1281c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1282c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1283c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually decrypting with private keys, but there is no 1284c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1285c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1286c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1287c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1288c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_2048_Vector1); 1289c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] encrypted = c.doFinal(); 1290c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertTrue("Encrypted should match expected", 1291c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root Arrays.equals(RSA_Vector1_Encrypt_Private, encrypted)); 1292c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1293c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1294c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_2048_Vector1); 1295c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root encrypted = c.doFinal(); 1296c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertTrue("Encrypted should match expected", 1297c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root Arrays.equals(RSA_Vector1_Encrypt_Private, encrypted)); 1298c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1299c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1300c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Private_SingleByteUpdateThenEmptyDoFinal_Success() 1301c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root throws Exception { 130272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 130372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Private_SingleByteUpdateThenEmptyDoFinal_Success(provider); 130472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 130572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 130672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 130772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Private_SingleByteUpdateThenEmptyDoFinal_Success(String provider) 130872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom throws Exception { 1309c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1310c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 1311c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_privateExponent); 1312c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1313c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PrivateKey privKey = kf.generatePrivate(keySpec); 1314c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 131572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1316c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1317c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1318c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually decrypting with private keys, but there is no 1319c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1320c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1321c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1322c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1323c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root int i; 1324c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root for (i = 0; i < RSA_2048_Vector1.length / 2; i++) { 1325c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_2048_Vector1, i, 1); 1326c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1327c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] encrypted = c.doFinal(RSA_2048_Vector1, i, RSA_2048_Vector1.length - i); 1328c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertTrue("Encrypted should match expected", 1329c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root Arrays.equals(RSA_Vector1_Encrypt_Private, encrypted)); 1330c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1331c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1332c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root for (i = 0; i < RSA_2048_Vector1.length / 2; i++) { 1333c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_2048_Vector1, i, 1); 1334c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1335c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root encrypted = c.doFinal(RSA_2048_Vector1, i, RSA_2048_Vector1.length - i); 1336c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertTrue("Encrypted should match expected", 1337c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root Arrays.equals(RSA_Vector1_Encrypt_Private, encrypted)); 1338c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1339c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1340d762af619aa85042c08553425a4ca4ef7900d45aKenny Root public void testRSA_ECB_NoPadding_Private_OnlyDoFinalWithOffset_Success() throws Exception { 134172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 134272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Private_OnlyDoFinalWithOffset_Success(provider); 134372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 134472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 134572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 134672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Private_OnlyDoFinalWithOffset_Success(String provider) throws Exception { 1347d762af619aa85042c08553425a4ca4ef7900d45aKenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1348d762af619aa85042c08553425a4ca4ef7900d45aKenny Root RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 1349d762af619aa85042c08553425a4ca4ef7900d45aKenny Root RSA_2048_privateExponent); 1350d762af619aa85042c08553425a4ca4ef7900d45aKenny Root final PrivateKey privKey = kf.generatePrivate(keySpec); 1351d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 135272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1353d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 1354d762af619aa85042c08553425a4ca4ef7900d45aKenny Root /* 1355d762af619aa85042c08553425a4ca4ef7900d45aKenny Root * You're actually decrypting with private keys, but there is no 1356d762af619aa85042c08553425a4ca4ef7900d45aKenny Root * distinction made here. It's all keyed off of what kind of key you're 1357d762af619aa85042c08553425a4ca4ef7900d45aKenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1358d762af619aa85042c08553425a4ca4ef7900d45aKenny Root */ 1359d762af619aa85042c08553425a4ca4ef7900d45aKenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1360d762af619aa85042c08553425a4ca4ef7900d45aKenny Root byte[] encrypted = new byte[RSA_Vector1_Encrypt_Private.length]; 1361d762af619aa85042c08553425a4ca4ef7900d45aKenny Root final int encryptLen = c 1362d762af619aa85042c08553425a4ca4ef7900d45aKenny Root .doFinal(RSA_2048_Vector1, 0, RSA_2048_Vector1.length, encrypted, 0); 1363d762af619aa85042c08553425a4ca4ef7900d45aKenny Root assertEquals("Encrypted size should match expected", RSA_Vector1_Encrypt_Private.length, 1364d762af619aa85042c08553425a4ca4ef7900d45aKenny Root encryptLen); 1365d762af619aa85042c08553425a4ca4ef7900d45aKenny Root assertTrue("Encrypted should match expected", 1366d762af619aa85042c08553425a4ca4ef7900d45aKenny Root Arrays.equals(RSA_Vector1_Encrypt_Private, encrypted)); 1367d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 1368d762af619aa85042c08553425a4ca4ef7900d45aKenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1369d762af619aa85042c08553425a4ca4ef7900d45aKenny Root final int decryptLen = c 1370d762af619aa85042c08553425a4ca4ef7900d45aKenny Root .doFinal(RSA_2048_Vector1, 0, RSA_2048_Vector1.length, encrypted, 0); 1371d762af619aa85042c08553425a4ca4ef7900d45aKenny Root assertEquals("Encrypted size should match expected", RSA_Vector1_Encrypt_Private.length, 1372d762af619aa85042c08553425a4ca4ef7900d45aKenny Root decryptLen); 1373d762af619aa85042c08553425a4ca4ef7900d45aKenny Root assertTrue("Encrypted should match expected", 1374d762af619aa85042c08553425a4ca4ef7900d45aKenny Root Arrays.equals(RSA_Vector1_Encrypt_Private, encrypted)); 1375d762af619aa85042c08553425a4ca4ef7900d45aKenny Root } 1376d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 1377c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Public_OnlyDoFinal_Success() throws Exception { 137872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 137972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Public_OnlyDoFinal_Success(provider); 138072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 138172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 138272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 138372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Public_OnlyDoFinal_Success(String provider) throws Exception { 1384c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1385c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPublicKeySpec keySpec = new RSAPublicKeySpec(RSA_2048_modulus, RSA_2048_publicExponent); 1386c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1387c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PublicKey privKey = kf.generatePublic(keySpec); 1388c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 138972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1390c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1391c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1392c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually encrypting with public keys, but there is no 1393c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1394c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1395c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1396c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1397c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] encrypted = c.doFinal(RSA_Vector1_Encrypt_Private); 139872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.ENCRYPT_MODE, RSA_2048_Vector1, encrypted); 1399c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1400c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1401c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root encrypted = c.doFinal(RSA_Vector1_Encrypt_Private); 140272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.DECRYPT_MODE, RSA_2048_Vector1, encrypted); 1403c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1404c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1405d762af619aa85042c08553425a4ca4ef7900d45aKenny Root public void testRSA_ECB_NoPadding_Public_OnlyDoFinalWithOffset_Success() throws Exception { 140672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 140772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Public_OnlyDoFinalWithOffset_Success(provider); 140872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 140972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 141072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 141172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Public_OnlyDoFinalWithOffset_Success(String provider) throws Exception { 1412d762af619aa85042c08553425a4ca4ef7900d45aKenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1413d762af619aa85042c08553425a4ca4ef7900d45aKenny Root RSAPublicKeySpec keySpec = new RSAPublicKeySpec(RSA_2048_modulus, RSA_2048_publicExponent); 1414d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 1415d762af619aa85042c08553425a4ca4ef7900d45aKenny Root final PublicKey pubKey = kf.generatePublic(keySpec); 1416d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 141772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1418d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 1419d762af619aa85042c08553425a4ca4ef7900d45aKenny Root /* 1420d762af619aa85042c08553425a4ca4ef7900d45aKenny Root * You're actually encrypting with public keys, but there is no 1421d762af619aa85042c08553425a4ca4ef7900d45aKenny Root * distinction made here. It's all keyed off of what kind of key you're 1422d762af619aa85042c08553425a4ca4ef7900d45aKenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1423d762af619aa85042c08553425a4ca4ef7900d45aKenny Root */ 1424d762af619aa85042c08553425a4ca4ef7900d45aKenny Root c.init(Cipher.ENCRYPT_MODE, pubKey); 1425d762af619aa85042c08553425a4ca4ef7900d45aKenny Root byte[] encrypted = new byte[RSA_2048_Vector1.length]; 1426d762af619aa85042c08553425a4ca4ef7900d45aKenny Root final int encryptLen = c.doFinal(RSA_Vector1_Encrypt_Private, 0, 1427d762af619aa85042c08553425a4ca4ef7900d45aKenny Root RSA_Vector1_Encrypt_Private.length, encrypted, 0); 1428d762af619aa85042c08553425a4ca4ef7900d45aKenny Root assertEquals("Encrypted size should match expected", RSA_2048_Vector1.length, encryptLen); 142972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.ENCRYPT_MODE, RSA_2048_Vector1, encrypted); 1430d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 1431d762af619aa85042c08553425a4ca4ef7900d45aKenny Root c.init(Cipher.DECRYPT_MODE, pubKey); 143272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom int decryptLen = c.doFinal(RSA_Vector1_Encrypt_Private, 0, 1433d762af619aa85042c08553425a4ca4ef7900d45aKenny Root RSA_Vector1_Encrypt_Private.length, encrypted, 0); 143472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (provider.equals("BC")) { 143572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // BC strips the leading 0 for us on decrypt even when NoPadding is specified... 143672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom decryptLen++; 143772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom encrypted = Arrays.copyOf(encrypted, encrypted.length - 1); 143872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 1439d762af619aa85042c08553425a4ca4ef7900d45aKenny Root assertEquals("Encrypted size should match expected", RSA_2048_Vector1.length, decryptLen); 144072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.DECRYPT_MODE, RSA_2048_Vector1, encrypted); 1441d762af619aa85042c08553425a4ca4ef7900d45aKenny Root } 1442d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 1443c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Public_UpdateThenEmptyDoFinal_Success() throws Exception { 144472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 144572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Public_UpdateThenEmptyDoFinal_Success(provider); 144672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 144772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 144872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 144972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Public_UpdateThenEmptyDoFinal_Success(String provider) throws Exception { 1450c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1451c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPublicKeySpec keySpec = new RSAPublicKeySpec(RSA_2048_modulus, RSA_2048_publicExponent); 1452c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1453c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PublicKey privKey = kf.generatePublic(keySpec); 1454c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 145572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1456c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1457c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1458c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually encrypting with public keys, but there is no 1459c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1460c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1461c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1462c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1463c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_Vector1_Encrypt_Private); 1464c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] encrypted = c.doFinal(); 146572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.ENCRYPT_MODE, RSA_2048_Vector1, encrypted); 1466c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1467c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1468c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_Vector1_Encrypt_Private); 1469c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root encrypted = c.doFinal(); 147072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.DECRYPT_MODE, RSA_2048_Vector1, encrypted); 1471c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1472c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1473c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Public_SingleByteUpdateThenEmptyDoFinal_Success() 1474c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root throws Exception { 147572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 147672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Public_SingleByteUpdateThenEmptyDoFinal_Success(provider); 147772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 147872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 147972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 148072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Public_SingleByteUpdateThenEmptyDoFinal_Success(String provider) 148172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom throws Exception { 1482c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1483c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPublicKeySpec keySpec = new RSAPublicKeySpec(RSA_2048_modulus, RSA_2048_publicExponent); 1484c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1485c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PublicKey privKey = kf.generatePublic(keySpec); 1486c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 148772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1488c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1489c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1490c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually encrypting with public keys, but there is no 1491c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1492c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1493c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1494c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1495c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root int i; 1496c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root for (i = 0; i < RSA_Vector1_Encrypt_Private.length / 2; i++) { 1497c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_Vector1_Encrypt_Private, i, 1); 1498c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1499c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] encrypted = c.doFinal(RSA_Vector1_Encrypt_Private, i, RSA_2048_Vector1.length - i); 150072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.ENCRYPT_MODE, RSA_2048_Vector1, encrypted); 1501c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1502c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1503c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root for (i = 0; i < RSA_Vector1_Encrypt_Private.length / 2; i++) { 1504c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_Vector1_Encrypt_Private, i, 1); 1505c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1506c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root encrypted = c.doFinal(RSA_Vector1_Encrypt_Private, i, RSA_2048_Vector1.length - i); 150772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.DECRYPT_MODE, RSA_2048_Vector1, encrypted); 1508c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1509c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1510c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Public_TooSmall_Success() throws Exception { 151172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 151272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Public_TooSmall_Success(provider); 151372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 151472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 151572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 151672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Public_TooSmall_Success(String provider) throws Exception { 1517c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1518c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPublicKeySpec keySpec = new RSAPublicKeySpec(RSA_2048_modulus, RSA_2048_publicExponent); 1519c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1520c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PublicKey privKey = kf.generatePublic(keySpec); 1521c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 152272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1523c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1524c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1525c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually encrypting with public keys, but there is no 1526c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1527c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1528c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1529c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1530c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] encrypted = c.doFinal(TooShort_Vector); 1531c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertTrue("Encrypted should match expected", 1532c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root Arrays.equals(RSA_Vector1_ZeroPadded_Encrypted, encrypted)); 1533c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1534c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1535c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root encrypted = c.doFinal(TooShort_Vector); 1536c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertTrue("Encrypted should match expected", 1537c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root Arrays.equals(RSA_Vector1_ZeroPadded_Encrypted, encrypted)); 1538c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1539c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1540c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Private_TooSmall_Success() throws Exception { 154172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 154272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Private_TooSmall_Success(provider); 154372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 154472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 154572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 154672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Private_TooSmall_Success(String provider) throws Exception { 1547c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1548c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 1549c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_privateExponent); 1550c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1551c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PrivateKey privKey = kf.generatePrivate(keySpec); 1552c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 155372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1554c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1555c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1556c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually encrypting with public keys, but there is no 1557c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1558c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1559c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1560c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1561c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] encrypted = c.doFinal(RSA_Vector1_ZeroPadded_Encrypted); 156272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.ENCRYPT_MODE, 156372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom TooShort_Vector_Zero_Padded, encrypted); 1564c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1565c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.DECRYPT_MODE, privKey); 1566c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root encrypted = c.doFinal(RSA_Vector1_ZeroPadded_Encrypted); 156772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEncryptedEqualsNoPadding(provider, Cipher.DECRYPT_MODE, 156872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom TooShort_Vector_Zero_Padded, encrypted); 156972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 157072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 157172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static void assertEncryptedEqualsNoPadding(String provider, int mode, 157272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom byte[] expected, byte[] actual) { 157372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (provider.equals("BC") && mode == Cipher.DECRYPT_MODE) { 157472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // BouncyCastle does us the favor of stripping leading zeroes in DECRYPT_MODE 157572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom int nonZeroOffset = 0; 157672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (byte b : expected) { 157772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (b != 0) { 157872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom break; 157972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 158072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom nonZeroOffset++; 158172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 158272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom expected = Arrays.copyOfRange(expected, nonZeroOffset, expected.length); 158372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 158472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals("Encrypted should match expected", 158572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Arrays.toString(expected), Arrays.toString(actual)); 1586c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1587c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1588c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Private_CombinedUpdateAndDoFinal_TooBig_Failure() 1589c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root throws Exception { 159072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 159172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Private_CombinedUpdateAndDoFinal_TooBig_Failure(provider); 159272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 159372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 159472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 159572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Private_CombinedUpdateAndDoFinal_TooBig_Failure(String provider) 159672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom throws Exception { 1597c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1598c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 1599c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_privateExponent); 1600c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1601c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PrivateKey privKey = kf.generatePrivate(keySpec); 1602c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 160372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1604c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1605c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1606c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually encrypting with public keys, but there is no 1607c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1608c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1609c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1610c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1611c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_Vector1_ZeroPadded_Encrypted); 1612c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1613c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root try { 1614c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.doFinal(RSA_Vector1_ZeroPadded_Encrypted); 1615c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root fail("Should have error when block size is too big."); 1616c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } catch (IllegalBlockSizeException success) { 161772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertFalse(provider, "BC".equals(provider)); 161872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (ArrayIndexOutOfBoundsException success) { 161972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals("BC", provider); 1620c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1621c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1622c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1623c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Private_UpdateInAndOutPlusDoFinal_TooBig_Failure() 1624c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root throws Exception { 162572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 162672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Private_UpdateInAndOutPlusDoFinal_TooBig_Failure(provider); 162772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 162872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 162972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 163072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Private_UpdateInAndOutPlusDoFinal_TooBig_Failure(String provider) 163172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom throws Exception { 1632c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1633c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 1634c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_privateExponent); 1635c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1636c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PrivateKey privKey = kf.generatePrivate(keySpec); 1637c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 163872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1639c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1640c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1641c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually encrypting with public keys, but there is no 1642c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1643c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1644c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1645c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1646c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1647c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] output = new byte[RSA_2048_Vector1.length]; 1648c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.update(RSA_Vector1_ZeroPadded_Encrypted, 0, RSA_Vector1_ZeroPadded_Encrypted.length, 1649c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root output); 1650c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1651c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root try { 1652c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.doFinal(RSA_Vector1_ZeroPadded_Encrypted); 1653c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root fail("Should have error when block size is too big."); 1654c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } catch (IllegalBlockSizeException success) { 165572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertFalse(provider, "BC".equals(provider)); 165672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (ArrayIndexOutOfBoundsException success) { 165772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals("BC", provider); 1658c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1659c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1660c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1661c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_Private_OnlyDoFinal_TooBig_Failure() throws Exception { 166272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 166372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_Private_OnlyDoFinal_TooBig_Failure(provider); 166472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 166572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 166672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 166772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_Private_OnlyDoFinal_TooBig_Failure(String provider) throws Exception { 1668c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1669c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(RSA_2048_modulus, 1670c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_privateExponent); 1671c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1672c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PrivateKey privKey = kf.generatePrivate(keySpec); 1673c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 167472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1675c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1676c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root /* 1677c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * You're actually encrypting with public keys, but there is no 1678c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * distinction made here. It's all keyed off of what kind of key you're 1679c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root * using. ENCRYPT_MODE and DECRYPT_MODE are the same. 1680c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root */ 1681c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, privKey); 1682c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1683c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root byte[] tooBig_Vector = new byte[RSA_Vector1_ZeroPadded_Encrypted.length * 2]; 1684c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root System.arraycopy(RSA_Vector1_ZeroPadded_Encrypted, 0, tooBig_Vector, 0, 1685c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_Vector1_ZeroPadded_Encrypted.length); 1686c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root System.arraycopy(RSA_Vector1_ZeroPadded_Encrypted, 0, tooBig_Vector, 1687c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_Vector1_ZeroPadded_Encrypted.length, RSA_Vector1_ZeroPadded_Encrypted.length); 1688c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1689c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root try { 1690c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.doFinal(tooBig_Vector); 1691c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root fail("Should have error when block size is too big."); 1692c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } catch (IllegalBlockSizeException success) { 169372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertFalse(provider, "BC".equals(provider)); 169472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (ArrayIndexOutOfBoundsException success) { 169572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals("BC", provider); 1696c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1697c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1698c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1699c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_GetBlockSize_Success() throws Exception { 170072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 170172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_GetBlockSize_Success(provider); 170272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 170372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 170472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 170572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_GetBlockSize_Success(String provider) throws Exception { 170672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 170772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (StandardNames.IS_RI) { 170872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(0, c.getBlockSize()); 170972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } else { 171072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 171172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.getBlockSize(); 171272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom fail(); 171372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (IllegalStateException expected) { 171472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 171572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 1716c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1717c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1718c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(RSA_2048_modulus, 1719c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_publicExponent); 1720c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PublicKey pubKey = kf.generatePublic(pubKeySpec); 1721c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, pubKey); 172272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(getExpectedBlockSize("RSA", Cipher.ENCRYPT_MODE, provider), c.getBlockSize()); 1723c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1724c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1725c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_GetOutputSize_NoInit_Failure() throws Exception { 172672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 172772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_GetOutputSize_NoInit_Failure(provider); 172872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 172972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 173072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 173172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_GetOutputSize_NoInit_Failure(String provider) throws Exception { 173272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1733c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root try { 1734c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.getOutputSize(RSA_2048_Vector1.length); 1735c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root fail("Should throw IllegalStateException if getOutputSize is called before init"); 1736c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } catch (IllegalStateException success) { 1737c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1738c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1739c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1740c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_GetOutputSize_Success() throws Exception { 174172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 174272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_GetOutputSize_Success(provider); 174372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 174472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 174572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 174672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_GetOutputSize_Success(String provider) throws Exception { 1747c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1748c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(RSA_2048_modulus, 1749c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_publicExponent); 1750c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PublicKey pubKey = kf.generatePublic(pubKeySpec); 1751c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 175272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1753c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, pubKey); 1754c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1755c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final int modulusInBytes = RSA_2048_modulus.bitLength() / 8; 175672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(modulusInBytes, c.getOutputSize(RSA_2048_Vector1.length)); 175772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(modulusInBytes, c.getOutputSize(RSA_2048_Vector1.length * 2)); 175872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(modulusInBytes, c.getOutputSize(0)); 1759c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1760c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1761c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_GetIV_Success() throws Exception { 176272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 176372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_GetIV_Success(provider); 176472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 176572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 176672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 176772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_GetIV_Success(String provider) throws Exception { 1768c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1769c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(RSA_2048_modulus, 1770c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_publicExponent); 1771c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PublicKey pubKey = kf.generatePublic(pubKeySpec); 1772c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 177372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1774c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertNull("ECB mode has no IV and should be null", c.getIV()); 1775c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1776c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root c.init(Cipher.ENCRYPT_MODE, pubKey); 1777c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1778c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertNull("ECB mode has no IV and should be null", c.getIV()); 1779c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 1780c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 1781c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root public void testRSA_ECB_NoPadding_GetParameters_NoneProvided_Success() throws Exception { 178272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : RSA_PROVIDERS) { 178372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testRSA_ECB_NoPadding_GetParameters_NoneProvided_Success(provider); 178472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 178572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 178672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 178772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testRSA_ECB_NoPadding_GetParameters_NoneProvided_Success(String provider) throws Exception { 1788c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root KeyFactory kf = KeyFactory.getInstance("RSA"); 1789c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(RSA_2048_modulus, 1790c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root RSA_2048_publicExponent); 1791c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root final PublicKey pubKey = kf.generatePublic(pubKeySpec); 1792c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root 179372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("RSA/ECB/NoPadding", provider); 1794c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root assertNull("Parameters should be null", c.getParameters()); 1795c5ddc93173f32383ab456c0a24739e7cb2d19c42Kenny Root } 179672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 179772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 179872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test vector generation: 179972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * openssl rand -hex 16 180072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * echo '3d4f8970b1f27537f40a39298a41555f' | sed 's/\(..\)/(byte) 0x\1, /g' 180172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 180272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_128_KEY = new byte[] { 180372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x3d, (byte) 0x4f, (byte) 0x89, (byte) 0x70, (byte) 0xb1, (byte) 0xf2, 180472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x75, (byte) 0x37, (byte) 0xf4, (byte) 0x0a, (byte) 0x39, (byte) 0x29, 180572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x8a, (byte) 0x41, (byte) 0x55, (byte) 0x5f, 180672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 180772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 180872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 180972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test key generation: 181072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * openssl rand -hex 24 181172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * echo '5a7a3d7e40b64ed996f7afa15f97fd595e27db6af428e342' | sed 's/\(..\)/(byte) 0x\1, /g' 181272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 181372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_192_KEY = new byte[] { 181472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x5a, (byte) 0x7a, (byte) 0x3d, (byte) 0x7e, (byte) 0x40, (byte) 0xb6, 181572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x4e, (byte) 0xd9, (byte) 0x96, (byte) 0xf7, (byte) 0xaf, (byte) 0xa1, 181672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x5f, (byte) 0x97, (byte) 0xfd, (byte) 0x59, (byte) 0x5e, (byte) 0x27, 181772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xdb, (byte) 0x6a, (byte) 0xf4, (byte) 0x28, (byte) 0xe3, (byte) 0x42, 181872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 181972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 182072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 182172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test key generation: 182272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * openssl rand -hex 32 182372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * echo 'ec53c6d51d2c4973585fb0b8e51cd2e39915ff07a1837872715d6121bf861935' | sed 's/\(..\)/(byte) 0x\1, /g' 182472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 182572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_256_KEY = new byte[] { 182672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xec, (byte) 0x53, (byte) 0xc6, (byte) 0xd5, (byte) 0x1d, (byte) 0x2c, 182772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x49, (byte) 0x73, (byte) 0x58, (byte) 0x5f, (byte) 0xb0, (byte) 0xb8, 182872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xe5, (byte) 0x1c, (byte) 0xd2, (byte) 0xe3, (byte) 0x99, (byte) 0x15, 182972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xff, (byte) 0x07, (byte) 0xa1, (byte) 0x83, (byte) 0x78, (byte) 0x72, 183072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x71, (byte) 0x5d, (byte) 0x61, (byte) 0x21, (byte) 0xbf, (byte) 0x86, 183172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x19, (byte) 0x35, 183272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 183372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 183472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[][] AES_KEYS = new byte[][] { 183572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_128_KEY, AES_192_KEY, AES_256_KEY, 183672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 183772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 183872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final String[] AES_MODES = new String[] { 183972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom "AES/ECB", 184072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom "AES/CBC", 184172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom "AES/CFB", 184272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom "AES/CTR", 184372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom "AES/OFB", 184472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 184572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 184672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 184772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test vector creation: 184872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * echo -n 'Hello, world!' | recode ../x1 | sed 's/0x/(byte) 0x/g' 184972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 185072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext = new byte[] { 185172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x48, (byte) 0x65, (byte) 0x6C, (byte) 0x6C, (byte) 0x6F, (byte) 0x2C, 185272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x20, (byte) 0x77, (byte) 0x6F, (byte) 0x72, (byte) 0x6C, (byte) 0x64, 185372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x21, 185472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 185572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 185672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 185772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test vector creation: 185872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * openssl enc -aes-128-ecb -K 3d4f8970b1f27537f40a39298a41555f -in blah|openssl enc -aes-128-ecb -K 3d4f8970b1f27537f40a39298a41555f -nopad -d|recode ../x1 | sed 's/0x/(byte) 0x/g' 185972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 186072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext_Padded = new byte[] { 186172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x48, (byte) 0x65, (byte) 0x6C, (byte) 0x6C, (byte) 0x6F, (byte) 0x2C, 186272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x20, (byte) 0x77, (byte) 0x6F, (byte) 0x72, (byte) 0x6C, (byte) 0x64, 186372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x21, (byte) 0x03, (byte) 0x03, (byte) 0x03 186472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 186572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 186672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 186772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test vector generation: 186872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * openssl enc -aes-128-ecb -K 3d4f8970b1f27537f40a39298a41555f -in blah|recode ../x1 | sed 's/0x/(byte) 0x/g' 186972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 187072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_128_ECB_PKCS5Padding_TestVector_1_Encrypted = new byte[] { 187172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x65, (byte) 0x3E, (byte) 0x86, (byte) 0xFB, (byte) 0x05, (byte) 0x5A, 187272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x52, (byte) 0xEA, (byte) 0xDD, (byte) 0x08, (byte) 0xE7, (byte) 0x48, 187372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x33, (byte) 0x01, (byte) 0xFC, (byte) 0x5A, 187472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 187572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 187672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 187772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test key generation: 187872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * openssl rand -hex 16 187972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * echo 'ceaa31952dfd3d0f5af4b2042ba06094' | sed 's/\(..\)/(byte) 0x\1, /g' 188072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 188172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_256_CBC_PKCS5Padding_TestVector_1_IV = new byte[] { 188272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xce, (byte) 0xaa, (byte) 0x31, (byte) 0x95, (byte) 0x2d, (byte) 0xfd, 188372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x3d, (byte) 0x0f, (byte) 0x5a, (byte) 0xf4, (byte) 0xb2, (byte) 0x04, 188472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x2b, (byte) 0xa0, (byte) 0x60, (byte) 0x94, 188572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 188672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 188772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 188872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test vector generation: 188972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * echo -n 'I only regret that I have but one test to write.' | recode ../x1 | sed 's/0x/(byte) 0x/g' 189072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 189172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_256_CBC_PKCS5Padding_TestVector_1_Plaintext = new byte[] { 189272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x49, (byte) 0x20, (byte) 0x6F, (byte) 0x6E, (byte) 0x6C, (byte) 0x79, 189372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x20, (byte) 0x72, (byte) 0x65, (byte) 0x67, (byte) 0x72, (byte) 0x65, 189472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x74, (byte) 0x20, (byte) 0x74, (byte) 0x68, (byte) 0x61, (byte) 0x74, 189572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x20, (byte) 0x49, (byte) 0x20, (byte) 0x68, (byte) 0x61, (byte) 0x76, 189672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x65, (byte) 0x20, (byte) 0x62, (byte) 0x75, (byte) 0x74, (byte) 0x20, 189772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x20, (byte) 0x74, (byte) 0x65, 189872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x74, (byte) 0x6F, (byte) 0x20, 189972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x77, (byte) 0x72, (byte) 0x69, (byte) 0x74, (byte) 0x65, (byte) 0x2E 190072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 190172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 190272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 190372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test vector generation: 190472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * echo -n 'I only regret that I have but one test to write.' | openssl enc -aes-256-cbc -K ec53c6d51d2c4973585fb0b8e51cd2e39915ff07a1837872715d6121bf861935 -iv ceaa31952dfd3d0f5af4b2042ba06094 | openssl enc -aes-256-cbc -K ec53c6d51d2c4973585fb0b8e51cd2e39915ff07a1837872715d6121bf861935 -iv ceaa31952dfd3d0f5af4b2042ba06094 -d -nopad | recode ../x1 | sed 's/0x/(byte) 0x/g' 190572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 190672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_256_CBC_PKCS5Padding_TestVector_1_Plaintext_Padded = new byte[] { 190772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x49, (byte) 0x20, (byte) 0x6F, (byte) 0x6E, (byte) 0x6C, (byte) 0x79, 190872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x20, (byte) 0x72, (byte) 0x65, (byte) 0x67, (byte) 0x72, (byte) 0x65, 190972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x74, (byte) 0x20, (byte) 0x74, (byte) 0x68, (byte) 0x61, (byte) 0x74, 191072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x20, (byte) 0x49, (byte) 0x20, (byte) 0x68, (byte) 0x61, (byte) 0x76, 191172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x65, (byte) 0x20, (byte) 0x62, (byte) 0x75, (byte) 0x74, (byte) 0x20, 191272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x6F, (byte) 0x6E, (byte) 0x65, (byte) 0x20, (byte) 0x74, (byte) 0x65, 191372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x73, (byte) 0x74, (byte) 0x20, (byte) 0x74, (byte) 0x6F, (byte) 0x20, 191472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x77, (byte) 0x72, (byte) 0x69, (byte) 0x74, (byte) 0x65, (byte) 0x2E, 191572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, 191672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10, 191772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x10, (byte) 0x10, (byte) 0x10, (byte) 0x10 191872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 191972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 192072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom /* 192172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * Test vector generation: 192272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom * echo -n 'I only regret that I have but one test to write.' | openssl enc -aes-256-cbc -K ec53c6d51d2c4973585fb0b8e51cd2e39915ff07a1837872715d6121bf861935 -iv ceaa31952dfd3d0f5af4b2042ba06094 | recode ../x1 | sed 's/0x/(byte) 0x/g' 192372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom */ 192472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_256_CBC_PKCS5Padding_TestVector_1_Ciphertext = new byte[] { 192572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x90, (byte) 0x65, (byte) 0xDD, (byte) 0xAF, (byte) 0x7A, (byte) 0xCE, 192672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xAE, (byte) 0xBF, (byte) 0xE8, (byte) 0xF6, (byte) 0x9E, (byte) 0xDB, 192772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xEA, (byte) 0x65, (byte) 0x28, (byte) 0xC4, (byte) 0x9A, (byte) 0x28, 192872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xEA, (byte) 0xA3, (byte) 0x95, (byte) 0x2E, (byte) 0xFF, (byte) 0xF1, 192972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xA0, (byte) 0xCA, (byte) 0xC2, (byte) 0xA4, (byte) 0x65, (byte) 0xCD, 193072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xBF, (byte) 0xCE, (byte) 0x9E, (byte) 0xF1, (byte) 0x57, (byte) 0xF6, 193172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x32, (byte) 0x2E, (byte) 0x8F, (byte) 0x93, (byte) 0x2E, (byte) 0xAE, 193272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x41, (byte) 0x33, (byte) 0x54, (byte) 0xD0, (byte) 0xEF, (byte) 0x8C, 193372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x52, (byte) 0x14, (byte) 0xAC, (byte) 0x2D, (byte) 0xD5, (byte) 0xA4, 193472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xF9, (byte) 0x20, (byte) 0x77, (byte) 0x25, (byte) 0x91, (byte) 0x3F, 193572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0xD1, (byte) 0xB9, (byte) 0x00, (byte) 0x3E 193672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 193772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 193872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static class CipherTestParam { 193972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public final String mode; 194072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 194172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public final byte[] key; 194272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 194372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public final byte[] iv; 194472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 194572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public final byte[] plaintext; 194672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 194772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public final byte[] ciphertext; 194872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 194972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public final byte[] plaintextPadded; 195072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 195172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public CipherTestParam(String mode, byte[] key, byte[] iv, byte[] plaintext, 195272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom byte[] plaintextPadded, byte[] ciphertext) { 195372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom this.mode = mode; 195472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom this.key = key; 195572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom this.iv = iv; 195672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom this.plaintext = plaintext; 195772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom this.plaintextPadded = plaintextPadded; 195872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom this.ciphertext = ciphertext; 195972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 196072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 196172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 196272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static List<CipherTestParam> CIPHER_TEST_PARAMS = new ArrayList<CipherTestParam>(); 196372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom static { 196472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom CIPHER_TEST_PARAMS.add(new CipherTestParam("AES/ECB", AES_128_KEY, 196572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom null, 196672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext, 196772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext_Padded, 196872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_128_ECB_PKCS5Padding_TestVector_1_Encrypted)); 196972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (IS_UNLIMITED) { 197072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom CIPHER_TEST_PARAMS.add(new CipherTestParam("AES/CBC", AES_256_KEY, 197172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_256_CBC_PKCS5Padding_TestVector_1_IV, 197272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_256_CBC_PKCS5Padding_TestVector_1_Plaintext, 197372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_256_CBC_PKCS5Padding_TestVector_1_Plaintext_Padded, 197472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_256_CBC_PKCS5Padding_TestVector_1_Ciphertext)); 197572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 197672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 197772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 197872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public void testCipher_Success() throws Exception { 197972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : AES_PROVIDERS) { 198072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testCipher_Success(provider); 198172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 198272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 198372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 198472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testCipher_Success(String provider) throws Exception { 198572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final ByteArrayOutputStream errBuffer = new ByteArrayOutputStream(); 198672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom PrintStream out = new PrintStream(errBuffer); 198772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (CipherTestParam p : CIPHER_TEST_PARAMS) { 198872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 198972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom checkCipher(p, provider); 199072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (Exception e) { 199172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom out.append("Error encountered checking " + p.mode + ", keySize=" 199272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom + (p.key.length * 8) + "\n"); 199372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom e.printStackTrace(out); 199472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 199572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 199672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom out.flush(); 199772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (errBuffer.size() > 0) { 199872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom throw new Exception("Errors encountered:\n\n" + errBuffer.toString() + "\n\n"); 199972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 200072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 200172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 200272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void checkCipher(CipherTestParam p, String provider) throws Exception { 200372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom SecretKey key = new SecretKeySpec(p.key, "AES"); 200472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance(p.mode + "/PKCS5Padding", provider); 200572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AlgorithmParameterSpec spec = null; 200672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (p.iv != null) { 200772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom spec = new IvParameterSpec(p.iv); 200872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 200972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(Cipher.ENCRYPT_MODE, key, spec); 201072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 201172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] actualCiphertext = c.doFinal(p.plaintext); 201272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertTrue(Arrays.equals(p.ciphertext, actualCiphertext)); 201372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 201472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(Cipher.DECRYPT_MODE, key, spec); 201572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 201672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] actualPlaintext = c.doFinal(p.ciphertext); 201772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertTrue(Arrays.equals(p.plaintext, actualPlaintext)); 201872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 201972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher cNoPad = Cipher.getInstance(p.mode + "/NoPadding", provider); 202072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom cNoPad.init(Cipher.DECRYPT_MODE, key, spec); 202172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 202272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] actualPlaintextPadded = cNoPad.doFinal(p.ciphertext); 202372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertTrue(Arrays.equals(p.plaintextPadded, actualPlaintextPadded)); 202472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 202572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 202672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public void testCipher_ShortBlock_Failure() throws Exception { 202772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : AES_PROVIDERS) { 202872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testCipher_ShortBlock_Failure(provider); 202972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 203072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 203172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 203272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testCipher_ShortBlock_Failure(String provider) throws Exception { 203372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final ByteArrayOutputStream errBuffer = new ByteArrayOutputStream(); 203472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom PrintStream out = new PrintStream(errBuffer); 203572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (CipherTestParam p : CIPHER_TEST_PARAMS) { 203672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 203772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom checkCipher_ShortBlock_Failure(p, provider); 203872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (Exception e) { 203972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom out.append("Error encountered checking " + p.mode + ", keySize=" 204072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom + (p.key.length * 8) + "\n"); 204172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom e.printStackTrace(out); 204272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 204372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 204472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom out.flush(); 204572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (errBuffer.size() > 0) { 204672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom throw new Exception("Errors encountered:\n\n" + errBuffer.toString() + "\n\n"); 204772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 204872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 204972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 205072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void checkCipher_ShortBlock_Failure(CipherTestParam p, String provider) throws Exception { 205172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom SecretKey key = new SecretKeySpec(p.key, "AES"); 205272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance(p.mode + "/NoPadding", provider); 205372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (c.getBlockSize() == 0) { 205472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom return; 205572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 205672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 205772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(Cipher.ENCRYPT_MODE, key); 205872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 205972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.doFinal(new byte[] { 0x01, 0x02, 0x03 }); 206072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom fail("Should throw IllegalBlockSizeException on wrong-sized block"); 206172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (IllegalBlockSizeException expected) { 206272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 206372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 206472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 206572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public void testAES_ECB_PKCS5Padding_ShortBuffer_Failure() throws Exception { 206672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : AES_PROVIDERS) { 206772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testAES_ECB_PKCS5Padding_ShortBuffer_Failure(provider); 206872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 206972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 207072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 207172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testAES_ECB_PKCS5Padding_ShortBuffer_Failure(String provider) throws Exception { 207272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom SecretKey key = new SecretKeySpec(AES_128_KEY, "AES"); 207372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding", provider); 207472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(Cipher.ENCRYPT_MODE, key); 207572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 207672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] fragmentOutput = c.update(AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext); 207772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (fragmentOutput != null) { 207872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(0, fragmentOutput.length); 207972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 208072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 208172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // Provide null buffer. 208272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom { 208372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 208472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.doFinal(null, 0); 208572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom fail("Should throw NullPointerException on null output buffer"); 208672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (NullPointerException expected) { 208772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (IllegalArgumentException expected) { 208872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 208972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 209072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 209172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // Provide short buffer. 209272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom { 209372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] output = new byte[c.getBlockSize() - 1]; 209472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 209572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.doFinal(output, 0); 209672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom fail("Should throw ShortBufferException on short output buffer"); 209772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (ShortBufferException expected) { 209872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 209972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 210072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 210172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // Start 1 byte into output buffer. 210272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom { 210372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] output = new byte[c.getBlockSize()]; 210472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 210572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.doFinal(output, 1); 210672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom fail("Should throw ShortBufferException on short output buffer"); 210772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (ShortBufferException expected) { 210872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 210972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 211072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 211172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom // Should keep data for real output buffer 211272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom { 211372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] output = new byte[c.getBlockSize()]; 211472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(AES_128_ECB_PKCS5Padding_TestVector_1_Encrypted.length, c.doFinal(output, 0)); 211572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertTrue(Arrays.equals(AES_128_ECB_PKCS5Padding_TestVector_1_Encrypted, output)); 211672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 211772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 211872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 211972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public void testAES_ECB_NoPadding_IncrementalUpdate_Success() throws Exception { 212072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : AES_PROVIDERS) { 212172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testAES_ECB_NoPadding_IncrementalUpdate_Success(provider); 212272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 212372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 212472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 212572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testAES_ECB_NoPadding_IncrementalUpdate_Success(String provider) throws Exception { 212672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom SecretKey key = new SecretKeySpec(AES_128_KEY, "AES"); 212772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("AES/ECB/NoPadding", provider); 212872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(Cipher.ENCRYPT_MODE, key); 212972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 213072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (int i = 0; i < AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext_Padded.length - 1; i++) { 213172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] outputFragment = c.update(AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext_Padded, i, 1); 213272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom if (outputFragment != null) { 213372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(0, outputFragment.length); 213472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 213572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 213672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 213772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom final byte[] output = c.doFinal(AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext_Padded, 213872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext_Padded.length - 1, 1); 213972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertNotNull(output); 214072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertEquals(AES_128_ECB_PKCS5Padding_TestVector_1_Plaintext_Padded.length, output.length); 214172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 214272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom assertTrue(Arrays.equals(AES_128_ECB_PKCS5Padding_TestVector_1_Encrypted, output)); 214372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 214472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 214572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private static final byte[] AES_IV_ZEROES = new byte[] { 214672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 214772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 214872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, 214972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom }; 215072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 215172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom public void testAES_ECB_NoPadding_IvParameters_Failure() throws Exception { 215272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom for (String provider : AES_PROVIDERS) { 215372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom testAES_ECB_NoPadding_IvParameters_Failure(provider); 215472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 215572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 215672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 215772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom private void testAES_ECB_NoPadding_IvParameters_Failure(String provider) throws Exception { 215872e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom SecretKey key = new SecretKeySpec(AES_128_KEY, "AES"); 215972e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom Cipher c = Cipher.getInstance("AES/ECB/NoPadding", provider); 216072e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom 216172e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom AlgorithmParameterSpec spec = new IvParameterSpec(AES_IV_ZEROES); 216272e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom try { 216372e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom c.init(Cipher.ENCRYPT_MODE, key, spec); 216472e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom fail("Should not accept an IV in ECB mode"); 216572e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } catch (InvalidAlgorithmParameterException expected) { 216672e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 216772e44404c32a98e7675a6e7cfbf856adb499a434Brian Carlstrom } 21680d5c7588179fb373da70ce04362be5ce74a98eb4Brian Carlstrom} 2169