Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7b02173 authored by dcashman's avatar dcashman
Browse files

Fix PackageManagerSettingsTests and add KeySet info.

Add unit tests for the keyset portion of packages.xml.  Also fix previously
broken test by adding UserManagerService reference.

Bug: 19530911
Bug: 19530120
Change-Id: I251fc3e9dc983f1d63f9e84905d3ed0e64843def
parent 2301174e
Loading
Loading
Loading
Loading
+99 −146
Original line number Original line Diff line number Diff line
@@ -24,7 +24,6 @@ import android.util.ArraySet;
import android.util.LongSparseArray;
import android.util.LongSparseArray;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.ArrayUtils;


import java.lang.reflect.Field;
import java.io.File;
import java.io.File;
import java.io.IOException;
import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateException;
@@ -43,53 +42,6 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
                "", 1, 0, 0);
                "", 1, 0, 0);
    }
    }


    public PublicKey getPubKey(long pkId) throws NoSuchFieldException, IllegalAccessException {
        Field pkField = mKsms.getClass().getDeclaredField("mPublicKeys");
        pkField.setAccessible(true);
        LongSparseArray<KeySetManagerService.PublicKeyHandle> mPublicKeys =
            (LongSparseArray<KeySetManagerService.PublicKeyHandle>) pkField.get(mKsms);
        KeySetManagerService.PublicKeyHandle pkh = mPublicKeys.get(pkId);
        if (pkh == null) {
            return null;
        } else {
            return pkh.getKey();
        }
    }

    public int getPubKeyRefCount(long pkId) throws NoSuchFieldException, IllegalAccessException {
        Field pkField = mKsms.getClass().getDeclaredField("mPublicKeys");
        pkField.setAccessible(true);
        LongSparseArray<KeySetManagerService.PublicKeyHandle> mPublicKeys =
            (LongSparseArray<KeySetManagerService.PublicKeyHandle>) pkField.get(mKsms);
        KeySetManagerService.PublicKeyHandle pkh = mPublicKeys.get(pkId);
        if (pkh == null) {
            return 0;
        } else {
            return pkh.getRefCountLPr();
        }
    }

    public int getKeySetRefCount(long keysetId) throws NoSuchFieldException, IllegalAccessException {
        Field ksField = mKsms.getClass().getDeclaredField("mKeySets");
        ksField.setAccessible(true);
        LongSparseArray<KeySetHandle> mKeySets =
            (LongSparseArray<KeySetHandle>) ksField.get(mKsms);
        KeySetHandle ksh = mKeySets.get(keysetId);
        if (ksh == null) {
            return 0;
        } else {
            return ksh.getRefCountLPr();
        }
    }

    public LongSparseArray<ArraySet<Long>> getKeySetMapping()
            throws NoSuchFieldException, IllegalAccessException {
        Field ksField = mKsms.getClass().getDeclaredField("mKeySetMapping");
        ksField.setAccessible(true);
        return (LongSparseArray<ArraySet<Long>>) ksField.get(mKsms);
    }


    @Override
    @Override
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        super.setUp();
        super.setUp();
@@ -168,10 +120,10 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        signingKeys.add(keyA);
        signingKeys.add(keyA);
        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);


        assertEquals(1, getKeySetRefCount(1));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(1));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(keyA, getPubKey(1));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(1);
        ArraySet<Long> mapping = ksMapping.get(1);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -198,10 +150,10 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        /* add again, to represent upgrade of package */
        /* add again, to represent upgrade of package */
        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);


        assertEquals(1, getKeySetRefCount(1));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(1));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(keyA, getPubKey(1));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(1);
        ArraySet<Long> mapping = ksMapping.get(1);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -231,12 +183,12 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        signingKeys.add(keyB);
        signingKeys.add(keyB);
        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);


        assertEquals(0, getKeySetRefCount(1));
        assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getKeySetRefCount(2));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 2));
        assertEquals(0, getPubKeyRefCount(1));
        assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(2));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 2));
        assertEquals(keyB, getPubKey(2));
        assertEquals(keyB, KeySetUtils.getPubKey(mKsms, 2));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(2);
        ArraySet<Long> mapping = ksMapping.get(2);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -269,13 +221,13 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        signingKeys.add(keyB);
        signingKeys.add(keyB);
        mKsms.addSigningKeySetToPackageLPw(ps1.name, signingKeys);
        mKsms.addSigningKeySetToPackageLPw(ps1.name, signingKeys);


        assertEquals(1, getKeySetRefCount(1));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getKeySetRefCount(2));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 2));
        assertEquals(1, getPubKeyRefCount(1));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(2));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 2));
        assertEquals(keyA, getPubKey(1));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 1));
        assertEquals(keyB, getPubKey(2));
        assertEquals(keyB, KeySetUtils.getPubKey(mKsms, 2));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(2, ksMapping.size());
        assertEquals(2, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(1);
        ArraySet<Long> mapping = ksMapping.get(1);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -312,10 +264,10 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys2);
        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys2);


        /* verify first is unchanged */
        /* verify first is unchanged */
        assertEquals(1, getKeySetRefCount(1));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(1));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(keyA, getPubKey(1));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(2, ksMapping.size());
        assertEquals(2, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(1);
        ArraySet<Long> mapping = ksMapping.get(1);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -323,9 +275,9 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        assertEquals(1, ps1.keySetData.getProperSigningKeySet());
        assertEquals(1, ps1.keySetData.getProperSigningKeySet());


        /* verify second */
        /* verify second */
        assertEquals(1, getKeySetRefCount(2));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 2));
        assertEquals(1, getPubKeyRefCount(2));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 2));
        assertEquals(keyB, getPubKey(2));
        assertEquals(keyB, KeySetUtils.getPubKey(mKsms, 2));
        mapping = ksMapping.get(2);
        mapping = ksMapping.get(2);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
        assertTrue(mapping.contains(new  Long(2)));
        assertTrue(mapping.contains(new  Long(2)));
@@ -353,10 +305,10 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        /* add again for second package */
        /* add again for second package */
        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys);
        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys);


        assertEquals(2, getKeySetRefCount(1));
        assertEquals(2, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(1));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(keyA, getPubKey(1));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(1);
        ArraySet<Long> mapping = ksMapping.get(1);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -388,13 +340,13 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        signingKeys.add(keyB);
        signingKeys.add(keyB);
        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys);
        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys);


        assertEquals(1, getKeySetRefCount(1));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getKeySetRefCount(2));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 2));
        assertEquals(2, getPubKeyRefCount(1));
        assertEquals(2, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(2));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 2));
        assertEquals(keyA, getPubKey(1));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 1));
        assertEquals(keyB, getPubKey(2));
        assertEquals(keyB, KeySetUtils.getPubKey(mKsms, 2));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(2, ksMapping.size());
        assertEquals(2, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(1);
        ArraySet<Long> mapping = ksMapping.get(1);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -429,16 +381,17 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        signingKeys.add(keyB);
        signingKeys.add(keyB);
        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);


        assertEquals(0, getKeySetRefCount(1));
        assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getKeySetRefCount(2));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 2));
        assertEquals(0, getPubKeyRefCount(1));
        assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(2));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 2));
        assertEquals(1, getPubKeyRefCount(3));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 3));


        /* the pub key is removed w/prev keyset and may be either 2 or 3 */
        /* the pub key is removed w/prev keyset and may be either 2 or 3 */
        assertTrue(keyA.equals(getPubKey(2)) && keyB.equals(getPubKey(3))
        assertTrue(keyA.equals(KeySetUtils.getPubKey(mKsms, 2)) || keyA.equals(KeySetUtils.getPubKey(mKsms, 3)));
                   || keyA.equals(getPubKey(3)) && keyB.equals(getPubKey(2)));
        assertTrue(keyB.equals(KeySetUtils.getPubKey(mKsms, 2)) || keyB.equals(KeySetUtils.getPubKey(mKsms, 3)));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        assertFalse(KeySetUtils.getPubKey(mKsms, 2).equals(KeySetUtils.getPubKey(mKsms, 3)));
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(2);
        ArraySet<Long> mapping = ksMapping.get(2);
        assertEquals(2, mapping.size());
        assertEquals(2, mapping.size());
@@ -462,10 +415,10 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        definedKS.put("aliasA", keys);
        definedKS.put("aliasA", keys);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);


        assertEquals(1, getKeySetRefCount(1));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(1));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(keyA, getPubKey(1));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(1);
        ArraySet<Long> mapping = ksMapping.get(1);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -490,10 +443,10 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        definedKS.put("aliasA2", keys);
        definedKS.put("aliasA2", keys);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);


        assertEquals(2, getKeySetRefCount(1));
        assertEquals(2, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(1));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(keyA, getPubKey(1));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(1);
        ArraySet<Long> mapping = ksMapping.get(1);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -527,12 +480,12 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        definedKS.put("aliasB", keys);
        definedKS.put("aliasB", keys);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);


        assertEquals(0, getKeySetRefCount(1));
        assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(0, getPubKeyRefCount(1));
        assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(1, getKeySetRefCount(2));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 2));
        assertEquals(1, getPubKeyRefCount(2));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 2));
        assertEquals(keyB, getPubKey(2));
        assertEquals(keyB, KeySetUtils.getPubKey(mKsms, 2));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(2);
        ArraySet<Long> mapping = ksMapping.get(2);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -566,12 +519,12 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        definedKS.put("aliasA", keys);
        definedKS.put("aliasA", keys);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);


        assertEquals(0, getKeySetRefCount(1));
        assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(0, getPubKeyRefCount(1));
        assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(1, getKeySetRefCount(2));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 2));
        assertEquals(1, getPubKeyRefCount(2));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 2));
        assertEquals(keyB, getPubKey(2));
        assertEquals(keyB, KeySetUtils.getPubKey(mKsms, 2));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(2);
        ArraySet<Long> mapping = ksMapping.get(2);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -608,10 +561,10 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        definedKS.put("aliasC", keys1);
        definedKS.put("aliasC", keys1);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);


        assertEquals(1, getKeySetRefCount(3));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 3));
        assertEquals(1, getPubKeyRefCount(3));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 3));
        assertEquals(keyC, getPubKey(3));
        assertEquals(keyC, KeySetUtils.getPubKey(mKsms, 3));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(2, ksMapping.size());
        assertEquals(2, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(3);
        ArraySet<Long> mapping = ksMapping.get(3);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -619,13 +572,13 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        assertEquals(new Long(3), ps.keySetData.getAliases().get("aliasC"));
        assertEquals(new Long(3), ps.keySetData.getAliases().get("aliasC"));


        /* either keyset w/keyA or w/keyB was added first, address both cases */
        /* either keyset w/keyA or w/keyB was added first, address both cases */
        if (1 == getKeySetRefCount(1)) {
        if (1 == KeySetUtils.getKeySetRefCount(mKsms, 1)) {


            /* keyB was added first and should have keyset 1 and pub-key 1 */
            /* keyB was added first and should have keyset 1 and pub-key 1 */
            assertEquals(1, getPubKeyRefCount(1));
            assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
            assertEquals(0, getKeySetRefCount(2));
            assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 2));
            assertEquals(0, getPubKeyRefCount(2));
            assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 2));
            assertEquals(keyB, getPubKey(1));
            assertEquals(keyB, KeySetUtils.getPubKey(mKsms, 1));
            mapping = ksMapping.get(1);
            mapping = ksMapping.get(1);
            assertEquals(1, mapping.size());
            assertEquals(1, mapping.size());
            assertTrue(mapping.contains(new Long(1)));
            assertTrue(mapping.contains(new Long(1)));
@@ -633,11 +586,11 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        } else {
        } else {


            /* keyA was added first and keyB has id 2 */
            /* keyA was added first and keyB has id 2 */
            assertEquals(1, getKeySetRefCount(2));
            assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 2));
            assertEquals(1, getPubKeyRefCount(2));
            assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 2));
            assertEquals(0, getKeySetRefCount(1));
            assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 1));
            assertEquals(0, getPubKeyRefCount(1));
            assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 1));
            assertEquals(keyB, getPubKey(2));
            assertEquals(keyB, KeySetUtils.getPubKey(mKsms, 2));
            mapping = ksMapping.get(2);
            mapping = ksMapping.get(2);
            assertEquals(1, mapping.size());
            assertEquals(1, mapping.size());
            assertTrue(mapping.contains(new Long(2)));
            assertTrue(mapping.contains(new Long(2)));
@@ -674,14 +627,14 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        definedKS.put("aliasA", keys1);
        definedKS.put("aliasA", keys1);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);


        assertEquals(0, getKeySetRefCount(1));
        assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(0, getKeySetRefCount(2));
        assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 2));
        assertEquals(1, getKeySetRefCount(3));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 3));
        assertEquals(0, getPubKeyRefCount(1));
        assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        assertEquals(0, getPubKeyRefCount(2));
        assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 2));
        assertEquals(1, getPubKeyRefCount(3));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 3));
        assertEquals(keyA, getPubKey(3));
        assertEquals(keyA, KeySetUtils.getPubKey(mKsms, 3));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        ArraySet<Long> mapping = ksMapping.get(3);
        ArraySet<Long> mapping = ksMapping.get(3);
        assertEquals(1, mapping.size());
        assertEquals(1, mapping.size());
@@ -780,9 +733,9 @@ public class KeySetManagerServiceTest extends AndroidTestCase {


        /* remove its references */
        /* remove its references */
        mKsms.removeAppKeySetDataLPw(ps.name);
        mKsms.removeAppKeySetDataLPw(ps.name);
        assertEquals(0, getKeySetRefCount(1));
        assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(0, getPubKeyRefCount(1));
        assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(0, ksMapping.size());
        assertEquals(0, ksMapping.size());
        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps.keySetData.getProperSigningKeySet());
        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps.keySetData.getProperSigningKeySet());
    }
    }
@@ -807,9 +760,9 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        /* remove references from first package */
        /* remove references from first package */
        mKsms.removeAppKeySetDataLPw(ps1.name);
        mKsms.removeAppKeySetDataLPw(ps1.name);


        assertEquals(1, getKeySetRefCount(1));
        assertEquals(1, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(1, getPubKeyRefCount(1));
        assertEquals(1, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(1, ksMapping.size());
        assertEquals(1, ksMapping.size());
        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps1.keySetData.getProperSigningKeySet());
        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps1.keySetData.getProperSigningKeySet());
        assertEquals(1, ps2.keySetData.getProperSigningKeySet());
        assertEquals(1, ps2.keySetData.getProperSigningKeySet());
@@ -840,9 +793,9 @@ public class KeySetManagerServiceTest extends AndroidTestCase {
        mKsms.addUpgradeKeySetsToPackageLPw(ps.name, upgradeKS);
        mKsms.addUpgradeKeySetsToPackageLPw(ps.name, upgradeKS);
        mKsms.removeAppKeySetDataLPw(ps.name);
        mKsms.removeAppKeySetDataLPw(ps.name);


        assertEquals(0, getKeySetRefCount(1));
        assertEquals(0, KeySetUtils.getKeySetRefCount(mKsms, 1));
        assertEquals(0, getPubKeyRefCount(1));
        assertEquals(0, KeySetUtils.getPubKeyRefCount(mKsms, 1));
        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
        LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(mKsms);
        assertEquals(0, ksMapping.size());
        assertEquals(0, ksMapping.size());
        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps.keySetData.getProperSigningKeySet());
        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps.keySetData.getProperSigningKeySet());
        assertEquals(0, ps.keySetData.getAliases().size());
        assertEquals(0, ps.keySetData.getAliases().size());
+89 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2015 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 com.android.server.pm;

import android.util.ArraySet;
import android.util.LongSparseArray;

import java.lang.reflect.Field;
import java.security.PublicKey;

public class KeySetUtils {

    public static PublicKey getPubKey(KeySetManagerService ksms, long pkId)
            throws NoSuchFieldException, IllegalAccessException {
        Field pkField = ksms.getClass().getDeclaredField("mPublicKeys");
        pkField.setAccessible(true);
        LongSparseArray<KeySetManagerService.PublicKeyHandle> mPublicKeys =
            (LongSparseArray<KeySetManagerService.PublicKeyHandle>) pkField.get(ksms);
        KeySetManagerService.PublicKeyHandle pkh = mPublicKeys.get(pkId);
        if (pkh == null) {
            return null;
        } else {
            return pkh.getKey();
        }
    }

    public static int getPubKeyRefCount(KeySetManagerService ksms, long pkId)
            throws NoSuchFieldException, IllegalAccessException {
        Field pkField = ksms.getClass().getDeclaredField("mPublicKeys");
        pkField.setAccessible(true);
        LongSparseArray<KeySetManagerService.PublicKeyHandle> mPublicKeys =
            (LongSparseArray<KeySetManagerService.PublicKeyHandle>) pkField.get(ksms);
        KeySetManagerService.PublicKeyHandle pkh = mPublicKeys.get(pkId);
        if (pkh == null) {
            return 0;
        } else {
            return pkh.getRefCountLPr();
        }
    }

    public static int getKeySetRefCount(KeySetManagerService ksms, long keysetId)
            throws NoSuchFieldException, IllegalAccessException {
        Field ksField = ksms.getClass().getDeclaredField("mKeySets");
        ksField.setAccessible(true);
        LongSparseArray<KeySetHandle> mKeySets =
            (LongSparseArray<KeySetHandle>) ksField.get(ksms);
        KeySetHandle ksh = mKeySets.get(keysetId);
        if (ksh == null) {
            return 0;
        } else {
            return ksh.getRefCountLPr();
        }
    }

    public static LongSparseArray<ArraySet<Long>> getKeySetMapping(KeySetManagerService ksms)
            throws NoSuchFieldException, IllegalAccessException {
        Field ksField = ksms.getClass().getDeclaredField("mKeySetMapping");
        ksField.setAccessible(true);
        return (LongSparseArray<ArraySet<Long>>) ksField.get(ksms);
    }

    public static Long getLastIssuedKeyId(KeySetManagerService ksms)
            throws NoSuchFieldException, IllegalAccessException {
        Field ksField = ksms.getClass().getDeclaredField("lastIssuedKeyId");
        ksField.setAccessible(true);
        return (Long) ksField.get(ksms);
    }

    public static Long getLastIssuedKeySetId(KeySetManagerService ksms)
            throws NoSuchFieldException, IllegalAccessException {
        Field ksField = ksms.getClass().getDeclaredField("lastIssuedKeySetId");
        ksField.setAccessible(true);
        return (Long) ksField.get(ksms);
    }
}
+139 −3

File changed.

Preview size limit exceeded, changes collapsed.