Fix dynamic adapter with provisioning

Bug: 302721191
Change-Id: Icdc003ed903142129eb1f89d109f447ea6dc2079
This commit is contained in:
Jacob Trimble
2023-10-04 17:32:16 +00:00
committed by Robert Shih
parent de3cac4f90
commit 692cb259f3

View File

@@ -2108,6 +2108,20 @@ extern "C" OEMCryptoResult OEMCrypto_PrepAndSignRenewalRequest(
return OEMCrypto_ERROR_NOT_IMPLEMENTED;
}
template <size_t N>
std::vector<uint8_t> MakeContext(const char (&key_label)[N],
const uint8_t* context, size_t context_length,
uint32_t suffix) {
// TODO(b/299343035): Use ODK methods.
std::vector<uint8_t> ret;
ret.insert(ret.end(), key_label, key_label + N);
ret.insert(ret.end(), context, context + context_length);
const uint32_t suffix_net = htonl(suffix);
auto* ptr = reinterpret_cast<const uint8_t*>(&suffix_net);
ret.insert(ret.end(), ptr, ptr + sizeof(suffix_net));
return ret;
}
extern "C" OEMCryptoResult OEMCrypto_PrepAndSignProvisioningRequest(
OEMCrypto_SESSION session, uint8_t* message, size_t message_length,
size_t* core_message_length, uint8_t* signature, size_t* signature_length) {
@@ -2115,6 +2129,24 @@ extern "C" OEMCryptoResult OEMCrypto_PrepAndSignProvisioningRequest(
LevelSession pair = gAdapter->GetSession(session);
if (!pair.fcn) return OEMCrypto_ERROR_INVALID_SESSION;
if (pair.fcn->PrepAndSignProvisioningRequest != nullptr) {
if (pair.fcn->version < 19 &&
pair.fcn->GenerateDerivedKeys_V18 != nullptr) {
if (!core_message_length || *core_message_length > message_length) {
return OEMCrypto_ERROR_INVALID_CONTEXT;
}
const std::vector<uint8_t> mac_context =
MakeContext("AUTHENTICATION", message + *core_message_length,
message_length - *core_message_length, 0x200);
const std::vector<uint8_t> enc_context =
MakeContext("ENCRYPTION", message + *core_message_length,
message_length - *core_message_length, 0x80);
const OEMCryptoResult result = pair.fcn->GenerateDerivedKeys_V18(
pair.session, mac_context.data(), mac_context.size(),
enc_context.data(), enc_context.size());
if (result != OEMCrypto_SUCCESS) return result;
}
return pair.fcn->PrepAndSignProvisioningRequest(
pair.session, message, message_length, core_message_length, signature,
signature_length);
@@ -2141,20 +2173,6 @@ const uint8_t* PointerOrNull(const uint8_t* pointer, size_t length) {
return length ? pointer : nullptr;
}
template <size_t N>
std::vector<uint8_t> MakeContext(const char (&key_label)[N],
const uint8_t* context, size_t context_length,
uint32_t suffix) {
// TODO(b/299343035): Use ODK methods.
std::vector<uint8_t> ret;
ret.insert(ret.end(), key_label, key_label + N);
ret.insert(ret.end(), context, context + context_length);
const uint32_t suffix_net = htonl(suffix);
auto* ptr = reinterpret_cast<const uint8_t*>(&suffix_net);
ret.insert(ret.end(), ptr, ptr + sizeof(suffix_net));
return ret;
}
extern "C" OEMCryptoResult OEMCrypto_LoadLicense(
OEMCrypto_SESSION session, const uint8_t* context, size_t context_length,
const uint8_t* derivation_key, size_t derivation_key_length,