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

Commit 47670548 authored by Eran Messeri's avatar Eran Messeri
Browse files

Keystore: Fix KeyGenParameterSpec parceling

Fix the way KeyGenParameterSpec is parceled, by correctly handling
default and null values for some of the fields.

A recent CL added the ability to parcel/unparcel KeyGenParameterSpec (by
a separate class).
Due to refactoring late in the CL review cycle, the parceling code did
not take into account a few edge cases.

Unit tests:
m -j KeystoreTests && adb install -r out/target/product/marlin/data/app/KeystoreTests/KeystoreTests.apk
adb shell am instrument 'android.security.tests/android.support.test.runner.AndroidJUnitRunner'

CTS tests:
cts-tradefed run commandAndExit cts-dev -a armeabi-v7a -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.DeviceOwnerTest#testKeyManagement -l DEBUG

Bug: 69337278
Test: Keystore unit tets (see instructions above) and cts Key Management test.
Change-Id: Ie08f42b07fb55b6fa1d8fb73c89d69687c97e214
parent b8f2728a
Loading
Loading
Loading
Loading
+25 −10
Original line number Original line Diff line number Diff line
@@ -81,12 +81,16 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable {
        }
        }
        out.writeByteArray(mSpec.getCertificateSubject().getEncoded());
        out.writeByteArray(mSpec.getCertificateSubject().getEncoded());
        out.writeByteArray(mSpec.getCertificateSerialNumber().toByteArray());
        out.writeByteArray(mSpec.getCertificateSerialNumber().toByteArray());
        writeOptionalDate(out, mSpec.getCertificateNotBefore());
        out.writeLong(mSpec.getCertificateNotBefore().getTime());
        writeOptionalDate(out, mSpec.getCertificateNotAfter());
        out.writeLong(mSpec.getCertificateNotAfter().getTime());
        writeOptionalDate(out, mSpec.getKeyValidityStart());
        writeOptionalDate(out, mSpec.getKeyValidityStart());
        writeOptionalDate(out, mSpec.getKeyValidityForOriginationEnd());
        writeOptionalDate(out, mSpec.getKeyValidityForOriginationEnd());
        writeOptionalDate(out, mSpec.getKeyValidityForConsumptionEnd());
        writeOptionalDate(out, mSpec.getKeyValidityForConsumptionEnd());
        if (mSpec.isDigestsSpecified()) {
            out.writeStringArray(mSpec.getDigests());
            out.writeStringArray(mSpec.getDigests());
        } else {
            out.writeStringArray(null);
        }
        out.writeStringArray(mSpec.getEncryptionPaddings());
        out.writeStringArray(mSpec.getEncryptionPaddings());
        out.writeStringArray(mSpec.getSignaturePaddings());
        out.writeStringArray(mSpec.getSignaturePaddings());
        out.writeStringArray(mSpec.getBlockModes());
        out.writeStringArray(mSpec.getBlockModes());
@@ -111,9 +115,15 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable {
    private ParcelableKeyGenParameterSpec(Parcel in) {
    private ParcelableKeyGenParameterSpec(Parcel in) {
        String keystoreAlias = in.readString();
        String keystoreAlias = in.readString();
        int purposes = in.readInt();
        int purposes = in.readInt();
        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(keystoreAlias, purposes);
        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
                keystoreAlias, purposes);
        builder.setUid(in.readInt());
        builder.setUid(in.readInt());
        builder.setKeySize(in.readInt());
        // KeySize is -1 by default, if the KeyGenParameterSpec previously parcelled had the default
        // value, do not set it as this will cause setKeySize to throw.
        int keySize = in.readInt();
        if (keySize >= 0) {
            builder.setKeySize(keySize);
        }


        int keySpecType = in.readInt();
        int keySpecType = in.readInt();
        AlgorithmParameterSpec algorithmSpec = null;
        AlgorithmParameterSpec algorithmSpec = null;
@@ -128,17 +138,22 @@ public final class ParcelableKeyGenParameterSpec implements Parcelable {
            algorithmSpec = new ECGenParameterSpec(stdName);
            algorithmSpec = new ECGenParameterSpec(stdName);
        } else {
        } else {
            throw new IllegalArgumentException(
            throw new IllegalArgumentException(
                    String.format("Unknown algorithm parameter spec: %d", algorithmSpec));
                    String.format("Unknown algorithm parameter spec: %d", keySpecType));
        }
        }
        if (algorithmSpec != null) {
            builder.setAlgorithmParameterSpec(algorithmSpec);
            builder.setAlgorithmParameterSpec(algorithmSpec);
        }
        builder.setCertificateSubject(new X500Principal(in.createByteArray()));
        builder.setCertificateSubject(new X500Principal(in.createByteArray()));
        builder.setCertificateSerialNumber(new BigInteger(in.createByteArray()));
        builder.setCertificateSerialNumber(new BigInteger(in.createByteArray()));
        builder.setCertificateNotBefore(readDateOrNull(in));
        builder.setCertificateNotBefore(new Date(in.readLong()));
        builder.setCertificateNotAfter(readDateOrNull(in));
        builder.setCertificateNotAfter(new Date(in.readLong()));
        builder.setKeyValidityStart(readDateOrNull(in));
        builder.setKeyValidityStart(readDateOrNull(in));
        builder.setKeyValidityForOriginationEnd(readDateOrNull(in));
        builder.setKeyValidityForOriginationEnd(readDateOrNull(in));
        builder.setKeyValidityForConsumptionEnd(readDateOrNull(in));
        builder.setKeyValidityForConsumptionEnd(readDateOrNull(in));
        builder.setDigests(in.createStringArray());
        String[] digests = in.createStringArray();
        if (digests != null) {
            builder.setDigests(digests);
        }
        builder.setEncryptionPaddings(in.createStringArray());
        builder.setEncryptionPaddings(in.createStringArray());
        builder.setSignaturePaddings(in.createStringArray());
        builder.setSignaturePaddings(in.createStringArray());
        builder.setBlockModes(in.createStringArray());
        builder.setBlockModes(in.createStringArray());