summaryrefslogtreecommitdiffstats
path: root/core/java/android/content
diff options
context:
space:
mode:
authorKenny Root <kroot@google.com>2011-09-13 17:51:08 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-09-13 17:51:08 -0700
commitc924fbd6933f6a96588b6e78d385082155cfd236 (patch)
tree1b5669c99d9e2bbf07dfcbe3a7be38591fe3e28d /core/java/android/content
parent3f0c821740305c352eb355ba3d72906a7a97751c (diff)
parent0aaa0d931716e9f57a1d84d795fab2df75092756 (diff)
downloadframeworks_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')
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/ActivityInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/ApplicationInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/ConfigurationInfo.java0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/FeatureInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/IPackageDataObserver.aidl0
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl3
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/IPackageStatsObserver.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/InstrumentationInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/ManifestDigest.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/PackageInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/PackageInfoLite.aidl0
-rw-r--r--core/java/android/content/pm/PackageManager.java10
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/PackageStats.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/PackageStats.java0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/ParceledListSlice.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/PermissionGroupInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/PermissionInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/ProviderInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/ResolveInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/ServiceInfo.aidl0
-rw-r--r--[-rwxr-xr-x]core/java/android/content/pm/Signature.aidl0
-rw-r--r--core/java/android/content/pm/VerifierDeviceIdentity.aidl19
-rw-r--r--core/java/android/content/pm/VerifierDeviceIdentity.java231
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];
+ }
+ };
+}