PackageKeySetData.java revision 55b1078e2a1b56daa85edfd5000a5844d3c7914b
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 com.android.internal.util.ArrayUtils;
20
21import java.util.Arrays;
22import java.util.HashMap;
23import java.util.Map;
24
25public class PackageKeySetData {
26
27    static final long KEYSET_UNASSIGNED = -1;
28
29    /* KeySet containing all signing keys - superset of the others */
30    private long mProperSigningKeySet;
31
32    private long[] mSigningKeySets;
33
34    private long[] mUpgradeKeySets;
35
36    private long[] mDefinedKeySets;
37
38    private final Map<String, Long> mKeySetAliases;
39
40    PackageKeySetData() {
41        mProperSigningKeySet = KEYSET_UNASSIGNED;
42        mKeySetAliases = new HashMap<String, Long>();
43    }
44
45    PackageKeySetData(PackageKeySetData original) {
46        mSigningKeySets = original.getSigningKeySets().clone();
47        mUpgradeKeySets = original.getUpgradeKeySets().clone();
48        mDefinedKeySets = original.getDefinedKeySets().clone();
49        mKeySetAliases = new HashMap<String, Long>();
50        mKeySetAliases.putAll(original.getAliases());
51    }
52
53    protected void setProperSigningKeySet(long ks) {
54        if (ks == mProperSigningKeySet) {
55
56            /* nothing to change */
57            return;
58        }
59
60        /* otherwise, our current signing keysets are likely invalid */
61        removeAllSigningKeySets();
62        mProperSigningKeySet = ks;
63        addSigningKeySet(ks);
64        return;
65    }
66
67    protected long getProperSigningKeySet() {
68        return mProperSigningKeySet;
69    }
70
71    protected void addSigningKeySet(long ks) {
72        mSigningKeySets = ArrayUtils.appendLong(mSigningKeySets, ks);
73    }
74
75    protected void removeSigningKeySet(long ks) {
76        mSigningKeySets = ArrayUtils.removeLong(mSigningKeySets, ks);
77    }
78
79    protected void addUpgradeKeySet(String alias) {
80
81        /* must have previously been defined */
82        Long ks = mKeySetAliases.get(alias);
83        if (ks != null) {
84            mUpgradeKeySets = ArrayUtils.appendLong(mUpgradeKeySets, ks);
85        } else {
86            throw new IllegalArgumentException("Upgrade keyset alias " + alias
87                    + "does not refer to a defined keyset alias!");
88        }
89    }
90
91    /*
92     * Used only when restoring keyset data from persistent storage.  Must
93     * correspond to a defined-keyset.
94     */
95    protected void addUpgradeKeySetById(long ks) {
96        mSigningKeySets = ArrayUtils.appendLong(mSigningKeySets, ks);
97    }
98
99    protected void addDefinedKeySet(long ks, String alias) {
100        mDefinedKeySets = ArrayUtils.appendLong(mDefinedKeySets, ks);
101        mKeySetAliases.put(alias, ks);
102    }
103
104    protected void removeAllSigningKeySets() {
105        mProperSigningKeySet = KEYSET_UNASSIGNED;
106        mSigningKeySets = null;
107        return;
108    }
109
110    protected void removeAllUpgradeKeySets() {
111        mUpgradeKeySets = null;
112        return;
113    }
114
115    protected void removeAllDefinedKeySets() {
116        mDefinedKeySets = null;
117        mKeySetAliases.clear();
118        return;
119    }
120
121    protected boolean packageIsSignedBy(long ks) {
122        return ArrayUtils.contains(mSigningKeySets, ks);
123    }
124
125    protected long[] getSigningKeySets() {
126        return mSigningKeySets;
127    }
128
129    protected long[] getUpgradeKeySets() {
130        return mUpgradeKeySets;
131    }
132
133    protected long[] getDefinedKeySets() {
134        return mDefinedKeySets;
135    }
136
137    protected Map<String, Long> getAliases() {
138        return mKeySetAliases;
139    }
140
141    protected boolean isUsingDefinedKeySets() {
142
143        /* should never be the case that mDefinedKeySets.length == 0 */
144        return (mDefinedKeySets != null && mDefinedKeySets.length > 0);
145    }
146
147    protected boolean isUsingUpgradeKeySets() {
148
149        /* should never be the case that mUpgradeKeySets.length == 0 */
150        return (mUpgradeKeySets != null && mUpgradeKeySets.length > 0);
151    }
152}