1860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root/*
2860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * Copyright (C) 2012 The Android Open Source Project
3860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root *
4860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * you may not use this file except in compliance with the License.
6860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * You may obtain a copy of the License at
7860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root *
8860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root *
10860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * Unless required by applicable law or agreed to in writing, software
11860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * See the License for the specific language governing permissions and
14860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root * limitations under the License.
15860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root */
16860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
17860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootpackage org.conscrypt;
18860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
19860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport java.security.Provider;
20860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport java.security.Security;
21860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport java.util.Arrays;
22860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
23860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport javax.crypto.Mac;
24860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport javax.crypto.SecretKey;
25860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport javax.crypto.spec.SecretKeySpec;
26860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
27860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootimport junit.framework.TestCase;
28860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
29860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootpublic class MacTest extends TestCase {
30860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root    public void test_getInstance_OpenSSL_ENGINE() throws Exception {
31860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        final String secret = "-HMAC-test1";
32860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        final byte[] testString = "testing123".getBytes();
33860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
34860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        Provider p = Security.getProvider(OpenSSLProvider.PROVIDER_NAME);
35860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        NativeCryptoTest.loadTestEngine();
36860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        OpenSSLEngine engine = OpenSSLEngine.getInstance(NativeCryptoTest.TEST_ENGINE_ID);
37860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
38860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        /*
39860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root         * The "-HMAC-" prefix is a special prefix recognized by
40860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root         * test_openssl_engine.cpp
41860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root         */
42860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        SecretKey key1 = engine.getSecretKeyById(secret, "HmacSHA256");
43860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        SecretKey key1dupe = engine.getSecretKeyById(secret, "HmacSHA256");
44860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
45860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        /* Non-ENGINE-based SecretKey */
46860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        SecretKey key2 = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
47860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
48860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        /* The one that is ENGINE-based can't be equal to a non-ENGINE one. */
49860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        assertFalse(key1.equals(key2));
50860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        assertEquals(key1, key1dupe);
51860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        assertNull(key1.getFormat());
52860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        assertNull(key1.getEncoded());
53860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        assertEquals("RAW", key2.getFormat());
54860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        assertEquals(Arrays.toString(secret.getBytes()), Arrays.toString(key2.getEncoded()));
55860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
56860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        Mac mac1 = Mac.getInstance("HmacSHA256", p);
57860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        mac1.init(key1);
58860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        mac1.update(testString);
59860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        byte[] output1 = mac1.doFinal();
60860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        assertEquals(mac1.getMacLength(), output1.length);
61860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
62860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        Mac mac2 = Mac.getInstance("HmacSHA256", p);
63860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        mac2.init(key2);
64860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        mac2.update(testString);
65860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        byte[] output2 = mac2.doFinal();
66860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root
67860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root        assertEquals(Arrays.toString(output2), Arrays.toString(output1));
68860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root    }
69860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Root}
70