Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5058d5e9 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Hand-migration to TypedXml interface.

Previous changes have applied mechanical refactorings, but this change
hand-migrates the remaining logic which was too complex to identify.

This change should have no behavior change; famous last words.

Bug: 171832118
Test: manual
Change-Id: I73f63cdb84d27e87c2af5a36d043cc225f1c749c
parent 1259c1fe
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -5626,10 +5626,23 @@ public class PackageParser {
            return null;
        }

        try {
            return parsePublicKey(Base64.decode(encodedPublicKey, Base64.DEFAULT));
        } catch (IllegalArgumentException e) {
            Slog.w(TAG, "Could not parse verifier public key; invalid Base64");
            return null;
        }
    }

    public static final PublicKey parsePublicKey(final byte[] publicKey) {
        if (publicKey == null) {
            Slog.w(TAG, "Could not parse null public key");
            return null;
        }

        EncodedKeySpec keySpec;
        try {
            final byte[] encoded = Base64.decode(encodedPublicKey, Base64.DEFAULT);
            keySpec = new X509EncodedKeySpec(encoded);
            keySpec = new X509EncodedKeySpec(publicKey);
        } catch (IllegalArgumentException e) {
            Slog.w(TAG, "Could not parse verifier public key; invalid Base64");
            return null;
+9 −0
Original line number Diff line number Diff line
@@ -16,14 +16,17 @@

package android.content.pm;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.TypedXmlSerializer;

import com.android.internal.util.ArrayUtils;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.security.PublicKey;
@@ -289,6 +292,12 @@ public class Signature implements Parcelable {
        }
    };

    /** {@hide} */
    public void writeToXmlAttributeBytesHex(@NonNull TypedXmlSerializer out,
            @Nullable String namespace, @NonNull String name) throws IOException {
        out.attributeBytesHex(namespace, name, mSignature);
    }

    private Signature(Parcel source) {
        mSignature = source.createByteArray();
    }
+2 −10
Original line number Diff line number Diff line
@@ -69,9 +69,9 @@ class CrossProfileIntentFilter extends IntentFilter {
    }

    CrossProfileIntentFilter(TypedXmlPullParser parser) throws XmlPullParserException, IOException {
        mTargetUserId = getIntFromXml(parser, ATTR_TARGET_USER_ID, UserHandle.USER_NULL);
        mTargetUserId = parser.getAttributeInt(null, ATTR_TARGET_USER_ID, UserHandle.USER_NULL);
        mOwnerPackage = getStringFromXml(parser, ATTR_OWNER_PACKAGE, "");
        mFlags = getIntFromXml(parser, ATTR_FLAGS, 0);
        mFlags = parser.getAttributeInt(null, ATTR_FLAGS, 0);

        int outerDepth = parser.getDepth();
        String tagName = parser.getName();
@@ -115,14 +115,6 @@ class CrossProfileIntentFilter extends IntentFilter {
        }
    }

    int getIntFromXml(TypedXmlPullParser parser, String attribute, int defaultValue) {
        String stringValue = getStringFromXml(parser, attribute, null);
        if (stringValue != null) {
            return Integer.parseInt(stringValue);
        }
        return defaultValue;
    }

    public void writeToXml(TypedXmlSerializer serializer) throws IOException {
        serializer.attributeInt(null, ATTR_TARGET_USER_ID, mTargetUserId);
        serializer.attributeInt(null, ATTR_FLAGS, mFlags);
+7 −12
Original line number Diff line number Diff line
@@ -596,6 +596,7 @@ public class KeySetManagerService {
        return;
    }

    @Deprecated
    public String encodePublicKey(PublicKey k) throws IOException {
        return new String(Base64.encode(k.getEncoded(), Base64.NO_WRAP));
    }
@@ -691,10 +692,9 @@ public class KeySetManagerService {
        for (int pKeyIndex = 0; pKeyIndex < mPublicKeys.size(); pKeyIndex++) {
            long id = mPublicKeys.keyAt(pKeyIndex);
            PublicKeyHandle pkh = mPublicKeys.valueAt(pKeyIndex);
            String encodedKey = encodePublicKey(pkh.getKey());
            serializer.startTag(null, "public-key");
            serializer.attributeLong(null, "identifier", id);
            serializer.attribute(null, "value", encodedKey);
            serializer.attributeBytesBase64(null, "value", pkh.getKey().getEncoded());
            serializer.endTag(null, "public-key");
        }
        serializer.endTag(null, "keys");
@@ -720,7 +720,6 @@ public class KeySetManagerService {
    void readKeySetsLPw(TypedXmlPullParser parser, ArrayMap<Long, Integer> keySetRefCounts)
            throws XmlPullParserException, IOException {
        int type;
        long currentKeySetId = 0;
        int outerDepth = parser.getDepth();
        String recordedVersionStr = parser.getAttributeValue(null, "version");
        if (recordedVersionStr == null) {
@@ -737,7 +736,6 @@ public class KeySetManagerService {
            }
            return;
        }
        int recordedVersion = Integer.parseInt(recordedVersionStr);
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
               && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
            if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
@@ -786,14 +784,12 @@ public class KeySetManagerService {
            }
            final String tagName = parser.getName();
            if (tagName.equals("keyset")) {
                String encodedID = parser.getAttributeValue(null, "identifier");
                currentKeySetId = Long.parseLong(encodedID);
                currentKeySetId = parser.getAttributeLong(null, "identifier");
                int refCount = 0;
                mKeySets.put(currentKeySetId, new KeySetHandle(currentKeySetId, refCount));
                mKeySetMapping.put(currentKeySetId, new ArraySet<Long>());
            } else if (tagName.equals("key-id")) {
                String encodedID = parser.getAttributeValue(null, "identifier");
                long id = Long.parseLong(encodedID);
                long id = parser.getAttributeLong(null, "identifier");
                mKeySetMapping.get(currentKeySetId).add(id);
            }
        }
@@ -801,11 +797,10 @@ public class KeySetManagerService {

    void readPublicKeyLPw(TypedXmlPullParser parser)
            throws XmlPullParserException {
        String encodedID = parser.getAttributeValue(null, "identifier");
        long identifier = Long.parseLong(encodedID);
        long identifier = parser.getAttributeLong(null, "identifier");
        int refCount = 0;
        String encodedPublicKey = parser.getAttributeValue(null, "value");
        PublicKey pub = PackageParser.parsePublicKey(encodedPublicKey);
        byte[] publicKey = parser.getAttributeBytesBase64(null, "value", null);
        PublicKey pub = PackageParser.parsePublicKey(publicKey);
        if (pub != null) {
            PublicKeyHandle pkh = new PublicKeyHandle(identifier, refCount, pub);
            mPublicKeys.put(identifier, pkh);
+18 −26
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ import com.android.internal.util.XmlUtils;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

import java.io.IOException;
import java.security.cert.CertificateException;
@@ -94,7 +93,7 @@ class PackageSignatures {
            if (j >= numWritten) {
                writtenSignatures.add(sig);
                serializer.attributeInt(null, "index", numWritten);
                serializer.attribute(null, "key", sig.toCharsString());
                sig.writeToXmlAttributeBytesHex(serializer, null, "key");
            }
            // The flags attribute is only written for previous signatures to represent the
            // capabilities the developer wants to grant to the previous signing certificates.
@@ -110,25 +109,21 @@ class PackageSignatures {
        PackageParser.SigningDetails.Builder builder =
                new PackageParser.SigningDetails.Builder();

        String countStr = parser.getAttributeValue(null, "count");
        if (countStr == null) {
        final int count = parser.getAttributeInt(null, "count", -1);
        if (count == -1) {
            PackageManagerService.reportSettingsProblem(Log.WARN,
                    "Error in package manager settings: <sigs> has"
                       + " no count at " + parser.getPositionDescription());
            XmlUtils.skipCurrentTag(parser);
            return;
        }
        final int count = Integer.parseInt(countStr);

        String schemeVersionStr = parser.getAttributeValue(null, "schemeVersion");
        int signatureSchemeVersion;
        if (schemeVersionStr == null) {
        final int signatureSchemeVersion = parser.getAttributeInt(null, "schemeVersion",
                SignatureSchemeVersion.UNKNOWN);
        if (signatureSchemeVersion == SignatureSchemeVersion.UNKNOWN) {
            PackageManagerService.reportSettingsProblem(Log.WARN,
                    "Error in package manager settings: <sigs> has no schemeVersion at "
                        + parser.getPositionDescription());
            signatureSchemeVersion = SignatureSchemeVersion.UNKNOWN;
        } else {
            signatureSchemeVersion = Integer.parseInt(schemeVersionStr);
        }
        builder.setSignatureSchemeVersion(signatureSchemeVersion);
        ArrayList<Signature> signatureList = new ArrayList<>();
@@ -170,15 +165,14 @@ class PackageSignatures {
            String tagName = parser.getName();
            if (tagName.equals("cert")) {
                if (pos < count) {
                    String index = parser.getAttributeValue(null, "index");
                    if (index != null) {
                    final int index = parser.getAttributeInt(null, "index", -1);
                    if (index != -1) {
                        boolean signatureParsed = false;
                        try {
                            int idx = Integer.parseInt(index);
                            String key = parser.getAttributeValue(null, "key");
                            final byte[] key = parser.getAttributeBytesHex(null, "key", null);
                            if (key == null) {
                                if (idx >= 0 && idx < readSignatures.size()) {
                                    Signature sig = readSignatures.get(idx);
                                if (index >= 0 && index < readSignatures.size()) {
                                    Signature sig = readSignatures.get(index);
                                    if (sig != null) {
                                        signatures.add(sig);
                                        signatureParsed = true;
@@ -198,7 +192,7 @@ class PackageSignatures {
                                // Create the signature first to prevent adding null entries to the
                                // output List if the key value is invalid.
                                Signature sig = new Signature(key);
                                while (readSignatures.size() < idx) {
                                while (readSignatures.size() < index) {
                                    readSignatures.add(null);
                                }
                                readSignatures.add(sig);
@@ -219,10 +213,9 @@ class PackageSignatures {
                        }

                        if (isPastSigs) {
                            String flagsStr = parser.getAttributeValue(null, "flags");
                            if (flagsStr != null) {
                            final int flagsValue = parser.getAttributeInt(null, "flags", -1);
                            if (flagsValue != -1) {
                                try {
                                    int flagsValue = Integer.parseInt(flagsStr);
                                    // only modify the flags if the signature of the previous signer
                                    // was successfully parsed above
                                    if (signatureParsed) {
@@ -237,7 +230,7 @@ class PackageSignatures {
                                } catch (NumberFormatException e) {
                                    PackageManagerService.reportSettingsProblem(Log.WARN,
                                            "Error in package manager settings: <cert> "
                                                    + "flags " + flagsStr + " is not a number at "
                                                    + "flags " + flagsValue + " is not a number at "
                                                    + parser.getPositionDescription());
                                }
                            } else {
@@ -262,8 +255,8 @@ class PackageSignatures {
            } else if (tagName.equals("pastSigs")) {
                if (!isPastSigs) {
                    // we haven't encountered pastSigs yet, go ahead
                    String countStr = parser.getAttributeValue(null, "count");
                    if (countStr == null) {
                    final int pastSigsCount = parser.getAttributeInt(null, "count", -1);
                    if (pastSigsCount == -1) {
                        PackageManagerService.reportSettingsProblem(Log.WARN,
                                "Error in package manager settings: <pastSigs> has"
                                        + " no count at " + parser.getPositionDescription());
@@ -271,7 +264,6 @@ class PackageSignatures {
                        continue;
                    }
                    try {
                        final int pastSigsCount = Integer.parseInt(countStr);
                        ArrayList<Signature> pastSignatureList = new ArrayList<>();
                        int pastSigsPos = readCertsListXml(parser, readSignatures,
                                pastSignatureList,
@@ -289,7 +281,7 @@ class PackageSignatures {
                    } catch (NumberFormatException e) {
                        PackageManagerService.reportSettingsProblem(Log.WARN,
                                "Error in package manager settings: <pastSigs> "
                                        + "count " + countStr + " is not a number at "
                                        + "count " + pastSigsCount + " is not a number at "
                                        + parser.getPositionDescription());
                    }
                } else {
Loading