Merge "Refactor VTS tests to use common sine input generation method" into main
diff --git a/audio/aidl/default/CapEngineConfigXmlConverter.cpp b/audio/aidl/default/CapEngineConfigXmlConverter.cpp
index 8210664..a6e78b9 100644
--- a/audio/aidl/default/CapEngineConfigXmlConverter.cpp
+++ b/audio/aidl/default/CapEngineConfigXmlConverter.cpp
@@ -69,29 +69,36 @@
std::string criterionName = xsdcRule.getSelectionCriterion();
std::string criterionValue = xsdcRule.getValue();
if (iequals(criterionName, toString(Tag::availableInputDevices))) {
- rule.criterion = AudioHalCapCriterionV2::make<Tag::availableInputDevices>();
- rule.criterionTypeValue =
- VALUE_OR_RETURN(convertDeviceTypeToAidl(gLegacyInputDevicePrefix + criterionValue));
+ AudioHalCapCriterionV2::AvailableDevices value;
+ value.values.emplace_back(VALUE_OR_RETURN(
+ convertDeviceTypeToAidl(gLegacyInputDevicePrefix + criterionValue)));
+ rule.criterionAndValue = AudioHalCapCriterionV2::make<Tag::availableInputDevices>(value);
+
} else if (iequals(criterionName, toString(Tag::availableOutputDevices))) {
- rule.criterion = AudioHalCapCriterionV2::make<Tag::availableOutputDevices>();
- rule.criterionTypeValue = VALUE_OR_RETURN(
- convertDeviceTypeToAidl(gLegacyOutputDevicePrefix + criterionValue));
+ AudioHalCapCriterionV2::AvailableDevices value;
+ value.values.emplace_back(VALUE_OR_RETURN(
+ convertDeviceTypeToAidl(gLegacyOutputDevicePrefix + criterionValue)));
+ rule.criterionAndValue = AudioHalCapCriterionV2::make<Tag::availableOutputDevices>(value);
} else if (iequals(criterionName, toString(Tag::availableInputDevicesAddresses))) {
- rule.criterion = AudioHalCapCriterionV2::make<Tag::availableInputDevicesAddresses>();
- rule.criterionTypeValue =
- AudioDeviceAddress::make<AudioDeviceAddress::Tag::id>(criterionValue);
+ AudioHalCapCriterionV2::AvailableDevicesAddresses value;
+ value.values.emplace_back(criterionValue);
+ rule.criterionAndValue =
+ AudioHalCapCriterionV2::make<Tag::availableInputDevicesAddresses>(value);
} else if (iequals(criterionName, toString(Tag::availableOutputDevicesAddresses))) {
- rule.criterion = AudioHalCapCriterionV2::make<Tag::availableOutputDevicesAddresses>();
- rule.criterionTypeValue =
- AudioDeviceAddress::make<AudioDeviceAddress::Tag::id>(criterionValue);
+ AudioHalCapCriterionV2::AvailableDevicesAddresses value;
+ value.values.emplace_back(criterionValue);
+ rule.criterionAndValue =
+ AudioHalCapCriterionV2::make<Tag::availableOutputDevicesAddresses>(value);
} else if (iequals(criterionName, toString(Tag::telephonyMode))) {
- rule.criterion = AudioHalCapCriterionV2::make<Tag::telephonyMode>();
- rule.criterionTypeValue = VALUE_OR_RETURN(convertTelephonyModeToAidl(criterionValue));
+ AudioHalCapCriterionV2::TelephonyMode value;
+ value.values.emplace_back(VALUE_OR_RETURN(convertTelephonyModeToAidl(criterionValue)));
+ rule.criterionAndValue = AudioHalCapCriterionV2::make<Tag::telephonyMode>(value);
} else if (!fastcmp<strncmp>(criterionName.c_str(), kXsdcForceConfigForUse,
strlen(kXsdcForceConfigForUse))) {
- rule.criterion = AudioHalCapCriterionV2::make<Tag::forceConfigForUse>(
- VALUE_OR_RETURN(convertForceUseCriterionToAidl(criterionName)));
- rule.criterionTypeValue = VALUE_OR_RETURN(convertForcedConfigToAidl(criterionValue));
+ AudioHalCapCriterionV2::ForceConfigForUse value;
+ value.forceUse = VALUE_OR_RETURN(convertForceUseCriterionToAidl(criterionName));
+ value.values.emplace_back(VALUE_OR_RETURN(convertForcedConfigToAidl(criterionValue)));
+ rule.criterionAndValue = AudioHalCapCriterionV2::make<Tag::forceConfigForUse>(value);
} else {
LOG(ERROR) << __func__ << " unrecognized criterion " << criterionName;
return unexpected(BAD_VALUE);
diff --git a/audio/aidl/default/Module.cpp b/audio/aidl/default/Module.cpp
index a2a357c..51b6085 100644
--- a/audio/aidl/default/Module.cpp
+++ b/audio/aidl/default/Module.cpp
@@ -467,58 +467,132 @@
fillConnectionsHelper(connections, patch.sinkPortConfigIds, patch.sourcePortConfigIds);
} // Otherwise, there are no streams to notify.
};
- fillConnections(oldConnections, oldPatch);
- fillConnections(newConnections, newPatch);
-
- std::for_each(oldConnections.begin(), oldConnections.end(), [&](const auto& connectionPair) {
- const int32_t mixPortConfigId = connectionPair.first;
- if (auto it = newConnections.find(mixPortConfigId);
- it == newConnections.end() || it->second != connectionPair.second) {
- if (auto status = mStreams.setStreamConnectedDevices(mixPortConfigId, {});
- status.isOk()) {
- LOG(DEBUG) << "updateStreamsConnectedState: The stream on port config id "
- << mixPortConfigId << " has been disconnected";
- } else {
- // Disconnection is tricky to roll back, just register a failure.
- maybeFailure = std::move(status);
+ auto restoreOldConnections = [&](const std::set<int32_t>& mixPortIds,
+ const bool continueWithEmptyDevices) {
+ for (const auto mixPort : mixPortIds) {
+ if (auto it = oldConnections.find(mixPort);
+ continueWithEmptyDevices || it != oldConnections.end()) {
+ const std::vector<AudioDevice> d =
+ it != oldConnections.end() ? getDevicesFromDevicePortConfigIds(it->second)
+ : std::vector<AudioDevice>();
+ if (auto status = mStreams.setStreamConnectedDevices(mixPort, d); status.isOk()) {
+ LOG(WARNING) << ":updateStreamsConnectedState: rollback: mix port config:"
+ << mixPort
+ << (d.empty() ? "; not connected"
+ : std::string("; connected to ") +
+ ::android::internal::ToString(d));
+ } else {
+ // can't do much about rollback failures
+ LOG(ERROR)
+ << ":updateStreamsConnectedState: rollback: failed for mix port config:"
+ << mixPort;
+ }
}
}
- });
- if (!maybeFailure.isOk()) return maybeFailure;
- std::set<int32_t> idsToDisconnectOnFailure;
- std::for_each(newConnections.begin(), newConnections.end(), [&](const auto& connectionPair) {
- const int32_t mixPortConfigId = connectionPair.first;
- if (auto it = oldConnections.find(mixPortConfigId);
- it == oldConnections.end() || it->second != connectionPair.second) {
- const auto connectedDevices = getDevicesFromDevicePortConfigIds(connectionPair.second);
+ };
+ fillConnections(oldConnections, oldPatch);
+ fillConnections(newConnections, newPatch);
+ /**
+ * Illustration of oldConnections and newConnections
+ *
+ * oldConnections {
+ * a : {A,B,C},
+ * b : {D},
+ * d : {H,I,J},
+ * e : {N,O,P},
+ * f : {Q,R},
+ * g : {T,U,V},
+ * }
+ *
+ * newConnections {
+ * a : {A,B,C},
+ * c : {E,F,G},
+ * d : {K,L,M},
+ * e : {N,P},
+ * f : {Q,R,S},
+ * g : {U,V,W},
+ * }
+ *
+ * Expected routings:
+ * 'a': is ignored both in disconnect step and connect step,
+ * due to same devices both in oldConnections and newConnections.
+ * 'b': handled only in disconnect step with empty devices because 'b' is only present
+ * in oldConnections.
+ * 'c': handled only in connect step with {E,F,G} devices because 'c' is only present
+ * in newConnections.
+ * 'd': handled only in connect step with {K,L,M} devices because 'd' is also present
+ * in newConnections and it is ignored in disconnected step.
+ * 'e': handled only in connect step with {N,P} devices because 'e' is also present
+ * in newConnections and it is ignored in disconnect step. please note that there
+ * is no exclusive disconnection for device {O}.
+ * 'f': handled only in connect step with {Q,R,S} devices because 'f' is also present
+ * in newConnections and it is ignored in disconnect step. Even though stream is
+ * already connected with {Q,R} devices and connection happens with {Q,R,S}.
+ * 'g': handled only in connect step with {U,V,W} devices because 'g' is also present
+ * in newConnections and it is ignored in disconnect step. There is no exclusive
+ * disconnection with devices {T,U,V}.
+ *
+ * If, any failure, will lead to restoreOldConnections (rollback).
+ * The aim of the restoreOldConnections is to make connections back to oldConnections.
+ * Failures in restoreOldConnections aren't handled.
+ */
+
+ std::set<int32_t> idsToConnectBackOnFailure;
+ // disconnection step
+ for (const auto& [oldMixPortConfigId, oldDevicePortConfigIds] : oldConnections) {
+ if (auto it = newConnections.find(oldMixPortConfigId); it == newConnections.end()) {
+ idsToConnectBackOnFailure.insert(oldMixPortConfigId);
+ if (auto status = mStreams.setStreamConnectedDevices(oldMixPortConfigId, {});
+ status.isOk()) {
+ LOG(DEBUG) << __func__ << ": The stream on port config id " << oldMixPortConfigId
+ << " has been disconnected";
+ } else {
+ maybeFailure = std::move(status);
+ // proceed to rollback even on one failure
+ break;
+ }
+ }
+ }
+
+ if (!maybeFailure.isOk()) {
+ restoreOldConnections(idsToConnectBackOnFailure, false /*continueWithEmptyDevices*/);
+ LOG(WARNING) << __func__ << ": failed to disconnect from old patch. attempted rollback";
+ return maybeFailure;
+ }
+
+ std::set<int32_t> idsToRollbackOnFailure;
+ // connection step
+ for (const auto& [newMixPortConfigId, newDevicePortConfigIds] : newConnections) {
+ if (auto it = oldConnections.find(newMixPortConfigId);
+ it == oldConnections.end() || it->second != newDevicePortConfigIds) {
+ const auto connectedDevices = getDevicesFromDevicePortConfigIds(newDevicePortConfigIds);
+ idsToRollbackOnFailure.insert(newMixPortConfigId);
if (connectedDevices.empty()) {
// This is important as workers use the vector size to derive the connection status.
- LOG(FATAL) << "updateStreamsConnectedState: No connected devices found for port "
- "config id "
- << mixPortConfigId;
+ LOG(FATAL) << __func__ << ": No connected devices found for port config id "
+ << newMixPortConfigId;
}
- if (auto status = mStreams.setStreamConnectedDevices(mixPortConfigId, connectedDevices);
+ if (auto status =
+ mStreams.setStreamConnectedDevices(newMixPortConfigId, connectedDevices);
status.isOk()) {
- LOG(DEBUG) << "updateStreamsConnectedState: The stream on port config id "
- << mixPortConfigId << " has been connected to: "
+ LOG(DEBUG) << __func__ << ": The stream on port config id " << newMixPortConfigId
+ << " has been connected to: "
<< ::android::internal::ToString(connectedDevices);
} else {
maybeFailure = std::move(status);
- idsToDisconnectOnFailure.insert(mixPortConfigId);
+ // proceed to rollback even on one failure
+ break;
}
}
- });
+ }
+
if (!maybeFailure.isOk()) {
- LOG(WARNING) << __func__ << ": " << mType
- << ": Due to a failure, disconnecting streams on port config ids "
- << ::android::internal::ToString(idsToDisconnectOnFailure);
- std::for_each(idsToDisconnectOnFailure.begin(), idsToDisconnectOnFailure.end(),
- [&](const auto& portConfigId) {
- auto status = mStreams.setStreamConnectedDevices(portConfigId, {});
- (void)status.isOk(); // Can't do much about a failure here.
- });
+ restoreOldConnections(idsToConnectBackOnFailure, false /*continueWithEmptyDevices*/);
+ restoreOldConnections(idsToRollbackOnFailure, true /*continueWithEmptyDevices*/);
+ LOG(WARNING) << __func__ << ": failed to connect for new patch. attempted rollback";
return maybeFailure;
}
+
return ndk::ScopedAStatus::ok();
}
diff --git a/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp
index 25fcd46..583143c 100644
--- a/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAudioCoreConfigTargetTest.cpp
@@ -355,7 +355,6 @@
const AudioHalCapRule& rule,
const std::vector<std::optional<AudioHalCapCriterionV2>>& criteria) {
const auto& compoundRule = rule.compoundRule;
- using TypeTag = AudioHalCapCriterionV2::Type::Tag;
if (rule.nestedRules.empty() && rule.criterionRules.empty()) {
EXPECT_EQ(compoundRule, AudioHalCapRule::CompoundRule::ALL);
}
@@ -365,8 +364,8 @@
ValidateAudioHalConfigurationRule(nestedRule, criteria);
}
for (const auto& criterionRule : rule.criterionRules) {
- auto selectionCriterion = criterionRule.criterion;
- auto criterionValue = criterionRule.criterionTypeValue;
+ auto selectionCriterion = criterionRule.criterionAndValue;
+ auto criterionValue = criterionRule.criterionAndValue;
auto matchesWhen = criterionRule.matchingRule;
auto criteriaIt = find_if(criteria.begin(), criteria.end(), [&](const auto& criterion) {
return criterion.has_value() &&
@@ -377,50 +376,65 @@
AudioHalCapCriterionV2 matchingCriterion = (*criteriaIt).value();
switch (selectionCriterion.getTag()) {
case AudioHalCapCriterionV2::availableInputDevices: {
- EXPECT_EQ(criterionValue.getTag(), TypeTag::availableDevicesType);
+ const auto& values =
+ criterionValue.get<AudioHalCapCriterionV2::availableInputDevices>()
+ .values;
+ ASSERT_FALSE(values.empty());
validateAudioHalCapRule(
matchingCriterion.get<AudioHalCapCriterionV2::availableInputDevices>(),
- criterionValue.get<TypeTag::availableDevicesType>(), matchesWhen);
+ values[0], matchesWhen);
break;
}
case AudioHalCapCriterionV2::availableOutputDevices: {
- EXPECT_EQ(criterionValue.getTag(), TypeTag::availableDevicesType);
+ const auto& values =
+ criterionValue.get<AudioHalCapCriterionV2::availableOutputDevices>()
+ .values;
+ ASSERT_FALSE(values.empty());
validateAudioHalCapRule(
matchingCriterion.get<AudioHalCapCriterionV2::availableOutputDevices>(),
- criterionValue.get<TypeTag::availableDevicesType>(), matchesWhen);
+ values[0], matchesWhen);
break;
}
case AudioHalCapCriterionV2::availableInputDevicesAddresses: {
- EXPECT_EQ(criterionValue.getTag(), TypeTag::availableDevicesAddressesType);
+ const auto& values =
+ criterionValue
+ .get<AudioHalCapCriterionV2::availableInputDevicesAddresses>()
+ .values;
+ ASSERT_FALSE(values.empty());
validateAudioHalCapRule(
matchingCriterion
.get<AudioHalCapCriterionV2::availableInputDevicesAddresses>(),
- criterionValue.get<TypeTag::availableDevicesAddressesType>(),
- matchesWhen);
+ values[0], matchesWhen);
break;
}
case AudioHalCapCriterionV2::availableOutputDevicesAddresses: {
- EXPECT_EQ(criterionValue.getTag(), TypeTag::availableDevicesAddressesType);
+ const auto& values =
+ criterionValue
+ .get<AudioHalCapCriterionV2::availableOutputDevicesAddresses>()
+ .values;
+ ASSERT_FALSE(values.empty());
validateAudioHalCapRule(
matchingCriterion
.get<AudioHalCapCriterionV2::availableOutputDevicesAddresses>(),
- criterionValue.get<TypeTag::availableDevicesAddressesType>(),
- matchesWhen);
+ values[0], matchesWhen);
break;
}
case AudioHalCapCriterionV2::telephonyMode: {
- EXPECT_EQ(criterionValue.getTag(), TypeTag::telephonyModeType);
+ const auto& values =
+ criterionValue.get<AudioHalCapCriterionV2::telephonyMode>().values;
+ ASSERT_FALSE(values.empty());
validateAudioHalCapRule(
matchingCriterion.get<AudioHalCapCriterionV2::telephonyMode>(),
- criterionValue.get<TypeTag::telephonyModeType>(), matchesWhen);
+ values[0], matchesWhen);
break;
}
case AudioHalCapCriterionV2::forceConfigForUse: {
- EXPECT_EQ(criterionValue.getTag(), TypeTag::forcedConfigType);
+ const auto& values =
+ criterionValue.get<AudioHalCapCriterionV2::forceConfigForUse>().values;
+ ASSERT_FALSE(values.empty());
validateAudioHalCapRule(
- matchingCriterion
- .get<AudioHalCapCriterionV2::forceConfigForUse>(),
- criterionValue.get<TypeTag::forcedConfigType>(), matchesWhen);
+ matchingCriterion.get<AudioHalCapCriterionV2::forceConfigForUse>(),
+ values[0], matchesWhen);
break;
}
default:
diff --git a/compatibility_matrices/compatibility_matrix.202504.xml b/compatibility_matrices/compatibility_matrix.202504.xml
index ced86a0..cd8fe2d 100644
--- a/compatibility_matrices/compatibility_matrix.202504.xml
+++ b/compatibility_matrices/compatibility_matrix.202504.xml
@@ -194,7 +194,7 @@
</hal>
<hal format="aidl">
<name>android.hardware.contexthub</name>
- <version>3</version>
+ <version>3-4</version>
<interface>
<name>IContextHub</name>
<instance>default</instance>
@@ -313,7 +313,7 @@
</hal>
<hal format="aidl" updatable-via-apex="true">
<name>android.hardware.security.keymint</name>
- <version>1-3</version>
+ <version>1-4</version>
<interface>
<name>IKeyMintDevice</name>
<instance>default</instance>
diff --git a/confirmationui/aidl/Android.bp b/confirmationui/aidl/Android.bp
index 51bde0a..1f17866 100644
--- a/confirmationui/aidl/Android.bp
+++ b/confirmationui/aidl/Android.bp
@@ -19,8 +19,8 @@
aidl_interface {
name: "android.hardware.confirmationui",
vendor_available: true,
- imports: [
- "android.hardware.security.keymint-V3",
+ defaults: [
+ "android.hardware.security.keymint-latest-defaults",
],
srcs: ["android/hardware/confirmationui/*.aidl"],
stability: "vintf",
@@ -38,7 +38,7 @@
versions_with_info: [
{
version: "1",
- imports: ["android.hardware.security.keymint-V3"],
+ imports: ["android.hardware.security.keymint-V4"],
},
],
frozen: true,
diff --git a/contexthub/OWNERS b/contexthub/OWNERS
index f35961a..ccd385b 100644
--- a/contexthub/OWNERS
+++ b/contexthub/OWNERS
@@ -1,2 +1,3 @@
# Bug component: 156070
bduddie@google.com
+arthuri@google.com
diff --git a/contexthub/aidl/Android.bp b/contexthub/aidl/Android.bp
index 202813c..eaa47c6 100644
--- a/contexthub/aidl/Android.bp
+++ b/contexthub/aidl/Android.bp
@@ -52,8 +52,6 @@
version: "3",
imports: [],
},
-
],
- frozen: true,
-
+ frozen: false,
}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/EndpointId.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/EndpointId.aidl
new file mode 100644
index 0000000..a70065d
--- /dev/null
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/EndpointId.aidl
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.contexthub;
+@VintfStability
+parcelable EndpointId {
+ long id;
+ long hubId;
+ const long ENDPOINT_ID_INVALID = 0;
+ const long ENDPOINT_ID_RESERVED = (-1) /* -1 */;
+}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/EndpointInfo.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/EndpointInfo.aidl
new file mode 100644
index 0000000..43e5ec3
--- /dev/null
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/EndpointInfo.aidl
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.contexthub;
+@VintfStability
+parcelable EndpointInfo {
+ android.hardware.contexthub.EndpointId id;
+ android.hardware.contexthub.EndpointInfo.EndpointType type;
+ String name;
+ int version;
+ @nullable String tag;
+ String[] requiredPermissions;
+ android.hardware.contexthub.Service[] services;
+ @Backing(type="int") @VintfStability
+ enum EndpointType {
+ FRAMEWORK = 1,
+ APP = 2,
+ NATIVE = 3,
+ NANOAPP = 4,
+ GENERIC = 5,
+ }
+}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/HubInfo.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/HubInfo.aidl
new file mode 100644
index 0000000..cac441a
--- /dev/null
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/HubInfo.aidl
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.contexthub;
+@VintfStability
+parcelable HubInfo {
+ long hubId;
+ android.hardware.contexthub.HubInfo.HubDetails hubDetails;
+ const long HUB_ID_INVALID = 0;
+ const long HUB_ID_RESERVED = (-1) /* -1 */;
+ union HubDetails {
+ android.hardware.contexthub.ContextHubInfo contextHubInfo;
+ android.hardware.contexthub.VendorHubInfo vendorHubInfo;
+ }
+}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/IContextHub.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/IContextHub.aidl
index 7341e0e..93b8ff5 100644
--- a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/IContextHub.aidl
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/IContextHub.aidl
@@ -49,5 +49,16 @@
void onNanSessionStateChanged(in android.hardware.contexthub.NanSessionStateUpdate update);
void setTestMode(in boolean enable);
void sendMessageDeliveryStatusToHub(in int contextHubId, in android.hardware.contexthub.MessageDeliveryStatus messageDeliveryStatus);
+ List<android.hardware.contexthub.HubInfo> getHubs();
+ List<android.hardware.contexthub.EndpointInfo> getEndpoints();
+ void registerEndpoint(in android.hardware.contexthub.EndpointInfo endpoint);
+ void unregisterEndpoint(in android.hardware.contexthub.EndpointInfo endpoint);
+ void registerEndpointCallback(in android.hardware.contexthub.IEndpointCallback callback);
+ int[] requestSessionIdRange(int size);
+ void openEndpointSession(int sessionId, in android.hardware.contexthub.EndpointId destination, in android.hardware.contexthub.EndpointId initiator, in @nullable String serviceDescriptor);
+ void sendMessageToEndpoint(int sessionId, in android.hardware.contexthub.Message msg);
+ void sendMessageDeliveryStatusToEndpoint(int sessionId, in android.hardware.contexthub.MessageDeliveryStatus msgStatus);
+ void closeEndpointSession(int sessionId, in android.hardware.contexthub.Reason reason);
+ void endpointSessionOpenComplete(int sessionId);
const int EX_CONTEXT_HUB_UNSPECIFIED = (-1) /* -1 */;
}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/IEndpointCallback.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/IEndpointCallback.aidl
new file mode 100644
index 0000000..c0bb744
--- /dev/null
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/IEndpointCallback.aidl
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.contexthub;
+@VintfStability
+interface IEndpointCallback {
+ void onEndpointStarted(in android.hardware.contexthub.EndpointInfo[] endpointInfos);
+ void onEndpointStopped(in android.hardware.contexthub.EndpointId[] endpointIds, android.hardware.contexthub.Reason reason);
+ void onMessageReceived(int sessionId, in android.hardware.contexthub.Message msg);
+ void onMessageDeliveryStatusReceived(int sessionId, in android.hardware.contexthub.MessageDeliveryStatus msgStatus);
+ void onEndpointSessionOpenRequest(int sessionId, in android.hardware.contexthub.EndpointId destination, in android.hardware.contexthub.EndpointId initiator, in @nullable String serviceDescriptor);
+ void onCloseEndpointSession(int sessionId, in android.hardware.contexthub.Reason reason);
+ void onEndpointSessionOpenComplete(int sessionId);
+}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Message.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Message.aidl
new file mode 100644
index 0000000..ef117c3
--- /dev/null
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Message.aidl
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.contexthub;
+@VintfStability
+parcelable Message {
+ int flags;
+ int sequenceNumber;
+ String[] permissions;
+ int type;
+ byte[] content;
+ const int FLAG_REQUIRES_DELIVERY_STATUS = 1;
+}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Reason.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Reason.aidl
new file mode 100644
index 0000000..a315438
--- /dev/null
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Reason.aidl
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2023 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.contexthub;
+@Backing(type="byte") @VintfStability
+enum Reason {
+ UNSPECIFIED = 0,
+ OUT_OF_MEMORY,
+ TIMEOUT,
+ OPEN_ENDPOINT_SESSION_REQUEST_REJECTED,
+ CLOSE_ENDPOINT_SESSION_REQUESTED,
+ ENDPOINT_INVALID,
+ ENDPOINT_GONE,
+ ENDPOINT_CRASHED,
+ HUB_RESET,
+}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Service.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Service.aidl
new file mode 100644
index 0000000..e3d94c8
--- /dev/null
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/Service.aidl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.contexthub;
+@VintfStability
+parcelable Service {
+ android.hardware.contexthub.Service.RpcFormat format;
+ String serviceDescriptor;
+ int majorVersion;
+ int minorVersion;
+ ParcelableHolder extendedInfo;
+ @Backing(type="int") @VintfStability
+ enum RpcFormat {
+ CUSTOM = 0,
+ AIDL = 1,
+ PW_RPC_PROTOBUF = 2,
+ }
+}
diff --git a/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/VendorHubInfo.aidl b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/VendorHubInfo.aidl
new file mode 100644
index 0000000..db64ec7
--- /dev/null
+++ b/contexthub/aidl/aidl_api/android.hardware.contexthub/current/android/hardware/contexthub/VendorHubInfo.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.contexthub;
+@VintfStability
+parcelable VendorHubInfo {
+ String name;
+ int version;
+ ParcelableHolder extendedInfo;
+}
diff --git a/contexthub/aidl/android/hardware/contexthub/EndpointId.aidl b/contexthub/aidl/android/hardware/contexthub/EndpointId.aidl
new file mode 100644
index 0000000..2075e73
--- /dev/null
+++ b/contexthub/aidl/android/hardware/contexthub/EndpointId.aidl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2024 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 android.hardware.contexthub;
+
+/* This structure is a unique identifier for an endpoint */
+@VintfStability
+parcelable EndpointId {
+ /**
+ * Invalid endpoint ID.
+ */
+ const long ENDPOINT_ID_INVALID = 0;
+
+ /**
+ * Reserved endpoint ID.
+ */
+ const long ENDPOINT_ID_RESERVED = -1;
+
+ /**
+ * Nanoapp ID or randomly generated ID (depending on type). This value uniquely identifies the
+ * endpoint within a single hub.
+ *
+ * ENDPOINT_ID_INVALID(0) is an invalid id and should never be used.
+ * ENDPOINT_ID_RESERVED(-1) is reserved for future use.
+ * For static/compile-time-generated IDs, topmost bit should be 0.
+ * For dynamic/runtime-generated IDs, topmost bit should be 1.
+ */
+ long id;
+
+ /**
+ * Hub ID of the hub hosting this endpoint. A pair of (hubId, id) uniquely identifies the
+ * endpoint globally.
+ */
+ long hubId;
+}
diff --git a/contexthub/aidl/android/hardware/contexthub/EndpointInfo.aidl b/contexthub/aidl/android/hardware/contexthub/EndpointInfo.aidl
new file mode 100644
index 0000000..53a41fc
--- /dev/null
+++ b/contexthub/aidl/android/hardware/contexthub/EndpointInfo.aidl
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2024 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 android.hardware.contexthub;
+
+import android.hardware.contexthub.EndpointId;
+import android.hardware.contexthub.Service;
+
+/* This structure is a unified superset of NanoAppInfo and HostEndpointInfo. */
+@VintfStability
+parcelable EndpointInfo {
+ /** Unique identifier of this endpoint. */
+ EndpointId id;
+
+ /** Type of this endpoint. */
+ EndpointType type;
+
+ /**
+ * Name of this endpoint. Endpoint may use this field to identify the initiator of the session
+ * request.
+ *
+ * Depending on type of the endpoint, the following values are used:
+ * - Framework: package name of the process registering this endpoint
+ * - App: package name of the process registering this endpoint
+ * - Native: name of the process registering this endpoint, supplied by client for debugging
+ * purpose.
+ * - Nanoapp: name of the nanoapp, for debugging purpose
+ * - Generic: name of the generic endpoint, for debugging purpose
+ */
+ String name;
+
+ /**
+ * Monotonically increasing version number. The two sides of an endpoint session can use this
+ * version number to identify the other side and determine compatibility with each other.
+ * The interpretation of the version number is specific to the implementation of an endpoint.
+ * The version number should not be used to compare endpoints implementation freshness for
+ * different endpoint types.
+ *
+ * Depending on type of the endpoint, the following values are used:
+ * - Framework: android.os.Build.VERSION.SDK_INT_FULL (populated by ContextHubService)
+ * - App: versionCode (populated by ContextHubService)
+ * - Native: unspecified format (supplied by endpoint code)
+ * - Nanoapp: nanoapp version, typically following 0xMMmmpppp scheme where
+ * MM = major version, mm = minor version, pppp = patch version
+ * - Generic: unspecified format (supplied by endpoint code), following nanoapp versioning
+ * scheme is recommended
+ */
+ int version;
+
+ /**
+ * Tag for this particular endpoint. Optional string that further identifies the submodule
+ * that created this endpoint.
+ */
+ @nullable String tag;
+
+ /**
+ * Represents the minimally required permissions in order to message this endpoint. Further
+ * permissions may be required on a message-by-message basis.
+ */
+ String[] requiredPermissions;
+
+ /**
+ * List of services provided by this endpoint. Service list should be fixed for the
+ * lifetime of an endpoint.
+ */
+ Service[] services;
+
+ @VintfStability
+ @Backing(type="int")
+ enum EndpointType {
+ /**
+ * This endpoint is from the Android framework
+ */
+ FRAMEWORK = 1,
+
+ /** This endpoint is an Android app. */
+ APP = 2,
+
+ /** This endpoint is from an Android native program. */
+ NATIVE = 3,
+
+ /** This endpoint is from a nanoapp. */
+ NANOAPP = 4,
+
+ /** This endpoint is a generic endpoint (not from a nanoapp). */
+ GENERIC = 5,
+ }
+}
diff --git a/contexthub/aidl/android/hardware/contexthub/HubInfo.aidl b/contexthub/aidl/android/hardware/contexthub/HubInfo.aidl
new file mode 100644
index 0000000..3d0a76e
--- /dev/null
+++ b/contexthub/aidl/android/hardware/contexthub/HubInfo.aidl
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2024 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 android.hardware.contexthub;
+
+import android.hardware.contexthub.ContextHubInfo;
+import android.hardware.contexthub.VendorHubInfo;
+
+@VintfStability
+parcelable HubInfo {
+ /**
+ * Invalid hub ID.
+ */
+ const long HUB_ID_INVALID = 0;
+
+ /**
+ * Reserved hub ID.
+ */
+ const long HUB_ID_RESERVED = -1;
+
+ /**
+ * Hub ID (depending on type). This is a globally unique identifier.
+ *
+ * HUB_ID_INVALID(0) is an invalid id and should never be used.
+ * HUB_ID_RESERVED(-1) is reserved for future use.
+ */
+ long hubId;
+
+ /**
+ * A hub can be either a ContextHub or a VendorHub.
+ */
+ union HubDetails {
+ ContextHubInfo contextHubInfo;
+ VendorHubInfo vendorHubInfo;
+ }
+
+ /**
+ * Detail information about the hub.
+ */
+ HubDetails hubDetails;
+}
diff --git a/contexthub/aidl/android/hardware/contexthub/IContextHub.aidl b/contexthub/aidl/android/hardware/contexthub/IContextHub.aidl
index b146ff8..24192a1 100644
--- a/contexthub/aidl/android/hardware/contexthub/IContextHub.aidl
+++ b/contexthub/aidl/android/hardware/contexthub/IContextHub.aidl
@@ -18,12 +18,19 @@
import android.hardware.contexthub.ContextHubInfo;
import android.hardware.contexthub.ContextHubMessage;
+import android.hardware.contexthub.EndpointId;
+import android.hardware.contexthub.EndpointInfo;
import android.hardware.contexthub.HostEndpointInfo;
+import android.hardware.contexthub.HubInfo;
import android.hardware.contexthub.IContextHubCallback;
+import android.hardware.contexthub.IEndpointCallback;
+import android.hardware.contexthub.Message;
import android.hardware.contexthub.MessageDeliveryStatus;
import android.hardware.contexthub.NanSessionStateUpdate;
import android.hardware.contexthub.NanoappBinary;
import android.hardware.contexthub.NanoappInfo;
+import android.hardware.contexthub.Reason;
+import android.hardware.contexthub.Service;
import android.hardware.contexthub.Setting;
@VintfStability
@@ -221,7 +228,7 @@
void onNanSessionStateChanged(in NanSessionStateUpdate update);
/**
- * Puts the context hub in and out of test mode. Test mode is a clean state
+ * Puts the Context Hub in and out of test mode. Test mode is a clean state
* where tests can be executed in the same environment. If enable is true,
* this will enable test mode by unloading all nanoapps. If enable is false,
* this will disable test mode and reverse the actions of enabling test mode
@@ -231,7 +238,7 @@
* @TestApi or development tools. This should not be used in a production
* environment.
*
- * @param enable If true, put the context hub in test mode. If false, disable
+ * @param enable If true, put the Context Hub in test mode. If false, disable
* test mode.
*/
void setTestMode(in boolean enable);
@@ -256,4 +263,136 @@
* value EX_SERVICE_SPECIFIC.
*/
const int EX_CONTEXT_HUB_UNSPECIFIED = -1;
+
+ /** Lists all the hubs, including the Context Hub and generic hubs. */
+ List<HubInfo> getHubs();
+
+ /** Lists all the endpoints, including the Context Hub nanoapps and generic endpoints. */
+ List<EndpointInfo> getEndpoints();
+
+ /**
+ * Publishes an endpoint from the calling side (e.g. Android). Endpoints must be registered
+ * prior to starting a session.
+ */
+ void registerEndpoint(in EndpointInfo endpoint);
+
+ /**
+ * Teardown an endpoint from the calling side (e.g. Android). This endpoint must have already
+ * been published via registerEndpoint().
+ */
+ void unregisterEndpoint(in EndpointInfo endpoint);
+
+ /**
+ * Attaches a callback interface to receive events targeted at endpoints registered by the
+ * caller.
+ */
+ void registerEndpointCallback(in IEndpointCallback callback);
+
+ /**
+ * Request a range of session IDs for the caller to use when initiating sessions. This may be
+ * called more than once, but typical usage is to request a large enough range to accommodate
+ * the maximum expected number of concurrent sessions, but not overly large as to limit other
+ * clients.
+ *
+ * @param size The number of sessionId reserved for host-initiated sessions. This number should
+ * be less than or equal to 1024.
+ *
+ * @return An array with two elements representing the smallest and largest possible session id
+ * available for host.
+ *
+ * @throws EX_ILLEGAL_ARGUMENT if the size is invalid.
+ * @throws EX_SERVICE_SPECIFIC if the id range requested cannot be allocated.
+ */
+ int[] requestSessionIdRange(int size);
+
+ /**
+ * Request to open a session for communication between an endpoint previously registered by the
+ * caller and a target endpoint found in getEndpoints(), optionally scoped to a service
+ * published by the target endpoint.
+ *
+ * Upon returning from this function, the session is in pending state, and the final result will
+ * be given by an asynchronous call to onEndpointSessionOpenComplete() on success, or
+ * onCloseEndpointSession() on failure.
+ *
+ * @param sessionId Caller-allocated session identifier, which must be unique across all active
+ * sessions, and must fall in a range allocated via requestSessionIdRange().
+ * @param destination The EndpointId representing the destination side of the session.
+ * @param initiator The EndpointId representing the initiating side of the session, which
+ * must've already been published through registerEndpoint().
+ * @param serviceDescriptor Descriptor for the service specification for scoping this session
+ * (nullable). Null indicates a fully custom marshalling scheme. The value should match
+ * a published descriptor for both destination and initiator.
+ *
+ * @return An integer identifying the session, the integer can be used to present
+ * the tuple of (destination, initiator, serviceDescriptor).
+ *
+ * @throws EX_ILLEGAL_ARGUMENT if any of the arguments are invalid, or the combination of the
+ * arguments is invalid.
+ * @throws EX_SERVICE_SPECIFIC on other errors
+ * - EX_CONTEXT_HUB_UNSPECIFIED if the request failed for other reasons.
+ */
+ void openEndpointSession(int sessionId, in EndpointId destination, in EndpointId initiator,
+ in @nullable String serviceDescriptor);
+
+ /**
+ * Send a message from one endpoint to another on the (currently open) session.
+ *
+ * @param sessionId The integer representing the communication session, previously set in
+ * openEndpointSession() or onEndpointSessionOpenRequest().
+ * @param msg The Message object representing a message to endpoint from the endpoint on host.
+ *
+ * @throws EX_ILLEGAL_ARGUMENT if any of the arguments are invalid, or the combination of the
+ * arguments is invalid.
+ * @throws EX_SERVICE_SPECIFIC on other errors
+ * - EX_CONTEXT_HUB_UNSPECIFIED if the request failed for other reasons.
+ */
+ void sendMessageToEndpoint(int sessionId, in Message msg);
+
+ /**
+ * Sends a message delivery status to the endpoint in response to receiving a Message with flag
+ * FLAG_REQUIRES_DELIVERY_STATUS. Each message with the flag should have a MessageDeliveryStatus
+ * response. This method sends the message delivery status back to the remote endpoint for a
+ * session.
+ *
+ * @param sessionId The integer representing the communication session, previously set in
+ * openEndpointSession() or onEndpointSessionOpenRequest().
+ * @param msgStatus The MessageDeliveryStatus object representing the delivery status for a
+ * specific message (identified by the sequenceNumber) within the session.
+ *
+ * @throws EX_UNSUPPORTED_OPERATION if ContextHubInfo.supportsReliableMessages is false for
+ * the hub involved in this session.
+ */
+ void sendMessageDeliveryStatusToEndpoint(int sessionId, in MessageDeliveryStatus msgStatus);
+
+ /**
+ * Closes a session previously opened by openEndpointSession() or requested via
+ * onEndpointSessionOpenRequest(). Processing of session closure must be ordered/synchronized
+ * with message delivery, such that if this session was open, any messages previously passed to
+ * sendMessageToEndpoint() that are still in-flight must still be delivered before the session
+ * is closed. Any in-flight messages to the endpoint that requested to close the session will
+ * not be delivered.
+ *
+ * @param sessionId The integer representing the communication session, previously set in
+ * openEndpointSession() or onEndpointSessionOpenRequest().
+ * @param reason The reason for this close endpoint session request.
+ *
+ * @throws EX_ILLEGAL_ARGUMENT if any of the arguments are invalid, or the combination of the
+ * arguments is invalid.
+ * @throws EX_SERVICE_SPECIFIC on other errors
+ * - EX_CONTEXT_HUB_UNSPECIFIED if the request failed for other reasons.
+ */
+ void closeEndpointSession(int sessionId, in Reason reason);
+
+ /**
+ * Notifies the HAL that the session requested by onEndpointSessionOpenRequest is ready to use.
+ *
+ * @param sessionId The integer representing the communication session, previously set in
+ * onEndpointSessionOpenRequest(). This id is assigned by the HAL.
+ *
+ * @throws EX_ILLEGAL_ARGUMENT if any of the arguments are invalid, or the combination of the
+ * arguments is invalid.
+ * @throws EX_SERVICE_SPECIFIC on other errors
+ * - EX_CONTEXT_HUB_UNSPECIFIED if the request failed for other reasons.
+ */
+ void endpointSessionOpenComplete(int sessionId);
}
diff --git a/contexthub/aidl/android/hardware/contexthub/IEndpointCallback.aidl b/contexthub/aidl/android/hardware/contexthub/IEndpointCallback.aidl
new file mode 100644
index 0000000..972853b
--- /dev/null
+++ b/contexthub/aidl/android/hardware/contexthub/IEndpointCallback.aidl
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2024 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 android.hardware.contexthub;
+
+import android.hardware.contexthub.EndpointId;
+import android.hardware.contexthub.EndpointInfo;
+import android.hardware.contexthub.Message;
+import android.hardware.contexthub.MessageDeliveryStatus;
+import android.hardware.contexthub.Reason;
+import android.hardware.contexthub.Service;
+
+@VintfStability
+interface IEndpointCallback {
+ /**
+ * Lifecycle event notification for endpoint starting from remote side. There is no need to
+ * report already started endpoint prior to the registration of an EndpointLifecycleCallbacks
+ * object. The EndpointInfo reported here should be consistent with values from getEndpoints().
+ *
+ * Endpoints added by registerEndpoint should not be included. registerEndpoint() should not
+ * cause this call.
+ *
+ * @param endpointInfos An array of EndpointInfo representing endpoints that just started.
+ */
+ void onEndpointStarted(in EndpointInfo[] endpointInfos);
+
+ /**
+ * Lifecycle event notification for endpoint stopping from remote side. There is no need to
+ * report already stopped endpoint prior to the registration of an EndpointLifecycleCallbacks
+ * object. The EndpointId reported here should represent a previously started Endpoint.
+ *
+ * When a hub crashes or restart, events should be batched into be a single call (containing all
+ * the EndpointId that were impacted).
+ *
+ * Endpoints added by registerEndpoint should not be included. unregisterEndpoint() should not
+ * cause this call.
+ *
+ * @param endpointIds An array of EndpointId representing endpoints that just stopped.
+ * @param reason The reason for why the endpoints stopped.
+ */
+ void onEndpointStopped(in EndpointId[] endpointIds, Reason reason);
+
+ /**
+ * Invoked when an endpoint sends message to another endpoint (on host) on the (currently open)
+ * session.
+ *
+ * @param sessionId The integer representing the communication session, previously set in
+ * openEndpointSession() or onEndpointSessionOpenRequest().
+ * @param msg The Message object representing a message from endpoint to an endpoint on host.
+ */
+ void onMessageReceived(int sessionId, in Message msg);
+
+ /**
+ * Invoked when an endpoint sends the response for a message that requires delivery status.
+ *
+ * The response is the message delivery status of a recently sent message within a session. See
+ * sendMessageDeliveryStatusToEndpoint() for more details.
+ *
+ * @param sessionId The integer representing the communication session, previously set in
+ * openEndpointSession() or onEndpointSessionOpenRequest().
+ * @param msgStatus The MessageDeliveryStatus object representing the delivery status for a
+ * specific message (identified by the sequenceNumber) within the session.
+ */
+ void onMessageDeliveryStatusReceived(int sessionId, in MessageDeliveryStatus msgStatus);
+
+ /**
+ * Invoked when session initiation is requested by a remote endpoint. The receiving host client
+ * must later call endpointSessionOpenComplete() to indicate successful connection and
+ * acceptance of the session, or closeEndpointSession() to indicate failure.
+ *
+ * @param sessionId Caller-allocated session identifier, which must be unique across all active
+ * sessions, and must not fall in a range allocated via requestSessionIdRange().
+ * @param destination The EndpointId representing the destination side of the session, which
+ * must've already been published through registerEndpoint().
+ * @param initiator The EndpointId representing the initiating side of the session.
+ * @param serviceDescriptor Descriptor for the service specification for scoping this session
+ * (nullable). Null indicates a fully custom marshalling scheme. The value should match
+ * a published descriptor for both endpoints.
+ *
+ * @throws EX_ILLEGAL_ARGUMENT if any of the arguments are invalid, or the combination of the
+ * arguments is invalid.
+ */
+ void onEndpointSessionOpenRequest(int sessionId, in EndpointId destination,
+ in EndpointId initiator, in @nullable String serviceDescriptor);
+
+ /**
+ * Invoked when a session has either failed to open, or has been closed by the remote side.
+ * Upon receiving this callback, the session is closed and further messages on it will not be
+ * delivered.
+ *
+ * @param sessionId The integer representing the communication session, previously set in
+ * openEndpointSession() or onEndpointSessionOpenRequest().
+ * @param reason The reason for this close endpoint session notification.
+ */
+ void onCloseEndpointSession(int sessionId, in Reason reason);
+
+ /**
+ * Callback when a session is opened. This callback is the status callback for a previous
+ * openEndpointSession().
+ *
+ * @param sessionId The integer representing the communication session, previously set in
+ * onEndpointSessionOpenRequest(). This id is assigned by the host.
+ */
+ void onEndpointSessionOpenComplete(int sessionId);
+}
diff --git a/contexthub/aidl/android/hardware/contexthub/Message.aidl b/contexthub/aidl/android/hardware/contexthub/Message.aidl
new file mode 100644
index 0000000..fc81ab0
--- /dev/null
+++ b/contexthub/aidl/android/hardware/contexthub/Message.aidl
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2024 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 android.hardware.contexthub;
+
+@VintfStability
+parcelable Message {
+ /**
+ * Bitmask for flags field if this message requires a MessageDeliveryStatus for the
+ * sequenceNumber within 1 second.
+ */
+ const int FLAG_REQUIRES_DELIVERY_STATUS = 1;
+
+ /** Bitset of flags */
+ int flags;
+
+ /** Sequence number of this message */
+ int sequenceNumber;
+
+ /**
+ * Per message permission (used for app-op permission attribution).
+ */
+ String[] permissions;
+
+ /**
+ * The type of this message payload, following a scheme specific to the service or sending
+ * endpoint's communication protocol. This value can be used to distinguish the handling of
+ * content (e.g. for decoding). This could also be used as the complete content of the message
+ * if no additional payload is needed.
+ */
+ int type;
+
+ /**
+ * Content (payload) of the message. The format of the message is specific to the context of the
+ * message: the service or endpoints involved in the session, and the message type.
+ */
+ byte[] content;
+}
diff --git a/contexthub/aidl/android/hardware/contexthub/MessageDeliveryStatus.aidl b/contexthub/aidl/android/hardware/contexthub/MessageDeliveryStatus.aidl
index ae425b3..4129981 100644
--- a/contexthub/aidl/android/hardware/contexthub/MessageDeliveryStatus.aidl
+++ b/contexthub/aidl/android/hardware/contexthub/MessageDeliveryStatus.aidl
@@ -21,7 +21,8 @@
@VintfStability
parcelable MessageDeliveryStatus {
/**
- * The messageSequenceNumber of the ContextHubMessage to which this status applies.
+ * The messageSequenceNumber of the ContextHubMessage or Message to which this status is
+ * required.
*/
int messageSequenceNumber;
diff --git a/contexthub/aidl/android/hardware/contexthub/Reason.aidl b/contexthub/aidl/android/hardware/contexthub/Reason.aidl
new file mode 100644
index 0000000..65d9f8a
--- /dev/null
+++ b/contexthub/aidl/android/hardware/contexthub/Reason.aidl
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2023 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 android.hardware.contexthub;
+
+@VintfStability
+@Backing(type="byte")
+enum Reason {
+ /**
+ * Unspecified reason.
+ */
+ UNSPECIFIED = 0,
+
+ /**
+ * Out of memory. There's not enough memory to perform this operation.
+ */
+ OUT_OF_MEMORY,
+
+ /**
+ * Timeout. This operation timed out.
+ */
+ TIMEOUT,
+
+ /**
+ * Endpoint rejected this openEndpointSession request.
+ */
+ OPEN_ENDPOINT_SESSION_REQUEST_REJECTED,
+
+ /**
+ * Endpoint requested closeEndpointSession.
+ */
+ CLOSE_ENDPOINT_SESSION_REQUESTED,
+
+ /**
+ * Invalid endpoint.
+ */
+ ENDPOINT_INVALID,
+
+ /**
+ * Endpoint is now stopped.
+ */
+ ENDPOINT_GONE,
+
+ /**
+ * Endpoint crashed.
+ */
+ ENDPOINT_CRASHED,
+
+ /**
+ * Hub was reset or is resetting.
+ */
+ HUB_RESET,
+}
diff --git a/contexthub/aidl/android/hardware/contexthub/Service.aidl b/contexthub/aidl/android/hardware/contexthub/Service.aidl
new file mode 100644
index 0000000..fd748c3
--- /dev/null
+++ b/contexthub/aidl/android/hardware/contexthub/Service.aidl
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2024 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 android.hardware.contexthub;
+
+@VintfStability
+parcelable Service {
+ /**
+ * Type of the Service. This field defines the messaging format used for this service.
+ * The format refers to how the data would be marhsalled in messages between host endpoint (on
+ * Android) and endpoint on the Context Hub or generic hub.
+ */
+ RpcFormat format;
+
+ /**
+ * Uniquely identifies the interface (scoped to type). Conventions depend on interface type.
+ * Examples:
+ * 1. AOSP-defined AIDL: android.hardware.something.IFoo/default
+ * 2. Vendor-defined AIDL: com.example.something.IBar/default
+ * 3. Pigweed RPC with Protobuf: com.example.proto.ExampleService
+ */
+ String serviceDescriptor;
+
+ /** Breaking changes should be a major version bump. */
+ int majorVersion;
+ /** Monotonically increasing minor version. */
+ int minorVersion;
+
+ /** Hook for additional detail in vendor-specific type */
+ ParcelableHolder extendedInfo;
+
+ /**
+ * Supported messaging format for the service between the host and the hubs.
+ */
+ @VintfStability
+ @Backing(type="int")
+ enum RpcFormat {
+ /**
+ * Customized format for messaging. Fully customized and opaque messaging format.
+ */
+ CUSTOM = 0,
+ /**
+ * Binder-based messaging. The host endpoint is defining this service in Stable AIDL.
+ * Messages between endpoints that uses this service will be using the binder marhsalling
+ * format.
+ */
+ AIDL = 1,
+ /**
+ * Pigweed RPC messaging with Protobuf. This endpoint is a Pigweed RPC. Messages between
+ * endpoints will use Pigweed RPC marshalling format (protobuf).
+ */
+ PW_RPC_PROTOBUF = 2,
+ }
+}
diff --git a/contexthub/aidl/android/hardware/contexthub/VendorHubInfo.aidl b/contexthub/aidl/android/hardware/contexthub/VendorHubInfo.aidl
new file mode 100644
index 0000000..524c7e8
--- /dev/null
+++ b/contexthub/aidl/android/hardware/contexthub/VendorHubInfo.aidl
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 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 android.hardware.contexthub;
+
+/**
+ * A representation of a vendor-specific hub providing endpoints (with services). The hub does not
+ * run the Context Hub Runtime Environment, but exposes a similar messaging API.
+ */
+@VintfStability
+parcelable VendorHubInfo {
+ /** Descriptive name of the basic hub */
+ String name;
+
+ /** Version of the hub */
+ int version;
+
+ /** Hook for additional detail in vendor-specific type */
+ ParcelableHolder extendedInfo;
+}
diff --git a/contexthub/aidl/default/Android.bp b/contexthub/aidl/default/Android.bp
index 2960746..da173f9 100644
--- a/contexthub/aidl/default/Android.bp
+++ b/contexthub/aidl/default/Android.bp
@@ -30,7 +30,7 @@
shared_libs: [
"libbase",
"libbinder_ndk",
- "android.hardware.contexthub-V3-ndk",
+ "android.hardware.contexthub-V4-ndk",
],
export_include_dirs: ["include"],
srcs: [
@@ -51,7 +51,7 @@
shared_libs: [
"libbase",
"libbinder_ndk",
- "android.hardware.contexthub-V3-ndk",
+ "android.hardware.contexthub-V4-ndk",
],
static_libs: [
"libcontexthubexampleimpl",
diff --git a/contexthub/aidl/default/ContextHub.cpp b/contexthub/aidl/default/ContextHub.cpp
index bd483d7..5713a1b 100644
--- a/contexthub/aidl/default/ContextHub.cpp
+++ b/contexthub/aidl/default/ContextHub.cpp
@@ -136,4 +136,83 @@
return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
}
+ScopedAStatus ContextHub::getHubs(std::vector<HubInfo>* _aidl_return) {
+ ContextHubInfo hub = {};
+ hub.name = "Mock Context Hub";
+ hub.vendor = "AOSP";
+ hub.toolchain = "n/a";
+ hub.id = kMockHubId;
+ hub.peakMips = 1;
+ hub.maxSupportedMessageLengthBytes = 4096;
+ hub.chrePlatformId = UINT64_C(0x476f6f6754000000);
+ hub.chreApiMajorVersion = 1;
+ hub.chreApiMinorVersion = 6;
+ hub.supportsReliableMessages = false;
+
+ HubInfo hubInfo1 = {};
+ hubInfo1.hubId = hub.chrePlatformId;
+ hubInfo1.hubDetails = HubInfo::HubDetails::make<HubInfo::HubDetails::Tag::contextHubInfo>(hub);
+
+ VendorHubInfo vendorHub = {};
+ vendorHub.name = "Mock Vendor Hub";
+ vendorHub.version = 42;
+
+ HubInfo hubInfo2 = {};
+ hubInfo1.hubId = UINT64_C(0x1234567812345678);
+ hubInfo1.hubDetails =
+ HubInfo::HubDetails::make<HubInfo::HubDetails::Tag::vendorHubInfo>(vendorHub);
+
+ _aidl_return->push_back(hubInfo1);
+ _aidl_return->push_back(hubInfo2);
+
+ return ScopedAStatus::ok();
+};
+
+ScopedAStatus ContextHub::getEndpoints(std::vector<EndpointInfo>* /* _aidl_return */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::registerEndpoint(const EndpointInfo& /* in_endpoint */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::unregisterEndpoint(const EndpointInfo& /* in_endpoint */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::registerEndpointCallback(
+ const std::shared_ptr<IEndpointCallback>& /* in_callback */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::requestSessionIdRange(int32_t /* in_size */,
+ std::vector<int32_t>* /* _aidl_return */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::openEndpointSession(
+ int32_t /* in_sessionId */, const EndpointId& /* in_destination */,
+ const EndpointId& /* in_initiator */,
+ const std::optional<std::string>& /* in_serviceDescriptor */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::sendMessageToEndpoint(int32_t /* in_sessionId */,
+ const Message& /* in_msg */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::sendMessageDeliveryStatusToEndpoint(
+ int32_t /* in_sessionId */, const MessageDeliveryStatus& /* in_msgStatus */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::closeEndpointSession(int32_t /* in_sessionId */, Reason /* in_reason */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
+ScopedAStatus ContextHub::endpointSessionOpenComplete(int32_t /* in_sessionId */) {
+ return ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION);
+};
+
} // namespace aidl::android::hardware::contexthub
diff --git a/contexthub/aidl/default/contexthub-default.xml b/contexthub/aidl/default/contexthub-default.xml
index 2f8ddc8..359bb0a 100644
--- a/contexthub/aidl/default/contexthub-default.xml
+++ b/contexthub/aidl/default/contexthub-default.xml
@@ -1,7 +1,7 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.contexthub</name>
- <version>3</version>
+ <version>4</version>
<interface>
<name>IContextHub</name>
<instance>default</instance>
diff --git a/contexthub/aidl/default/include/contexthub-impl/ContextHub.h b/contexthub/aidl/default/include/contexthub-impl/ContextHub.h
index 72e8b3b..5680a77 100644
--- a/contexthub/aidl/default/include/contexthub-impl/ContextHub.h
+++ b/contexthub/aidl/default/include/contexthub-impl/ContextHub.h
@@ -53,6 +53,24 @@
int32_t in_contextHubId,
const MessageDeliveryStatus& in_messageDeliveryStatus) override;
+ ::ndk::ScopedAStatus getHubs(std::vector<HubInfo>* _aidl_return) override;
+ ::ndk::ScopedAStatus getEndpoints(std::vector<EndpointInfo>* _aidl_return) override;
+ ::ndk::ScopedAStatus registerEndpoint(const EndpointInfo& in_endpoint) override;
+ ::ndk::ScopedAStatus unregisterEndpoint(const EndpointInfo& in_endpoint) override;
+ ::ndk::ScopedAStatus registerEndpointCallback(
+ const std::shared_ptr<IEndpointCallback>& in_callback) override;
+ ::ndk::ScopedAStatus requestSessionIdRange(int32_t in_size,
+ std::vector<int32_t>* _aidl_return) override;
+ ::ndk::ScopedAStatus openEndpointSession(
+ int32_t in_sessionId, const EndpointId& in_destination, const EndpointId& in_initiator,
+ const std::optional<std::string>& in_serviceDescriptor) override;
+ ::ndk::ScopedAStatus sendMessageToEndpoint(int32_t in_sessionId,
+ const Message& in_msg) override;
+ ::ndk::ScopedAStatus sendMessageDeliveryStatusToEndpoint(
+ int32_t in_sessionId, const MessageDeliveryStatus& in_msgStatus) override;
+ ::ndk::ScopedAStatus closeEndpointSession(int32_t in_sessionId, Reason in_reason) override;
+ ::ndk::ScopedAStatus endpointSessionOpenComplete(int32_t in_sessionId) override;
+
private:
static constexpr uint32_t kMockHubId = 0;
std::shared_ptr<IContextHubCallback> mCallback;
diff --git a/gatekeeper/aidl/Android.bp b/gatekeeper/aidl/Android.bp
index 169a7d5..88c10b7 100644
--- a/gatekeeper/aidl/Android.bp
+++ b/gatekeeper/aidl/Android.bp
@@ -10,8 +10,8 @@
aidl_interface {
name: "android.hardware.gatekeeper",
vendor_available: true,
- imports: [
- "android.hardware.security.keymint-V3",
+ defaults: [
+ "android.hardware.security.keymint-latest-defaults",
],
srcs: ["android/hardware/gatekeeper/*.aidl"],
stability: "vintf",
@@ -32,7 +32,7 @@
versions_with_info: [
{
version: "1",
- imports: ["android.hardware.security.keymint-V3"],
+ imports: ["android.hardware.security.keymint-V4"],
},
],
frozen: true,
diff --git a/health/storage/1.0/vts/functional/Android.bp b/health/storage/1.0/vts/functional/Android.bp
index ccf22ce..e78e044 100644
--- a/health/storage/1.0/vts/functional/Android.bp
+++ b/health/storage/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_kernel",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"
diff --git a/health/storage/aidl/vts/functional/Android.bp b/health/storage/aidl/vts/functional/Android.bp
index fe15170..083ec37 100644
--- a/health/storage/aidl/vts/functional/Android.bp
+++ b/health/storage/aidl/vts/functional/Android.bp
@@ -13,6 +13,7 @@
// limitations under the License.
package {
+ default_team: "trendy_team_android_kernel",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"
diff --git a/security/keymint/aidl/Android.bp b/security/keymint/aidl/Android.bp
index e346610..a2e58ac 100644
--- a/security/keymint/aidl/Android.bp
+++ b/security/keymint/aidl/Android.bp
@@ -17,7 +17,7 @@
"android.hardware.security.secureclock-V1",
],
stability: "vintf",
- frozen: true,
+ frozen: false,
backend: {
java: {
platform_apis: true,
@@ -51,34 +51,42 @@
}
+// An aidl_interface_defaults that includes the latest KeyMint AIDL interface.
+// aidl_interface modules that depend on KeyMint directly can include this
+// aidl_interface_defaults to avoid managing dependency versions explicitly.
+aidl_interface_defaults {
+ name: "android.hardware.security.keymint-latest-defaults",
+ imports: ["android.hardware.security.keymint-V4"],
+}
+
// cc_defaults that includes the latest KeyMint AIDL library.
// Modules that depend on KeyMint directly can include this cc_defaults to avoid
// managing dependency versions explicitly.
cc_defaults {
name: "keymint_use_latest_hal_aidl_ndk_static",
static_libs: [
- "android.hardware.security.keymint-V3-ndk",
+ "android.hardware.security.keymint-V4-ndk",
],
}
cc_defaults {
name: "keymint_use_latest_hal_aidl_ndk_shared",
shared_libs: [
- "android.hardware.security.keymint-V3-ndk",
+ "android.hardware.security.keymint-V4-ndk",
],
}
cc_defaults {
name: "keymint_use_latest_hal_aidl_cpp_static",
static_libs: [
- "android.hardware.security.keymint-V3-cpp",
+ "android.hardware.security.keymint-V4-cpp",
],
}
cc_defaults {
name: "keymint_use_latest_hal_aidl_cpp_shared",
shared_libs: [
- "android.hardware.security.keymint-V3-cpp",
+ "android.hardware.security.keymint-V4-cpp",
],
}
@@ -88,6 +96,6 @@
rust_defaults {
name: "keymint_use_latest_hal_aidl_rust",
rustlibs: [
- "android.hardware.security.keymint-V3-rust",
+ "android.hardware.security.keymint-V4-rust",
],
}
diff --git a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/ErrorCode.aidl b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/ErrorCode.aidl
index b05a0f3..71d3651 100644
--- a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/ErrorCode.aidl
+++ b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/ErrorCode.aidl
@@ -36,90 +36,91 @@
@Backing(type="int") @VintfStability
enum ErrorCode {
OK = 0,
- ROOT_OF_TRUST_ALREADY_SET = -1,
- UNSUPPORTED_PURPOSE = -2,
- INCOMPATIBLE_PURPOSE = -3,
- UNSUPPORTED_ALGORITHM = -4,
- INCOMPATIBLE_ALGORITHM = -5,
- UNSUPPORTED_KEY_SIZE = -6,
- UNSUPPORTED_BLOCK_MODE = -7,
- INCOMPATIBLE_BLOCK_MODE = -8,
- UNSUPPORTED_MAC_LENGTH = -9,
- UNSUPPORTED_PADDING_MODE = -10,
- INCOMPATIBLE_PADDING_MODE = -11,
- UNSUPPORTED_DIGEST = -12,
- INCOMPATIBLE_DIGEST = -13,
- INVALID_EXPIRATION_TIME = -14,
- INVALID_USER_ID = -15,
- INVALID_AUTHORIZATION_TIMEOUT = -16,
- UNSUPPORTED_KEY_FORMAT = -17,
- INCOMPATIBLE_KEY_FORMAT = -18,
- UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = -19,
- UNSUPPORTED_KEY_VERIFICATION_ALGORITHM = -20,
- INVALID_INPUT_LENGTH = -21,
- KEY_EXPORT_OPTIONS_INVALID = -22,
- DELEGATION_NOT_ALLOWED = -23,
- KEY_NOT_YET_VALID = -24,
- KEY_EXPIRED = -25,
- KEY_USER_NOT_AUTHENTICATED = -26,
- OUTPUT_PARAMETER_NULL = -27,
- INVALID_OPERATION_HANDLE = -28,
- INSUFFICIENT_BUFFER_SPACE = -29,
- VERIFICATION_FAILED = -30,
- TOO_MANY_OPERATIONS = -31,
- UNEXPECTED_NULL_POINTER = -32,
- INVALID_KEY_BLOB = -33,
- IMPORTED_KEY_NOT_ENCRYPTED = -34,
- IMPORTED_KEY_DECRYPTION_FAILED = -35,
- IMPORTED_KEY_NOT_SIGNED = -36,
- IMPORTED_KEY_VERIFICATION_FAILED = -37,
- INVALID_ARGUMENT = -38,
- UNSUPPORTED_TAG = -39,
- INVALID_TAG = -40,
- MEMORY_ALLOCATION_FAILED = -41,
- IMPORT_PARAMETER_MISMATCH = -44,
- SECURE_HW_ACCESS_DENIED = -45,
- OPERATION_CANCELLED = -46,
- CONCURRENT_ACCESS_CONFLICT = -47,
- SECURE_HW_BUSY = -48,
- SECURE_HW_COMMUNICATION_FAILED = -49,
- UNSUPPORTED_EC_FIELD = -50,
- MISSING_NONCE = -51,
- INVALID_NONCE = -52,
- MISSING_MAC_LENGTH = -53,
- KEY_RATE_LIMIT_EXCEEDED = -54,
- CALLER_NONCE_PROHIBITED = -55,
- KEY_MAX_OPS_EXCEEDED = -56,
- INVALID_MAC_LENGTH = -57,
- MISSING_MIN_MAC_LENGTH = -58,
- UNSUPPORTED_MIN_MAC_LENGTH = -59,
- UNSUPPORTED_KDF = -60,
- UNSUPPORTED_EC_CURVE = -61,
- KEY_REQUIRES_UPGRADE = -62,
- ATTESTATION_CHALLENGE_MISSING = -63,
- KEYMINT_NOT_CONFIGURED = -64,
- ATTESTATION_APPLICATION_ID_MISSING = -65,
- CANNOT_ATTEST_IDS = -66,
- ROLLBACK_RESISTANCE_UNAVAILABLE = -67,
- HARDWARE_TYPE_UNAVAILABLE = -68,
- PROOF_OF_PRESENCE_REQUIRED = -69,
- CONCURRENT_PROOF_OF_PRESENCE_REQUESTED = -70,
- NO_USER_CONFIRMATION = -71,
- DEVICE_LOCKED = -72,
- EARLY_BOOT_ENDED = -73,
- ATTESTATION_KEYS_NOT_PROVISIONED = -74,
- ATTESTATION_IDS_NOT_PROVISIONED = -75,
- INVALID_OPERATION = -76,
- STORAGE_KEY_UNSUPPORTED = -77,
- INCOMPATIBLE_MGF_DIGEST = -78,
- UNSUPPORTED_MGF_DIGEST = -79,
- MISSING_NOT_BEFORE = -80,
- MISSING_NOT_AFTER = -81,
- MISSING_ISSUER_SUBJECT = -82,
- INVALID_ISSUER_SUBJECT = -83,
- BOOT_LEVEL_EXCEEDED = -84,
- HARDWARE_NOT_YET_AVAILABLE = -85,
- UNIMPLEMENTED = -100,
- VERSION_MISMATCH = -101,
- UNKNOWN_ERROR = -1000,
+ ROOT_OF_TRUST_ALREADY_SET = (-1) /* -1 */,
+ UNSUPPORTED_PURPOSE = (-2) /* -2 */,
+ INCOMPATIBLE_PURPOSE = (-3) /* -3 */,
+ UNSUPPORTED_ALGORITHM = (-4) /* -4 */,
+ INCOMPATIBLE_ALGORITHM = (-5) /* -5 */,
+ UNSUPPORTED_KEY_SIZE = (-6) /* -6 */,
+ UNSUPPORTED_BLOCK_MODE = (-7) /* -7 */,
+ INCOMPATIBLE_BLOCK_MODE = (-8) /* -8 */,
+ UNSUPPORTED_MAC_LENGTH = (-9) /* -9 */,
+ UNSUPPORTED_PADDING_MODE = (-10) /* -10 */,
+ INCOMPATIBLE_PADDING_MODE = (-11) /* -11 */,
+ UNSUPPORTED_DIGEST = (-12) /* -12 */,
+ INCOMPATIBLE_DIGEST = (-13) /* -13 */,
+ INVALID_EXPIRATION_TIME = (-14) /* -14 */,
+ INVALID_USER_ID = (-15) /* -15 */,
+ INVALID_AUTHORIZATION_TIMEOUT = (-16) /* -16 */,
+ UNSUPPORTED_KEY_FORMAT = (-17) /* -17 */,
+ INCOMPATIBLE_KEY_FORMAT = (-18) /* -18 */,
+ UNSUPPORTED_KEY_ENCRYPTION_ALGORITHM = (-19) /* -19 */,
+ UNSUPPORTED_KEY_VERIFICATION_ALGORITHM = (-20) /* -20 */,
+ INVALID_INPUT_LENGTH = (-21) /* -21 */,
+ KEY_EXPORT_OPTIONS_INVALID = (-22) /* -22 */,
+ DELEGATION_NOT_ALLOWED = (-23) /* -23 */,
+ KEY_NOT_YET_VALID = (-24) /* -24 */,
+ KEY_EXPIRED = (-25) /* -25 */,
+ KEY_USER_NOT_AUTHENTICATED = (-26) /* -26 */,
+ OUTPUT_PARAMETER_NULL = (-27) /* -27 */,
+ INVALID_OPERATION_HANDLE = (-28) /* -28 */,
+ INSUFFICIENT_BUFFER_SPACE = (-29) /* -29 */,
+ VERIFICATION_FAILED = (-30) /* -30 */,
+ TOO_MANY_OPERATIONS = (-31) /* -31 */,
+ UNEXPECTED_NULL_POINTER = (-32) /* -32 */,
+ INVALID_KEY_BLOB = (-33) /* -33 */,
+ IMPORTED_KEY_NOT_ENCRYPTED = (-34) /* -34 */,
+ IMPORTED_KEY_DECRYPTION_FAILED = (-35) /* -35 */,
+ IMPORTED_KEY_NOT_SIGNED = (-36) /* -36 */,
+ IMPORTED_KEY_VERIFICATION_FAILED = (-37) /* -37 */,
+ INVALID_ARGUMENT = (-38) /* -38 */,
+ UNSUPPORTED_TAG = (-39) /* -39 */,
+ INVALID_TAG = (-40) /* -40 */,
+ MEMORY_ALLOCATION_FAILED = (-41) /* -41 */,
+ IMPORT_PARAMETER_MISMATCH = (-44) /* -44 */,
+ SECURE_HW_ACCESS_DENIED = (-45) /* -45 */,
+ OPERATION_CANCELLED = (-46) /* -46 */,
+ CONCURRENT_ACCESS_CONFLICT = (-47) /* -47 */,
+ SECURE_HW_BUSY = (-48) /* -48 */,
+ SECURE_HW_COMMUNICATION_FAILED = (-49) /* -49 */,
+ UNSUPPORTED_EC_FIELD = (-50) /* -50 */,
+ MISSING_NONCE = (-51) /* -51 */,
+ INVALID_NONCE = (-52) /* -52 */,
+ MISSING_MAC_LENGTH = (-53) /* -53 */,
+ KEY_RATE_LIMIT_EXCEEDED = (-54) /* -54 */,
+ CALLER_NONCE_PROHIBITED = (-55) /* -55 */,
+ KEY_MAX_OPS_EXCEEDED = (-56) /* -56 */,
+ INVALID_MAC_LENGTH = (-57) /* -57 */,
+ MISSING_MIN_MAC_LENGTH = (-58) /* -58 */,
+ UNSUPPORTED_MIN_MAC_LENGTH = (-59) /* -59 */,
+ UNSUPPORTED_KDF = (-60) /* -60 */,
+ UNSUPPORTED_EC_CURVE = (-61) /* -61 */,
+ KEY_REQUIRES_UPGRADE = (-62) /* -62 */,
+ ATTESTATION_CHALLENGE_MISSING = (-63) /* -63 */,
+ KEYMINT_NOT_CONFIGURED = (-64) /* -64 */,
+ ATTESTATION_APPLICATION_ID_MISSING = (-65) /* -65 */,
+ CANNOT_ATTEST_IDS = (-66) /* -66 */,
+ ROLLBACK_RESISTANCE_UNAVAILABLE = (-67) /* -67 */,
+ HARDWARE_TYPE_UNAVAILABLE = (-68) /* -68 */,
+ PROOF_OF_PRESENCE_REQUIRED = (-69) /* -69 */,
+ CONCURRENT_PROOF_OF_PRESENCE_REQUESTED = (-70) /* -70 */,
+ NO_USER_CONFIRMATION = (-71) /* -71 */,
+ DEVICE_LOCKED = (-72) /* -72 */,
+ EARLY_BOOT_ENDED = (-73) /* -73 */,
+ ATTESTATION_KEYS_NOT_PROVISIONED = (-74) /* -74 */,
+ ATTESTATION_IDS_NOT_PROVISIONED = (-75) /* -75 */,
+ INVALID_OPERATION = (-76) /* -76 */,
+ STORAGE_KEY_UNSUPPORTED = (-77) /* -77 */,
+ INCOMPATIBLE_MGF_DIGEST = (-78) /* -78 */,
+ UNSUPPORTED_MGF_DIGEST = (-79) /* -79 */,
+ MISSING_NOT_BEFORE = (-80) /* -80 */,
+ MISSING_NOT_AFTER = (-81) /* -81 */,
+ MISSING_ISSUER_SUBJECT = (-82) /* -82 */,
+ INVALID_ISSUER_SUBJECT = (-83) /* -83 */,
+ BOOT_LEVEL_EXCEEDED = (-84) /* -84 */,
+ HARDWARE_NOT_YET_AVAILABLE = (-85) /* -85 */,
+ MODULE_HASH_ALREADY_SET = (-86) /* -86 */,
+ UNIMPLEMENTED = (-100) /* -100 */,
+ VERSION_MISMATCH = (-101) /* -101 */,
+ UNKNOWN_ERROR = (-1000) /* -1000 */,
}
diff --git a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/HardwareAuthenticatorType.aidl b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/HardwareAuthenticatorType.aidl
index dfc98f0..eb4f621 100644
--- a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/HardwareAuthenticatorType.aidl
+++ b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/HardwareAuthenticatorType.aidl
@@ -36,7 +36,7 @@
@Backing(type="int") @VintfStability
enum HardwareAuthenticatorType {
NONE = 0,
- PASSWORD = 1,
- FINGERPRINT = 2,
- ANY = -1,
+ PASSWORD = (1 << 0) /* 1 */,
+ FINGERPRINT = (1 << 1) /* 2 */,
+ ANY = 0xFFFFFFFF,
}
diff --git a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/IKeyMintDevice.aidl b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/IKeyMintDevice.aidl
index dcc22c4..2945dab 100644
--- a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/IKeyMintDevice.aidl
+++ b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/IKeyMintDevice.aidl
@@ -52,5 +52,6 @@
byte[16] getRootOfTrustChallenge();
byte[] getRootOfTrust(in byte[16] challenge);
void sendRootOfTrust(in byte[] rootOfTrust);
+ void setAdditionalAttestationInfo(in android.hardware.security.keymint.KeyParameter[] info);
const int AUTH_TOKEN_MAC_LENGTH = 32;
}
diff --git a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/Tag.aidl b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/Tag.aidl
index 6ae2369..79341ee 100644
--- a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/Tag.aidl
+++ b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/Tag.aidl
@@ -36,69 +36,70 @@
@Backing(type="int") @VintfStability
enum Tag {
INVALID = 0,
- PURPOSE = 536870913,
- ALGORITHM = 268435458,
- KEY_SIZE = 805306371,
- BLOCK_MODE = 536870916,
- DIGEST = 536870917,
- PADDING = 536870918,
- CALLER_NONCE = 1879048199,
- MIN_MAC_LENGTH = 805306376,
- EC_CURVE = 268435466,
- RSA_PUBLIC_EXPONENT = 1342177480,
- INCLUDE_UNIQUE_ID = 1879048394,
- RSA_OAEP_MGF_DIGEST = 536871115,
- BOOTLOADER_ONLY = 1879048494,
- ROLLBACK_RESISTANCE = 1879048495,
- HARDWARE_TYPE = 268435760,
- EARLY_BOOT_ONLY = 1879048497,
- ACTIVE_DATETIME = 1610613136,
- ORIGINATION_EXPIRE_DATETIME = 1610613137,
- USAGE_EXPIRE_DATETIME = 1610613138,
- MIN_SECONDS_BETWEEN_OPS = 805306771,
- MAX_USES_PER_BOOT = 805306772,
- USAGE_COUNT_LIMIT = 805306773,
- USER_ID = 805306869,
- USER_SECURE_ID = -1610612234,
- NO_AUTH_REQUIRED = 1879048695,
- USER_AUTH_TYPE = 268435960,
- AUTH_TIMEOUT = 805306873,
- ALLOW_WHILE_ON_BODY = 1879048698,
- TRUSTED_USER_PRESENCE_REQUIRED = 1879048699,
- TRUSTED_CONFIRMATION_REQUIRED = 1879048700,
- UNLOCKED_DEVICE_REQUIRED = 1879048701,
- APPLICATION_ID = -1879047591,
- APPLICATION_DATA = -1879047492,
- CREATION_DATETIME = 1610613437,
- ORIGIN = 268436158,
- ROOT_OF_TRUST = -1879047488,
- OS_VERSION = 805307073,
- OS_PATCHLEVEL = 805307074,
- UNIQUE_ID = -1879047485,
- ATTESTATION_CHALLENGE = -1879047484,
- ATTESTATION_APPLICATION_ID = -1879047483,
- ATTESTATION_ID_BRAND = -1879047482,
- ATTESTATION_ID_DEVICE = -1879047481,
- ATTESTATION_ID_PRODUCT = -1879047480,
- ATTESTATION_ID_SERIAL = -1879047479,
- ATTESTATION_ID_IMEI = -1879047478,
- ATTESTATION_ID_MEID = -1879047477,
- ATTESTATION_ID_MANUFACTURER = -1879047476,
- ATTESTATION_ID_MODEL = -1879047475,
- VENDOR_PATCHLEVEL = 805307086,
- BOOT_PATCHLEVEL = 805307087,
- DEVICE_UNIQUE_ATTESTATION = 1879048912,
- IDENTITY_CREDENTIAL_KEY = 1879048913,
- STORAGE_KEY = 1879048914,
- ATTESTATION_ID_SECOND_IMEI = -1879047469,
- ASSOCIATED_DATA = -1879047192,
- NONCE = -1879047191,
- MAC_LENGTH = 805307371,
- RESET_SINCE_ID_ROTATION = 1879049196,
- CONFIRMATION_TOKEN = -1879047187,
- CERTIFICATE_SERIAL = -2147482642,
- CERTIFICATE_SUBJECT = -1879047185,
- CERTIFICATE_NOT_BEFORE = 1610613744,
- CERTIFICATE_NOT_AFTER = 1610613745,
- MAX_BOOT_LEVEL = 805307378,
+ PURPOSE = (android.hardware.security.keymint.TagType.ENUM_REP | 1) /* 536870913 */,
+ ALGORITHM = (android.hardware.security.keymint.TagType.ENUM | 2) /* 268435458 */,
+ KEY_SIZE = (android.hardware.security.keymint.TagType.UINT | 3) /* 805306371 */,
+ BLOCK_MODE = (android.hardware.security.keymint.TagType.ENUM_REP | 4) /* 536870916 */,
+ DIGEST = (android.hardware.security.keymint.TagType.ENUM_REP | 5) /* 536870917 */,
+ PADDING = (android.hardware.security.keymint.TagType.ENUM_REP | 6) /* 536870918 */,
+ CALLER_NONCE = (android.hardware.security.keymint.TagType.BOOL | 7) /* 1879048199 */,
+ MIN_MAC_LENGTH = (android.hardware.security.keymint.TagType.UINT | 8) /* 805306376 */,
+ EC_CURVE = (android.hardware.security.keymint.TagType.ENUM | 10) /* 268435466 */,
+ RSA_PUBLIC_EXPONENT = (android.hardware.security.keymint.TagType.ULONG | 200) /* 1342177480 */,
+ INCLUDE_UNIQUE_ID = (android.hardware.security.keymint.TagType.BOOL | 202) /* 1879048394 */,
+ RSA_OAEP_MGF_DIGEST = (android.hardware.security.keymint.TagType.ENUM_REP | 203) /* 536871115 */,
+ BOOTLOADER_ONLY = (android.hardware.security.keymint.TagType.BOOL | 302) /* 1879048494 */,
+ ROLLBACK_RESISTANCE = (android.hardware.security.keymint.TagType.BOOL | 303) /* 1879048495 */,
+ HARDWARE_TYPE = (android.hardware.security.keymint.TagType.ENUM | 304) /* 268435760 */,
+ EARLY_BOOT_ONLY = (android.hardware.security.keymint.TagType.BOOL | 305) /* 1879048497 */,
+ ACTIVE_DATETIME = (android.hardware.security.keymint.TagType.DATE | 400) /* 1610613136 */,
+ ORIGINATION_EXPIRE_DATETIME = (android.hardware.security.keymint.TagType.DATE | 401) /* 1610613137 */,
+ USAGE_EXPIRE_DATETIME = (android.hardware.security.keymint.TagType.DATE | 402) /* 1610613138 */,
+ MIN_SECONDS_BETWEEN_OPS = (android.hardware.security.keymint.TagType.UINT | 403) /* 805306771 */,
+ MAX_USES_PER_BOOT = (android.hardware.security.keymint.TagType.UINT | 404) /* 805306772 */,
+ USAGE_COUNT_LIMIT = (android.hardware.security.keymint.TagType.UINT | 405) /* 805306773 */,
+ USER_ID = (android.hardware.security.keymint.TagType.UINT | 501) /* 805306869 */,
+ USER_SECURE_ID = (android.hardware.security.keymint.TagType.ULONG_REP | 502) /* -1610612234 */,
+ NO_AUTH_REQUIRED = (android.hardware.security.keymint.TagType.BOOL | 503) /* 1879048695 */,
+ USER_AUTH_TYPE = (android.hardware.security.keymint.TagType.ENUM | 504) /* 268435960 */,
+ AUTH_TIMEOUT = (android.hardware.security.keymint.TagType.UINT | 505) /* 805306873 */,
+ ALLOW_WHILE_ON_BODY = (android.hardware.security.keymint.TagType.BOOL | 506) /* 1879048698 */,
+ TRUSTED_USER_PRESENCE_REQUIRED = (android.hardware.security.keymint.TagType.BOOL | 507) /* 1879048699 */,
+ TRUSTED_CONFIRMATION_REQUIRED = (android.hardware.security.keymint.TagType.BOOL | 508) /* 1879048700 */,
+ UNLOCKED_DEVICE_REQUIRED = (android.hardware.security.keymint.TagType.BOOL | 509) /* 1879048701 */,
+ APPLICATION_ID = (android.hardware.security.keymint.TagType.BYTES | 601) /* -1879047591 */,
+ APPLICATION_DATA = (android.hardware.security.keymint.TagType.BYTES | 700) /* -1879047492 */,
+ CREATION_DATETIME = (android.hardware.security.keymint.TagType.DATE | 701) /* 1610613437 */,
+ ORIGIN = (android.hardware.security.keymint.TagType.ENUM | 702) /* 268436158 */,
+ ROOT_OF_TRUST = (android.hardware.security.keymint.TagType.BYTES | 704) /* -1879047488 */,
+ OS_VERSION = (android.hardware.security.keymint.TagType.UINT | 705) /* 805307073 */,
+ OS_PATCHLEVEL = (android.hardware.security.keymint.TagType.UINT | 706) /* 805307074 */,
+ UNIQUE_ID = (android.hardware.security.keymint.TagType.BYTES | 707) /* -1879047485 */,
+ ATTESTATION_CHALLENGE = (android.hardware.security.keymint.TagType.BYTES | 708) /* -1879047484 */,
+ ATTESTATION_APPLICATION_ID = (android.hardware.security.keymint.TagType.BYTES | 709) /* -1879047483 */,
+ ATTESTATION_ID_BRAND = (android.hardware.security.keymint.TagType.BYTES | 710) /* -1879047482 */,
+ ATTESTATION_ID_DEVICE = (android.hardware.security.keymint.TagType.BYTES | 711) /* -1879047481 */,
+ ATTESTATION_ID_PRODUCT = (android.hardware.security.keymint.TagType.BYTES | 712) /* -1879047480 */,
+ ATTESTATION_ID_SERIAL = (android.hardware.security.keymint.TagType.BYTES | 713) /* -1879047479 */,
+ ATTESTATION_ID_IMEI = (android.hardware.security.keymint.TagType.BYTES | 714) /* -1879047478 */,
+ ATTESTATION_ID_MEID = (android.hardware.security.keymint.TagType.BYTES | 715) /* -1879047477 */,
+ ATTESTATION_ID_MANUFACTURER = (android.hardware.security.keymint.TagType.BYTES | 716) /* -1879047476 */,
+ ATTESTATION_ID_MODEL = (android.hardware.security.keymint.TagType.BYTES | 717) /* -1879047475 */,
+ VENDOR_PATCHLEVEL = (android.hardware.security.keymint.TagType.UINT | 718) /* 805307086 */,
+ BOOT_PATCHLEVEL = (android.hardware.security.keymint.TagType.UINT | 719) /* 805307087 */,
+ DEVICE_UNIQUE_ATTESTATION = (android.hardware.security.keymint.TagType.BOOL | 720) /* 1879048912 */,
+ IDENTITY_CREDENTIAL_KEY = (android.hardware.security.keymint.TagType.BOOL | 721) /* 1879048913 */,
+ STORAGE_KEY = (android.hardware.security.keymint.TagType.BOOL | 722) /* 1879048914 */,
+ ATTESTATION_ID_SECOND_IMEI = (android.hardware.security.keymint.TagType.BYTES | 723) /* -1879047469 */,
+ MODULE_HASH = (android.hardware.security.keymint.TagType.BYTES | 724) /* -1879047468 */,
+ ASSOCIATED_DATA = (android.hardware.security.keymint.TagType.BYTES | 1000) /* -1879047192 */,
+ NONCE = (android.hardware.security.keymint.TagType.BYTES | 1001) /* -1879047191 */,
+ MAC_LENGTH = (android.hardware.security.keymint.TagType.UINT | 1003) /* 805307371 */,
+ RESET_SINCE_ID_ROTATION = (android.hardware.security.keymint.TagType.BOOL | 1004) /* 1879049196 */,
+ CONFIRMATION_TOKEN = (android.hardware.security.keymint.TagType.BYTES | 1005) /* -1879047187 */,
+ CERTIFICATE_SERIAL = (android.hardware.security.keymint.TagType.BIGNUM | 1006) /* -2147482642 */,
+ CERTIFICATE_SUBJECT = (android.hardware.security.keymint.TagType.BYTES | 1007) /* -1879047185 */,
+ CERTIFICATE_NOT_BEFORE = (android.hardware.security.keymint.TagType.DATE | 1008) /* 1610613744 */,
+ CERTIFICATE_NOT_AFTER = (android.hardware.security.keymint.TagType.DATE | 1009) /* 1610613745 */,
+ MAX_BOOT_LEVEL = (android.hardware.security.keymint.TagType.UINT | 1010) /* 805307378 */,
}
diff --git a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/TagType.aidl b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/TagType.aidl
index a7d1de5..ca19e7e 100644
--- a/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/TagType.aidl
+++ b/security/keymint/aidl/aidl_api/android.hardware.security.keymint/current/android/hardware/security/keymint/TagType.aidl
@@ -35,15 +35,15 @@
/* @hide */
@Backing(type="int") @VintfStability
enum TagType {
- INVALID = 0,
- ENUM = 268435456,
- ENUM_REP = 536870912,
- UINT = 805306368,
- UINT_REP = 1073741824,
- ULONG = 1342177280,
- DATE = 1610612736,
- BOOL = 1879048192,
- BIGNUM = -2147483648,
- BYTES = -1879048192,
- ULONG_REP = -1610612736,
+ INVALID = (0 << 28) /* 0 */,
+ ENUM = (1 << 28) /* 268435456 */,
+ ENUM_REP = (2 << 28) /* 536870912 */,
+ UINT = (3 << 28) /* 805306368 */,
+ UINT_REP = (4 << 28) /* 1073741824 */,
+ ULONG = (5 << 28) /* 1342177280 */,
+ DATE = (6 << 28) /* 1610612736 */,
+ BOOL = (7 << 28) /* 1879048192 */,
+ BIGNUM = (8 << 28) /* -2147483648 */,
+ BYTES = (9 << 28) /* -1879048192 */,
+ ULONG_REP = (10 << 28) /* -1610612736 */,
}
diff --git a/security/keymint/aidl/android/hardware/security/keymint/ErrorCode.aidl b/security/keymint/aidl/android/hardware/security/keymint/ErrorCode.aidl
index 137e6b6..72fa773 100644
--- a/security/keymint/aidl/android/hardware/security/keymint/ErrorCode.aidl
+++ b/security/keymint/aidl/android/hardware/security/keymint/ErrorCode.aidl
@@ -108,6 +108,7 @@
INVALID_ISSUER_SUBJECT = -83,
BOOT_LEVEL_EXCEEDED = -84,
HARDWARE_NOT_YET_AVAILABLE = -85,
+ MODULE_HASH_ALREADY_SET = -86,
UNIMPLEMENTED = -100,
VERSION_MISMATCH = -101,
diff --git a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl
index 4ebafee..e8eed71 100644
--- a/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl
+++ b/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl
@@ -959,4 +959,17 @@
* not implemented. TEE KeyMint implementations must return ErrorCode::UNIMPLEMENTED.
*/
void sendRootOfTrust(in byte[] rootOfTrust);
+
+ /**
+ * Called by Android to deliver additional attestation information to the IKeyMintDevice.
+ *
+ * IKeyMintDevice must ignore KeyParameters with tags not included in the following list:
+ *
+ * o Tag::MODULE_HASH: holds a hash that must be included in attestations in the moduleHash
+ * field of the software enforced authorization list. If Tag::MODULE_HASH is included in more
+ * than one setAdditionalAttestationInfo call, the implementation should compare the initial
+ * KeyParamValue with the more recent one. If they differ, the implementation should fail with
+ * ErrorCode::MODULE_HASH_ALREADY_SET. If they are the same, no action needs to be taken.
+ */
+ void setAdditionalAttestationInfo(in KeyParameter[] info);
}
diff --git a/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl b/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl
index 996e4e3..e56c193 100644
--- a/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl
+++ b/security/keymint/aidl/android/hardware/security/keymint/Tag.aidl
@@ -901,6 +901,17 @@
ATTESTATION_ID_SECOND_IMEI = TagType.BYTES | 723,
/**
+ * Tag::MODULE_HASH specifies the SHA-256 hash of the DER-encoded module information (see
+ * KeyCreationResult.aidl for the ASN.1 schema).
+ *
+ * This tag is never provided or returned from KeyMint in the key characteristics. It exists
+ * only to define the tag for use in the attestation record.
+ *
+ * Must never appear in KeyCharacteristics.
+ */
+ MODULE_HASH = TagType.BYTES | 724,
+
+ /**
* OBSOLETE: Do not use.
*
* This tag value is included for historical reasons -- in Keymaster it was used to hold
diff --git a/security/keymint/aidl/default/android.hardware.hardware_keystore.xml b/security/keymint/aidl/default/android.hardware.hardware_keystore.xml
index 4c75596..1ab2133 100644
--- a/security/keymint/aidl/default/android.hardware.hardware_keystore.xml
+++ b/security/keymint/aidl/default/android.hardware.hardware_keystore.xml
@@ -14,5 +14,5 @@
limitations under the License.
-->
<permissions>
- <feature name="android.hardware.hardware_keystore" version="300" />
+ <feature name="android.hardware.hardware_keystore" version="400" />
</permissions>
diff --git a/security/keymint/aidl/default/android.hardware.security.keymint-service.xml b/security/keymint/aidl/default/android.hardware.security.keymint-service.xml
index 0568ae6..6bdd33e 100644
--- a/security/keymint/aidl/default/android.hardware.security.keymint-service.xml
+++ b/security/keymint/aidl/default/android.hardware.security.keymint-service.xml
@@ -1,7 +1,7 @@
<manifest version="1.0" type="device">
<hal format="aidl">
<name>android.hardware.security.keymint</name>
- <version>3</version>
+ <version>4</version>
<fqname>IKeyMintDevice/default</fqname>
</hal>
<hal format="aidl">
diff --git a/security/keymint/aidl/vts/functional/BootloaderStateTest.cpp b/security/keymint/aidl/vts/functional/BootloaderStateTest.cpp
index c1f6aee..083a9aa 100644
--- a/security/keymint/aidl/vts/functional/BootloaderStateTest.cpp
+++ b/security/keymint/aidl/vts/functional/BootloaderStateTest.cpp
@@ -109,7 +109,7 @@
}
}
-// Check that attested vbmeta digest is correct.
+// Check that the attested VBMeta digest is correct.
TEST_P(BootloaderStateTest, VbmetaDigest) {
AvbSlotVerifyData* avbSlotData;
auto suffix = fs_mgr_get_slot_suffix();
@@ -125,21 +125,29 @@
AVB_HASHTREE_ERROR_MODE_EIO, &avbSlotData);
ASSERT_TRUE(avb_slot_data_loaded(result)) << "Failed to load avb slot data";
- // Unfortunately, bootloader is not required to report the algorithm used
- // to calculate the digest. There are only two supported options though,
- // SHA256 and SHA512. Attested VBMeta digest must match one of these.
- vector<uint8_t> digest256(AVB_SHA256_DIGEST_SIZE);
- vector<uint8_t> digest512(AVB_SHA512_DIGEST_SIZE);
-
+ vector<uint8_t> sha256Digest(AVB_SHA256_DIGEST_SIZE);
avb_slot_verify_data_calculate_vbmeta_digest(avbSlotData, AVB_DIGEST_TYPE_SHA256,
- digest256.data());
- avb_slot_verify_data_calculate_vbmeta_digest(avbSlotData, AVB_DIGEST_TYPE_SHA512,
- digest512.data());
+ sha256Digest.data());
- ASSERT_TRUE((attestedVbmetaDigest_ == digest256) || (attestedVbmetaDigest_ == digest512))
- << "Attested vbmeta digest (" << bin2hex(attestedVbmetaDigest_)
- << ") does not match computed digest (sha256: " << bin2hex(digest256)
- << ", sha512: " << bin2hex(digest512) << ").";
+ if (get_vsr_api_level() >= __ANDROID_API_V__) {
+ ASSERT_TRUE(attestedVbmetaDigest_ == sha256Digest)
+ << "Attested VBMeta digest (" << bin2hex(attestedVbmetaDigest_)
+ << ") does not match the expected SHA-256 digest (" << bin2hex(sha256Digest)
+ << ").";
+ } else {
+ // Prior to VSR-V, there was no MUST requirement for the algorithm used by the bootloader
+ // to calculate the VBMeta digest. However, the only two supported options are SHA-256 and
+ // SHA-512, so we expect the attested VBMeta digest to match one of these.
+ vector<uint8_t> sha512Digest(AVB_SHA512_DIGEST_SIZE);
+ avb_slot_verify_data_calculate_vbmeta_digest(avbSlotData, AVB_DIGEST_TYPE_SHA512,
+ sha512Digest.data());
+
+ ASSERT_TRUE((attestedVbmetaDigest_ == sha256Digest) ||
+ (attestedVbmetaDigest_ == sha512Digest))
+ << "Attested VBMeta digest (" << bin2hex(attestedVbmetaDigest_)
+ << ") does not match the expected digest (SHA-256: " << bin2hex(sha256Digest)
+ << " or SHA-512: " << bin2hex(sha512Digest) << ").";
+ }
}
INSTANTIATE_KEYMINT_AIDL_TEST(BootloaderStateTest);
diff --git a/security/keymint/aidl/vts/performance/KeyMintBenchmark.cpp b/security/keymint/aidl/vts/performance/KeyMintBenchmark.cpp
index 49fd0c9..781b7a6 100644
--- a/security/keymint/aidl/vts/performance/KeyMintBenchmark.cpp
+++ b/security/keymint/aidl/vts/performance/KeyMintBenchmark.cpp
@@ -294,6 +294,7 @@
ErrorCode DeleteKey() {
Status result = keymint_->deleteKey(key_blob_);
key_blob_ = vector<uint8_t>();
+ key_transform_ = "";
return GetReturnErrorCode(result);
}
diff --git a/usb/1.0/vts/functional/Android.bp b/usb/1.0/vts/functional/Android.bp
index d976a06..09bbeec 100644
--- a/usb/1.0/vts/functional/Android.bp
+++ b/usb/1.0/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_usb",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"
diff --git a/usb/1.1/vts/functional/Android.bp b/usb/1.1/vts/functional/Android.bp
index f514009..48e36f0 100644
--- a/usb/1.1/vts/functional/Android.bp
+++ b/usb/1.1/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_usb",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"
diff --git a/usb/1.2/vts/functional/Android.bp b/usb/1.2/vts/functional/Android.bp
index 688e725..62442be 100644
--- a/usb/1.2/vts/functional/Android.bp
+++ b/usb/1.2/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_usb",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"
diff --git a/usb/1.3/vts/functional/Android.bp b/usb/1.3/vts/functional/Android.bp
index 6a1ce1e..a345128 100644
--- a/usb/1.3/vts/functional/Android.bp
+++ b/usb/1.3/vts/functional/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_usb",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"
diff --git a/usb/aidl/vts/Android.bp b/usb/aidl/vts/Android.bp
index cf9299e..d41116a 100644
--- a/usb/aidl/vts/Android.bp
+++ b/usb/aidl/vts/Android.bp
@@ -15,6 +15,7 @@
//
package {
+ default_team: "trendy_team_android_usb",
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"