Merge "HapticGeneratorTest: Add Tests for all HapticGenerator effect parameters" into main
diff --git a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
index bbc4caf..8d430de 100644
--- a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
+++ b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp
@@ -2975,15 +2975,15 @@
// The five methods below is intended to be called after the worker
// thread has joined, thus no extra synchronization is needed.
- bool hasObservablePositionIncrease() const { return mObservablePositionIncrease; }
- bool hasObservableRetrogradePosition() const { return mRetrogradeObservablePosition; }
+ bool hasObservablePositionIncrease() const { return mObservable.hasPositionIncrease; }
+ bool hasObservableRetrogradePosition() const { return mObservable.hasRetrogradePosition; }
bool hasHardwarePositionIncrease() const {
// For non-MMap, always return true to pass the validation.
- return mIsMmap ? mHardwarePositionIncrease : true;
+ return mIsMmap ? mHardware.hasPositionIncrease : true;
}
bool hasHardwareRetrogradePosition() const {
// For non-MMap, always return false to pass the validation.
- return mIsMmap ? mRetrogradeHardwarePosition : false;
+ return mIsMmap ? mHardware.hasRetrogradePosition : false;
}
std::string getUnexpectedStateTransition() const { return mUnexpectedTransition; }
@@ -3011,25 +3011,9 @@
}
bool interceptRawReply(const StreamDescriptor::Reply&) override { return false; }
bool processValidReply(const StreamDescriptor::Reply& reply) override {
- if (reply.observable.frames != StreamDescriptor::Position::UNKNOWN) {
- if (mPreviousObservableFrames.has_value()) {
- if (reply.observable.frames > mPreviousObservableFrames.value()) {
- mObservablePositionIncrease = true;
- } else if (reply.observable.frames < mPreviousObservableFrames.value()) {
- mRetrogradeObservablePosition = true;
- }
- }
- mPreviousObservableFrames = reply.observable.frames;
- }
+ mObservable.update(reply.observable.frames);
if (mIsMmap) {
- if (mPreviousHardwareFrames.has_value()) {
- if (reply.hardware.frames > mPreviousHardwareFrames.value()) {
- mHardwarePositionIncrease = true;
- } else if (reply.hardware.frames < mPreviousHardwareFrames.value()) {
- mRetrogradeHardwarePosition = true;
- }
- }
- mPreviousHardwareFrames = reply.hardware.frames;
+ mHardware.update(reply.hardware.frames);
}
auto expected = mCommands->getExpectedStates();
@@ -3054,16 +3038,30 @@
}
protected:
+ struct FramesCounter {
+ std::optional<int64_t> previous;
+ bool hasPositionIncrease = false;
+ bool hasRetrogradePosition = false;
+
+ void update(int64_t position) {
+ if (position == StreamDescriptor::Position::UNKNOWN) return;
+ if (previous.has_value()) {
+ if (position > previous.value()) {
+ hasPositionIncrease = true;
+ } else if (position < previous.value()) {
+ hasRetrogradePosition = true;
+ }
+ }
+ previous = position;
+ }
+ };
+
std::shared_ptr<StateSequence> mCommands;
const size_t mFrameSizeBytes;
const bool mIsMmap;
std::optional<StreamDescriptor::State> mPreviousState;
- std::optional<int64_t> mPreviousObservableFrames;
- bool mObservablePositionIncrease = false;
- bool mRetrogradeObservablePosition = false;
- std::optional<int64_t> mPreviousHardwareFrames;
- bool mHardwarePositionIncrease = false;
- bool mRetrogradeHardwarePosition = false;
+ FramesCounter mObservable;
+ FramesCounter mHardware;
std::string mUnexpectedTransition;
};
diff --git a/gnss/aidl/vts/gnss_hal_test.cpp b/gnss/aidl/vts/gnss_hal_test.cpp
index 5e2cbe3..6d5a9a2 100644
--- a/gnss/aidl/vts/gnss_hal_test.cpp
+++ b/gnss/aidl/vts/gnss_hal_test.cpp
@@ -276,29 +276,35 @@
}
/*
- * FindStrongFrequentNonGpsSource:
+ * FindStrongFrequentBlockableSource:
*
- * Search through a GnssSvStatus list for the strongest non-GPS satellite observed enough times
+ * Search through a GnssSvStatus list for the strongest blockable satellite observed enough times
*
* returns the strongest source,
* or a source with constellation == UNKNOWN if none are found sufficient times
*/
-BlocklistedSource GnssHalTest::FindStrongFrequentNonGpsSource(
+BlocklistedSource GnssHalTest::FindStrongFrequentBlockableSource(
const std::list<hidl_vec<IGnssCallback_2_1::GnssSvInfo>> sv_info_list,
const int min_observations) {
- return FindStrongFrequentNonGpsSource(convertToAidl(sv_info_list), min_observations);
+ return FindStrongFrequentBlockableSource(convertToAidl(sv_info_list), min_observations);
}
-BlocklistedSource GnssHalTest::FindStrongFrequentNonGpsSource(
+BlocklistedSource GnssHalTest::FindStrongFrequentBlockableSource(
const std::list<std::vector<IGnssCallback::GnssSvInfo>> sv_info_list,
const int min_observations) {
std::map<ComparableBlocklistedSource, SignalCounts> mapSignals;
+ bool isCnBuild = Utils::isCnBuild();
+ ALOGD("isCnBuild: %s", isCnBuild ? "true" : "false");
for (const auto& sv_info_vec : sv_info_list) {
for (uint32_t iSv = 0; iSv < sv_info_vec.size(); iSv++) {
const auto& gnss_sv = sv_info_vec[iSv];
if ((gnss_sv.svFlag & (int)IGnssCallback::GnssSvFlags::USED_IN_FIX) &&
(gnss_sv.constellation != GnssConstellationType::GPS)) {
+ if (isCnBuild && (gnss_sv.constellation == GnssConstellationType::BEIDOU)) {
+ // Do not blocklist BDS on CN builds
+ continue;
+ }
ComparableBlocklistedSource source;
source.id.svid = gnss_sv.svid;
source.id.constellation = gnss_sv.constellation;
@@ -343,7 +349,7 @@
return source_to_blocklist.id;
}
-GnssConstellationType GnssHalTest::startLocationAndGetNonGpsConstellation(
+GnssConstellationType GnssHalTest::startLocationAndGetBlockableConstellation(
const int locations_to_await, const int gnss_sv_info_list_timeout) {
if (aidl_gnss_hal_->getInterfaceVersion() <= 1) {
return static_cast<GnssConstellationType>(
@@ -360,7 +366,9 @@
ALOGD("Observed %d GnssSvInfo, while awaiting %d Locations (%d received)",
sv_info_list_cbq_size, locations_to_await, location_called_count);
- // Find first non-GPS constellation to blocklist
+ bool isCnBuild = Utils::isCnBuild();
+ ALOGD("isCnBuild: %s", isCnBuild ? "true" : "false");
+ // Find first blockable constellation to blocklist
GnssConstellationType constellation_to_blocklist = GnssConstellationType::UNKNOWN;
for (int i = 0; i < sv_info_list_cbq_size; ++i) {
std::vector<IGnssCallback::GnssSvInfo> sv_info_vec;
@@ -370,7 +378,11 @@
if ((gnss_sv.svFlag & (uint32_t)IGnssCallback::GnssSvFlags::USED_IN_FIX) &&
(gnss_sv.constellation != GnssConstellationType::UNKNOWN) &&
(gnss_sv.constellation != GnssConstellationType::GPS)) {
- // found a non-GPS constellation
+ if (isCnBuild && (gnss_sv.constellation == GnssConstellationType::BEIDOU)) {
+ // Do not blocklist BDS on CN builds
+ continue;
+ }
+ // found a blockable constellation
constellation_to_blocklist = gnss_sv.constellation;
break;
}
@@ -381,11 +393,11 @@
}
if (constellation_to_blocklist == GnssConstellationType::UNKNOWN) {
- ALOGI("No non-GPS constellations found, constellation blocklist test less effective.");
+ ALOGI("No blockable constellations found, constellation blocklist test less effective.");
// Proceed functionally to blocklist something.
constellation_to_blocklist = GnssConstellationType::GLONASS;
}
-
+ ALOGD("Constellation to blocklist: %d", constellation_to_blocklist);
return constellation_to_blocklist;
}
diff --git a/gnss/aidl/vts/gnss_hal_test.h b/gnss/aidl/vts/gnss_hal_test.h
index 88d01c1..dec5856 100644
--- a/gnss/aidl/vts/gnss_hal_test.h
+++ b/gnss/aidl/vts/gnss_hal_test.h
@@ -76,16 +76,16 @@
void StartAndCheckLocations(const int count);
void StartAndCheckLocations(const int count, const bool start_sv_status, const bool start_nmea);
- android::hardware::gnss::GnssConstellationType startLocationAndGetNonGpsConstellation(
+ android::hardware::gnss::GnssConstellationType startLocationAndGetBlockableConstellation(
const int locations_to_await, const int gnss_sv_info_list_timeout);
std::list<std::vector<android::hardware::gnss::IGnssCallback::GnssSvInfo>> convertToAidl(
const std::list<hidl_vec<android::hardware::gnss::V2_1::IGnssCallback::GnssSvInfo>>&
sv_info_list);
- android::hardware::gnss::BlocklistedSource FindStrongFrequentNonGpsSource(
+ android::hardware::gnss::BlocklistedSource FindStrongFrequentBlockableSource(
const std::list<hidl_vec<android::hardware::gnss::V2_1::IGnssCallback::GnssSvInfo>>
sv_info_list,
const int min_observations);
- android::hardware::gnss::BlocklistedSource FindStrongFrequentNonGpsSource(
+ android::hardware::gnss::BlocklistedSource FindStrongFrequentBlockableSource(
const std::list<std::vector<android::hardware::gnss::IGnssCallback::GnssSvInfo>>
sv_info_list,
const int min_observations);
diff --git a/gnss/aidl/vts/gnss_hal_test_cases.cpp b/gnss/aidl/vts/gnss_hal_test_cases.cpp
index f7408d8..091b523 100644
--- a/gnss/aidl/vts/gnss_hal_test_cases.cpp
+++ b/gnss/aidl/vts/gnss_hal_test_cases.cpp
@@ -657,19 +657,19 @@
kGnssSvInfoListTimeout);
ASSERT_EQ(count, sv_info_list_cbq_size);
source_to_blocklist =
- FindStrongFrequentNonGpsSource(sv_info_vec_list, kLocationsToAwait - 1);
+ FindStrongFrequentBlockableSource(sv_info_vec_list, kLocationsToAwait - 1);
} else {
std::list<std::vector<IGnssCallback::GnssSvInfo>> sv_info_vec_list;
int count = aidl_gnss_cb_->sv_info_list_cbq_.retrieve(
sv_info_vec_list, sv_info_list_cbq_size, kGnssSvInfoListTimeout);
ASSERT_EQ(count, sv_info_list_cbq_size);
source_to_blocklist =
- FindStrongFrequentNonGpsSource(sv_info_vec_list, kLocationsToAwait - 1);
+ FindStrongFrequentBlockableSource(sv_info_vec_list, kLocationsToAwait - 1);
}
if (source_to_blocklist.constellation == GnssConstellationType::UNKNOWN) {
- // Cannot find a non-GPS satellite. Let the test pass.
- ALOGD("Cannot find a non-GPS satellite. Letting the test pass.");
+ // Cannot find a blockable satellite. Let the test pass.
+ ALOGD("Cannot find a blockable satellite. Letting the test pass.");
return;
}
@@ -816,8 +816,8 @@
* BlocklistConstellationLocationOff:
*
* 1) Turns on location, waits for 3 locations, ensuring they are valid, and checks corresponding
- * GnssStatus for any non-GPS constellations.
- * 2a & b) Turns off location, and blocklist first non-GPS constellations.
+ * GnssStatus for any blockable constellations.
+ * 2a & b) Turns off location, and blocklist first blockable constellations.
* 3) Restart location, wait for 3 locations, ensuring they are valid, and checks corresponding
* GnssStatus does not use any constellation but GPS.
* 4a & b) Clean up by turning off location, and send in empty blocklist.
@@ -833,9 +833,9 @@
const int kLocationsToAwait = 3;
const int kGnssSvInfoListTimeout = 2;
- // Find first non-GPS constellation to blocklist
+ // Find first blockable constellation to blocklist
GnssConstellationType constellation_to_blocklist = static_cast<GnssConstellationType>(
- startLocationAndGetNonGpsConstellation(kLocationsToAwait, kGnssSvInfoListTimeout));
+ startLocationAndGetBlockableConstellation(kLocationsToAwait, kGnssSvInfoListTimeout));
// Turns off location
StopAndClearLocations();
@@ -919,8 +919,8 @@
* BlocklistConstellationLocationOn:
*
* 1) Turns on location, waits for 3 locations, ensuring they are valid, and checks corresponding
- * GnssStatus for any non-GPS constellations.
- * 2a & b) Blocklist first non-GPS constellation, and turn off location.
+ * GnssStatus for any blockable constellations.
+ * 2a & b) Blocklist first blockable constellation, and turn off location.
* 3) Restart location, wait for 3 locations, ensuring they are valid, and checks corresponding
* GnssStatus does not use any constellation but GPS.
* 4a & b) Clean up by turning off location, and send in empty blocklist.
@@ -936,9 +936,9 @@
const int kLocationsToAwait = 3;
const int kGnssSvInfoListTimeout = 2;
- // Find first non-GPS constellation to blocklist
+ // Find first blockable constellation to blocklist
GnssConstellationType constellation_to_blocklist = static_cast<GnssConstellationType>(
- startLocationAndGetNonGpsConstellation(kLocationsToAwait, kGnssSvInfoListTimeout));
+ startLocationAndGetBlockableConstellation(kLocationsToAwait, kGnssSvInfoListTimeout));
BlocklistedSource source_to_blocklist_1;
source_to_blocklist_1.constellation = constellation_to_blocklist;
diff --git a/gnss/common/utils/vts/Utils.cpp b/gnss/common/utils/vts/Utils.cpp
index e3ff0f3..38afaf3 100644
--- a/gnss/common/utils/vts/Utils.cpp
+++ b/gnss/common/utils/vts/Utils.cpp
@@ -319,6 +319,24 @@
return d * 1000; // meters
}
+// Returns true iff the device has the specified feature.
+bool Utils::deviceSupportsFeature(const char* feature) {
+ bool device_supports_feature = false;
+ FILE* p = popen("/system/bin/pm list features", "re");
+ if (p) {
+ char* line = NULL;
+ size_t len = 0;
+ while (getline(&line, &len, p) > 0) {
+ if (strstr(line, feature)) {
+ device_supports_feature = true;
+ break;
+ }
+ }
+ pclose(p);
+ }
+ return device_supports_feature;
+}
+
} // namespace common
} // namespace gnss
} // namespace hardware
diff --git a/gnss/common/utils/vts/include/Utils.h b/gnss/common/utils/vts/include/Utils.h
index 62d409a..09b99c4 100644
--- a/gnss/common/utils/vts/include/Utils.h
+++ b/gnss/common/utils/vts/include/Utils.h
@@ -60,6 +60,11 @@
static bool isAutomotiveDevice();
static double distanceMeters(double lat1, double lon1, double lat2, double lon2);
+ // Returns true iff the device has the specified feature.
+ static bool deviceSupportsFeature(const char* feature);
+
+ static bool isCnBuild() { return deviceSupportsFeature("cn.google.services"); }
+
private:
template <class T>
static int64_t getLocationTimestampMillis(const T&);
diff --git a/radio/aidl/compat/libradiocompat/sim/structs.cpp b/radio/aidl/compat/libradiocompat/sim/structs.cpp
index 00db2b8..27aca60 100644
--- a/radio/aidl/compat/libradiocompat/sim/structs.cpp
+++ b/radio/aidl/compat/libradiocompat/sim/structs.cpp
@@ -70,26 +70,60 @@
};
}
-aidl::CarrierRestrictions toAidl(const V1_0::CarrierRestrictions& cr) {
+static aidl::CarrierInfo toCarrierInfo(const aidl::Carrier& carrier) {
return {
- .allowedCarriers = toAidl(cr.allowedCarriers),
- .excludedCarriers = toAidl(cr.excludedCarriers),
+ .mcc = carrier.mcc,
+ .mnc = carrier.mnc,
+ };
+}
+
+static std::vector<aidl::CarrierInfo> toCarrierInfos(const std::vector<aidl::Carrier>& carriers) {
+ std::vector<aidl::CarrierInfo> infos(carriers.size());
+ for (size_t i = 0; i < carriers.size(); i++) {
+ infos[i] = toCarrierInfo(carriers[i]);
+ }
+ return infos;
+}
+
+V1_0::Carrier toHidl(const aidl::CarrierInfo& carrierInfo) {
+ return {
+ .mcc = carrierInfo.mcc,
+ .mnc = carrierInfo.mnc,
+ };
+}
+
+aidl::CarrierRestrictions toAidl(const V1_0::CarrierRestrictions& cr) {
+ auto allowedCarriers = toAidl(cr.allowedCarriers);
+ auto excludedCarriers = toAidl(cr.excludedCarriers);
+ return {
+ .allowedCarriers = allowedCarriers,
+ .excludedCarriers = excludedCarriers,
.allowedCarriersPrioritized = true,
+ .allowedCarrierInfoList = toCarrierInfos(allowedCarriers),
+ .excludedCarrierInfoList = toCarrierInfos(excludedCarriers),
};
}
aidl::CarrierRestrictions toAidl(const V1_4::CarrierRestrictionsWithPriority& cr) {
+ auto allowedCarriers = toAidl(cr.allowedCarriers);
+ auto excludedCarriers = toAidl(cr.excludedCarriers);
return {
- .allowedCarriers = toAidl(cr.allowedCarriers),
- .excludedCarriers = toAidl(cr.excludedCarriers),
+ .allowedCarriers = allowedCarriers,
+ .excludedCarriers = excludedCarriers,
.allowedCarriersPrioritized = cr.allowedCarriersPrioritized,
+ .allowedCarrierInfoList = toCarrierInfos(allowedCarriers),
+ .excludedCarrierInfoList = toCarrierInfos(excludedCarriers),
};
}
V1_4::CarrierRestrictionsWithPriority toHidl(const aidl::CarrierRestrictions& cr) {
return {
- .allowedCarriers = toHidl(cr.allowedCarriers),
- .excludedCarriers = toHidl(cr.excludedCarriers),
+ .allowedCarriers = (cr.allowedCarriers.size() > cr.allowedCarrierInfoList.size())
+ ? toHidl(cr.allowedCarriers)
+ : toHidl(cr.allowedCarrierInfoList),
+ .excludedCarriers = (cr.excludedCarriers.size() > cr.excludedCarrierInfoList.size())
+ ? toHidl(cr.excludedCarriers)
+ : toHidl(cr.excludedCarrierInfoList),
.allowedCarriersPrioritized = cr.allowedCarriersPrioritized,
};
}
diff --git a/radio/aidl/compat/libradiocompat/sim/structs.h b/radio/aidl/compat/libradiocompat/sim/structs.h
index 54099b7..7774bee 100644
--- a/radio/aidl/compat/libradiocompat/sim/structs.h
+++ b/radio/aidl/compat/libradiocompat/sim/structs.h
@@ -37,6 +37,7 @@
::aidl::android::hardware::radio::sim::Carrier toAidl(const V1_0::Carrier& carrier);
V1_0::Carrier toHidl(const ::aidl::android::hardware::radio::sim::Carrier& carrier);
+V1_0::Carrier toHidl(const ::aidl::android::hardware::radio::sim::CarrierInfo& carrierInfo);
::aidl::android::hardware::radio::sim::CarrierRestrictions //
toAidl(const V1_0::CarrierRestrictions& cr);
diff --git a/radio/aidl/vts/radio_sim_test.cpp b/radio/aidl/vts/radio_sim_test.cpp
index 6ffe2c5..2823977 100644
--- a/radio/aidl/vts/radio_sim_test.cpp
+++ b/radio/aidl/vts/radio_sim_test.cpp
@@ -485,8 +485,10 @@
} else {
carrierRestrictions.allowedCarrierInfoList.resize(1);
carrierRestrictions.excludedCarrierInfoList.resize(0);
- carrierRestrictions.allowedCarrierInfoList[0].mcc = std::string("321");
- carrierRestrictions.allowedCarrierInfoList[0].mnc = std::string("654");
+ // TODO(b/365568518): change mcc/mnc to something else once CF fully supports
+ // setAllowedCarriers
+ carrierRestrictions.allowedCarrierInfoList[0].mcc = std::string("123");
+ carrierRestrictions.allowedCarrierInfoList[0].mnc = std::string("456");
carrierRestrictions.allowedCarrierInfoList[0].spn = std::string("TestNetwork");
carrierRestrictions.allowedCarrierInfoList[0].gid1 = std::string("BAE000000000000");
carrierRestrictions.allowedCarrierInfoList[0].gid2 = std::string("AE0000000000000");
@@ -517,7 +519,7 @@
sleep(2);
updateSimCardStatus();
}
- // TODO: uncomment once CF fully supports setAllowedCarriers
+ // TODO(b/365568518): uncomment once CF fully supports setAllowedCarriers
// EXPECT_EQ(CardStatus::STATE_RESTRICTED, cardStatus.cardState);
}
@@ -545,19 +547,21 @@
} else {
ASSERT_EQ(1, radioRsp_sim->carrierRestrictionsResp.allowedCarrierInfoList.size());
EXPECT_EQ(0, radioRsp_sim->carrierRestrictionsResp.excludedCarrierInfoList.size());
- ASSERT_TRUE(std::string("321") ==
- radioRsp_sim->carrierRestrictionsResp.allowedCarrierInfoList[0].mcc);
- ASSERT_TRUE(std::string("654") ==
- radioRsp_sim->carrierRestrictionsResp.allowedCarrierInfoList[0].mnc);
- ASSERT_TRUE(std::string("BAE000000000000") ==
+ ASSERT_EQ(std::string("123"),
+ radioRsp_sim->carrierRestrictionsResp.allowedCarrierInfoList[0].mcc);
+ ASSERT_EQ(std::string("456"),
+ radioRsp_sim->carrierRestrictionsResp.allowedCarrierInfoList[0].mnc);
+#if 0 // TODO(b/365568518): enable once CF fully supports setAllowedCarriers
+ ASSERT_EQ(std::string("BAE000000000000"),
radioRsp_sim->carrierRestrictionsResp.allowedCarrierInfoList[0].gid1);
- ASSERT_TRUE(std::string("AE0000000000000") ==
+ ASSERT_EQ(std::string("AE0000000000000"),
radioRsp_sim->carrierRestrictionsResp.allowedCarrierInfoList[0].gid2);
- ASSERT_TRUE(std::string("9987") ==
+ ASSERT_EQ(std::string("9987"),
radioRsp_sim->carrierRestrictionsResp.allowedCarrierInfoList[0].imsiPrefix);
- ASSERT_TRUE(radioRsp_sim->carrierRestrictionsResp.allowedCarriersPrioritized);
EXPECT_EQ(CarrierRestrictions::CarrierRestrictionStatus::RESTRICTED,
radioRsp_sim->carrierRestrictionsResp.status);
+#endif
+ ASSERT_TRUE(radioRsp_sim->carrierRestrictionsResp.allowedCarriersPrioritized);
EXPECT_EQ(SimLockMultiSimPolicy::NO_MULTISIM_POLICY, radioRsp_sim->multiSimPolicyResp);
}
sleep(10);
diff --git a/secure_element/aidl/default/Android.bp b/secure_element/aidl/default/Android.bp
index b382822..6f5e5f7 100644
--- a/secure_element/aidl/default/Android.bp
+++ b/secure_element/aidl/default/Android.bp
@@ -55,6 +55,7 @@
prebuilts: [
"secure_element.rc",
"secure_element.xml",
- "android.hardware.se.omapi.ese.prebuilt.xml", // <feature>
+ // TODO (b/289193458): Add this back when access control is implemented for cuttlefish.
+ // "android.hardware.se.omapi.ese.prebuilt.xml", // <feature>
],
}
diff --git a/security/keymint/support/include/remote_prov/remote_prov_utils.h b/security/keymint/support/include/remote_prov/remote_prov_utils.h
index b7c32ca..141f243 100644
--- a/security/keymint/support/include/remote_prov/remote_prov_utils.h
+++ b/security/keymint/support/include/remote_prov/remote_prov_utils.h
@@ -21,6 +21,7 @@
#include <vector>
#include "aidl/android/hardware/security/keymint/IRemotelyProvisionedComponent.h"
+#include <hwtrust/hwtrust.h>
#include <keymaster/cppcose/cppcose.h>
namespace aidl::android::hardware::security::keymint::remote_prov {
@@ -176,7 +177,8 @@
*/
ErrMsgOr<std::unique_ptr<cppbor::Array>> verifyFactoryCsr(
const cppbor::Array& keysToSign, const std::vector<uint8_t>& csr,
- IRemotelyProvisionedComponent* provisionable, const std::vector<uint8_t>& challenge);
+ IRemotelyProvisionedComponent* provisionable, const std::vector<uint8_t>& challenge,
+ bool allowDegenerate = true);
/**
* Verify the CSR as if the device is a final production sample.
*/
@@ -188,4 +190,9 @@
/** Checks whether the CSR has a proper DICE chain. */
ErrMsgOr<bool> isCsrWithProperDiceChain(const std::vector<uint8_t>& csr);
+/** Verify the DICE chain. */
+ErrMsgOr<std::vector<BccEntryData>> validateBcc(const cppbor::Array* bcc,
+ hwtrust::DiceChain::Kind kind, bool allowAnyMode,
+ bool allowDegenerate);
+
} // namespace aidl::android::hardware::security::keymint::remote_prov
diff --git a/security/keymint/support/remote_prov_utils.cpp b/security/keymint/support/remote_prov_utils.cpp
index 646037c..a679340 100644
--- a/security/keymint/support/remote_prov_utils.cpp
+++ b/security/keymint/support/remote_prov_utils.cpp
@@ -26,7 +26,6 @@
#include <android-base/macros.h>
#include <android-base/properties.h>
#include <cppbor.h>
-#include <hwtrust/hwtrust.h>
#include <json/json.h>
#include <keymaster/km_openssl/ec_key.h>
#include <keymaster/km_openssl/ecdsa_operation.h>
@@ -325,7 +324,8 @@
}
ErrMsgOr<std::vector<BccEntryData>> validateBcc(const cppbor::Array* bcc,
- hwtrust::DiceChain::Kind kind, bool allowAnyMode) {
+ hwtrust::DiceChain::Kind kind, bool allowAnyMode,
+ bool allowDegenerate) {
auto encodedBcc = bcc->encode();
// Use ro.build.type instead of ro.debuggable because ro.debuggable=1 for VTS testing
@@ -336,6 +336,11 @@
auto chain = hwtrust::DiceChain::Verify(encodedBcc, kind, allowAnyMode);
if (!chain.ok()) return chain.error().message();
+
+ if (!allowDegenerate && !chain->IsProper()) {
+ return "DICE chain is degenerate";
+ }
+
auto keys = chain->CosePublicKeys();
if (!keys.ok()) return keys.error().message();
std::vector<BccEntryData> result;
@@ -701,7 +706,8 @@
}
// BCC is [ pubkey, + BccEntry]
- auto bccContents = validateBcc(bcc->asArray(), hwtrust::DiceChain::Kind::kVsr13, allowAnyMode);
+ auto bccContents = validateBcc(bcc->asArray(), hwtrust::DiceChain::Kind::kVsr13, allowAnyMode,
+ /*allowDegenerate=*/true);
if (!bccContents) {
return bccContents.message() + "\n" + prettyPrint(bcc.get());
}
@@ -997,7 +1003,8 @@
ErrMsgOr<bytevec> parseAndValidateAuthenticatedRequest(const std::vector<uint8_t>& request,
const std::vector<uint8_t>& challenge,
- bool allowAnyMode = false) {
+ bool allowAnyMode = false,
+ bool allowDegenerate = true) {
auto [parsedRequest, _, csrErrMsg] = cppbor::parse(request);
if (!parsedRequest) {
return csrErrMsg;
@@ -1035,19 +1042,20 @@
return diceChainKind.message();
}
- auto diceContents = validateBcc(diceCertChain, *diceChainKind, allowAnyMode);
+ auto diceContents = validateBcc(diceCertChain, *diceChainKind, allowAnyMode, allowDegenerate);
if (!diceContents) {
return diceContents.message() + "\n" + prettyPrint(diceCertChain);
}
- auto& udsPub = diceContents->back().pubKey;
+ auto udsPub = diceCertChain->get(0)->asMap()->encode();
+ auto& kmDiceKey = diceContents->back().pubKey;
auto error = validateUdsCerts(*udsCerts, udsPub);
if (!error.empty()) {
return error;
}
- auto signedPayload = verifyAndParseCoseSign1(signedData, udsPub, {} /* aad */);
+ auto signedPayload = verifyAndParseCoseSign1(signedData, kmDiceKey, {} /* aad */);
if (!signedPayload) {
return signedPayload.message();
}
@@ -1064,7 +1072,8 @@
const std::vector<uint8_t>& csr,
IRemotelyProvisionedComponent* provisionable,
const std::vector<uint8_t>& challenge,
- bool isFactory, bool allowAnyMode = false) {
+ bool isFactory, bool allowAnyMode = false,
+ bool allowDegenerate = true) {
RpcHardwareInfo info;
provisionable->getHardwareInfo(&info);
if (info.versionNumber != 3) {
@@ -1072,7 +1081,8 @@
") does not match expected version (3).";
}
- auto csrPayload = parseAndValidateAuthenticatedRequest(csr, challenge, allowAnyMode);
+ auto csrPayload =
+ parseAndValidateAuthenticatedRequest(csr, challenge, allowAnyMode, allowDegenerate);
if (!csrPayload) {
return csrPayload.message();
}
@@ -1082,8 +1092,10 @@
ErrMsgOr<std::unique_ptr<cppbor::Array>> verifyFactoryCsr(
const cppbor::Array& keysToSign, const std::vector<uint8_t>& csr,
- IRemotelyProvisionedComponent* provisionable, const std::vector<uint8_t>& challenge) {
- return verifyCsr(keysToSign, csr, provisionable, challenge, /*isFactory=*/true);
+ IRemotelyProvisionedComponent* provisionable, const std::vector<uint8_t>& challenge,
+ bool allowDegenerate) {
+ return verifyCsr(keysToSign, csr, provisionable, challenge, /*isFactory=*/true,
+ /*allowAnyMode=*/false, allowDegenerate);
}
ErrMsgOr<std::unique_ptr<cppbor::Array>> verifyProductionCsr(
diff --git a/security/keymint/support/remote_prov_utils_test.cpp b/security/keymint/support/remote_prov_utils_test.cpp
index 89469f1..82121cb 100644
--- a/security/keymint/support/remote_prov_utils_test.cpp
+++ b/security/keymint/support/remote_prov_utils_test.cpp
@@ -41,6 +41,41 @@
using ::testing::ElementsAreArray;
using byte_view = std::span<const uint8_t>;
+inline const std::vector<uint8_t> kDegenerateBcc{
+ 0x82, 0xa5, 0x01, 0x01, 0x03, 0x27, 0x04, 0x81, 0x02, 0x20, 0x06, 0x21, 0x58, 0x20, 0xf5,
+ 0x5a, 0xfb, 0x28, 0x06, 0x48, 0x68, 0xea, 0x49, 0x3e, 0x47, 0x80, 0x1d, 0xfe, 0x1f, 0xfc,
+ 0xa8, 0x84, 0xb3, 0x4d, 0xdb, 0x99, 0xc7, 0xbf, 0x23, 0x53, 0xe5, 0x71, 0x92, 0x41, 0x9b,
+ 0x46, 0x84, 0x43, 0xa1, 0x01, 0x27, 0xa0, 0x59, 0x01, 0x75, 0xa9, 0x01, 0x78, 0x28, 0x31,
+ 0x64, 0x34, 0x35, 0x65, 0x33, 0x35, 0x63, 0x34, 0x35, 0x37, 0x33, 0x31, 0x61, 0x32, 0x62,
+ 0x34, 0x35, 0x36, 0x37, 0x63, 0x33, 0x63, 0x65, 0x35, 0x31, 0x36, 0x66, 0x35, 0x63, 0x31,
+ 0x66, 0x34, 0x33, 0x61, 0x62, 0x64, 0x36, 0x30, 0x62, 0x02, 0x78, 0x28, 0x31, 0x64, 0x34,
+ 0x35, 0x65, 0x33, 0x35, 0x63, 0x34, 0x35, 0x37, 0x33, 0x31, 0x61, 0x32, 0x62, 0x34, 0x35,
+ 0x36, 0x37, 0x63, 0x33, 0x63, 0x65, 0x35, 0x31, 0x36, 0x66, 0x35, 0x63, 0x31, 0x66, 0x34,
+ 0x33, 0x61, 0x62, 0x64, 0x36, 0x30, 0x62, 0x3a, 0x00, 0x47, 0x44, 0x50, 0x58, 0x40, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3a, 0x00, 0x47, 0x44, 0x53, 0x41, 0xa0, 0x3a, 0x00, 0x47, 0x44, 0x52,
+ 0x58, 0x40, 0x71, 0xd7, 0x47, 0x9e, 0x61, 0xb5, 0x30, 0xa3, 0xda, 0xe6, 0xac, 0xb2, 0x91,
+ 0xa4, 0xf9, 0xcf, 0x7f, 0xba, 0x6b, 0x5f, 0xf9, 0xa3, 0x7f, 0xba, 0xab, 0xac, 0x69, 0xdd,
+ 0x0b, 0x04, 0xd6, 0x34, 0xd2, 0x3f, 0x8f, 0x84, 0x96, 0xd7, 0x58, 0x51, 0x1d, 0x68, 0x25,
+ 0xea, 0xbe, 0x11, 0x11, 0x1e, 0xd8, 0xdf, 0x4b, 0x62, 0x78, 0x5c, 0xa8, 0xfa, 0xb7, 0x66,
+ 0x4e, 0x8d, 0xac, 0x3b, 0x00, 0x4c, 0x3a, 0x00, 0x47, 0x44, 0x54, 0x58, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3a, 0x00, 0x47, 0x44, 0x56, 0x41, 0x00, 0x3a, 0x00, 0x47, 0x44, 0x57, 0x58,
+ 0x2d, 0xa5, 0x01, 0x01, 0x03, 0x27, 0x04, 0x81, 0x02, 0x20, 0x06, 0x21, 0x58, 0x20, 0xf5,
+ 0x5a, 0xfb, 0x28, 0x06, 0x48, 0x68, 0xea, 0x49, 0x3e, 0x47, 0x80, 0x1d, 0xfe, 0x1f, 0xfc,
+ 0xa8, 0x84, 0xb3, 0x4d, 0xdb, 0x99, 0xc7, 0xbf, 0x23, 0x53, 0xe5, 0x71, 0x92, 0x41, 0x9b,
+ 0x46, 0x3a, 0x00, 0x47, 0x44, 0x58, 0x41, 0x20, 0x58, 0x40, 0x31, 0x5c, 0x43, 0x87, 0xf9,
+ 0xbb, 0xb9, 0x45, 0x09, 0xa8, 0xe8, 0x08, 0x70, 0xc4, 0xd9, 0xdc, 0x4e, 0x5a, 0x19, 0x10,
+ 0x4f, 0xa3, 0x21, 0x20, 0x34, 0x05, 0x5b, 0x2e, 0x78, 0x91, 0xd1, 0xe2, 0x39, 0x43, 0x8b,
+ 0x50, 0x12, 0x82, 0x37, 0xfe, 0xa4, 0x07, 0xc3, 0xd5, 0xc3, 0x78, 0xcc, 0xf9, 0xef, 0xe1,
+ 0x95, 0x38, 0x9f, 0xb0, 0x79, 0x16, 0x4c, 0x4a, 0x23, 0xc4, 0xdc, 0x35, 0x4e, 0x0f};
+
inline bool equal_byte_views(const byte_view& view1, const byte_view& view2) {
return std::equal(view1.begin(), view1.end(), view2.begin(), view2.end());
}
@@ -258,5 +293,14 @@
EXPECT_THAT(eekPubY, ElementsAreArray(geek->getBstrValue(CoseKey::PUBKEY_Y).value_or(empty)));
}
+TEST(RemoteProvUtilsTest, validateBccDegenerate) {
+ auto [bcc, _, errMsg] = cppbor::parse(kDegenerateBcc);
+ ASSERT_TRUE(bcc) << "Error: " << errMsg;
+
+ EXPECT_TRUE(validateBcc(bcc->asArray(), hwtrust::DiceChain::Kind::kVsr16,
+ /*allowAnyMode=*/false, /*allowDegenerate=*/true));
+ EXPECT_FALSE(validateBcc(bcc->asArray(), hwtrust::DiceChain::Kind::kVsr16,
+ /*allowAnyMode=*/false, /*allowDegenerate=*/false));
+}
} // namespace
} // namespace aidl::android::hardware::security::keymint::remote_prov