diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/content/pm/Signature.java | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/core/java/android/content/pm/Signature.java b/core/java/android/content/pm/Signature.java index b32664eefc3c..c6aefb87c723 100644 --- a/core/java/android/content/pm/Signature.java +++ b/core/java/android/content/pm/Signature.java @@ -16,7 +16,6 @@ package android.content.pm; -import android.content.ComponentName; import android.os.Parcel; import android.os.Parcelable; @@ -40,26 +39,41 @@ public class Signature implements Parcelable { mSignature = signature.clone(); } + private static final int parseHexDigit(int nibble) { + if ('0' <= nibble && nibble <= '9') { + return nibble - '0'; + } else if ('a' <= nibble && nibble <= 'f') { + return nibble - 'a' + 10; + } else if ('A' <= nibble && nibble <= 'F') { + return nibble - 'A' + 10; + } else { + throw new IllegalArgumentException("Invalid character " + nibble + " in hex string"); + } + } + /** * Create Signature from a text representation previously returned by - * {@link #toChars} or {@link #toCharsString()}. + * {@link #toChars} or {@link #toCharsString()}. Signatures are expected to + * be a hex-encoded ASCII string. + * + * @param text hex-encoded string representing the signature + * @throws IllegalArgumentException when signature is odd-length */ public Signature(String text) { final byte[] input = text.getBytes(); final int N = input.length; + + if (N % 2 != 0) { + throw new IllegalArgumentException("text size " + N + " is not even"); + } + final byte[] sig = new byte[N / 2]; int sigIndex = 0; for (int i = 0; i < N;) { - int b; - - final int hi = input[i++]; - b = (hi >= 'a' ? (hi - 'a' + 10) : (hi - '0')) << 4; - - final int lo = input[i++]; - b |= (lo >= 'a' ? (lo - 'a' + 10) : (lo - '0')) & 0x0F; - - sig[sigIndex++] = (byte) (b & 0xFF); + final int hi = parseHexDigit(input[i++]); + final int lo = parseHexDigit(input[i++]); + sig[sigIndex++] = (byte) ((hi << 4) | lo); } mSignature = sig; @@ -100,8 +114,7 @@ public class Signature implements Parcelable { } /** - * Return the result of {@link #toChars()} as a String. This result is - * cached so future calls will return the same String. + * Return the result of {@link #toChars()} as a String. */ public String toCharsString() { String str = mStringRef == null ? null : mStringRef.get(); @@ -127,7 +140,7 @@ public class Signature implements Parcelable { try { if (obj != null) { Signature other = (Signature)obj; - return Arrays.equals(mSignature, other.mSignature); + return this == other || Arrays.equals(mSignature, other.mSignature); } } catch (ClassCastException e) { } |
