| /* |
| * 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()); |
| } |
| } |