diff options
author | Kenny Root <kroot@google.com> | 2011-09-13 17:51:08 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-09-13 17:51:08 -0700 |
commit | c924fbd6933f6a96588b6e78d385082155cfd236 (patch) | |
tree | 1b5669c99d9e2bbf07dfcbe3a7be38591fe3e28d /core/java/android/content | |
parent | 3f0c821740305c352eb355ba3d72906a7a97751c (diff) | |
parent | 0aaa0d931716e9f57a1d84d795fab2df75092756 (diff) | |
download | frameworks_base-c924fbd6933f6a96588b6e78d385082155cfd236.zip frameworks_base-c924fbd6933f6a96588b6e78d385082155cfd236.tar.gz frameworks_base-c924fbd6933f6a96588b6e78d385082155cfd236.tar.bz2 |
Merge "Add verifier device identity"
Diffstat (limited to 'core/java/android/content')
23 files changed, 263 insertions, 0 deletions
diff --git a/core/java/android/content/pm/ActivityInfo.aidl b/core/java/android/content/pm/ActivityInfo.aidl index dd90302..dd90302 100755..100644 --- a/core/java/android/content/pm/ActivityInfo.aidl +++ b/core/java/android/content/pm/ActivityInfo.aidl diff --git a/core/java/android/content/pm/ApplicationInfo.aidl b/core/java/android/content/pm/ApplicationInfo.aidl index 006d1bd..006d1bd 100755..100644 --- a/core/java/android/content/pm/ApplicationInfo.aidl +++ b/core/java/android/content/pm/ApplicationInfo.aidl diff --git a/core/java/android/content/pm/ConfigurationInfo.java b/core/java/android/content/pm/ConfigurationInfo.java index 8edd436..8edd436 100755..100644 --- a/core/java/android/content/pm/ConfigurationInfo.java +++ b/core/java/android/content/pm/ConfigurationInfo.java diff --git a/core/java/android/content/pm/FeatureInfo.aidl b/core/java/android/content/pm/FeatureInfo.aidl index d84a84c..d84a84c 100755..100644 --- a/core/java/android/content/pm/FeatureInfo.aidl +++ b/core/java/android/content/pm/FeatureInfo.aidl diff --git a/core/java/android/content/pm/IPackageDataObserver.aidl b/core/java/android/content/pm/IPackageDataObserver.aidl index d010ee4..d010ee4 100755..100644 --- a/core/java/android/content/pm/IPackageDataObserver.aidl +++ b/core/java/android/content/pm/IPackageDataObserver.aidl diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 08aef16..5e6e768 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -38,6 +38,7 @@ import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.UserInfo; +import android.content.pm.VerifierDeviceIdentity; import android.net.Uri; import android.content.IntentSender; @@ -359,4 +360,6 @@ interface IPackageManager { in ManifestDigest manifestDigest); void verifyPendingInstall(int id, boolean verified, in String message); + + VerifierDeviceIdentity getVerifierDeviceIdentity(); } diff --git a/core/java/android/content/pm/IPackageStatsObserver.aidl b/core/java/android/content/pm/IPackageStatsObserver.aidl index ede4d1d..ede4d1d 100755..100644 --- a/core/java/android/content/pm/IPackageStatsObserver.aidl +++ b/core/java/android/content/pm/IPackageStatsObserver.aidl diff --git a/core/java/android/content/pm/InstrumentationInfo.aidl b/core/java/android/content/pm/InstrumentationInfo.aidl index 3d847ae..3d847ae 100755..100644 --- a/core/java/android/content/pm/InstrumentationInfo.aidl +++ b/core/java/android/content/pm/InstrumentationInfo.aidl diff --git a/core/java/android/content/pm/ManifestDigest.aidl b/core/java/android/content/pm/ManifestDigest.aidl index ebabab0..ebabab0 100755..100644 --- a/core/java/android/content/pm/ManifestDigest.aidl +++ b/core/java/android/content/pm/ManifestDigest.aidl diff --git a/core/java/android/content/pm/PackageInfo.aidl b/core/java/android/content/pm/PackageInfo.aidl index 35e2322..35e2322 100755..100644 --- a/core/java/android/content/pm/PackageInfo.aidl +++ b/core/java/android/content/pm/PackageInfo.aidl diff --git a/core/java/android/content/pm/PackageInfoLite.aidl b/core/java/android/content/pm/PackageInfoLite.aidl index 2c80942..2c80942 100755..100644 --- a/core/java/android/content/pm/PackageInfoLite.aidl +++ b/core/java/android/content/pm/PackageInfoLite.aidl diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index b4e3988..dcb6776 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2614,4 +2614,14 @@ public abstract class PackageManager { public static int getAppId(int uid) { return uid % PER_USER_RANGE; } + + /** + * Returns the device identity that verifiers can use to associate their + * scheme to a particular device. This should not be used by anything other + * than a package verifier. + * + * @return identity that uniquely identifies current device + * @hide + */ + public abstract VerifierDeviceIdentity getVerifierDeviceIdentity(); } diff --git a/core/java/android/content/pm/PackageStats.aidl b/core/java/android/content/pm/PackageStats.aidl index 8c9786f..8c9786f 100755..100644 --- a/core/java/android/content/pm/PackageStats.aidl +++ b/core/java/android/content/pm/PackageStats.aidl diff --git a/core/java/android/content/pm/PackageStats.java b/core/java/android/content/pm/PackageStats.java index 1205da7..1205da7 100755..100644 --- a/core/java/android/content/pm/PackageStats.java +++ b/core/java/android/content/pm/PackageStats.java diff --git a/core/java/android/content/pm/ParceledListSlice.aidl b/core/java/android/content/pm/ParceledListSlice.aidl index c02cc6a..c02cc6a 100755..100644 --- a/core/java/android/content/pm/ParceledListSlice.aidl +++ b/core/java/android/content/pm/ParceledListSlice.aidl diff --git a/core/java/android/content/pm/PermissionGroupInfo.aidl b/core/java/android/content/pm/PermissionGroupInfo.aidl index 9f215f1..9f215f1 100755..100644 --- a/core/java/android/content/pm/PermissionGroupInfo.aidl +++ b/core/java/android/content/pm/PermissionGroupInfo.aidl diff --git a/core/java/android/content/pm/PermissionInfo.aidl b/core/java/android/content/pm/PermissionInfo.aidl index 5a7d4f4..5a7d4f4 100755..100644 --- a/core/java/android/content/pm/PermissionInfo.aidl +++ b/core/java/android/content/pm/PermissionInfo.aidl diff --git a/core/java/android/content/pm/ProviderInfo.aidl b/core/java/android/content/pm/ProviderInfo.aidl index 18fbc8a..18fbc8a 100755..100644 --- a/core/java/android/content/pm/ProviderInfo.aidl +++ b/core/java/android/content/pm/ProviderInfo.aidl diff --git a/core/java/android/content/pm/ResolveInfo.aidl b/core/java/android/content/pm/ResolveInfo.aidl index b4e7f8b..b4e7f8b 100755..100644 --- a/core/java/android/content/pm/ResolveInfo.aidl +++ b/core/java/android/content/pm/ResolveInfo.aidl diff --git a/core/java/android/content/pm/ServiceInfo.aidl b/core/java/android/content/pm/ServiceInfo.aidl index 5ddae1a..5ddae1a 100755..100644 --- a/core/java/android/content/pm/ServiceInfo.aidl +++ b/core/java/android/content/pm/ServiceInfo.aidl diff --git a/core/java/android/content/pm/Signature.aidl b/core/java/android/content/pm/Signature.aidl index 3a0d775..3a0d775 100755..100644 --- a/core/java/android/content/pm/Signature.aidl +++ b/core/java/android/content/pm/Signature.aidl diff --git a/core/java/android/content/pm/VerifierDeviceIdentity.aidl b/core/java/android/content/pm/VerifierDeviceIdentity.aidl new file mode 100644 index 0000000..eb076ae --- /dev/null +++ b/core/java/android/content/pm/VerifierDeviceIdentity.aidl @@ -0,0 +1,19 @@ +/* + * Copyright 2011, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +parcelable VerifierDeviceIdentity; diff --git a/core/java/android/content/pm/VerifierDeviceIdentity.java b/core/java/android/content/pm/VerifierDeviceIdentity.java new file mode 100644 index 0000000..bfebe0f --- /dev/null +++ b/core/java/android/content/pm/VerifierDeviceIdentity.java @@ -0,0 +1,231 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.content.pm; + +import android.os.Parcel; +import android.os.Parcelable; + +import java.io.UnsupportedEncodingException; +import java.security.SecureRandom; +import java.util.Random; + +/** + * An identity that uniquely identifies a particular device. In this + * implementation, the identity is represented as a 64-bit integer encoded to a + * 13-character string using RFC 4648's Base32 encoding without the trailing + * padding. This makes it easy for users to read and write the code without + * confusing 'I' (letter) with '1' (one) or 'O' (letter) with '0' (zero). + * + * @hide + */ +public class VerifierDeviceIdentity implements Parcelable { + /** + * Encoded size of a long (64-bit) into Base32. This format will end up + * looking like XXXX-XXXX-XXXX-X (length ignores hyphens) when applied with + * the GROUP_SIZE below. + */ + private static final int LONG_SIZE = 13; + + /** + * Size of groupings when outputting as strings. This helps people read it + * out and keep track of where they are. + */ + private static final int GROUP_SIZE = 4; + + private final long mIdentity; + + private final String mIdentityString; + + /** + * Create a verifier device identity from a long. + * + * @param identity device identity in a 64-bit integer. + * @throws + */ + public VerifierDeviceIdentity(long identity) { + mIdentity = identity; + mIdentityString = encodeBase32(identity); + } + + private VerifierDeviceIdentity(Parcel source) { + final long identity = source.readLong(); + + mIdentity = identity; + mIdentityString = encodeBase32(identity); + } + + /** + * Generate a new device identity. + * + * @return random uniformly-distributed device identity + */ + public static VerifierDeviceIdentity generate() { + final SecureRandom sr = new SecureRandom(); + return generate(sr); + } + + /** + * Generate a new device identity using a provided random number generator + * class. This is used for testing. + * + * @param rng random number generator to retrieve the next long from + * @return verifier device identity based on the input from the provided + * random number generator + */ + static VerifierDeviceIdentity generate(Random rng) { + long identity = rng.nextLong(); + return new VerifierDeviceIdentity(identity); + } + + private static final char ENCODE[] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', '2', '3', '4', '5', '6', '7', + }; + + private static final char SEPARATOR = '-'; + + private static final String encodeBase32(long input) { + final char[] alphabet = ENCODE; + + /* + * Make a character array with room for the separators between each + * group. + */ + final char encoded[] = new char[LONG_SIZE + (LONG_SIZE / GROUP_SIZE)]; + + int index = encoded.length; + for (int i = 0; i < LONG_SIZE; i++) { + /* + * Make sure we don't put a separator at the beginning. Since we're + * building from the rear of the array, we use (LONG_SIZE % + * GROUP_SIZE) to make the odd-size group appear at the end instead + * of the beginning. + */ + if (i > 0 && (i % GROUP_SIZE) == (LONG_SIZE % GROUP_SIZE)) { + encoded[--index] = SEPARATOR; + } + + /* + * Extract 5 bits of data, then shift it out. + */ + final int group = (int) (input & 0x1F); + input >>>= 5; + + encoded[--index] = alphabet[group]; + } + + return String.valueOf(encoded); + } + + // TODO move this out to its own class (android.util.Base32) + private static final long decodeBase32(byte[] input) throws IllegalArgumentException { + long output = 0L; + int numParsed = 0; + + final int N = input.length; + for (int i = 0; i < N; i++) { + final int group = input[i]; + + /* + * This essentially does the reverse of the ENCODED alphabet above + * without a table. A..Z are 0..25 and 2..7 are 26..31. + */ + final int value; + if ('A' <= group && group <= 'Z') { + value = group - 'A'; + } else if ('2' <= group && group <= '7') { + value = group - ('2' - 26); + } else if (group == SEPARATOR) { + continue; + } else { + throw new IllegalArgumentException("base base-32 character: " + group); + } + + output = (output << 5) | value; + numParsed++; + + if (numParsed == 1) { + if ((value & 0xF) != value) { + throw new IllegalArgumentException("illegal start character; will overflow"); + } + } else if (numParsed > 13) { + throw new IllegalArgumentException("too long; should have 13 characters"); + } + } + + if (numParsed != 13) { + throw new IllegalArgumentException("too short; should have 13 characters"); + } + + return output; + } + + @Override + public int hashCode() { + return (int) mIdentity; + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof VerifierDeviceIdentity)) { + return false; + } + + final VerifierDeviceIdentity o = (VerifierDeviceIdentity) other; + return mIdentity == o.mIdentity; + } + + @Override + public String toString() { + return mIdentityString; + } + + public static VerifierDeviceIdentity parse(String deviceIdentity) + throws IllegalArgumentException { + final byte[] input; + try { + input = deviceIdentity.getBytes("US-ASCII"); + } catch (UnsupportedEncodingException e) { + throw new IllegalArgumentException("bad base-32 characters in input"); + } + + return new VerifierDeviceIdentity(decodeBase32(input)); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(mIdentity); + } + + public static final Parcelable.Creator<VerifierDeviceIdentity> CREATOR + = new Parcelable.Creator<VerifierDeviceIdentity>() { + public VerifierDeviceIdentity createFromParcel(Parcel source) { + return new VerifierDeviceIdentity(source); + } + + public VerifierDeviceIdentity[] newArray(int size) { + return new VerifierDeviceIdentity[size]; + } + }; +} |