1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.crypto.tests.javax.crypto.func;
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Key;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchAlgorithmException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.SecureRandom;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.Cipher;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.KeyGenerator;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.spec.IvParameterSpec;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class CipherSymmetricKeyThread extends CipherThread {
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    CipherSymmetricKeyThread(String name, int[] keys, String[] modes, String[] paddings) {
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(name, keys, modes, paddings);
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void crypt() throws Exception {
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] output = new byte[128];
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] decrypted = new byte[128];
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] input  =  getData().getBytes();
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = null;//new byte[16];
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int outputSize = 0;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        KeyGenerator kg = KeyGenerator.getInstance(getAlgName());
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        kg.init(getKeyLength(), new SecureRandom());
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Key key = kg.generateKey();
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cip = Cipher.getInstance(getAlgName() + "/" + getMode() + "/" +
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    getPadding());
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (getAlgName() != "AES") {
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            iv = new byte[8];
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            iv = new byte[16];
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        IvParameterSpec ivspec = new IvParameterSpec(iv);
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (getMode() != "ECB") {
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cip.init(Cipher.ENCRYPT_MODE, key, ivspec);
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cip.doFinal(input, 0, input.length, output);
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            outputSize = cip.getOutputSize(input.length);
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            iv = cip.getIV();
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ivspec = new IvParameterSpec(iv);
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cip.init(Cipher.DECRYPT_MODE, key, ivspec);
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cip.doFinal(output, 0, outputSize, decrypted);
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cip.init(Cipher.ENCRYPT_MODE, key);
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cip.doFinal(input, 0, input.length, output);
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            outputSize = cip.getOutputSize(input.length);
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cip.init(Cipher.DECRYPT_MODE, key);
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cip.doFinal(output, 0, outputSize, decrypted);
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        checkEncodedData(getData().getBytes(), decrypted);
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
74