Thu, 17 Apr 2014 16:09:08 -0700
Added tag hs25.20-b11 for changeset b6a2ba7d3ea7
kvn@4205 | 1 | /* |
kvn@4205 | 2 | * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. |
kvn@4205 | 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
kvn@4205 | 4 | * |
kvn@4205 | 5 | * This code is free software; you can redistribute it and/or modify it |
kvn@4205 | 6 | * under the terms of the GNU General Public License version 2 only, as |
kvn@4205 | 7 | * published by the Free Software Foundation. |
kvn@4205 | 8 | * |
kvn@4205 | 9 | * This code is distributed in the hope that it will be useful, but WITHOUT |
kvn@4205 | 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
kvn@4205 | 11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
kvn@4205 | 12 | * version 2 for more details (a copy is included in the LICENSE file that |
kvn@4205 | 13 | * accompanied this code). |
kvn@4205 | 14 | * |
kvn@4205 | 15 | * You should have received a copy of the GNU General Public License version |
kvn@4205 | 16 | * 2 along with this work; if not, write to the Free Software Foundation, |
kvn@4205 | 17 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
kvn@4205 | 18 | * |
kvn@4205 | 19 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
kvn@4205 | 20 | * or visit www.oracle.com if you need additional information or have any |
kvn@4205 | 21 | * questions. |
kvn@4205 | 22 | * |
kvn@4205 | 23 | */ |
kvn@4205 | 24 | |
kvn@4205 | 25 | /** |
kvn@4205 | 26 | * @author Tom Deneau |
kvn@4205 | 27 | */ |
kvn@4205 | 28 | |
kvn@4205 | 29 | import javax.crypto.Cipher; |
kvn@4205 | 30 | import javax.crypto.KeyGenerator; |
kvn@4205 | 31 | import javax.crypto.SecretKey; |
kvn@4205 | 32 | import javax.crypto.spec.IvParameterSpec; |
kvn@4205 | 33 | import javax.crypto.spec.SecretKeySpec; |
kvn@4205 | 34 | import java.security.AlgorithmParameters; |
kvn@4205 | 35 | |
kvn@4205 | 36 | import java.util.Random; |
kvn@4205 | 37 | import java.util.Arrays; |
kvn@4205 | 38 | |
kvn@4205 | 39 | abstract public class TestAESBase { |
kvn@4205 | 40 | int msgSize = Integer.getInteger("msgSize", 646); |
kvn@4205 | 41 | boolean checkOutput = Boolean.getBoolean("checkOutput"); |
kvn@4205 | 42 | boolean noReinit = Boolean.getBoolean("noReinit"); |
kvn@4205 | 43 | int keySize = Integer.getInteger("keySize", 128); |
kvn@4205 | 44 | String algorithm = System.getProperty("algorithm", "AES"); |
kvn@4205 | 45 | String mode = System.getProperty("mode", "CBC"); |
kvn@4205 | 46 | byte[] input; |
kvn@4205 | 47 | byte[] encode; |
kvn@4205 | 48 | byte[] expectedEncode; |
kvn@4205 | 49 | byte[] decode; |
kvn@4205 | 50 | byte[] expectedDecode; |
kvn@4205 | 51 | Random random = new Random(0); |
kvn@4205 | 52 | Cipher cipher; |
kvn@4205 | 53 | Cipher dCipher; |
kvn@4205 | 54 | String paddingStr = "PKCS5Padding"; |
kvn@4205 | 55 | AlgorithmParameters algParams; |
kvn@4205 | 56 | SecretKey key; |
kvn@4205 | 57 | |
kvn@4205 | 58 | static int numThreads = 0; |
kvn@4205 | 59 | int threadId; |
kvn@4205 | 60 | static synchronized int getThreadId() { |
kvn@4205 | 61 | int id = numThreads; |
kvn@4205 | 62 | numThreads++; |
kvn@4205 | 63 | return id; |
kvn@4205 | 64 | } |
kvn@4205 | 65 | |
kvn@4205 | 66 | abstract public void run(); |
kvn@4205 | 67 | |
kvn@4205 | 68 | public void prepare() { |
kvn@4205 | 69 | try { |
kvn@4363 | 70 | System.out.println("\nalgorithm=" + algorithm + ", mode=" + mode + ", msgSize=" + msgSize + ", keySize=" + keySize + ", noReinit=" + noReinit + ", checkOutput=" + checkOutput); |
kvn@4205 | 71 | |
kvn@4205 | 72 | int keyLenBytes = (keySize == 0 ? 16 : keySize/8); |
kvn@4205 | 73 | byte keyBytes[] = new byte[keyLenBytes]; |
kvn@4205 | 74 | if (keySize == 128) |
kvn@4205 | 75 | keyBytes = new byte[] {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}; |
kvn@4205 | 76 | else |
kvn@4205 | 77 | random.nextBytes(keyBytes); |
kvn@4205 | 78 | |
kvn@4205 | 79 | key = new SecretKeySpec(keyBytes, algorithm); |
kvn@4205 | 80 | if (threadId == 0) { |
kvn@4205 | 81 | System.out.println("Algorithm: " + key.getAlgorithm() + "(" |
kvn@4205 | 82 | + key.getEncoded().length * 8 + "bit)"); |
kvn@4205 | 83 | } |
kvn@4205 | 84 | input = new byte[msgSize]; |
kvn@4205 | 85 | for (int i=0; i<input.length; i++) { |
kvn@4205 | 86 | input[i] = (byte) (i & 0xff); |
kvn@4205 | 87 | } |
kvn@4205 | 88 | |
kvn@4205 | 89 | cipher = Cipher.getInstance(algorithm + "/" + mode + "/" + paddingStr, "SunJCE"); |
kvn@4205 | 90 | dCipher = Cipher.getInstance(algorithm + "/" + mode + "/" + paddingStr, "SunJCE"); |
kvn@4205 | 91 | |
kvn@4363 | 92 | if (mode.equals("CBC")) { |
kvn@4363 | 93 | int ivLen = (algorithm.equals("AES") ? 16 : algorithm.equals("DES") ? 8 : 0); |
kvn@4363 | 94 | IvParameterSpec initVector = new IvParameterSpec(new byte[ivLen]); |
kvn@4363 | 95 | cipher.init(Cipher.ENCRYPT_MODE, key, initVector); |
kvn@4363 | 96 | } else { |
kvn@4363 | 97 | algParams = cipher.getParameters(); |
kvn@4363 | 98 | cipher.init(Cipher.ENCRYPT_MODE, key, algParams); |
kvn@4363 | 99 | } |
kvn@4205 | 100 | algParams = cipher.getParameters(); |
kvn@4205 | 101 | dCipher.init(Cipher.DECRYPT_MODE, key, algParams); |
kvn@4205 | 102 | if (threadId == 0) { |
kvn@4205 | 103 | childShowCipher(); |
kvn@4205 | 104 | } |
kvn@4205 | 105 | |
kvn@4205 | 106 | // do one encode and decode in preparation |
kvn@4205 | 107 | // this will also create the encode buffer and decode buffer |
kvn@4205 | 108 | encode = cipher.doFinal(input); |
kvn@4205 | 109 | decode = dCipher.doFinal(encode); |
kvn@4205 | 110 | if (checkOutput) { |
kvn@4205 | 111 | expectedEncode = (byte[]) encode.clone(); |
kvn@4205 | 112 | expectedDecode = (byte[]) decode.clone(); |
kvn@4205 | 113 | showArray(key.getEncoded() , "key: "); |
kvn@4205 | 114 | showArray(input, "input: "); |
kvn@4205 | 115 | showArray(encode, "encode: "); |
kvn@4205 | 116 | showArray(decode, "decode: "); |
kvn@4205 | 117 | } |
kvn@4205 | 118 | } |
kvn@4205 | 119 | catch (Exception e) { |
kvn@4205 | 120 | e.printStackTrace(); |
kvn@4205 | 121 | System.exit(1); |
kvn@4205 | 122 | } |
kvn@4205 | 123 | } |
kvn@4205 | 124 | |
kvn@4205 | 125 | void showArray(byte b[], String name) { |
kvn@4205 | 126 | System.out.format("%s [%d]: ", name, b.length); |
kvn@4205 | 127 | for (int i=0; i<Math.min(b.length, 32); i++) { |
kvn@4205 | 128 | System.out.format("%02x ", b[i] & 0xff); |
kvn@4205 | 129 | } |
kvn@4205 | 130 | System.out.println(); |
kvn@4205 | 131 | } |
kvn@4205 | 132 | |
kvn@4205 | 133 | void compareArrays(byte b[], byte exp[]) { |
kvn@4205 | 134 | if (b.length != exp.length) { |
kvn@4205 | 135 | System.out.format("different lengths for actual and expected output arrays\n"); |
kvn@4205 | 136 | showArray(b, "test: "); |
kvn@4205 | 137 | showArray(exp, "exp : "); |
kvn@4205 | 138 | System.exit(1); |
kvn@4205 | 139 | } |
kvn@4205 | 140 | for (int i=0; i< exp.length; i++) { |
kvn@4205 | 141 | if (b[i] != exp[i]) { |
kvn@4205 | 142 | System.out.format("output error at index %d: got %02x, expected %02x\n", i, b[i] & 0xff, exp[i] & 0xff); |
kvn@4205 | 143 | showArray(b, "test: "); |
kvn@4205 | 144 | showArray(exp, "exp : "); |
kvn@4205 | 145 | System.exit(1); |
kvn@4205 | 146 | } |
kvn@4205 | 147 | } |
kvn@4205 | 148 | } |
kvn@4205 | 149 | |
kvn@4205 | 150 | |
kvn@4205 | 151 | void showCipher(Cipher c, String kind) { |
kvn@4205 | 152 | System.out.println(kind + " cipher provider: " + cipher.getProvider()); |
kvn@4205 | 153 | System.out.println(kind + " cipher algorithm: " + cipher.getAlgorithm()); |
kvn@4205 | 154 | } |
kvn@4205 | 155 | |
kvn@4205 | 156 | abstract void childShowCipher(); |
kvn@4205 | 157 | } |