Merge OEMCrypto KDF and usage functions
Since KDF functions are only used right before specific functions, this merges them to simplify internal state within OEMCrypto. Fixes: 299527712 Change-Id: I426cfcdc102bd73cf65cd809b213da2474f44b34
This commit is contained in:
committed by
Robert Shih
parent
b04fda2908
commit
488a4647db
@@ -257,38 +257,6 @@ OEMCrypto_Substring GetSubstring(const std::string& message,
|
||||
return substring;
|
||||
}
|
||||
|
||||
void GenerateMacContext(const std::string& input_context,
|
||||
std::string* deriv_context) {
|
||||
if (!deriv_context) {
|
||||
LOGE("Output parameter |deriv_context| not provided");
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string kSigningKeyLabel = "AUTHENTICATION";
|
||||
const size_t kSigningKeySizeBits = wvcdm::MAC_KEY_SIZE * 8;
|
||||
|
||||
deriv_context->assign(kSigningKeyLabel);
|
||||
deriv_context->append(1, '\0');
|
||||
deriv_context->append(input_context);
|
||||
deriv_context->append(wvutil::EncodeUint32(kSigningKeySizeBits * 2));
|
||||
}
|
||||
|
||||
void GenerateEncryptContext(const std::string& input_context,
|
||||
std::string* deriv_context) {
|
||||
if (!deriv_context) {
|
||||
LOGE("Output parameter |deriv_context| not provided");
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string kEncryptionKeyLabel = "ENCRYPTION";
|
||||
const size_t kEncryptionKeySizeBits = wvcdm::CONTENT_KEY_SIZE * 8;
|
||||
|
||||
deriv_context->assign(kEncryptionKeyLabel);
|
||||
deriv_context->append(1, '\0');
|
||||
deriv_context->append(input_context);
|
||||
deriv_context->append(wvutil::EncodeUint32(kEncryptionKeySizeBits));
|
||||
}
|
||||
|
||||
OEMCryptoCipherMode ToOEMCryptoCipherMode(CdmCipherMode cipher_mode) {
|
||||
return cipher_mode == kCipherModeCtr ? OEMCrypto_CipherMode_CENC
|
||||
: OEMCrypto_CipherMode_CBCS;
|
||||
@@ -1122,7 +1090,9 @@ CdmResponseType CryptoSession::UseSecondaryKey(bool /* dual_key */) {
|
||||
}
|
||||
#endif
|
||||
|
||||
CdmResponseType CryptoSession::LoadLicense(const std::string& signed_message,
|
||||
CdmResponseType CryptoSession::LoadLicense(const std::string& context,
|
||||
const std::string& session_key,
|
||||
const std::string& signed_message,
|
||||
const std::string& core_message,
|
||||
const std::string& signature,
|
||||
CdmLicenseKeyType key_type) {
|
||||
@@ -1138,6 +1108,9 @@ CdmResponseType CryptoSession::LoadLicense(const std::string& signed_message,
|
||||
|
||||
M_TIME(sts = OEMCrypto_LoadLicense(
|
||||
oec_session_id_,
|
||||
reinterpret_cast<const uint8_t*>(context.data()), context.size(),
|
||||
reinterpret_cast<const uint8_t*>(session_key.data()),
|
||||
session_key.size(),
|
||||
reinterpret_cast<const uint8_t*>(combined_message.data()),
|
||||
combined_message.size(), core_message.size(),
|
||||
reinterpret_cast<const uint8_t*>(signature.data()),
|
||||
@@ -1264,8 +1237,6 @@ CdmResponseType CryptoSession::PrepareAndSignProvisioningRequest(
|
||||
OEMCryptoResult sts;
|
||||
if (pre_provision_token_type_ == kClientTokenKeybox) {
|
||||
should_specify_algorithm = false;
|
||||
const CdmResponseType status = GenerateDerivedKeys(message);
|
||||
if (status != NO_ERROR) return status;
|
||||
} else if (pre_provision_token_type_ == kClientTokenOemCert) {
|
||||
should_specify_algorithm = true;
|
||||
WithOecSessionLock("LoadOEMPrivateKey", [&] {
|
||||
@@ -1708,26 +1679,6 @@ CdmResponseType CryptoSession::SelectKey(const std::string& key_id,
|
||||
}
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::GenerateDerivedKeys(const std::string& message) {
|
||||
OEMCryptoResult sts;
|
||||
WithOecSessionLock("GenerateDerivedKeys without session_key",
|
||||
[&] { sts = key_session_->GenerateDerivedKeys(message); });
|
||||
|
||||
return MapOEMCryptoResult(sts, GENERATE_DERIVED_KEYS_ERROR_2,
|
||||
"GenerateDerivedKeys");
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::GenerateDerivedKeys(
|
||||
const std::string& message, const std::string& session_key) {
|
||||
OEMCryptoResult sts;
|
||||
WithOecSessionLock("GenerateDerivedKeys with session_key", [&] {
|
||||
sts = key_session_->GenerateDerivedKeys(message, session_key);
|
||||
});
|
||||
|
||||
return MapOEMCryptoResult(sts, GENERATE_DERIVED_KEYS_ERROR,
|
||||
"GenerateDerivedKeys");
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::GenerateRsaSignature(const std::string& message,
|
||||
std::string* signature,
|
||||
RSA_Padding_Scheme scheme) {
|
||||
@@ -2209,8 +2160,9 @@ bool CryptoSession::SetDestinationBufferType() {
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::LoadProvisioning(
|
||||
const std::string& signed_message, const std::string& core_message,
|
||||
const std::string& signature, std::string* wrapped_private_key) {
|
||||
const std::string& request, const std::string& signed_message,
|
||||
const std::string& core_message, const std::string& signature,
|
||||
std::string* wrapped_private_key) {
|
||||
LOGV("Loading provisioning certificate: id = %u", oec_session_id_);
|
||||
if (wrapped_private_key == nullptr) {
|
||||
LOGE("Missing wrapped |wrapped_private_key|");
|
||||
@@ -2224,6 +2176,7 @@ CdmResponseType CryptoSession::LoadProvisioning(
|
||||
WithOecSessionLock("LoadProvisioning Attempt 1", [&] {
|
||||
M_TIME(status = OEMCrypto_LoadProvisioning(
|
||||
oec_session_id_,
|
||||
reinterpret_cast<const uint8_t*>(request.data()), request.size(),
|
||||
reinterpret_cast<const uint8_t*>(combined_message.data()),
|
||||
combined_message.size(), core_message.size(),
|
||||
reinterpret_cast<const uint8_t*>(signature.data()),
|
||||
@@ -2241,6 +2194,7 @@ CdmResponseType CryptoSession::LoadProvisioning(
|
||||
WithOecSessionLock("LoadProvisioning Attempt 2", [&] {
|
||||
M_TIME(status = OEMCrypto_LoadProvisioning(
|
||||
oec_session_id_,
|
||||
reinterpret_cast<const uint8_t*>(request.data()), request.size(),
|
||||
reinterpret_cast<const uint8_t*>(combined_message.data()),
|
||||
combined_message.size(), core_message.size(),
|
||||
reinterpret_cast<const uint8_t*>(signature.data()),
|
||||
@@ -2259,6 +2213,64 @@ CdmResponseType CryptoSession::LoadProvisioning(
|
||||
"LoadProvisioning");
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::LoadProvisioningCast(
|
||||
const std::string& derivation_key, const std::string& request,
|
||||
const std::string& signed_message, const std::string& core_message,
|
||||
const std::string& signature, std::string* wrapped_private_key) {
|
||||
LOGV("Loading provisioning certificate: id = %u", oec_session_id_);
|
||||
if (wrapped_private_key == nullptr) {
|
||||
LOGE("Missing wrapped |wrapped_private_key|");
|
||||
return CdmResponseType(PARAMETER_NULL);
|
||||
}
|
||||
|
||||
const std::string combined_message = core_message + signed_message;
|
||||
// Round 1, get the size of the wrapped private key buffer.
|
||||
size_t wrapped_private_key_length = 0;
|
||||
OEMCryptoResult status;
|
||||
WithOecSessionLock("LoadProvisioningCast Attempt 1", [&] {
|
||||
M_TIME(status = OEMCrypto_LoadProvisioningCast(
|
||||
oec_session_id_,
|
||||
reinterpret_cast<const uint8_t*>(derivation_key.data()),
|
||||
derivation_key.size(),
|
||||
reinterpret_cast<const uint8_t*>(request.data()), request.size(),
|
||||
reinterpret_cast<const uint8_t*>(combined_message.data()),
|
||||
combined_message.size(), core_message.size(),
|
||||
reinterpret_cast<const uint8_t*>(signature.data()),
|
||||
signature.size(), nullptr, &wrapped_private_key_length),
|
||||
metrics_, oemcrypto_load_provisioning_, status);
|
||||
});
|
||||
|
||||
if (status != OEMCrypto_ERROR_SHORT_BUFFER) {
|
||||
return MapOEMCryptoResult(status, LOAD_PROVISIONING_ERROR,
|
||||
"LoadProvisioningCast");
|
||||
}
|
||||
|
||||
wrapped_private_key->resize(wrapped_private_key_length);
|
||||
|
||||
WithOecSessionLock("LoadProvisioningCast Attempt 2", [&] {
|
||||
M_TIME(status = OEMCrypto_LoadProvisioningCast(
|
||||
oec_session_id_,
|
||||
reinterpret_cast<const uint8_t*>(derivation_key.data()),
|
||||
derivation_key.size(),
|
||||
reinterpret_cast<const uint8_t*>(request.data()), request.size(),
|
||||
reinterpret_cast<const uint8_t*>(combined_message.data()),
|
||||
combined_message.size(), core_message.size(),
|
||||
reinterpret_cast<const uint8_t*>(signature.data()),
|
||||
signature.size(),
|
||||
reinterpret_cast<uint8_t*>(&wrapped_private_key->front()),
|
||||
&wrapped_private_key_length),
|
||||
metrics_, oemcrypto_load_provisioning_, status);
|
||||
});
|
||||
|
||||
if (status == OEMCrypto_SUCCESS) {
|
||||
wrapped_private_key->resize(wrapped_private_key_length);
|
||||
return CdmResponseType(NO_ERROR);
|
||||
}
|
||||
wrapped_private_key->clear();
|
||||
return MapOEMCryptoResult(status, LOAD_PROVISIONING_ERROR,
|
||||
"LoadProvisioningCast");
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::GetHdcpCapabilities(HdcpCapability* current,
|
||||
HdcpCapability* max) {
|
||||
LOGV("Getting HDCP capabilities: id = %u", oec_session_id_);
|
||||
|
||||
Reference in New Issue
Block a user