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