Loading services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading services/core/java/com/android/server/locksettings/WeaverHidlWrapper.java→services/core/java/com/android/server/locksettings/WeaverHidlAdapter.java +137 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; } } Loading
services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
services/core/java/com/android/server/locksettings/WeaverHidlWrapper.java→services/core/java/com/android/server/locksettings/WeaverHidlAdapter.java +137 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; } }