Fix dynamic adapter with provisioning
Bug: 302721191 Change-Id: Icdc003ed903142129eb1f89d109f447ea6dc2079
This commit is contained in:
committed by
Robert Shih
parent
de3cac4f90
commit
692cb259f3
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user