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

Commit d9a2a9e7 authored by Paul Crowley's avatar Paul Crowley
Browse files

mv WeaverHidlWrapper WeaverHidlAdapter; refactor

Change WeaverHidlWrapper to match AuthSecretHidlAdapter and refactor:
- rename to WeaverHidlAdapter
- import the AIDL names, fully qualify HIDL names
- put the functional stuff first, and helpers/boilerplate last
- do conversion work inside the callback, not outside

Test: atest FrameworksServicesTests:com.android.server.locksettings.LockSettingsServiceTests
Test: Set PIN, enter incorrect PIN, enter correct PIN
Test: Remove AIDL HAL service and flash new image
Test: enter incorrect PIN, enter correct PIN.
Test: Set a new PIN and retest all without AIDL service
Bug: 182976659
Change-Id: I7123927f5b05b0d167dba33130f9bb8fe1daa01c
parent f8e243e6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -490,7 +490,7 @@ class SyntheticPasswordManager {
            android.hardware.weaver.V1_0.IWeaver hidlWeaver = getWeaverHidlService();
            if (hidlWeaver != null) {
                Slog.i(TAG, "Using HIDL weaver service");
                return new WeaverHidlWrapper(hidlWeaver);
                return new WeaverHidlAdapter(hidlWeaver);
            }
        } catch (RemoteException e) {
            Slog.w(TAG, "Failed to get HIDL weaver service.", e);
+137 −0
Original line number Diff line number Diff line
@@ -16,11 +16,11 @@

package com.android.server.locksettings;

import android.hardware.weaver.V1_0.IWeaver;
import android.hardware.weaver.V1_0.WeaverConfig;
import android.hardware.weaver.V1_0.WeaverReadResponse;
import android.hardware.weaver.V1_0.WeaverReadStatus;
import android.hardware.weaver.V1_0.WeaverStatus;
import android.hardware.weaver.IWeaver;
import android.hardware.weaver.WeaverConfig;
import android.hardware.weaver.WeaverReadResponse;
import android.hardware.weaver.WeaverReadStatus;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.util.Slog;
@@ -28,116 +28,110 @@ import android.util.Slog;
import java.util.ArrayList;

/**
 * Implement the AIDL IWeaver interface wrapping the HIDL implementation
 * Adapt the legacy HIDL interface to present the AIDL interface.
 */
class WeaverHidlWrapper implements android.hardware.weaver.IWeaver {
    private static final String TAG = "WeaverHidlWrapper";
    private final IWeaver mImpl;
class WeaverHidlAdapter implements IWeaver {
    private static final String TAG = "WeaverHidlAdapter";
    private final android.hardware.weaver.V1_0.IWeaver mImpl;

    WeaverHidlWrapper(IWeaver impl) {
    WeaverHidlAdapter(android.hardware.weaver.V1_0.IWeaver impl) {
        mImpl = impl;
    }

    private static ArrayList<Byte> toByteArrayList(byte[] data) {
        ArrayList<Byte> result = new ArrayList<Byte>(data.length);
        for (int i = 0; i < data.length; i++) {
            result.add(data[i]);
        }
        return result;
    }

    private static byte[] fromByteArrayList(ArrayList<Byte> data) {
        byte[] result = new byte[data.size()];
        for (int i = 0; i < data.size(); i++) {
            result[i] = data.get(i);
        }
        return result;
    }

    @Override
    public String getInterfaceHash() {
        // We do not require the interface hash as the client.
        throw new UnsupportedOperationException(
            "WeaverHidlWrapper does not support getInterfaceHash");
    }
    @Override
    public int getInterfaceVersion() {
        // Supports only V2 which is at feature parity.
        return 2;
    }
    @Override
    public android.os.IBinder asBinder() {
        // There is no IHwBinder to IBinder. Not required as the client.
        throw new UnsupportedOperationException("WeaverHidlWrapper does not support asBinder");
    }

    @Override
    public android.hardware.weaver.WeaverConfig getConfig() throws RemoteException {
    public WeaverConfig getConfig() throws RemoteException {
        final WeaverConfig[] res = new WeaverConfig[1];
        mImpl.getConfig((int status, WeaverConfig config) -> {
            if (status == WeaverStatus.OK && config.slots > 0) {
                res[0] = config;
        mImpl.getConfig((int status, android.hardware.weaver.V1_0.WeaverConfig config) -> {
            if (status == android.hardware.weaver.V1_0.WeaverStatus.OK) {
                WeaverConfig aidlRes = new WeaverConfig();
                aidlRes.slots = config.slots;
                aidlRes.keySize = config.keySize;
                aidlRes.valueSize = config.valueSize;
                res[0] = aidlRes;
            } else {
                res[0] = null;
                Slog.e(TAG,
                        "Failed to get HIDL weaver config. status: " + status
                                + ", slots: " + config.slots);
            }
        });

        if (res[0] == null) {
            return null;
        }
        android.hardware.weaver.WeaverConfig config = new android.hardware.weaver.WeaverConfig();
        config.slots = res[0].slots;
        config.keySize = res[0].keySize;
        config.valueSize = res[0].valueSize;
        return config;
        return res[0];
    }

    @Override
    public android.hardware.weaver.WeaverReadResponse read(int slotId, byte[] key)
    public WeaverReadResponse read(int slotId, byte[] key)
            throws RemoteException {
        final WeaverReadResponse[] res = new WeaverReadResponse[1];
        final int[] status = new int[1];
        mImpl.read(
                slotId, toByteArrayList(key), (int inStatus, WeaverReadResponse readResponse) -> {
                    status[0] = inStatus;
                    res[0] = readResponse;
                });

        android.hardware.weaver.WeaverReadResponse aidlRes =
                new android.hardware.weaver.WeaverReadResponse();
        switch (status[0]) {
            case WeaverReadStatus.OK:
                aidlRes.status = android.hardware.weaver.WeaverReadStatus.OK;
                slotId, toByteArrayList(key),
                (int inStatus, android.hardware.weaver.V1_0.WeaverReadResponse readResponse) -> {
                    WeaverReadResponse aidlRes =
                            new WeaverReadResponse();
                    switch (inStatus) {
                        case android.hardware.weaver.V1_0.WeaverReadStatus.OK:
                            aidlRes.status = WeaverReadStatus.OK;
                            break;
            case WeaverReadStatus.THROTTLE:
                aidlRes.status = android.hardware.weaver.WeaverReadStatus.THROTTLE;
                        case android.hardware.weaver.V1_0.WeaverReadStatus.THROTTLE:
                            aidlRes.status = WeaverReadStatus.THROTTLE;
                            break;
            case WeaverReadStatus.INCORRECT_KEY:
                aidlRes.status = android.hardware.weaver.WeaverReadStatus.INCORRECT_KEY;
                        case android.hardware.weaver.V1_0.WeaverReadStatus.INCORRECT_KEY:
                            aidlRes.status = WeaverReadStatus.INCORRECT_KEY;
                            break;
            case WeaverReadStatus.FAILED:
                aidlRes.status = android.hardware.weaver.WeaverReadStatus.FAILED;
                        case android.hardware.weaver.V1_0.WeaverReadStatus.FAILED:
                            aidlRes.status = WeaverReadStatus.FAILED;
                            break;
                        default:
                aidlRes.status = android.hardware.weaver.WeaverReadStatus.FAILED;
                            Slog.e(TAG, "Unexpected status in read: " + inStatus);
                            aidlRes.status = WeaverReadStatus.FAILED;
                            break;
                    }
        if (res[0] != null) {
            aidlRes.timeout = res[0].timeout;
            aidlRes.value = fromByteArrayList(res[0].value);
        }
        return aidlRes;
                    aidlRes.timeout = readResponse.timeout;
                    aidlRes.value = fromByteArrayList(readResponse.value);
                    res[0] = aidlRes;
                });
        return res[0];
    }

    @Override
    public void write(int slotId, byte[] key, byte[] value) throws RemoteException {
        int writeStatus = mImpl.write(slotId, toByteArrayList(key), toByteArrayList(value));
        if (writeStatus != WeaverStatus.OK) {
        if (writeStatus != android.hardware.weaver.V1_0.WeaverStatus.OK) {
            throw new ServiceSpecificException(
                android.hardware.weaver.IWeaver.STATUS_FAILED, "Failed IWeaver.write call");
                    IWeaver.STATUS_FAILED, "Failed IWeaver.write call, status: " + writeStatus);
        }
    }

    @Override
    public String getInterfaceHash() {
        // We do not require the interface hash as the client.
        throw new UnsupportedOperationException(
                "WeaverHidlAdapter does not support getInterfaceHash");
    }

    @Override
    public int getInterfaceVersion() {
        // Supports only V2 which is at feature parity.
        return 2;
    }

    @Override
    public IBinder asBinder() {
        // There is no IHwBinder to IBinder. Not required as the client.
        throw new UnsupportedOperationException("WeaverHidlAdapter does not support asBinder");
    }

    private static ArrayList<Byte> toByteArrayList(byte[] data) {
        ArrayList<Byte> result = new ArrayList<Byte>(data.length);
        for (int i = 0; i < data.length; i++) {
            result.add(data[i]);
        }
        return result;
    }

    private static byte[] fromByteArrayList(ArrayList<Byte> data) {
        byte[] result = new byte[data.size()];
        for (int i = 0; i < data.size(); i++) {
            result[i] = data.get(i);
        }
        return result;
    }
}