1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* @author Vera Y. Petrashkova
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project* @version $Revision$
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project*/
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.crypto.tests.javax.crypto;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargets;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.math.BigInteger;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.ByteBuffer;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidAlgorithmParameterException;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidKeyException;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchAlgorithmException;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchProviderException;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Provider;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.DSAParameterSpec;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.PSSParameterSpec;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.Mac;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.MacSpi;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.ShortBufferException;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.spec.DHGenParameterSpec;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.spec.SecretKeySpec;
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.crypto.tests.support.MyMacSpi;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.security.tests.support.SpiEngUtils;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.TestCase;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.Test;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport junit.framework.TestSuite;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(Mac.class)
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Tests for Mac class constructors and methods
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class MacTest extends TestCase {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final String srvMac = "Mac";
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static String defaultAlgorithm = null;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static String defaultProviderName = null;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static Provider defaultProvider = null;
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static boolean DEFSupported = false;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String NotSupportedMsg = "There is no suitable provider for Mac";
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static final String[] invalidValues = SpiEngUtils.invalidValues;
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static String[] validValues = new String[3];
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final String validAlgorithmsMac [] =
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        {"HmacSHA1", "HmacMD5", "HmacSHA256", "HmacSHA384", "HmacSHA512"};
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < validAlgorithmsMac.length; i++) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            defaultProvider = SpiEngUtils.isSupport(validAlgorithmsMac[i],
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    srvMac);
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            DEFSupported = (defaultProvider != null);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (DEFSupported) {
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                defaultAlgorithm = validAlgorithmsMac[i];
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                defaultProviderName = defaultProvider.getName();
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                validValues[0] = defaultAlgorithm;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                validValues[1] = defaultAlgorithm.toUpperCase();
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                validValues[2] = defaultAlgorithm.toLowerCase();
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                break;
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private Mac [] createMacs() {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Mac m [] = new Mac[3];
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            m[0] = Mac.getInstance(defaultAlgorithm);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            m[1] = Mac.getInstance(defaultAlgorithm, defaultProvider);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            m[2] = Mac.getInstance(defaultAlgorithm, defaultProviderName);
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return m;
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getInstance(String algorithm)</code> method
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion:
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws NullPointerException when algorithm is null
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws NoSuchAlgorithmException when algorithm is not available
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "This is a complete subset of tests for getInstance method.",
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class}
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac01() {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Mac.getInstance(null);
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NullPointerException or NoSuchAlgorithmException should be thrown when algorithm is null");
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < invalidValues.length; i++) {
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mac.getInstance(invalidValues[i]);
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("NoSuchAlgorithmException must be thrown when algorithm is not available: "
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .concat(invalidValues[i]));
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getInstance(String algorithm)</code> method
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: returns Mac object
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "This is a complete subset of tests for getInstance method.",
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class}
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac02() throws NoSuchAlgorithmException {
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac mac;
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < validValues.length; i++) {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mac = Mac.getInstance(validValues[i]);
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Incorrect algorithm", mac.getAlgorithm(), validValues[i]);
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getInstance(String algorithm, String provider)</code> method
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion:
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws IllegalArgumentException when provider is null or empty
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws NoSuchProviderException when provider is not available
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "This is a complete subset of tests for getInstance method.",
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class, java.lang.String.class}
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac03() throws NoSuchAlgorithmException, NoSuchProviderException {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String provider = null;
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < validValues.length; i++) {
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mac.getInstance(validValues[i], provider);
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException must be thrown when provider is null");
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mac.getInstance(validValues[i], "");
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException must be thrown when provider is empty");
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int j = 1; j < invalidValues.length; j++) {
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                try {
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Mac.getInstance(validValues[i], invalidValues[j]);
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    fail("NoSuchProviderException must be thrown (algorithm: "
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            .concat(validValues[i]).concat(" provider: ")
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                            .concat(invalidValues[j]).concat(")"));
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                } catch (NoSuchProviderException e) {
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getInstance(String algorithm, String provider)</code> method
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion:
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws NullPointerException when algorithm is null
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws NoSuchAlgorithmException when algorithm is not available
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "This is a complete subset of tests for getInstance method.",
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class, java.lang.String.class}
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac04() throws NoSuchAlgorithmException,
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalArgumentException, NoSuchProviderException {
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Mac.getInstance(null, defaultProviderName);
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NullPointerException or NoSuchAlgorithmException should be thrown when algorithm is null");
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < invalidValues.length; i++) {
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mac.getInstance(invalidValues[i], defaultProviderName);
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("NoSuchAlgorithmException must be throws when algorithm is not available: "
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .concat(invalidValues[i]));
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch( NoSuchAlgorithmException e) {
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getInstance(String algorithm, String provider)</code> method
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: returns Mac object
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "This is a complete subset of tests for getInstance method.",
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class, java.lang.String.class}
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac05() throws NoSuchAlgorithmException, NoSuchProviderException,
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalArgumentException {
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac mac;
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < validValues.length; i++) {
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mac = Mac.getInstance(validValues[i], defaultProviderName);
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Incorrect algorithm", mac.getAlgorithm(), validValues[i]);
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Incorrect provider", mac.getProvider().getName(),
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    defaultProviderName);
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getInstance(String algorithm, Provider provider)</code> method
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: throws IllegalArgumentException when provider is null
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "This is a complete subset of tests for getInstance method.",
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class, java.security.Provider.class}
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac06() throws NoSuchAlgorithmException, NoSuchProviderException {
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Provider provider = null;
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < validValues.length; i++) {
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mac.getInstance(validValues[i], provider);
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException must be thrown when provider is null");
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getInstance(String algorithm, Provider provider)</code> method
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion:
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws NullPointerException when algorithm is null
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws NoSuchAlgorithmException when algorithm is not available
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "This is a complete subset of tests for getInstance method.",
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class, java.security.Provider.class}
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac07() throws NoSuchAlgorithmException,
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            NoSuchProviderException, IllegalArgumentException {
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Mac.getInstance(null, defaultProvider);
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NullPointerException or NoSuchAlgorithmException should be thrown when algorithm is null");
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < invalidValues.length; i++) {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mac.getInstance(invalidValues[i], defaultProvider);
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("NoSuchAlgorithmException must be thrown when algorithm is not available: "
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .concat(invalidValues[i]));
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getInstance(String algorithm, Provider provider)</code> method
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: returns Mac object
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "This is a complete subset of tests for getInstance method.",
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getInstance",
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class, java.security.Provider.class}
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac08() throws NoSuchAlgorithmException, NoSuchProviderException,
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalArgumentException {
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac mac;
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < validValues.length; i++) {
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mac = Mac.getInstance(validValues[i], defaultProvider);
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Incorrect algorithm", mac.getAlgorithm(), validValues[i]);
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Incorrect provider", mac.getProvider(), defaultProvider);
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>update</code> and <code>doFinal</code> methods
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: throws IllegalStateException when Mac is not initialized
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws Exception
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineDoFinal",
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class}
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class}
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte.class}
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte.class}
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class}
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.nio.ByteBuffer.class}
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac09() throws Exception {
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] buf = new byte[10];
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer bBuf = ByteBuffer.wrap(buf, 0, 10);
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb = {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5};
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec sks = new SecretKeySpec(bb, "SHA1");
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update((byte)0);
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalStateException must be thrown");
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalStateException e) {
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update(buf);
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalStateException must be thrown");
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalStateException e) {
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update(buf, 0, 3);
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalStateException must be thrown");
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalStateException e) {
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update(bBuf);
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalStateException must be thrown");
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalStateException e) {
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal();
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalStateException must be thrown");
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalStateException e) {
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal(new byte[10]);
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalStateException must be thrown");
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalStateException e) {
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal(new byte[10], 0);
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalStateException must be thrown");
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalStateException e) {
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(sks);
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal(new byte[1], 0);
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("ShortBufferException expected");
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ShortBufferException e) {
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                //expected
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>doFinal(byte[] output, int outOffset)</code> method
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion:
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * throws ShotBufferException when outOffset  is negative or
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * outOffset >= output.length  or when given buffer is small
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "Checks ShortBufferException",
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "doFinal",
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {byte[].class, int.class}
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac10() throws NoSuchAlgorithmException,
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            NoSuchProviderException, IllegalArgumentException,
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalStateException, InvalidKeyException {
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac[] macs = createMacs();
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = { (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0 };
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] byteA = new byte[b.length];
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec sks = new SecretKeySpec(b, "SHA1");
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(sks);
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal(null, 10);
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("ShortBufferException must be thrown");
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ShortBufferException e) {
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal(byteA, -4);
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("ShortBufferException must be thrown");
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ShortBufferException e) {
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal(byteA, 10);
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("ShortBufferException must be thrown");
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ShortBufferException e) {
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal(new byte[1], 0);
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("ShortBufferException must be thrown");
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ShortBufferException e) {
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] res = macs[i].doFinal();
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].doFinal(new byte[res.length - 1], 0);
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("ShortBufferException must be thrown");
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (ShortBufferException e) {
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>doFinal(byte[] output, int outOffset)</code> and
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>doFinal()</code> methods Assertion: Mac result is stored in
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * output buffer
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality.",
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineDoFinal",
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality.",
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class}
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac11() throws NoSuchAlgorithmException, NoSuchProviderException,
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalArgumentException, IllegalStateException,
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InvalidKeyException, ShortBufferException {
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] b = {(byte)0, (byte)0, (byte)0, (byte)0, (byte)0};
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec scs = new SecretKeySpec(b, "SHA1");
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(scs);
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte [] res1 = macs[i].doFinal();
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte [] res2 = new byte[res1.length + 10];
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].doFinal(res2, 0);
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int j = 0; j < res1.length; j++) {
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Not equals byte number: "
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        .concat(Integer.toString(j)), res1[j], res2[j]);
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>doFinal(byte[] input)</code> method
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: update Mac and returns result
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality.",
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineDoFinal",
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality.",
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class}
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac12() throws NoSuchAlgorithmException, NoSuchProviderException,
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalArgumentException, IllegalStateException,
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InvalidKeyException  {
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] b = {(byte)0, (byte)0, (byte)0, (byte)0, (byte)0};
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] upd = {(byte)5, (byte)4, (byte)3, (byte)2, (byte)1, (byte)0};
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec scs = new SecretKeySpec(b, "SHA1");
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(scs);
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte [] res1 = macs[i].doFinal();
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte [] res2 = macs[i].doFinal();
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Results are not the same", res1.length, res2.length);
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for(int t = 0; t < res1.length; t++) {
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Results are not the same", res1[t], res2[t]);
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            res2 = macs[i].doFinal(upd);
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(upd);
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            res1 = macs[i].doFinal();
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Results are not the same", res1.length, res2.length);
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for(int t = 0; t < res1.length; t++) {
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Results are not the same", res1[t], res2[t]);
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>update(byte[] input, int outset, int len)</code> method
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: throws IllegalArgumentException when offset or len is negative,
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * offset + len >= input.length
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalArgumentException",
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac13() throws NoSuchAlgorithmException,
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            NoSuchProviderException, IllegalArgumentException, IllegalStateException,
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InvalidKeyException {
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] b = {(byte)0, (byte)0, (byte)0, (byte)0, (byte)0};
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec scs = new SecretKeySpec(b, "SHA1");
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(scs);
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update(b, -10, b.length);
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException must be thrown");
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update(b, 0, -10);
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException must be thrown");
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update(b, 0, b.length + 1);
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException must be thrown");
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update(b, b.length - 1, 2);
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException must be thrown");
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>update(byte[] input, int outset, int len)</code> and
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>update(byte[] input</code>
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * methods
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: updates Mac
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality.",
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte.class}
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte.class}
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality.",
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMac14() throws NoSuchAlgorithmException,
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            NoSuchProviderException, IllegalArgumentException, IllegalStateException,
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InvalidKeyException {
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] b = {(byte)0, (byte)0, (byte)0, (byte)0, (byte)0};
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] upd1 = {(byte)0, (byte)1, (byte)5, (byte)4, (byte)3, (byte)2};
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] upd2 = {(byte)5, (byte)4, (byte)3, (byte)2};
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] res1;
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] res2;
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec scs = new SecretKeySpec(b, "SHA1");
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(scs);
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(upd1, 2, 4);
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            res1 = macs[i].doFinal();
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(scs);
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(upd2);
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            res2 = macs[i].doFinal();
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Results are not the same", res1.length, res2.length);
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for(int t = 0; t < res1.length; t++) {
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Results are not the same", res1[t], res2[t]);
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(scs);
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update((byte)5);
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            res1 = macs[i].doFinal();
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(scs);
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(upd1,2,1);
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            res2 = macs[i].doFinal();
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Results are not the same", res1.length, res2.length);
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for(int t = 0; t < res1.length; t++) {
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Results are not the same", res1[t], res2[t]);
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>clone()</code> method
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: returns Mac object or throws CloneNotSupportedException
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "clone",
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMacClone() throws NoSuchAlgorithmException, CloneNotSupportedException {
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Mac mac1 = (Mac) macs[i].clone();
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals(mac1.getAlgorithm(), macs[i].getAlgorithm());
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals(mac1.getProvider(), macs[i].getProvider());
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertFalse(macs[i].equals(mac1));
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (CloneNotSupportedException e) {
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>init(Key key, AlgorithmParameterSpec params)</code>
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>init(Key key)</code>
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * methods
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: throws InvalidKeyException and InvalidAlgorithmParameterException
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * when parameters are not appropriate
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks exceptions",
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "init",
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.security.Key.class}
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks exceptions",
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "init",
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.security.Key.class, java.security.spec.AlgorithmParameterSpec.class}
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks exceptions",
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineInit",
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.security.Key.class, java.security.spec.AlgorithmParameterSpec.class}
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testInit() throws NoSuchAlgorithmException, NoSuchProviderException,
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalArgumentException, IllegalStateException, InvalidAlgorithmParameterException,
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InvalidKeyException {
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] b = {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5};
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec sks = new SecretKeySpec(b, "SHA1");
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        DHGenParameterSpec algPS = new DHGenParameterSpec(1, 2);
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PSSParameterSpec algPSS = new PSSParameterSpec(20);
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec sks1 = new SecretKeySpec(b, "RSA");
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(sks);
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].init(sks1, algPSS);
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("init(..) accepts incorrect AlgorithmParameterSpec parameter");
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvalidAlgorithmParameterException e) {
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].init(sks, algPS);
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("init(..) accepts incorrect AlgorithmParameterSpec parameter");
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvalidAlgorithmParameterException e) {
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].init(null, null);
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("InvalidKeyException must be thrown");
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvalidKeyException e) {
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].init(null);
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("InvalidKeyException must be thrown");
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (InvalidKeyException e) {
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//            macs[i].init(sks, null);
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>update(ByteBuffer input)</code>
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>update(byte[] input, int offset, int len)</code>
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * methods
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: processes Mac; if input is null then do nothing
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality",
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality",
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.nio.ByteBuffer.class}
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testUpdateByteBuffer01() throws NoSuchAlgorithmException, NoSuchProviderException,
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalArgumentException, IllegalStateException, InvalidAlgorithmParameterException,
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InvalidKeyException {
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb = {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5};
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec sks = new SecretKeySpec(bb, "SHA1");
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer byteNull = null;
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer byteBuff = ByteBuffer.allocate(0);
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb1;
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb2;
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(sks);
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb1 = macs[i].doFinal();
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                macs[i].update(byteNull);
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("IllegalArgumentException must be thrown because buffer is null");
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (IllegalArgumentException e) {
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(byteBuff);
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb2 = macs[i].doFinal();
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int t = 0; t < bb1.length; t++) {
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Incorrect doFinal result", bb1[t], bb2[t]);
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(sks);
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb1 = macs[i].doFinal();
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(null, 0, 0);
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb2 = macs[i].doFinal();
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int t = 0; t < bb1.length; t++) {
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Incorrect doFinal result", bb1[t], bb2[t]);
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>update(ByteBuffer input)</code>
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <code>update(byte[] input, int offset, int len)</code>
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * methods
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: processes Mac
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality",
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.nio.ByteBuffer.class}
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks functionality",
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.PARTIAL_COMPLETE,
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "Checks IllegalStateException only but for all methods. Not enough for doFinal(byte[] output, int outOffset) - it can throw ShortBufferException",
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testUpdateByteBuffer02() throws NoSuchAlgorithmException, NoSuchProviderException,
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IllegalArgumentException, IllegalStateException, InvalidAlgorithmParameterException,
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InvalidKeyException {
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb = {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5};
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec sks = new SecretKeySpec(bb, "SHA1");
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bbuf = {(byte)5, (byte)4, (byte)3, (byte)2, (byte)1};
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer byteBuf;
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb1;
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb2;
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byteBuf = ByteBuffer.allocate(5);
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byteBuf.put(bbuf);
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byteBuf.position(2);
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(sks);
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(byteBuf);
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb1 = macs[i].doFinal();
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(sks);
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(bbuf, 2, 3);
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb2 = macs[i].doFinal();
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int t = 0; t < bb1.length; t++) {
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Incorrect doFinal result", bb1[t], bb2[t]);
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>clone()</code> method
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: clone if provider is clo
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "clone",
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testClone()  {
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac res;
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                res = (Mac)macs[i].clone();
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertTrue("Object should not be equals", !macs[i].equals(res));
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                assertEquals("Incorrect class", macs[i].getClass(), res.getClass());
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (CloneNotSupportedException e) {
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>getMacLength()</code> method
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: return Mac length
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "getMacLength",
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineGetMacLength",
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGetMacLength() {
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertTrue("Length should be positive", (macs[i].getMacLength() >= 0));
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>reset()</code> method
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: return Mac length
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "reset",
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = MacSpi.class,
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineReset",
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testReset() throws InvalidKeyException {
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac [] macs = createMacs();
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Mac objects were not created", macs);
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb = {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5};
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecretKeySpec sks = new SecretKeySpec(bb, "SHA1");
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bbuf = {(byte)5, (byte)4, (byte)3, (byte)2, (byte)1};
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb1;
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte [] bb2;
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < macs.length; i++) {
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].init(sks);
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb1 = macs[i].doFinal();
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].reset();
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb2 = macs[i].doFinal();
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("incorrect result",bb1.length, bb2.length);
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int t = 0; t < bb1.length; t++) {
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               assertEquals("Incorrect doFinal result", bb1[t], bb2[t]);
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].reset();
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(bbuf);
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb1 = macs[i].doFinal();
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].reset();
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            macs[i].update(bbuf, 0, bbuf.length);
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            bb2 = macs[i].doFinal();
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("incorrect result",bb1.length, bb2.length);
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            for (int t = 0; t < bb1.length; t++) {
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project               assertEquals("Incorrect doFinal result", bb1[t], bb2[t]);
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Test for <code>Mac</code> constructor
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Assertion: returns Mac object
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "Mac",
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {javax.crypto.MacSpi.class, java.security.Provider.class, java.lang.String.class}
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testMacConstructor() throws NoSuchAlgorithmException,
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InvalidKeyException, InvalidAlgorithmParameterException {
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!DEFSupported) {
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail(NotSupportedMsg);
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return;
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MacSpi spi = new MyMacSpi();
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac mac = new myMac(spi, defaultProvider, defaultAlgorithm);
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Incorrect algorithm", mac.getAlgorithm(),
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                defaultAlgorithm);
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Incorrect provider", mac.getProvider(), defaultProvider);
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mac.init(null, null);
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Exception should be thrown because init(..) uses incorrect parameters");
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Invalid mac length", mac.getMacLength(), 0);
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mac = new myMac(null, null, null);
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNull("Algorithm must be null", mac.getAlgorithm());
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNull("Provider must be null", mac.getProvider());
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mac.init(null, null);
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Exception should be thrown because init(..) uses incorrect parameters");
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mac.getMacLength();
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NullPointerException must be thrown");
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getAlgorithm",
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getAlgorithm() throws NoSuchAlgorithmException {
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac mac;
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < validValues.length; i++) {
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mac = Mac.getInstance(validValues[i]);
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertEquals("Incorrect algorithm", mac.getAlgorithm(), validValues[i]);
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mac = new Mock_Mac(null, null, null);
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNull(mac.getAlgorithm());
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getProvider",
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getProvider() throws NoSuchAlgorithmException {
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Mac mac;
1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < validValues.length; i++) {
1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            mac = Mac.getInstance(validValues[i]);
1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull(mac.getProvider());
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        mac = new Mock_Mac(null, null, null);
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNull(mac.getProvider());
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    class Mock_Mac extends Mac {
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        protected Mock_Mac(MacSpi arg0, Provider arg1, String arg2) {
1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(arg0, arg1, arg2);
1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Test suite() {
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new TestSuite(MacTest.class);
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static void main(String args[]) {
1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        junit.textui.TestRunner.run(suite());
1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Additional class for Mac constructor verification
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectclass myMac extends Mac {
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public myMac(MacSpi macSpi, Provider provider,
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String algorithm) {
1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        super(macSpi, provider, algorithm);
1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
1190