/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.content.pm; import android.os.Parcel; import android.test.AndroidTestCase; import java.util.Arrays; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class ContainerEncryptionParamsTest extends AndroidTestCase { private static final String ENC_ALGORITHM = "AES/CBC/PKCS7Padding"; private static final byte[] IV_BYTES = "FOOBAR".getBytes(); private static final IvParameterSpec ENC_PARAMS = new IvParameterSpec(IV_BYTES); private static final byte[] ENC_KEY_BYTES = "abcd1234wxyz7890".getBytes(); private static final SecretKey ENC_KEY = new SecretKeySpec(ENC_KEY_BYTES, "RAW"); private static final String MAC_ALGORITHM = "HMAC-SHA1"; private static final byte[] MAC_KEY_BYTES = "4wxyzabcd1237890".getBytes(); private static final SecretKey MAC_KEY = new SecretKeySpec(MAC_KEY_BYTES, "RAW"); private static final byte[] MAC_TAG = "faketag".getBytes(); private static final int AUTHENTICATED_START = 5; private static final int ENCRYPTED_START = 11; private static final int DATA_END = 19; public void testParcel() throws Exception { ContainerEncryptionParams expected = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); Parcel parcel = Parcel.obtain(); expected.writeToParcel(parcel, 0); parcel.setDataPosition(0); ContainerEncryptionParams actual = ContainerEncryptionParams.CREATOR .createFromParcel(parcel); assertEquals(ENC_ALGORITHM, actual.getEncryptionAlgorithm()); if (!(actual.getEncryptionSpec() instanceof IvParameterSpec)) { fail("encryption parameters should be IvParameterSpec"); } else { IvParameterSpec actualParams = (IvParameterSpec) actual.getEncryptionSpec(); assertTrue(Arrays.equals(IV_BYTES, actualParams.getIV())); } assertEquals(ENC_KEY, actual.getEncryptionKey()); assertEquals(MAC_ALGORITHM, actual.getMacAlgorithm()); assertNull(actual.getMacSpec()); assertEquals(MAC_KEY, actual.getMacKey()); assertTrue(Arrays.equals(MAC_TAG, actual.getMacTag())); assertEquals(AUTHENTICATED_START, actual.getAuthenticatedDataStart()); assertEquals(ENCRYPTED_START, actual.getEncryptedDataStart()); assertEquals(DATA_END, actual.getDataEnd()); } public void testEquals_Success() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertEquals(params1, params2); } public void testEquals_EncAlgo_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams(new String( "AES-256/CBC/PKCS7Padding"), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.equals(params2)); } public void testEquals_EncParams_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec("BLAHBLAH".getBytes()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.equals(params2)); } public void testEquals_EncKey_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec("BLAHBLAH".getBytes(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.equals(params2)); } public void testEquals_MacAlgo_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), "BLAHBLAH", null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.equals(params2)); } public void testEquals_MacKey_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec("FAKE_MAC_KEY".getBytes(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.equals(params2)); } public void testEquals_MacTag_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), "broken".getBytes(), AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.equals(params2)); } public void testEquals_AuthenticatedStart_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START - 1, ENCRYPTED_START, DATA_END); assertFalse(params1.equals(params2)); } public void testEquals_EncryptedStart_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START - 1, DATA_END); assertFalse(params1.equals(params2)); } public void testEquals_DataEnd_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END + 1); assertFalse(params1.equals(params2)); } public void testHashCode_Success() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertEquals(params1.hashCode(), params2.hashCode()); } public void testHashCode_EncAlgo_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams(new String( "AES-256/CBC/PKCS7Padding"), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.hashCode() == params2.hashCode()); } public void testHashCode_EncParams_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec("BLAHBLAH".getBytes()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.hashCode() == params2.hashCode()); } public void testHashCode_EncKey_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec("BLAHBLAH".getBytes(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.hashCode() == params2.hashCode()); } public void testHashCode_MacAlgo_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), "BLAHBLAH", null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.hashCode() == params2.hashCode()); } public void testHashCode_MacKey_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec("FAKE_MAC_KEY".getBytes(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.hashCode() == params2.hashCode()); } public void testHashCode_MacTag_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), "broken".getBytes(), AUTHENTICATED_START, ENCRYPTED_START, DATA_END); assertFalse(params1.hashCode() == params2.hashCode()); } public void testHashCode_AuthenticatedStart_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START - 1, ENCRYPTED_START, DATA_END); assertFalse(params1.hashCode() == params2.hashCode()); } public void testHashCode_EncryptedStart_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START - 1, DATA_END); assertFalse(params1.hashCode() == params2.hashCode()); } public void testHashCode_DataEnd_Failure() throws Exception { ContainerEncryptionParams params1 = new ContainerEncryptionParams(ENC_ALGORITHM, ENC_PARAMS, ENC_KEY, MAC_ALGORITHM, null, MAC_KEY, MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END); ContainerEncryptionParams params2 = new ContainerEncryptionParams( new String(ENC_ALGORITHM), new IvParameterSpec(IV_BYTES.clone()), new SecretKeySpec(ENC_KEY_BYTES.clone(), "RAW"), new String(MAC_ALGORITHM), null, new SecretKeySpec(MAC_KEY_BYTES.clone(), "RAW"), MAC_TAG, AUTHENTICATED_START, ENCRYPTED_START, DATA_END + 1); assertFalse(params1.hashCode() == params2.hashCode()); } }