• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package com.android.server.pm;
18 
19 import java.util.Arrays;
20 import java.util.HashMap;
21 import java.util.HashSet;
22 import java.util.Map;
23 import java.util.Set;
24 
25 public class PackageKeySetData {
26 
27     private long[] mSigningKeySets;
28 
29     private long[] mDefinedKeySets;
30 
31     private final Map<String, Long> mKeySetAliases;
32 
PackageKeySetData()33     PackageKeySetData() {
34         mSigningKeySets = new long[0];
35         mDefinedKeySets = new long[0];
36         mKeySetAliases =  new HashMap<String, Long>();
37     }
38 
PackageKeySetData(PackageKeySetData original)39     PackageKeySetData(PackageKeySetData original) {
40         mSigningKeySets = original.getSigningKeySets().clone();
41         mDefinedKeySets = original.getDefinedKeySets().clone();
42         mKeySetAliases = new HashMap<String, Long>();
43         mKeySetAliases.putAll(original.getAliases());
44     }
45 
addSigningKeySet(long ks)46     public void addSigningKeySet(long ks) {
47         // deduplicate
48         for (long knownKeySet : mSigningKeySets) {
49             if (ks == knownKeySet) {
50                 return;
51             }
52         }
53         int end = mSigningKeySets.length;
54         mSigningKeySets = Arrays.copyOf(mSigningKeySets, end + 1);
55         mSigningKeySets[end] = ks;
56     }
57 
removeSigningKeySet(long ks)58     public void removeSigningKeySet(long ks) {
59         if (packageIsSignedBy(ks)) {
60             long[] keysets = new long[mSigningKeySets.length - 1];
61             int index = 0;
62             for (long signingKeySet : mSigningKeySets) {
63                 if (signingKeySet != ks) {
64                     keysets[index] = signingKeySet;
65                     index += 1;
66                 }
67             }
68             mSigningKeySets = keysets;
69         }
70     }
71 
addDefinedKeySet(long ks, String alias)72     public void addDefinedKeySet(long ks, String alias) {
73         // deduplicate
74         for (long knownKeySet : mDefinedKeySets) {
75             if (ks == knownKeySet) {
76                 return;
77             }
78         }
79         int end = mDefinedKeySets.length;
80         mDefinedKeySets = Arrays.copyOf(mDefinedKeySets, end + 1);
81         mDefinedKeySets[end] = ks;
82         mKeySetAliases.put(alias, ks);
83     }
84 
removeDefinedKeySet(long ks)85     public void removeDefinedKeySet(long ks) {
86         if (mKeySetAliases.containsValue(ks)) {
87             long[] keysets = new long[mDefinedKeySets.length - 1];
88             int index = 0;
89             for (long definedKeySet : mDefinedKeySets) {
90                 if (definedKeySet != ks) {
91                     keysets[index] = definedKeySet;
92                     index += 1;
93                 }
94             }
95             mDefinedKeySets = keysets;
96             for (String alias : mKeySetAliases.keySet()) {
97                 if (mKeySetAliases.get(alias) == ks) {
98                     mKeySetAliases.remove(alias);
99                     break;
100                 }
101             }
102         }
103     }
104 
packageIsSignedBy(long ks)105     public boolean packageIsSignedBy(long ks) {
106         for (long signingKeySet : mSigningKeySets) {
107             if (ks == signingKeySet) {
108                 return true;
109             }
110         }
111         return false;
112     }
113 
getSigningKeySets()114     public long[] getSigningKeySets() {
115         return mSigningKeySets;
116     }
117 
getDefinedKeySets()118     public long[] getDefinedKeySets() {
119         return mDefinedKeySets;
120     }
121 
getAliases()122     public Map<String, Long> getAliases() {
123         return mKeySetAliases;
124     }
125 }