1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License. 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.crypto.tests.javax.crypto.func; 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.Cipher; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class CipherThread implements Runnable { 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int[] keyLengthAr = null; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String[] modeAr = null; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String[] paddingModeAr = null; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int kCounter = 0; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int mCounter = 0; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int pCounter = 0; 27f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private StringBuffer errorSB = null; 28f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean flagTestResult = false; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String data = " Albert Einstein was a German-born " + 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project "theoretical physicist. "; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String algName = null; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int keyLength = 0; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String mode = null; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String paddingMode = null; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int fails = 0; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38d29fddcf333997fc2d7429d531e4d934dc705c88Jesse Wilson public abstract void crypt() throws Exception; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherThread(String name, int[] keys, String[] modes, String[] paddings) { 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project algName = name; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project keyLengthAr = keys; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project modeAr = modes; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project paddingModeAr = paddings; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project kCounter = 0; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mCounter = 0; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pCounter = 0; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 49f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void checkEncodedData(byte[] original, byte[] encoded) 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws Exception { 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for(int i = 0; i < original.length; i++) { 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (original[i] != encoded[i]) { 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new Exception("Source and encoded data not match " + 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getCipherParameters()); 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60d762af619aa85042c08553425a4ca4ef7900d45aKenny Root public void checkPaddedEncodedData(byte[] original, byte[] encoded, int offset) 61d762af619aa85042c08553425a4ca4ef7900d45aKenny Root throws Exception { 62d762af619aa85042c08553425a4ca4ef7900d45aKenny Root for (int i = 0; i < offset; i++) { 63d762af619aa85042c08553425a4ca4ef7900d45aKenny Root if (encoded[i] != 0) { 64d762af619aa85042c08553425a4ca4ef7900d45aKenny Root throw new Exception("Encoded data is not properly padded at offset " + i); 65d762af619aa85042c08553425a4ca4ef7900d45aKenny Root } 66d762af619aa85042c08553425a4ca4ef7900d45aKenny Root } 67d762af619aa85042c08553425a4ca4ef7900d45aKenny Root for (int i = 0; i < original.length; i++) { 68d762af619aa85042c08553425a4ca4ef7900d45aKenny Root if (original[i] != encoded[i + offset]) { 69d762af619aa85042c08553425a4ca4ef7900d45aKenny Root throw new Exception("Source and encoded data not match " + getCipherParameters()); 70d762af619aa85042c08553425a4ca4ef7900d45aKenny Root } 71d762af619aa85042c08553425a4ca4ef7900d45aKenny Root } 72d762af619aa85042c08553425a4ca4ef7900d45aKenny Root } 73d762af619aa85042c08553425a4ca4ef7900d45aKenny Root 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void launcher() { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Thread thread = null; 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project do { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project keyLength = getNextKey(); 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project do { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mode = getNextMode(); 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project do { 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project paddingMode = getNextPadding(); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project thread = new Thread(this); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project thread.start(); 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project thread.join(); 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InterruptedException e) { 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project e.printStackTrace(); 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } while (hasNextPadding()); 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } while (hasNextMode()); 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } while (hasNextKey()); 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void run() { 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project crypt(); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if(errorSB == null) { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorSB = new StringBuffer(); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorSB.append(e.getMessage()); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorSB.append("\n"); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorSB.append(getCipherParameters()); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorSB.append("\n"); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StackTraceElement[] st = e.getStackTrace(); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < st.length; i++) { 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorSB.append(st[i].toString()); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project errorSB.append("\n"); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fails++; 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project flagTestResult = true; 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getAlgName() { 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return algName; 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getKeyLength() { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return keyLength; 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getData() { 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return data; 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 128f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getPadding() { 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return paddingMode; 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getMode() { 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return mode; 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getCipherParameters() { 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return "Alg name:" + algName + " Key:" + keyLength + " Mode:" + mode + 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project " Padding:" + paddingMode; 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getTestStatus() { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return flagTestResult; 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getAlgorithmName() { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return algName; 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasNextKey() { 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (kCounter < keyLengthAr.length); 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 153f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasNextMode() { 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (mCounter < modeAr.length); 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 157f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean hasNextPadding() { 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (pCounter < paddingModeAr.length); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 161f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getNextKey() { 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project kCounter = (hasNextKey()) ? kCounter : 0; 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return keyLengthAr[kCounter++]; 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 166f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getNextMode() { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mCounter = (hasNextMode()) ? mCounter : 0; 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return modeAr[mCounter++]; 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getNextPadding() { 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pCounter = (hasNextPadding()) ? pCounter : 0; 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return paddingModeAr[pCounter++]; 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getTotalCasesNumber() { 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return keyLengthAr.length * modeAr.length * paddingModeAr.length; 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getTotalFailuresNumber() { 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return fails; 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getFailureMessages() { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (errorSB == null) ? "" : new String(errorSB); 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 189