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

Commit 00d45983 authored by Dmitrii Merkurev's avatar Dmitrii Merkurev Committed by Gerrit Code Review
Browse files

Merge "OemLockService: support oemlock AIDL hal"

parents 1be10b54 98a36a77
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ java_library_static {
        "android.hardware.biometrics.fingerprint-V2.3-java",
        "android.hardware.biometrics.fingerprint-V2-java",
        "android.hardware.oemlock-V1.0-java",
        "android.hardware.oemlock-V1-java",
        "android.hardware.configstore-V1.1-java",
        "android.hardware.ir-V1-java",
        "android.hardware.rebootescrow-V1-java",
+8 −6
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.annotation.Nullable;
import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.hardware.oemlock.V1_0.IOemLock;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
@@ -54,15 +53,18 @@ public class OemLockService extends SystemService {
    private OemLock mOemLock;

    public static boolean isHalPresent() {
        return VendorLock.getOemLockHalService() != null;
        return (VendorLockHidl.getOemLockHalService() != null)
                || (VendorLockAidl.getOemLockHalService() != null);
    }

    /** Select the OEM lock implementation */
    private static OemLock getOemLock(Context context) {
        final IOemLock oemLockHal = VendorLock.getOemLockHalService();
        if (oemLockHal != null) {
            Slog.i(TAG, "Using vendor lock via the HAL");
            return new VendorLock(context, oemLockHal);
        if (VendorLockAidl.getOemLockHalService() != null) {
            Slog.i(TAG, "Using vendor lock via the HAL(aidl)");
            return new VendorLockAidl(context);
        } else if (VendorLockHidl.getOemLockHalService() != null) {
            Slog.i(TAG, "Using vendor lock via the HAL(hidl)");
            return new VendorLockHidl(context);
        } else {
            Slog.i(TAG, "Using persistent data block based lock");
            return new PersistentDataBlockLock(context);
+115 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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 com.android.server.oemlock;

import android.annotation.Nullable;
import android.content.Context;
import android.hardware.oemlock.IOemLock;
import android.hardware.oemlock.OemLockSecureStatus;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Slog;

/** Uses the OEM lock HAL. */
class VendorLockAidl extends OemLock {
    private static final String TAG = "OemLock";
    private IOemLock mOemLock;

    static IOemLock getOemLockHalService() {
        return IOemLock.Stub.asInterface(
                ServiceManager.waitForDeclaredService(IOemLock.DESCRIPTOR + "/default"));
    }

    VendorLockAidl(Context context) {
        mOemLock = getOemLockHalService();
    }

    @Override
    @Nullable
    String getLockName() {
        try {
            return mOemLock.getName();
        } catch (RemoteException e) {
            Slog.e(TAG, "Failed to get name from HAL", e);
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    void setOemUnlockAllowedByCarrier(boolean allowed, @Nullable byte[] signature) {
        try {
            final int status;
            if (signature == null) {
                status = mOemLock.setOemUnlockAllowedByCarrier(allowed, new byte[0]);
            } else {
                status = mOemLock.setOemUnlockAllowedByCarrier(allowed, signature);
            }
            switch (status) {
                case OemLockSecureStatus.OK:
                    Slog.i(TAG, "Updated carrier allows OEM lock state to: " + allowed);
                    return;

                case OemLockSecureStatus.INVALID_SIGNATURE:
                    if (signature == null) {
                        throw new IllegalArgumentException("Signature required for carrier unlock");
                    }
                    throw new SecurityException(
                            "Invalid signature used in attempt to carrier unlock");

                default:
                    Slog.e(TAG, "Unknown return value indicates code is out of sync with HAL");
                    // Fallthrough
                case OemLockSecureStatus.FAILED:
                    throw new RuntimeException("Failed to set carrier OEM unlock state");
            }
        } catch (RemoteException e) {
            Slog.e(TAG, "Failed to set carrier state with HAL", e);
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    boolean isOemUnlockAllowedByCarrier() {
        try {
            return mOemLock.isOemUnlockAllowedByCarrier();
        } catch (RemoteException e) {
            Slog.e(TAG, "Failed to get carrier state from HAL");
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    void setOemUnlockAllowedByDevice(boolean allowedByDevice) {
        try {
            mOemLock.setOemUnlockAllowedByDevice(allowedByDevice);
        } catch (RemoteException e) {
            Slog.e(TAG, "Failed to set device state with HAL", e);
            throw e.rethrowFromSystemServer();
        }
    }

    @Override
    boolean isOemUnlockAllowedByDevice() {

        try {
            return mOemLock.isOemUnlockAllowedByDevice();
        } catch (RemoteException e) {
            Slog.e(TAG, "Failed to get devie state from HAL");
            throw e.rethrowFromSystemServer();
        }
    }
}
+23 −23
Original line number Diff line number Diff line
@@ -27,10 +27,8 @@ import android.util.Slog;
import java.util.ArrayList;
import java.util.NoSuchElementException;

/**
 * Uses the OEM lock HAL.
 */
class VendorLock extends OemLock {
/** Uses the OEM lock HAL. */
class VendorLockHidl extends OemLock {
    private static final String TAG = "OemLock";

    private Context mContext;
@@ -40,26 +38,27 @@ class VendorLock extends OemLock {
        try {
            return IOemLock.getService(/* retry */ true);
        } catch (NoSuchElementException e) {
            Slog.i(TAG, "OemLock HAL not present on device");
            Slog.i(TAG, "OemLock Hidl HAL not present on device");
            return null;
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    VendorLock(Context context, IOemLock oemLock) {
    VendorLockHidl(Context context) {
        mContext = context;
        mOemLock = oemLock;
        mOemLock = getOemLockHalService();
    }

    @Override
    @Nullable
    String getLockName() {
        final Integer[] requestStatus = new Integer[1];
        final String[] lockName = new String[1];
        final Integer[] requestStatus = new Integer[1];

        try {
            mOemLock.getName((status, name) -> {
            mOemLock.getName(
                    (status, name) -> {
                        requestStatus[0] = status;
                        lockName[0] = name;
                    });
@@ -113,11 +112,11 @@ class VendorLock extends OemLock {

    @Override
    boolean isOemUnlockAllowedByCarrier() {
        final Integer[] requestStatus = new Integer[1];
        final Boolean[] allowedByCarrier = new Boolean[1];

        final Integer[] requestStatus = new Integer[1];
        try {
            mOemLock.isOemUnlockAllowedByCarrier((status, allowed) -> {
            mOemLock.isOemUnlockAllowedByCarrier(
                    (status, allowed) -> {
                        requestStatus[0] = status;
                        allowedByCarrier[0] = allowed;
                    });
@@ -161,11 +160,12 @@ class VendorLock extends OemLock {

    @Override
    boolean isOemUnlockAllowedByDevice() {
        final Integer[] requestStatus = new Integer[1];
        final Boolean[] allowedByDevice = new Boolean[1];

        final Integer[] requestStatus = new Integer[1];
        try {
            mOemLock.isOemUnlockAllowedByDevice((status, allowed) -> {
            mOemLock.isOemUnlockAllowedByDevice(
                    (status, allowed) -> {
                        requestStatus[0] = status;
                        allowedByDevice[0] = allowed;
                    });