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}