summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Zeuthen <zeuthen@google.com>2020-07-14 18:36:50 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-07-14 18:36:50 +0000
commit764af005ee3825123b41f7799a805ae84b1bafcc (patch)
tree4e8d04b042c606ac7f8e6c429994818efcc97519
parent879d8497dce88bd3c2d8302272c3f9800824fcff (diff)
parent969d3803c81011b2162bff01894a2d68dfd40674 (diff)
downloadsecurity-764af005ee3825123b41f7799a805ae84b1bafcc.tar.gz
credstore: Don't require credentials to use ACP ids starting at 0. am: 969d3803c8android-11.0.0_r16android11-d1-b-release
Original change: https://googleplex-android-review.googlesource.com/c/platform/system/security/+/12141145 Change-Id: I79456d9543c19919f5d1f063a3fcf3ef1a72c535
-rw-r--r--identity/Credential.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/identity/Credential.cpp b/identity/Credential.cpp
index 59a4d81e..28ba752e 100644
--- a/identity/Credential.cpp
+++ b/identity/Credential.cpp
@@ -184,7 +184,21 @@ Status Credential::getEntries(const vector<uint8_t>& requestMessage,
// in the startRetrieval() call.
vector<int32_t> requestCounts;
const vector<SecureAccessControlProfile>& allProfiles = data_->getSecureAccessControlProfiles();
- vector<bool> includeProfile(allProfiles.size());
+
+ // We don't support ACP identifiers which isn't in the range 0 to 31. This
+ // guarantee exists so it's feasible to implement the TA part of an Identity
+ // Credential HAL implementation where the TA uses a 32-bit word to indicate
+ // which profiles are authorized.
+ for (const SecureAccessControlProfile& profile : allProfiles) {
+ if (profile.id < 0 || profile.id >= 32) {
+ return Status::fromServiceSpecificError(
+ ICredentialStore::ERROR_GENERIC,
+ "Invalid accessProfileId in profile (must be between 0 and 31)");
+ }
+ }
+
+ vector<bool> includeProfile(32);
+
for (const RequestNamespaceParcel& rns : requestNamespaces) {
size_t numEntriesInNsToRequest = 0;
for (const RequestEntryParcel& rep : rns.entries) {
@@ -195,11 +209,12 @@ Status Credential::getEntries(const vector<uint8_t>& requestMessage,
optional<EntryData> data = data_->getEntryData(rns.namespaceName, rep.name);
if (data) {
for (int32_t id : data.value().accessControlProfileIds) {
- if (id >= int32_t(includeProfile.size())) {
+ if (id < 0 || id >= 32) {
LOG(ERROR) << "Invalid accessControlProfileId " << id << " for "
<< rns.namespaceName << ": " << rep.name;
return Status::fromServiceSpecificError(
- ICredentialStore::ERROR_GENERIC, "Invalid accessProfileId for entry");
+ ICredentialStore::ERROR_GENERIC,
+ "Invalid accessProfileId in entry (must be between 0 and 31)");
}
includeProfile[id] = true;
}
@@ -212,7 +227,7 @@ Status Credential::getEntries(const vector<uint8_t>& requestMessage,
// HAL.
vector<SecureAccessControlProfile> selectedProfiles;
for (size_t n = 0; n < allProfiles.size(); n++) {
- if (includeProfile[n]) {
+ if (includeProfile[allProfiles[n].id]) {
selectedProfiles.push_back(allProfiles[n]);
}
}