1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.pm;
18
19import android.util.ArrayMap;
20
21import com.android.internal.util.ArrayUtils;
22
23public class PackageKeySetData {
24
25    static final long KEYSET_UNASSIGNED = -1;
26
27    /* KeySet containing all signing keys - superset of the others */
28    private long mProperSigningKeySet;
29
30    private long[] mUpgradeKeySets;
31
32    private final ArrayMap<String, Long> mKeySetAliases = new ArrayMap<String, Long>();
33
34    PackageKeySetData() {
35        mProperSigningKeySet = KEYSET_UNASSIGNED;
36    }
37
38    PackageKeySetData(PackageKeySetData original) {
39        mProperSigningKeySet = original.mProperSigningKeySet;
40        mUpgradeKeySets = ArrayUtils.cloneOrNull(original.mUpgradeKeySets);
41        mKeySetAliases.putAll(original.mKeySetAliases);
42    }
43
44    protected void setProperSigningKeySet(long ks) {
45        mProperSigningKeySet = ks;
46        return;
47    }
48
49    protected long getProperSigningKeySet() {
50        return mProperSigningKeySet;
51    }
52
53    protected void addUpgradeKeySet(String alias) {
54        if (alias == null) {
55            return;
56        }
57
58        /* must have previously been defined */
59        Long ks = mKeySetAliases.get(alias);
60        if (ks != null) {
61            mUpgradeKeySets = ArrayUtils.appendLong(mUpgradeKeySets, ks);
62        } else {
63            throw new IllegalArgumentException("Upgrade keyset alias " + alias
64                    + "does not refer to a defined keyset alias!");
65        }
66    }
67
68    /*
69     * Used only when restoring keyset data from persistent storage.  Must
70     * correspond to a defined-keyset.
71     */
72
73    protected void addUpgradeKeySetById(long ks) {
74        mUpgradeKeySets = ArrayUtils.appendLong(mUpgradeKeySets, ks);
75    }
76
77    protected void removeAllUpgradeKeySets() {
78        mUpgradeKeySets = null;
79        return;
80    }
81
82    protected long[] getUpgradeKeySets() {
83        return mUpgradeKeySets;
84    }
85
86    protected ArrayMap<String, Long> getAliases() {
87        return mKeySetAliases;
88    }
89
90    /*
91     * Replace defined keysets with new ones.
92     */
93    protected void setAliases(ArrayMap<String, Long> newAliases) {
94
95        /* remove old aliases */
96        removeAllDefinedKeySets();
97
98        /* add new ones */
99        final int newAliasSize = newAliases.size();
100        for (int i = 0; i < newAliasSize; i++) {
101            mKeySetAliases.put(newAliases.keyAt(i), newAliases.valueAt(i));;
102        }
103    }
104
105    protected void addDefinedKeySet(long ks, String alias) {
106        mKeySetAliases.put(alias, ks);
107    }
108
109    protected void removeAllDefinedKeySets() {
110        final int aliasSize = mKeySetAliases.size();
111        for (int i = 0; i < aliasSize; i++) {
112            mKeySetAliases.removeAt(i);
113        }
114    }
115
116    protected boolean isUsingDefinedKeySets() {
117
118        /* should never be the case that mUpgradeKeySets.length == 0 */
119        return (mKeySetAliases.size() > 0);
120    }
121
122    protected boolean isUsingUpgradeKeySets() {
123
124        /* should never be the case that mUpgradeKeySets.length == 0 */
125        return (mUpgradeKeySets != null && mUpgradeKeySets.length > 0);
126    }
127}
128