Support for multiple versions of DeviceInfo
We need to be able to generate different (specifically older) version of
DeviceInfo to make IRPC v3 backwards compatible.
Bug: 260920864
Test: atest VtsHalRemotelyProvisionedComponentTargetTest
Test: atest RemoteProvisionerUnitTests
Change-Id: I8b921b172b3d45a17a02a7bc81dce54e7167b3d8
diff --git a/android_keymaster/android_keymaster.cpp b/android_keymaster/android_keymaster.cpp
index 561bdcf..743a8fd 100644
--- a/android_keymaster/android_keymaster.cpp
+++ b/android_keymaster/android_keymaster.cpp
@@ -460,7 +460,8 @@
}
response->keys_to_sign_mac = KeymasterBlob(pubKeysToSignMac->data(), pubKeysToSignMac->size());
- std::unique_ptr<cppbor::Map> device_info_map = rem_prov_ctx->CreateDeviceInfo();
+ std::unique_ptr<cppbor::Map> device_info_map =
+ rem_prov_ctx->CreateDeviceInfo(2 /* csrVersion */);
std::vector<uint8_t> device_info = device_info_map->encode();
response->device_info_blob = KeymasterBlob(device_info.data(), device_info.size());
auto protectedDataPayload = rem_prov_ctx->BuildProtectedDataPayload(
diff --git a/contexts/pure_soft_remote_provisioning_context.cpp b/contexts/pure_soft_remote_provisioning_context.cpp
index feff175..c0eea3a 100644
--- a/contexts/pure_soft_remote_provisioning_context.cpp
+++ b/contexts/pure_soft_remote_provisioning_context.cpp
@@ -71,7 +71,8 @@
return result;
}
-std::unique_ptr<cppbor::Map> PureSoftRemoteProvisioningContext::CreateDeviceInfo() const {
+std::unique_ptr<cppbor::Map>
+PureSoftRemoteProvisioningContext::CreateDeviceInfo(uint32_t csrVersion) const {
auto result = std::make_unique<cppbor::Map>(cppbor::Map());
// The following placeholders show how the DeviceInfo map would be populated.
@@ -101,7 +102,10 @@
if (vendor_patchlevel_) {
result->add(cppbor::Tstr("vendor_patch_level"), cppbor::Uint(*vendor_patchlevel_));
}
- result->add(cppbor::Tstr("version"), cppbor::Uint(2));
+ // "version" field was removed from DeviceInfo in CSR v3.
+ if (csrVersion < 3) {
+ result->add(cppbor::Tstr("version"), cppbor::Uint(csrVersion));
+ }
result->add(cppbor::Tstr("fused"), cppbor::Uint(0));
// "software" security level is not supported, so lie and say we're a TEE
@@ -203,13 +207,14 @@
cppcose::ErrMsgOr<cppbor::Array>
PureSoftRemoteProvisioningContext::BuildCsr(const std::vector<uint8_t>& challenge,
cppbor::Array keysToSign) const {
- auto deviceInfo = std::move(*CreateDeviceInfo());
+ uint32_t csrVersion = 3;
+ auto deviceInfo = std::move(*CreateDeviceInfo(csrVersion));
auto signedDataPayload =
cppbor::Array().add(std::move(deviceInfo)).add(challenge).add(std::move(keysToSign));
auto signedData = constructCoseSign1(devicePrivKey_, signedDataPayload.encode(), {} /* aad */);
return cppbor::Array()
- .add(3 /* version */)
+ .add(csrVersion)
.add(cppbor::Map() /* UdsCerts */)
.add(std::move(*bcc_.clone()->asArray()) /* DiceCertChain */)
.add(std::move(*signedData) /* SignedData */);
diff --git a/include/keymaster/contexts/pure_soft_remote_provisioning_context.h b/include/keymaster/contexts/pure_soft_remote_provisioning_context.h
index 630446c..7d7e51e 100644
--- a/include/keymaster/contexts/pure_soft_remote_provisioning_context.h
+++ b/include/keymaster/contexts/pure_soft_remote_provisioning_context.h
@@ -38,7 +38,7 @@
~PureSoftRemoteProvisioningContext() override = default;
std::vector<uint8_t> DeriveBytesFromHbk(const std::string& context,
size_t numBytes) const override;
- std::unique_ptr<cppbor::Map> CreateDeviceInfo() const override;
+ std::unique_ptr<cppbor::Map> CreateDeviceInfo(uint32_t csrVersion) const override;
cppcose::ErrMsgOr<std::vector<uint8_t>>
BuildProtectedDataPayload(bool isTestMode, //
const std::vector<uint8_t>& macKey, //
diff --git a/include/keymaster/remote_provisioning_context.h b/include/keymaster/remote_provisioning_context.h
index f6e3b72..cc65502 100644
--- a/include/keymaster/remote_provisioning_context.h
+++ b/include/keymaster/remote_provisioning_context.h
@@ -34,7 +34,7 @@
virtual ~RemoteProvisioningContext(){};
virtual std::vector<uint8_t> DeriveBytesFromHbk(const std::string& context,
size_t numBytes) const = 0;
- virtual std::unique_ptr<cppbor::Map> CreateDeviceInfo() const = 0;
+ virtual std::unique_ptr<cppbor::Map> CreateDeviceInfo(uint32_t csrVersion) const = 0;
virtual cppcose::ErrMsgOr<std::vector<uint8_t>>
BuildProtectedDataPayload(bool testMode, //
const std::vector<uint8_t>& macKey, //