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

Commit 06327bba authored by Hasini Gunasinghe's avatar Hasini Gunasinghe Committed by Android (Google) Code Review
Browse files

Merge "Keystore2 Metrics: System server rerouting" into sc-dev

parents c8bbb99a 932f870d
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -104,6 +104,7 @@ filegroup {
        ":android.security.apc-java-source",
        ":android.security.apc-java-source",
        ":android.security.authorization-java-source",
        ":android.security.authorization-java-source",
        ":android.security.maintenance-java-source",
        ":android.security.maintenance-java-source",
        ":android.security.metrics-java-source",
        ":android.security.vpnprofilestore-java-source",
        ":android.security.vpnprofilestore-java-source",
        ":android.system.keystore2-V1-java-source",
        ":android.system.keystore2-V1-java-source",
        ":credstore_aidl",
        ":credstore_aidl",
+309 −0
Original line number Original line Diff line number Diff line
@@ -117,6 +117,7 @@ import android.os.Parcelable;
import android.os.Process;
import android.os.Process;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.ServiceSpecificException;
import android.os.StatFs;
import android.os.StatFs;
import android.os.SynchronousResultReceiver;
import android.os.SynchronousResultReceiver;
import android.os.SystemClock;
import android.os.SystemClock;
@@ -132,6 +133,18 @@ import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
import android.os.storage.VolumeInfo;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.provider.Settings;
import android.security.metrics.IKeystoreMetrics;
import android.security.metrics.KeyCreationWithAuthInfo;
import android.security.metrics.KeyCreationWithGeneralInfo;
import android.security.metrics.KeyCreationWithPurposeAndModesInfo;
import android.security.metrics.KeyOperationWithGeneralInfo;
import android.security.metrics.KeyOperationWithPurposeAndModesInfo;
import android.security.metrics.Keystore2AtomWithOverflow;
import android.security.metrics.KeystoreAtom;
import android.security.metrics.KeystoreAtomPayload;
import android.security.metrics.RkpErrorStats;
import android.security.metrics.RkpPoolStats;
import android.security.metrics.StorageStats;
import android.stats.storage.StorageEnums;
import android.stats.storage.StorageEnums;
import android.telephony.ModemActivityInfo;
import android.telephony.ModemActivityInfo;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionInfo;
@@ -373,6 +386,10 @@ public class StatsPullAtomService extends SystemService {


    private SelectedProcessCpuThreadReader mSurfaceFlingerProcessCpuThreadReader;
    private SelectedProcessCpuThreadReader mSurfaceFlingerProcessCpuThreadReader;


    // Only access via getIKeystoreMetricsService
    @GuardedBy("mKeystoreLock")
    private IKeystoreMetrics mIKeystoreMetrics;

    // Puller locks
    // Puller locks
    private final Object mDataBytesTransferLock = new Object();
    private final Object mDataBytesTransferLock = new Object();
    private final Object mBluetoothBytesTransferLock = new Object();
    private final Object mBluetoothBytesTransferLock = new Object();
@@ -428,6 +445,7 @@ public class StatsPullAtomService extends SystemService {
    private final Object mAttributedAppOpsLock = new Object();
    private final Object mAttributedAppOpsLock = new Object();
    private final Object mSettingsStatsLock = new Object();
    private final Object mSettingsStatsLock = new Object();
    private final Object mInstalledIncrementalPackagesLock = new Object();
    private final Object mInstalledIncrementalPackagesLock = new Object();
    private final Object mKeystoreLock = new Object();


    public StatsPullAtomService(Context context) {
    public StatsPullAtomService(Context context) {
        super(context);
        super(context);
@@ -435,6 +453,7 @@ public class StatsPullAtomService extends SystemService {
    }
    }


    private native void initializeNativePullers();
    private native void initializeNativePullers();

    /**
    /**
     * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would
     * Use of this StatsPullAtomCallbackImpl means we avoid one class per tagId, which we would
     * get if we used lambdas.
     * get if we used lambdas.
@@ -703,6 +722,16 @@ public class StatsPullAtomService extends SystemService {
                        synchronized (mInstalledIncrementalPackagesLock) {
                        synchronized (mInstalledIncrementalPackagesLock) {
                            return pullInstalledIncrementalPackagesLocked(atomTag, data);
                            return pullInstalledIncrementalPackagesLocked(atomTag, data);
                        }
                        }
                    case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS:
                    case FrameworkStatsLog.RKP_POOL_STATS:
                    case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO:
                    case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO:
                    case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO:
                    case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW:
                    case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO:
                    case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO:
                    case FrameworkStatsLog.RKP_ERROR_STATS:
                        return pullKeystoreAtoms(atomTag, data);
                    default:
                    default:
                        throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
                        throw new UnsupportedOperationException("Unknown tagId=" + atomTag);
                }
                }
@@ -795,6 +824,8 @@ public class StatsPullAtomService extends SystemService {


        mSurfaceFlingerProcessCpuThreadReader =
        mSurfaceFlingerProcessCpuThreadReader =
                new SelectedProcessCpuThreadReader("/system/bin/surfaceflinger");
                new SelectedProcessCpuThreadReader("/system/bin/surfaceflinger");

        getIKeystoreMetricsService();
    }
    }


    void registerEventListeners() {
    void registerEventListeners() {
@@ -887,6 +918,15 @@ public class StatsPullAtomService extends SystemService {
        registerBatteryCycleCount();
        registerBatteryCycleCount();
        registerSettingsStats();
        registerSettingsStats();
        registerInstalledIncrementalPackages();
        registerInstalledIncrementalPackages();
        registerKeystoreStorageStats();
        registerRkpPoolStats();
        registerKeystoreKeyCreationWithGeneralInfo();
        registerKeystoreKeyCreationWithAuthInfo();
        registerKeystoreKeyCreationWithPurposeModesInfo();
        registerKeystoreAtomWithOverflow();
        registerKeystoreKeyOperationWithPurposeAndModesInfo();
        registerKeystoreKeyOperationWithGeneralInfo();
        registerRkpErrorStats();
    }
    }


    private void initAndRegisterNetworkStatsPullers() {
    private void initAndRegisterNetworkStatsPullers() {
@@ -971,6 +1011,28 @@ public class StatsPullAtomService extends SystemService {
        }
        }
    }
    }


    private IKeystoreMetrics getIKeystoreMetricsService() {
        synchronized (mKeystoreLock) {
            if (mIKeystoreMetrics == null) {
                mIKeystoreMetrics = IKeystoreMetrics.Stub.asInterface(
                        ServiceManager.getService("android.security.metrics"));
                if (mIKeystoreMetrics != null) {
                    try {
                        mIKeystoreMetrics.asBinder().linkToDeath(() -> {
                            synchronized (mKeystoreLock) {
                                mIKeystoreMetrics = null;
                            }
                        }, /* flags */ 0);
                    } catch (RemoteException e) {
                        Slog.e(TAG, "linkToDeath with IKeystoreMetrics failed", e);
                        mIKeystoreMetrics = null;
                    }
                }
            }
            return mIKeystoreMetrics;
        }
    }

    private IStoraged getIStoragedService() {
    private IStoraged getIStoragedService() {
        synchronized (mStoragedLock) {
        synchronized (mStoragedLock) {
            if (mStorageService == null) {
            if (mStorageService == null) {
@@ -4005,6 +4067,253 @@ public class StatsPullAtomService extends SystemService {
        return StatsManager.PULL_SUCCESS;
        return StatsManager.PULL_SUCCESS;
    }
    }


    private void registerKeystoreStorageStats() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.KEYSTORE2_STORAGE_STATS,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    private void registerRkpPoolStats() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.RKP_POOL_STATS,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    private void registerKeystoreKeyCreationWithGeneralInfo() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    private void registerKeystoreKeyCreationWithAuthInfo() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    private void registerKeystoreKeyCreationWithPurposeModesInfo() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    private void registerKeystoreAtomWithOverflow() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    private void registerKeystoreKeyOperationWithPurposeAndModesInfo() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    private void registerKeystoreKeyOperationWithGeneralInfo() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    private void registerRkpErrorStats() {
        mStatsManager.setPullAtomCallback(
                FrameworkStatsLog.RKP_ERROR_STATS,
                null, // use default PullAtomMetadata values,
                DIRECT_EXECUTOR,
                mStatsCallbackImpl);
    }

    int parseKeystoreStorageStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.storageStats) {
                return StatsManager.PULL_SKIP;
            }
            StorageStats atom = atomWrapper.payload.getStorageStats();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.KEYSTORE2_STORAGE_STATS, atom.storage_type,
                    atom.size, atom.unused_size));
        }
        return StatsManager.PULL_SUCCESS;
    }

    int parseRkpPoolStats(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpPoolStats) {
                return StatsManager.PULL_SKIP;
            }
            RkpPoolStats atom = atomWrapper.payload.getRkpPoolStats();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.RKP_POOL_STATS, atom.pool_status, atom.count_of_keys));
        }
        return StatsManager.PULL_SUCCESS;
    }

    int parseKeystoreKeyCreationWithGeneralInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag()
                    != KeystoreAtomPayload.keyCreationWithGeneralInfo) {
                return StatsManager.PULL_SKIP;
            }
            KeyCreationWithGeneralInfo atom = atomWrapper.payload.getKeyCreationWithGeneralInfo();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO, atom.algorithm,
                    atom.key_size, atom.ec_curve, atom.key_origin, atom.error_code,
                    atom.attestation_requested, atomWrapper.count));
        }
        return StatsManager.PULL_SUCCESS;
    }

    int parseKeystoreKeyCreationWithAuthInfo(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.keyCreationWithAuthInfo) {
                return StatsManager.PULL_SKIP;
            }
            KeyCreationWithAuthInfo atom = atomWrapper.payload.getKeyCreationWithAuthInfo();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO, atom.user_auth_type,
                    atom.log10_auth_key_timeout_seconds, atom.security_level, atomWrapper.count));
        }
        return StatsManager.PULL_SUCCESS;
    }


    int parseKeystoreKeyCreationWithPurposeModesInfo(KeystoreAtom[] atoms,
            List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag()
                    != KeystoreAtomPayload.keyCreationWithPurposeAndModesInfo) {
                return StatsManager.PULL_SKIP;
            }
            KeyCreationWithPurposeAndModesInfo atom =
                    atomWrapper.payload.getKeyCreationWithPurposeAndModesInfo();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO,
                    atom.algorithm, atom.purpose_bitmap,
                    atom.padding_mode_bitmap, atom.digest_bitmap, atom.block_mode_bitmap,
                    atomWrapper.count));
        }
        return StatsManager.PULL_SUCCESS;
    }

    int parseKeystoreAtomWithOverflow(KeystoreAtom[] atoms, List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag()
                    != KeystoreAtomPayload.keystore2AtomWithOverflow) {
                return StatsManager.PULL_SKIP;
            }
            Keystore2AtomWithOverflow atom = atomWrapper.payload.getKeystore2AtomWithOverflow();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW, atom.atom_id,
                    atomWrapper.count));
        }
        return StatsManager.PULL_SUCCESS;
    }

    int parseKeystoreKeyOperationWithPurposeModesInfo(KeystoreAtom[] atoms,
            List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag()
                    != KeystoreAtomPayload.keyOperationWithPurposeAndModesInfo) {
                return StatsManager.PULL_SKIP;
            }
            KeyOperationWithPurposeAndModesInfo atom =
                    atomWrapper.payload.getKeyOperationWithPurposeAndModesInfo();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO,
                    atom.purpose, atom.padding_mode_bitmap, atom.digest_bitmap,
                    atom.block_mode_bitmap, atomWrapper.count));
        }
        return StatsManager.PULL_SUCCESS;
    }

    int parseKeystoreKeyOperationWithGeneralInfo(KeystoreAtom[] atoms,
            List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag()
                    != KeystoreAtomPayload.keyOperationWithGeneralInfo) {
                return StatsManager.PULL_SKIP;
            }
            KeyOperationWithGeneralInfo atom = atomWrapper.payload.getKeyOperationWithGeneralInfo();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO, atom.outcome,
                    atom.error_code, atom.key_upgraded, atom.security_level, atomWrapper.count));
        }
        return StatsManager.PULL_SUCCESS;
    }

    int parseRkpErrorStats(KeystoreAtom[] atoms,
            List<StatsEvent> pulledData) {
        for (KeystoreAtom atomWrapper : atoms) {
            if (atomWrapper.payload.getTag() != KeystoreAtomPayload.rkpErrorStats) {
                return StatsManager.PULL_SKIP;
            }
            RkpErrorStats atom = atomWrapper.payload.getRkpErrorStats();
            pulledData.add(FrameworkStatsLog.buildStatsEvent(
                    FrameworkStatsLog.RKP_ERROR_STATS, atom.rkpError, atomWrapper.count));
        }
        return StatsManager.PULL_SUCCESS;
    }

    int pullKeystoreAtoms(int atomTag, List<StatsEvent> pulledData) {
        IKeystoreMetrics keystoreMetricsService = getIKeystoreMetricsService();
        if (keystoreMetricsService == null) {
            Slog.w(TAG, "Keystore service is null");
            return StatsManager.PULL_SKIP;
        }
        final long callingToken = Binder.clearCallingIdentity();
        try {
            KeystoreAtom[] atoms = keystoreMetricsService.pullMetrics(atomTag);
            switch (atomTag) {
                case FrameworkStatsLog.KEYSTORE2_STORAGE_STATS:
                    return parseKeystoreStorageStats(atoms, pulledData);
                case FrameworkStatsLog.RKP_POOL_STATS:
                    return parseRkpPoolStats(atoms, pulledData);
                case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_GENERAL_INFO:
                    return parseKeystoreKeyCreationWithGeneralInfo(atoms, pulledData);
                case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_AUTH_INFO:
                    return parseKeystoreKeyCreationWithAuthInfo(atoms, pulledData);
                case FrameworkStatsLog.KEYSTORE2_KEY_CREATION_WITH_PURPOSE_AND_MODES_INFO:
                    return parseKeystoreKeyCreationWithPurposeModesInfo(atoms, pulledData);
                case FrameworkStatsLog.KEYSTORE2_ATOM_WITH_OVERFLOW:
                    return parseKeystoreAtomWithOverflow(atoms, pulledData);
                case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_PURPOSE_AND_MODES_INFO:
                    return parseKeystoreKeyOperationWithPurposeModesInfo(atoms, pulledData);
                case FrameworkStatsLog.KEYSTORE2_KEY_OPERATION_WITH_GENERAL_INFO:
                    return parseKeystoreKeyOperationWithGeneralInfo(atoms, pulledData);
                case FrameworkStatsLog.RKP_ERROR_STATS:
                    return parseRkpErrorStats(atoms, pulledData);
                default:
                    Slog.w(TAG, "Unsupported keystore atom: " + atomTag);
                    return StatsManager.PULL_SKIP;
            }
        } catch (RemoteException e) {
            // Should not happen.
            Slog.e(TAG, "Disconnected from keystore service. Cannot pull.", e);
            return StatsManager.PULL_SKIP;
        } catch (ServiceSpecificException e) {
            Slog.e(TAG, "pulling keystore metrics failed", e);
            return StatsManager.PULL_SKIP;
        } finally {
            Binder.restoreCallingIdentity(callingToken);
        }
    }

    // Thermal event received from vendor thermal management subsystem
    // Thermal event received from vendor thermal management subsystem
    private static final class ThermalEventListener extends IThermalEventListener.Stub {
    private static final class ThermalEventListener extends IThermalEventListener.Stub {
        @Override
        @Override