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;
|
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(
|
extern "C" OEMCryptoResult OEMCrypto_PrepAndSignProvisioningRequest(
|
||||||
OEMCrypto_SESSION session, uint8_t* message, size_t message_length,
|
OEMCrypto_SESSION session, uint8_t* message, size_t message_length,
|
||||||
size_t* core_message_length, uint8_t* signature, size_t* signature_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);
|
LevelSession pair = gAdapter->GetSession(session);
|
||||||
if (!pair.fcn) return OEMCrypto_ERROR_INVALID_SESSION;
|
if (!pair.fcn) return OEMCrypto_ERROR_INVALID_SESSION;
|
||||||
if (pair.fcn->PrepAndSignProvisioningRequest != nullptr) {
|
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(
|
return pair.fcn->PrepAndSignProvisioningRequest(
|
||||||
pair.session, message, message_length, core_message_length, signature,
|
pair.session, message, message_length, core_message_length, signature,
|
||||||
signature_length);
|
signature_length);
|
||||||
@@ -2141,20 +2173,6 @@ const uint8_t* PointerOrNull(const uint8_t* pointer, size_t length) {
|
|||||||
return length ? pointer : nullptr;
|
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(
|
extern "C" OEMCryptoResult OEMCrypto_LoadLicense(
|
||||||
OEMCrypto_SESSION session, const uint8_t* context, size_t context_length,
|
OEMCrypto_SESSION session, const uint8_t* context, size_t context_length,
|
||||||
const uint8_t* derivation_key, size_t derivation_key_length,
|
const uint8_t* derivation_key, size_t derivation_key_length,
|
||||||
|
|||||||
Reference in New Issue
Block a user