diff --git a/services/tests/servicestests/src/com/android/server/pm/KeySetManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/KeySetManagerServiceTest.java
new file mode 100644
index 0000000..fbdb20b
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/KeySetManagerServiceTest.java
@@ -0,0 +1,851 @@
+/*
+ * 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.content.pm.PackageParser;
+import android.content.pm.Signature;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.LongSparseArray;
+import com.android.internal.util.ArrayUtils;
+
+import java.lang.reflect.Field;
+import java.io.File;
+import java.io.IOException;
+import java.security.cert.CertificateException;
+import java.security.PublicKey;
+
+import android.test.AndroidTestCase;
+
+public class KeySetManagerServiceTest extends AndroidTestCase {
+
+    private ArrayMap<String, PackageSetting> mPackagesMap;
+    private KeySetManagerService mKsms;
+
+    public PackageSetting generateFakePackageSetting(String name) {
+        return new PackageSetting(name, name, new File(mContext.getCacheDir(), "fakeCodePath"),
+                new File(mContext.getCacheDir(), "fakeResPath"), "", "", "",
+                "", 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
+    public void setUp() throws Exception {
+        super.setUp();
+        mPackagesMap = new ArrayMap<String, PackageSetting>();
+        mKsms = new KeySetManagerService(mPackagesMap);
+    }
+
+    public void testPackageKeySetDataConstructorUnassignend() {
+        PackageKeySetData pksd = new PackageKeySetData();
+        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, pksd.getProperSigningKeySet());
+        assertNull(pksd.getUpgradeKeySets());
+        ArrayMap<String, Long> aliases = pksd.getAliases();
+        assertNotNull(aliases);
+        assertEquals(0, aliases.size());
+    }
+
+    /* test equivalence of PackageManager cert encoding and PackageParser manifest keys */
+    public void testPublicKeyCertReprEquiv() throws CertificateException {
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        PublicKey keyC = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyC);
+
+        Signature sigA = new Signature(KeySetStrings.ctsKeySetCertA);
+        Signature sigB = new Signature(KeySetStrings.ctsKeySetCertB);
+        Signature sigC = new Signature(KeySetStrings.ctsKeySetCertC);
+
+        assertNotNull(keyA);
+        assertNotNull(keyB);
+        assertNotNull(keyC);
+
+        assertEquals(keyA, sigA.getPublicKey());
+        assertEquals(keyB, sigB.getPublicKey());
+        assertEquals(keyC, sigC.getPublicKey());
+
+        byte[] bArrayPk = keyA.getEncoded();
+        byte[] bArrayCert = sigA.getPublicKey().getEncoded();
+        assertEquals(bArrayPk.length, bArrayCert.length);
+        assertEquals(true, ArrayUtils.equals(bArrayPk, bArrayCert, bArrayPk.length));
+
+        bArrayPk = keyB.getEncoded();
+        bArrayCert = sigB.getPublicKey().getEncoded();
+        assertEquals(bArrayPk.length, bArrayCert.length);
+        assertEquals(true, ArrayUtils.equals(bArrayPk, bArrayCert, bArrayPk.length));
+
+        bArrayPk = keyC.getEncoded();
+        bArrayCert = sigC.getPublicKey().getEncoded();
+        assertEquals(bArrayPk.length, bArrayCert.length);
+        assertEquals(true, ArrayUtils.equals(bArrayPk, bArrayCert, bArrayPk.length));
+    }
+
+    public void testEncodePublicKey() throws IOException {
+        ArrayMap<String, PackageSetting> packagesMap = new ArrayMap<String, PackageSetting>();
+        KeySetManagerService ksms = new KeySetManagerService(packagesMap);
+
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        PublicKey keyC = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyC);
+
+        assertEquals(ksms.encodePublicKey(keyA), KeySetStrings.ctsKeySetPublicKeyA);
+        assertEquals(ksms.encodePublicKey(keyB), KeySetStrings.ctsKeySetPublicKeyB);
+        assertEquals(ksms.encodePublicKey(keyC), KeySetStrings.ctsKeySetPublicKeyC);
+    }
+
+    /*
+     * Add the keyset information for a package to a system w/no previous keysets
+     */
+    public void testAddSigningKSToPackageEmpty() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
+
+        assertEquals(1, getKeySetRefCount(1));
+        assertEquals(1, getPubKeyRefCount(1));
+        assertEquals(keyA, getPubKey(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(1);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        assertEquals(1, ps.keySetData.getProperSigningKeySet());
+    }
+
+    /*
+     * upgrade an app (same packagename) with same keyset and verify that
+     * nothing changed.
+     */
+    public void testAddSigningKSToPackageUpgradeSame() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
+
+        /* add again, to represent upgrade of package */
+        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
+
+        assertEquals(1, getKeySetRefCount(1));
+        assertEquals(1, getPubKeyRefCount(1));
+        assertEquals(keyA, getPubKey(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(1);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        assertEquals(1, ps.keySetData.getProperSigningKeySet());
+    }
+
+    /*
+     * upgrade an app (same packagename) with different unique keyset and verify
+     * that the old was removed.
+     */
+    public void testAddSigningKSToPackageUpgradeDiff() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
+
+        /* now upgrade with new key */
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        signingKeys.removeAt(0);
+        signingKeys.add(keyB);
+        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
+
+        assertEquals(0, getKeySetRefCount(1));
+        assertEquals(1, getKeySetRefCount(2));
+        assertEquals(0, getPubKeyRefCount(1));
+        assertEquals(1, getPubKeyRefCount(2));
+        assertEquals(keyB, getPubKey(2));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(2);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(2)));
+        assertEquals(2, ps.keySetData.getProperSigningKeySet());
+    }
+
+    /*
+     * upgrade an app (same packagename) with different keyset and verify
+     * that the old had its ref count reduced due to reference by other ps.
+     */
+    public void testAddSigningKSToPackageUpgradeDiff2() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps1 = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps1.name, ps1);
+        PackageSetting ps2 = generateFakePackageSetting("packageB");
+        mPackagesMap.put(ps2.name, ps2);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps1.name, signingKeys);
+        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys);
+
+        /* now upgrade with new key */
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        signingKeys.removeAt(0);
+        signingKeys.add(keyB);
+        mKsms.addSigningKeySetToPackageLPw(ps1.name, signingKeys);
+
+        assertEquals(1, getKeySetRefCount(1));
+        assertEquals(1, getKeySetRefCount(2));
+        assertEquals(1, getPubKeyRefCount(1));
+        assertEquals(1, getPubKeyRefCount(2));
+        assertEquals(keyA, getPubKey(1));
+        assertEquals(keyB, getPubKey(2));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(2, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(1);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        mapping = ksMapping.get(2);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(2)));
+        assertEquals(2, ps1.keySetData.getProperSigningKeySet());
+        assertEquals(1, ps2.keySetData.getProperSigningKeySet());
+    }
+
+    /*
+     * Add orthoganal keyset info to system and ensure previous keysets are
+     * unmodified.
+     */
+    public void testAddSigningKSToPackageNewOrtho() throws ReflectiveOperationException {
+
+        /* create PackageSettings and add to Settings mPackages */
+        PackageSetting ps1 = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps1.name, ps1);
+        PackageSetting ps2 = generateFakePackageSetting("packageB");
+        mPackagesMap.put(ps2.name, ps2);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys1 = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys1.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps1.name, signingKeys1);
+
+        /* collect second signing key and add */
+        ArraySet<PublicKey> signingKeys2 = new ArraySet<PublicKey>();
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        signingKeys2.add(keyB);
+        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys2);
+
+        /* verify first is unchanged */
+        assertEquals(1, getKeySetRefCount(1));
+        assertEquals(1, getPubKeyRefCount(1));
+        assertEquals(keyA, getPubKey(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(2, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(1);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        assertEquals(1, ps1.keySetData.getProperSigningKeySet());
+
+        /* verify second */
+        assertEquals(1, getKeySetRefCount(2));
+        assertEquals(1, getPubKeyRefCount(2));
+        assertEquals(keyB, getPubKey(2));
+        mapping = ksMapping.get(2);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new  Long(2)));
+        assertEquals(2, ps2.keySetData.getProperSigningKeySet());
+    }
+
+    /*
+     * Add identical keyset info to system via new package and ensure previous
+     * keysets has reference count incremented
+     */
+    public void testAddSigningKSToPackageNewSame() throws ReflectiveOperationException {
+
+        /* create PackageSettings and add to Settings mPackages */
+        PackageSetting ps1 = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps1.name, ps1);
+        PackageSetting ps2 = generateFakePackageSetting("packageB");
+        mPackagesMap.put(ps2.name, ps2);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps1.name, signingKeys);
+
+        /* add again for second package */
+        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys);
+
+        assertEquals(2, getKeySetRefCount(1));
+        assertEquals(1, getPubKeyRefCount(1));
+        assertEquals(keyA, getPubKey(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(1);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        assertEquals(1, ps1.keySetData.getProperSigningKeySet());
+        assertEquals(1, ps2.keySetData.getProperSigningKeySet());
+    }
+
+    /*
+     * add a package which is signed by a keyset which contains a previously seen
+     * public key and make sure its refernces are incremented.
+     */
+    public void testAddSigningKSToPackageSuper() throws ReflectiveOperationException {
+
+        /* create PackageSettings and add to Settings mPackages */
+        PackageSetting ps1 = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps1.name, ps1);
+        PackageSetting ps2 = generateFakePackageSetting("packageB");
+        mPackagesMap.put(ps2.name, ps2);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps1.name, signingKeys);
+
+        /* give ps2 a superset (add keyB) */
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        signingKeys.add(keyB);
+        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys);
+
+        assertEquals(1, getKeySetRefCount(1));
+        assertEquals(1, getKeySetRefCount(2));
+        assertEquals(2, getPubKeyRefCount(1));
+        assertEquals(1, getPubKeyRefCount(2));
+        assertEquals(keyA, getPubKey(1));
+        assertEquals(keyB, getPubKey(2));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(2, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(1);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        mapping = ksMapping.get(2);
+        assertEquals(2, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        assertTrue(mapping.contains(new Long(2)));
+        assertEquals(1, ps1.keySetData.getProperSigningKeySet());
+        assertEquals(2, ps2.keySetData.getProperSigningKeySet());
+    }
+
+    /*
+     * Upgrade an app (same pkgName) with different keyset which contains a public
+     * key from the previous keyset.  Verify old keyset removed and pub key ref
+     * count is accurate.
+     */
+    public void testAddSigningKSToPackageUpgradeDiffSuper() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
+
+        /* now with additional key */
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        signingKeys.add(keyB);
+        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
+
+        assertEquals(0, getKeySetRefCount(1));
+        assertEquals(1, getKeySetRefCount(2));
+        assertEquals(0, getPubKeyRefCount(1));
+        assertEquals(1, getPubKeyRefCount(2));
+        assertEquals(1, getPubKeyRefCount(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))
+                   || keyA.equals(getPubKey(3)) && keyB.equals(getPubKey(2)));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(2);
+        assertEquals(2, mapping.size());
+        assertTrue(mapping.contains(new Long(2)));
+        assertTrue(mapping.contains(new Long(3)));
+        assertEquals(2, ps.keySetData.getProperSigningKeySet());
+    }
+
+    /* add a defined keyset make sure it shows up */
+    public void testAddDefinedKSToPackageEmpty() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys.add(keyA);
+        definedKS.put("aliasA", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        assertEquals(1, getKeySetRefCount(1));
+        assertEquals(1, getPubKeyRefCount(1));
+        assertEquals(keyA, getPubKey(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(1);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        assertNotNull(ps.keySetData.getAliases().get("aliasA"));
+        assertEquals(new Long(1), ps.keySetData.getAliases().get("aliasA"));
+    }
+
+    /* add 2 defined keysets which refer to same keyset and make sure ref-ct is 2 */
+    public void testAddDefinedKSToPackageDoubleAlias() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys.add(keyA);
+        definedKS.put("aliasA", keys);
+        definedKS.put("aliasA2", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        assertEquals(2, getKeySetRefCount(1));
+        assertEquals(1, getPubKeyRefCount(1));
+        assertEquals(keyA, getPubKey(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(1);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(1)));
+        assertNotNull(ps.keySetData.getAliases().get("aliasA"));
+        assertEquals(new Long(1), ps.keySetData.getAliases().get("aliasA"));
+        assertNotNull(ps.keySetData.getAliases().get("aliasA2"));
+        assertEquals(new Long(1), ps.keySetData.getAliases().get("aliasA2"));
+    }
+
+    /* upgrd defined keyset ortho (make sure previous is removed for pkg) */
+    public void testAddDefinedKSToPackageOrthoUpgr() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys.add(keyA);
+        definedKS.put("aliasA", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        /* now upgrade to different defined key-set */
+        keys = new ArraySet<PublicKey>();
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        keys.add(keyB);
+        definedKS.remove("aliasA");
+        definedKS.put("aliasB", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        assertEquals(0, getKeySetRefCount(1));
+        assertEquals(0, getPubKeyRefCount(1));
+        assertEquals(1, getKeySetRefCount(2));
+        assertEquals(1, getPubKeyRefCount(2));
+        assertEquals(keyB, getPubKey(2));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(2);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(2)));
+        assertNull(ps.keySetData.getAliases().get("aliasA"));
+        assertNotNull(ps.keySetData.getAliases().get("aliasB"));
+        assertEquals(new Long(2), ps.keySetData.getAliases().get("aliasB"));
+    }
+
+    /* upgrd defined keyset ortho but reuse alias (make sure old is removed and
+     * alias points to new keyset)
+     */
+    public void testAddDefinedKSToPackageOrthoUpgrAliasSame() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys.add(keyA);
+        definedKS.put("aliasA", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        /* now upgrade to different set w/same alias as before */
+        keys = new ArraySet<PublicKey>();
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        keys.add(keyB);
+        definedKS.put("aliasA", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        assertEquals(0, getKeySetRefCount(1));
+        assertEquals(0, getPubKeyRefCount(1));
+        assertEquals(1, getKeySetRefCount(2));
+        assertEquals(1, getPubKeyRefCount(2));
+        assertEquals(keyB, getPubKey(2));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(2);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(2)));
+        assertNotNull(ps.keySetData.getAliases().get("aliasA"));
+        assertEquals(new Long(2), ps.keySetData.getAliases().get("aliasA"));
+    }
+
+     /* Start with defined ks of (A, B) and upgrade to (B, C).  Make sure B is
+      * unchanged. */
+    public void testAddDefinedKSToPackageOverlapUpgr() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect keys A and B and add */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys1 = new ArraySet<PublicKey>();
+        ArraySet<PublicKey> keys2 = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        keys1.add(keyA);
+        keys2.add(keyB);
+        definedKS.put("aliasA", keys1);
+        definedKS.put("aliasB", keys2);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        /* now upgrade to different set (B, C) */
+        keys1 = new ArraySet<PublicKey>();
+        PublicKey keyC = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyC);
+        keys1.add(keyC);
+        definedKS.remove("aliasA");
+        definedKS.put("aliasC", keys1);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        assertEquals(1, getKeySetRefCount(3));
+        assertEquals(1, getPubKeyRefCount(3));
+        assertEquals(keyC, getPubKey(3));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(2, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(3);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(3)));
+        assertEquals(new Long(3), ps.keySetData.getAliases().get("aliasC"));
+
+        /* either keyset w/keyA or w/keyB was added first, address both cases */
+        if (1 == getKeySetRefCount(1)) {
+
+            /* keyB was added first and should have keyset 1 and pub-key 1 */
+            assertEquals(1, getPubKeyRefCount(1));
+            assertEquals(0, getKeySetRefCount(2));
+            assertEquals(0, getPubKeyRefCount(2));
+            assertEquals(keyB, getPubKey(1));
+            mapping = ksMapping.get(1);
+            assertEquals(1, mapping.size());
+            assertTrue(mapping.contains(new Long(1)));
+            assertEquals(new Long(1), ps.keySetData.getAliases().get("aliasB"));
+        } else {
+
+            /* keyA was added first and keyB has id 2 */
+            assertEquals(1, getKeySetRefCount(2));
+            assertEquals(1, getPubKeyRefCount(2));
+            assertEquals(0, getKeySetRefCount(1));
+            assertEquals(0, getPubKeyRefCount(1));
+            assertEquals(keyB, getPubKey(2));
+            mapping = ksMapping.get(2);
+            assertEquals(1, mapping.size());
+            assertTrue(mapping.contains(new Long(2)));
+            assertEquals(new Long(2), ps.keySetData.getAliases().get("aliasB"));
+        }
+        assertNull(ps.keySetData.getAliases().get("aliasA"));
+    }
+
+    /* add defined keyset, remove it, add again and make sure diff id. */
+    public void testAddDefinedKSToPackageThree() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys1 = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys1.add(keyA);
+        definedKS.put("aliasA", keys1);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        /* now upgrade to different set */
+        ArraySet<PublicKey> keys2 = new ArraySet<PublicKey>();
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        keys2.add(keyB);
+        definedKS.remove("aliasA");
+        definedKS.put("aliasB", keys2);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        /* upgrade back to original */
+        definedKS.remove("aliasB");
+        definedKS.put("aliasA", keys1);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+
+        assertEquals(0, getKeySetRefCount(1));
+        assertEquals(0, getKeySetRefCount(2));
+        assertEquals(1, getKeySetRefCount(3));
+        assertEquals(0, getPubKeyRefCount(1));
+        assertEquals(0, getPubKeyRefCount(2));
+        assertEquals(1, getPubKeyRefCount(3));
+        assertEquals(keyA, getPubKey(3));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        ArraySet<Long> mapping = ksMapping.get(3);
+        assertEquals(1, mapping.size());
+        assertTrue(mapping.contains(new Long(3)));
+        assertEquals(new Long(3), ps.keySetData.getAliases().get("aliasA"));
+    }
+
+    /* add upgrade keyset for existing defined keyset and check that it is recorded */
+    public void testAddUpgradeKSToPackageEmpty() {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add, and denote as an upgrade keyset */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys.add(keyA);
+        definedKS.put("aliasA", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+        ArraySet<String> upgradeKS = new ArraySet<String>();
+        upgradeKS.add("aliasA");
+        mKsms.addUpgradeKeySetsToPackageLPw(ps.name, upgradeKS);
+
+        assertEquals(1, ps.keySetData.getUpgradeKeySets().length);
+        assertEquals(1, ps.keySetData.getUpgradeKeySets()[0]);
+    }
+
+    /* add upgrade keyset for non-existing defined and check that it compains */
+    public void testAddUpgradeKSToPackageWrong() {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add and try to specify bogus upgrade keyset */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys.add(keyA);
+        definedKS.put("aliasA", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+        ArraySet<String> upgradeKS = new ArraySet<String>();
+        upgradeKS.add("aliasB");
+        try {
+            mKsms.addUpgradeKeySetsToPackageLPw(ps.name, upgradeKS);
+        } catch (IllegalArgumentException e) {
+
+            /* should have been caught in packagemanager, so exception thrown */
+            return;
+        }
+        fail("Expected IllegalArgumentException when adding undefined upgrade keyset!!");
+    }
+
+    /* upgrade from defined keysets w/upgrade to different defined keysets and
+     * make sure the previously specified upgrade keyset has been removed. */
+    public void testAddUpgradeKSToPackageDisappear() {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys.add(keyA);
+        definedKS.put("aliasA", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+        ArraySet<String> upgradeKS = new ArraySet<String>();
+        upgradeKS.add("aliasA");
+        mKsms.addUpgradeKeySetsToPackageLPw(ps.name, upgradeKS);
+
+        keys = new ArraySet<PublicKey>();
+        PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB);
+        keys.add(keyB);
+        definedKS.remove("aliasA");
+        definedKS.put("aliasB", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+        assertNull(ps.keySetData.getUpgradeKeySets());
+    }
+
+    /* remove package and validate that keyset and public keys are removed */
+    public void testRemoveAppKSDataUnique() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect signing key and add */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps.name, signingKeys);
+
+        /* remove its references */
+        mKsms.removeAppKeySetDataLPw(ps.name);
+        assertEquals(0, getKeySetRefCount(1));
+        assertEquals(0, getPubKeyRefCount(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(0, ksMapping.size());
+        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps.keySetData.getProperSigningKeySet());
+    }
+
+    /* remove package and validate that keysets remain if defined elsewhere but
+     * have refcounts decreased. */
+    public void testRemoveAppKSDataDup() throws ReflectiveOperationException {
+
+        /* create PackageSettings and add to Settings mPackages */
+        PackageSetting ps1 = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps1.name, ps1);
+        PackageSetting ps2 = generateFakePackageSetting("packageB");
+        mPackagesMap.put(ps2.name, ps2);
+
+        /* collect signing key and add for both packages */
+        ArraySet<PublicKey> signingKeys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        signingKeys.add(keyA);
+        mKsms.addSigningKeySetToPackageLPw(ps1.name, signingKeys);
+        mKsms.addSigningKeySetToPackageLPw(ps2.name, signingKeys);
+
+        /* remove references from first package */
+        mKsms.removeAppKeySetDataLPw(ps1.name);
+
+        assertEquals(1, getKeySetRefCount(1));
+        assertEquals(1, getPubKeyRefCount(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(1, ksMapping.size());
+        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps1.keySetData.getProperSigningKeySet());
+        assertEquals(1, ps2.keySetData.getProperSigningKeySet());
+    }
+
+    /* remove package which used defined and upgrade keysets and ensure  removed */
+    public void testRemoveAppKSDataDefined() throws ReflectiveOperationException {
+
+        /* create PackageSetting and add to Settings mPackages */
+        PackageSetting ps = generateFakePackageSetting("packageA");
+        mPackagesMap.put(ps.name, ps);
+
+        /* collect key and add */
+        ArrayMap<String, ArraySet<PublicKey>> definedKS = new ArrayMap<String, ArraySet<PublicKey>>();
+        ArraySet<PublicKey> keys = new ArraySet<PublicKey>();
+        PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA);
+        keys.add(keyA);
+
+        /* removal requires signing keyset to be specified (since all apps are
+         * assumed to have it).  We skipped this in the defined tests, but can't
+         * here. */
+        mKsms.addSigningKeySetToPackageLPw(ps.name, keys);
+
+        definedKS.put("aliasA", keys);
+        mKsms.addDefinedKeySetsToPackageLPw(ps.name, definedKS);
+        ArraySet<String> upgradeKS = new ArraySet<String>();
+        upgradeKS.add("aliasA");
+        mKsms.addUpgradeKeySetsToPackageLPw(ps.name, upgradeKS);
+        mKsms.removeAppKeySetDataLPw(ps.name);
+
+        assertEquals(0, getKeySetRefCount(1));
+        assertEquals(0, getPubKeyRefCount(1));
+        LongSparseArray<ArraySet<Long>> ksMapping = getKeySetMapping();
+        assertEquals(0, ksMapping.size());
+        assertEquals(PackageKeySetData.KEYSET_UNASSIGNED, ps.keySetData.getProperSigningKeySet());
+        assertEquals(0, ps.keySetData.getAliases().size());
+        assertNull(ps.keySetData.getUpgradeKeySets());
+    }
+}
diff --git a/services/tests/servicestests/src/com/android/server/pm/KeySetStrings.java b/services/tests/servicestests/src/com/android/server/pm/KeySetStrings.java
new file mode 100644
index 0000000..89d01ae
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/pm/KeySetStrings.java
@@ -0,0 +1,137 @@
+/*
+ * 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;
+
+public class KeySetStrings {
+
+    /*
+     * public keys taken from:
+     * openssl x509 -in cts-keyset-test-${N}.x509.pem -inform PEM -pubkey
+     * in /platform/cts/hostsidetests/appsecurity/certs/keysets
+     */
+    public static final String ctsKeySetPublicKeyA =
+            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwf5zJblvYSB7Ym7or/7Ggg"
+            + "AAu7mp7RrykPJsXhod8doFhVT5s7eF3A4MCE55vvANP7HvwMw2b+T6qx7Pq0VJtb"
+            + "bSDtlBHBtIc47Pjq0CsDg590BUcgKp7PdJ9J6UVgtzDnV6cGEpXmSag3sY+lqiW0"
+            + "4ytPhCVwzYTWGdYe9+TIl47cBrveRfLOlGrcuFQe+zCTmDFqzBKCRHK9b7l5PDWv"
+            + "XXyg65Uu/MBUA/TZWO0fEqOlxZG/nn6DUKQLhPdmJRXWJ3WqMNMhJGD+nKtkmdX7"
+            + "03xRqmg4h+6g0S7M9Y3IQ2NUGyw05AYzCguHB/Mv6uVIiW659wpbyb45TgKG3UhQ"
+            + "IDAQAB";
+
+    public static final String ctsKeySetPublicKeyB =
+            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoeFZqMqTbZiozFTXMkXtSK"
+            + "JRzn2qODZgvVXAAwKTi50xYcbPcHTfKxtif8+q7OCp/50JYDH32bg6wkUunn5+dE"
+            + "aHkxZY8d7uw46tQtl5dNGi+6cc4MezVLCS6nkqNDusAgdvgLU6Fl6SGi02KTp1vk"
+            + "t6CwLO977YJP7kt9ouDRTG7ASJiq3OyRRoOqYHhD9gpsbUq4w+1bXGfuuZujA1dX"
+            + "yovXtvrHUGOdFIEBYOVYGfCcwh3lXPmjNJMlHtKQkurq8/LH7a1B5ocoXCGsyR8Y"
+            + "HdlWfrqRAfzgOB1KCnNNmWqskU9LOci3uQn9IDeMEFmAd8FqF8SwV+4Ludk/xWGQ"
+            + "IDAQAB";
+
+    public static final String ctsKeySetPublicKeyC =
+            "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwIJ/p9zZ6pGe7h1lBJULE"
+            + "5lbYbC3mh5G43OsJ+B0CebN4KzEKyVg+wmkuGSvG2xXUp1BlbipSjnTJ5bUt2iBu"
+            + "wB81Lvumg9GOfCpTBGtfE4a4igtfo7e2U8IbRzEYbhaZlBEmC1BDUvdTFdMRGZPu"
+            + "hUcMkwit4RpHkL6rttuOfaeoJwsgEjbELyzgcm+1Z49Den/JmmXNGMw1/QMibBFG"
+            + "vGkhu2rHg/SYiKpupclU4FIeALcOSnPkrrY6LuSATHDnYvuvK3Vhu0EBKID+rAv5"
+            + "j6BNvnu25SAf3GgS7PLuyVlhiE5p3hTevXn5g/7tjJlXa0FsbMlnFf53WyP9pRWw"
+            + "IDAQAB";
+
+    /*
+     * certs taken from packagemanager packages.xml output corresponding to certs in
+     * /platform/cts/hostsidetests/appsecurity/certs/keysets
+     */
+    public static final String ctsKeySetCertA =
+            "3082030b308201f3a0030201020209009d76e8a600170813300d06092a864886f7"
+            + "0d0101050500301c311a301806035504030c116374732d6b65797365742d7465"
+            + "73742d61301e170d3134303931313030343434385a170d343230313237303034"
+            + "3434385a301c311a301806035504030c116374732d6b65797365742d74657374"
+            + "2d6130820122300d06092a864886f70d01010105000382010f003082010a0282"
+            + "010100c1fe7325b96f61207b626ee8affec6820000bbb9a9ed1af290f26c5e1a"
+            + "1df1da058554f9b3b785dc0e0c084e79bef00d3fb1efc0cc366fe4faab1ecfab"
+            + "4549b5b6d20ed9411c1b48738ecf8ead02b03839f740547202a9ecf749f49e94"
+            + "560b730e757a7061295e649a837b18fa5aa25b4e32b4f842570cd84d619d61ef"
+            + "7e4c8978edc06bbde45f2ce946adcb8541efb309398316acc12824472bd6fb97"
+            + "93c35af5d7ca0eb952efcc05403f4d958ed1f12a3a5c591bf9e7e8350a40b84f"
+            + "7662515d62775aa30d3212460fe9cab6499d5fbd37c51aa683887eea0d12eccf"
+            + "58dc84363541b2c34e406330a0b8707f32feae548896eb9f70a5bc9be394e028"
+            + "6dd4850203010001a350304e301d0603551d0e04160414debf602e08b7573bce"
+            + "4816ac32eab215fb052892301f0603551d23041830168014debf602e08b7573b"
+            + "ce4816ac32eab215fb052892300c0603551d13040530030101ff300d06092a86"
+            + "4886f70d0101050500038201010092f1b8d08252d808d3051dce80780bd27eef"
+            + "e3f6b6d935398afb448209461b6f8b352e830d4358661e1b3e9eb9ab3937bddd"
+            + "581a28f533da1ebeb6838ce4a84ca64c43507c5ef9528917857e4d1c4c5996cf"
+            + "6b3d30823db514a715eeee709d69e38b4f0ef5dce4b08ce40fd52b39ac651311"
+            + "b6d1814913d922ce84748b6999256851fb583a49e35cecf79a527108df8e062d"
+            + "f4831addbb12a661999d41849e2545150cab74c91447dd15e55cdf3f8082dcab"
+            + "667c5cee3350d0f15d3970edcf3e81882e80985b0c0bf9917adb55c634de3a92"
+            + "e8fb5d9413b1703bec116b9ee9346b658f394acfe0c60406718be80b7110df8b"
+            + "44c984f001e1d16aac3831afee18";
+
+    public static final String ctsKeySetCertB =
+            "3082030b308201f3a003020102020900e670a5b2ec1e8a12300d06092a864886f7"
+            + "0d0101050500301c311a301806035504030c116374732d6b65797365742d7465"
+            + "73742d62301e170d3134303931313030343434315a170d343230313237303034"
+            + "3434315a301c311a301806035504030c116374732d6b65797365742d74657374"
+            + "2d6230820122300d06092a864886f70d01010105000382010f003082010a0282"
+            + "010100a1e159a8ca936d98a8cc54d73245ed48a251ce7daa383660bd55c00302"
+            + "938b9d3161c6cf7074df2b1b627fcfaaece0a9ff9d096031f7d9b83ac2452e9e"
+            + "7e7e744687931658f1deeec38ead42d97974d1a2fba71ce0c7b354b092ea792a"
+            + "343bac02076f80b53a165e921a2d36293a75be4b7a0b02cef7bed824fee4b7da"
+            + "2e0d14c6ec04898aadcec914683aa607843f60a6c6d4ab8c3ed5b5c67eeb99ba"
+            + "3035757ca8bd7b6fac750639d14810160e55819f09cc21de55cf9a33493251ed"
+            + "29092eaeaf3f2c7edad41e687285c21acc91f181dd9567eba9101fce0381d4a0"
+            + "a734d996aac914f4b39c8b7b909fd20378c10598077c16a17c4b057ee0bb9d93"
+            + "fc56190203010001a350304e301d0603551d0e04160414ccd4d9d47dcc18889d"
+            + "cba32de37e6570c88f8109301f0603551d23041830168014ccd4d9d47dcc1888"
+            + "9dcba32de37e6570c88f8109300c0603551d13040530030101ff300d06092a86"
+            + "4886f70d0101050500038201010061951cf9c9a629b30b560d53d62a72796edc"
+            + "97b0b210b567859311b14574abb052ef08cabb0b18cef5517597eabee9498a07"
+            + "a04472b8e6eee8668c05d2ff28141a36351593551f0c9d27feb4367fd0d23c76"
+            + "e36035f9d06d2d24b4167120fabdcfddfbe872bd127a602de8563ad6027ee19a"
+            + "fc21065cf02d6aaf97bf78388c3c129e72d1b31f5727896aaad7fe6773fbc285"
+            + "34e89194a75e1ecf64bcc5fa228e71e3be9efc78cb39bbabf60e334b403fc3e4"
+            + "9eb59c3407883d10efb04470a7d7d12114e7c9ddc3b381ffc43e8e8a830efa59"
+            + "38e47eef0d4dd39a80186c3b4236f812f52775941fe1dd73d51f6f50ab0916e3"
+            + "149c31feabcf38860be45d113a54";
+
+    public static final String ctsKeySetCertC =
+            "3082030b308201f3a0030201020209008f2e824e4e17810d300d06092a864886f7"
+            + "0d0101050500301c311a301806035504030c116374732d6b65797365742d7465"
+            + "73742d63301e170d3134303931313030343432325a170d343230313237303034"
+            + "3432325a301c311a301806035504030c116374732d6b65797365742d74657374"
+            + "2d6330820122300d06092a864886f70d01010105000382010f003082010a0282"
+            + "010100af0209fe9f7367aa467bb8759412542c4e656d86c2de68791b8dceb09f"
+            + "81d0279b3782b310ac9583ec2692e192bc6db15d4a750656e2a528e74c9e5b52"
+            + "dda206ec01f352efba683d18e7c2a53046b5f1386b88a0b5fa3b7b653c21b473"
+            + "1186e16999411260b504352f75315d3111993ee85470c9308ade11a4790beabb"
+            + "6db8e7da7a8270b201236c42f2ce0726fb5678f437a7fc99a65cd18cc35fd032"
+            + "26c1146bc6921bb6ac783f49888aa6ea5c954e0521e00b70e4a73e4aeb63a2ee"
+            + "4804c70e762fbaf2b7561bb41012880feac0bf98fa04dbe7bb6e5201fdc6812e"
+            + "cf2eec95961884e69de14debd79f983feed8c99576b416c6cc96715fe775b23f"
+            + "da515b0203010001a350304e301d0603551d0e041604141b8137c73974a17633"
+            + "686f93798a7f7b8385bded301f0603551d230418301680141b8137c73974a176"
+            + "33686f93798a7f7b8385bded300c0603551d13040530030101ff300d06092a86"
+            + "4886f70d01010505000382010100276ce2ca7b78b12aa2e432c8287075af91e5"
+            + "2a15a8586e23cdd7524a4c5ae04156307e95275cdfd841f2d28c0583cb36779e"
+            + "25d849a8b608eb48a84a50202a7825c7847e865409b1dd01303b5b1bdfafecab"
+            + "bfe1c6ec5f30ce1cb16b93db72ef726f77a48ca4f5ac5e12c4ad08c6df6fbf7e"
+            + "1548ef7ca80cf1d98abb550c0e28b246e8c0f1a975ffb624f1a4aeec11f01ba6"
+            + "02631d56645f5ae042dbf67b444b160711ca2629c456c5cc12e2ff56fa1332b6"
+            + "92483d14d2e6fb8e026246058fb5826e3958ee8f780d0fc2b840d51c2bbf0d24"
+            + "e9e108ef1c2d9ec13797bb4e5793349628a2ddb2a79c9d9c5736e7aea93e4552"
+            + "18fd162e0a42a4fbb4aa9df82b8a";
+}
