Geremy Condra | f1bcca8 | 2013-01-07 22:35:24 -0800 | [diff] [blame] | 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 | |
Jeff Sharkey | 9f837a9 | 2014-10-24 12:07:24 -0700 | [diff] [blame] | 19 | import android.util.ArrayMap; |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 20 | |
Jeff Sharkey | 9f837a9 | 2014-10-24 12:07:24 -0700 | [diff] [blame] | 21 | import com.android.internal.util.ArrayUtils; |
Geremy Condra | f1bcca8 | 2013-01-07 22:35:24 -0800 | [diff] [blame] | 22 | |
| 23 | public class PackageKeySetData { |
| 24 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 25 | static final long KEYSET_UNASSIGNED = -1; |
| 26 | |
| 27 | /* KeySet containing all signing keys - superset of the others */ |
| 28 | private long mProperSigningKeySet; |
| 29 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 30 | private long[] mUpgradeKeySets; |
| 31 | |
Jeff Sharkey | 9f837a9 | 2014-10-24 12:07:24 -0700 | [diff] [blame] | 32 | private final ArrayMap<String, Long> mKeySetAliases = new ArrayMap<String, Long>(); |
Geremy Condra | f1bcca8 | 2013-01-07 22:35:24 -0800 | [diff] [blame] | 33 | |
| 34 | PackageKeySetData() { |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 35 | mProperSigningKeySet = KEYSET_UNASSIGNED; |
Geremy Condra | f1bcca8 | 2013-01-07 22:35:24 -0800 | [diff] [blame] | 36 | } |
| 37 | |
| 38 | PackageKeySetData(PackageKeySetData original) { |
dcashman | d876a1d | 2014-10-07 14:16:35 -0700 | [diff] [blame] | 39 | mProperSigningKeySet = original.mProperSigningKeySet; |
Jeff Sharkey | 57dcf5b | 2014-06-18 17:46:05 -0700 | [diff] [blame] | 40 | mUpgradeKeySets = ArrayUtils.cloneOrNull(original.mUpgradeKeySets); |
Jeff Sharkey | 57dcf5b | 2014-06-18 17:46:05 -0700 | [diff] [blame] | 41 | mKeySetAliases.putAll(original.mKeySetAliases); |
Geremy Condra | f1bcca8 | 2013-01-07 22:35:24 -0800 | [diff] [blame] | 42 | } |
| 43 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 44 | protected void setProperSigningKeySet(long ks) { |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 45 | mProperSigningKeySet = ks; |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 46 | return; |
Geremy Condra | f1bcca8 | 2013-01-07 22:35:24 -0800 | [diff] [blame] | 47 | } |
| 48 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 49 | protected long getProperSigningKeySet() { |
| 50 | return mProperSigningKeySet; |
| 51 | } |
| 52 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 53 | protected void addUpgradeKeySet(String alias) { |
dcashman | 8c04fac | 2015-03-23 11:39:42 -0700 | [diff] [blame] | 54 | if (alias == null) { |
| 55 | return; |
| 56 | } |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 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!"); |
Geremy Condra | cdb5789 | 2013-03-26 16:22:36 -0700 | [diff] [blame] | 65 | } |
| 66 | } |
| 67 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 68 | /* |
| 69 | * Used only when restoring keyset data from persistent storage. Must |
| 70 | * correspond to a defined-keyset. |
| 71 | */ |
dcashman | 8c04fac | 2015-03-23 11:39:42 -0700 | [diff] [blame] | 72 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 73 | protected void addUpgradeKeySetById(long ks) { |
dcashman | 8c04fac | 2015-03-23 11:39:42 -0700 | [diff] [blame] | 74 | mUpgradeKeySets = ArrayUtils.appendLong(mUpgradeKeySets, ks); |
Geremy Condra | cdb5789 | 2013-03-26 16:22:36 -0700 | [diff] [blame] | 75 | } |
| 76 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 77 | protected void removeAllUpgradeKeySets() { |
| 78 | mUpgradeKeySets = null; |
| 79 | return; |
Geremy Condra | f1bcca8 | 2013-01-07 22:35:24 -0800 | [diff] [blame] | 80 | } |
| 81 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 82 | protected long[] getUpgradeKeySets() { |
| 83 | return mUpgradeKeySets; |
| 84 | } |
| 85 | |
Jeff Sharkey | 9f837a9 | 2014-10-24 12:07:24 -0700 | [diff] [blame] | 86 | protected ArrayMap<String, Long> getAliases() { |
Geremy Condra | f1bcca8 | 2013-01-07 22:35:24 -0800 | [diff] [blame] | 87 | return mKeySetAliases; |
| 88 | } |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 89 | |
dcashman | 8c04fac | 2015-03-23 11:39:42 -0700 | [diff] [blame] | 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 | |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 116 | protected boolean isUsingDefinedKeySets() { |
| 117 | |
dcashman | 8c04fac | 2015-03-23 11:39:42 -0700 | [diff] [blame] | 118 | /* should never be the case that mUpgradeKeySets.length == 0 */ |
| 119 | return (mKeySetAliases.size() > 0); |
dcashman | 55b1078 | 2014-04-09 14:20:38 -0700 | [diff] [blame] | 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 | } |
Jeff Sharkey | 57dcf5b | 2014-06-18 17:46:05 -0700 | [diff] [blame] | 127 | } |