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