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