Merge recent doc changes for OEMCrypto
This is a cherry pick of recent changes to OEMCrypto and ODK. Most of these are part of the document migration to doxygen. See http://go/wvgerrit/106005 and its parents for code reviews. Bug: 144715340 Bug: 148232693 Bug: 167580674 Change-Id: I658f99c8117b974faed97322d61fac0f382283af
This commit is contained in:
@@ -86,8 +86,7 @@ class ContentKeysContext : public SessionContextKeys {
|
||||
|
||||
OEMCrypto_LicenseType type() override { return OEMCrypto_ContentLicense; }
|
||||
|
||||
bool SetContentKey(const KeyId& entitlement_id,
|
||||
const KeyId& content_key_id,
|
||||
bool SetContentKey(const KeyId& entitlement_id, const KeyId& content_key_id,
|
||||
const std::vector<uint8_t>& content_key) override;
|
||||
EntitlementKey* GetEntitlementKey(const KeyId& entitlement_id) override;
|
||||
|
||||
@@ -139,8 +138,7 @@ class EntitlementKeysContext : public SessionContextKeys {
|
||||
Key* FirstKey() override;
|
||||
void Remove(const KeyId& key_id) override;
|
||||
void UpdateDuration(const KeyControlBlock& control) override;
|
||||
bool SetContentKey(const KeyId& entitlement_id,
|
||||
const KeyId& content_key_id,
|
||||
bool SetContentKey(const KeyId& entitlement_id, const KeyId& content_key_id,
|
||||
const std::vector<uint8_t>& content_key) override;
|
||||
EntitlementKey* GetEntitlementKey(const KeyId& entitlement_id) override;
|
||||
|
||||
@@ -210,8 +208,7 @@ SessionContext::SessionContext(CryptoEngine* ce, SessionId sid,
|
||||
CryptoEngine::kApiVersion, sid);
|
||||
}
|
||||
|
||||
SessionContext::~SessionContext() {
|
||||
}
|
||||
SessionContext::~SessionContext() {}
|
||||
|
||||
// Internal utility function to derive key using CMAC-128
|
||||
bool SessionContext::DeriveKey(const std::vector<uint8_t>& key,
|
||||
@@ -366,8 +363,10 @@ OEMCryptoResult SessionContext::PrepAndSignLicenseRequest(
|
||||
const size_t message_body_length = message_length - *core_message_length;
|
||||
result = GenerateCertSignature(message_body, message_body_length, signature,
|
||||
signature_length);
|
||||
if (result == OEMCrypto_SUCCESS) state_request_signed_ = true;
|
||||
ODK_InitializeClockValues(&clock_values_, ce_->SystemTime());
|
||||
if (result == OEMCrypto_SUCCESS) {
|
||||
state_request_signed_ = true;
|
||||
result = ODK_InitializeClockValues(&clock_values_, ce_->SystemTime());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -677,11 +676,13 @@ OEMCryptoResult SessionContext::CheckStatusOffline(uint32_t nonce,
|
||||
OEMCryptoResult SessionContext::CheckNonceOrEntry(
|
||||
const KeyControlBlock& key_control_block) {
|
||||
switch (key_control_block.control_bits() & wvoec::kControlReplayMask) {
|
||||
case wvoec::kControlNonceRequired: // Online license. Nonce always required.
|
||||
case wvoec::kControlNonceRequired: // Online license. Nonce always
|
||||
// required.
|
||||
return CheckStatusOnline(key_control_block.nonce(),
|
||||
key_control_block.control_bits());
|
||||
break;
|
||||
case wvoec::kControlNonceOrEntry: // Offline license. Nonce required on first use.
|
||||
case wvoec::kControlNonceOrEntry: // Offline license. Nonce required on
|
||||
// first use.
|
||||
return CheckStatusOffline(key_control_block.nonce(),
|
||||
key_control_block.control_bits());
|
||||
break;
|
||||
@@ -844,9 +845,8 @@ OEMCryptoResult SessionContext::LoadKeysNoSignature(
|
||||
message + key_array[i].key_control_iv.offset,
|
||||
message + key_array[i].key_control_iv.offset + wvoec::KEY_IV_SIZE);
|
||||
|
||||
OEMCryptoResult result =
|
||||
InstallKey(key_id, enc_key_data, key_data_iv, key_control,
|
||||
key_control_iv);
|
||||
OEMCryptoResult result = InstallKey(key_id, enc_key_data, key_data_iv,
|
||||
key_control, key_control_iv);
|
||||
if (result != OEMCrypto_SUCCESS) {
|
||||
status = result;
|
||||
break;
|
||||
@@ -868,7 +868,12 @@ OEMCryptoResult SessionContext::LoadKeysNoSignature(
|
||||
LOGE("Failed to update mac keys.");
|
||||
return OEMCrypto_ERROR_UNKNOWN_FAILURE;
|
||||
}
|
||||
} else {
|
||||
// If the mac keys are not updated, we will not need them again.
|
||||
mac_key_server_.resize(0);
|
||||
mac_key_client_.resize(0);
|
||||
}
|
||||
|
||||
if (usage_entry_) {
|
||||
OEMCryptoResult result = OEMCrypto_SUCCESS;
|
||||
switch (usage_entry_status_) {
|
||||
@@ -1122,6 +1127,10 @@ bool SessionContext::DecryptRSAKey(const uint8_t* enc_rsa_key,
|
||||
size_t enc_rsa_key_length,
|
||||
const uint8_t* enc_rsa_key_iv,
|
||||
uint8_t* pkcs8_rsa_key) {
|
||||
if (enc_rsa_key_length % AES_BLOCK_SIZE != 0) {
|
||||
LOGE("[DecryptRSAKey(): bad buffer size]");
|
||||
return false;
|
||||
}
|
||||
// Decrypt rsa key with keybox.
|
||||
uint8_t iv_buffer[wvoec::KEY_IV_SIZE];
|
||||
memcpy(iv_buffer, enc_rsa_key_iv, wvoec::KEY_IV_SIZE);
|
||||
@@ -1136,6 +1145,10 @@ bool SessionContext::EncryptRSAKey(const uint8_t* pkcs8_rsa_key,
|
||||
size_t enc_rsa_key_length,
|
||||
const uint8_t* enc_rsa_key_iv,
|
||||
uint8_t* enc_rsa_key) {
|
||||
if (enc_rsa_key_length % AES_BLOCK_SIZE != 0) {
|
||||
LOGE("[EncryptRSAKey(): bad buffer size]");
|
||||
return false;
|
||||
}
|
||||
// Encrypt rsa key with keybox.
|
||||
uint8_t iv_buffer[wvoec::KEY_IV_SIZE];
|
||||
memcpy(iv_buffer, enc_rsa_key_iv, wvoec::KEY_IV_SIZE);
|
||||
@@ -1227,7 +1240,7 @@ OEMCryptoResult SessionContext::CheckKeyUse(const std::string& log_string,
|
||||
LOGE("[%s(): CGMS required, but buffer is clear", log_string.c_str());
|
||||
return OEMCrypto_ERROR_ANALOG_OUTPUT;
|
||||
}
|
||||
if ( ce_->analog_display_active() && !ce_->cgms_a_active()) {
|
||||
if (ce_->analog_display_active() && !ce_->cgms_a_active()) {
|
||||
LOGE("[%s(): control bit says CGMS required", log_string.c_str());
|
||||
return OEMCrypto_ERROR_ANALOG_OUTPUT;
|
||||
}
|
||||
@@ -1252,8 +1265,9 @@ OEMCryptoResult SessionContext::Generic_Encrypt(const uint8_t* in_buffer,
|
||||
LOGE("[Generic_Encrypt(): CONTENT_KEY has wrong size: %zu", key.size());
|
||||
return OEMCrypto_ERROR_UNKNOWN_FAILURE;
|
||||
}
|
||||
OEMCryptoResult result = CheckKeyUse("Generic_Encrypt", wvoec::kControlAllowEncrypt,
|
||||
OEMCrypto_BufferType_Clear);
|
||||
OEMCryptoResult result =
|
||||
CheckKeyUse("Generic_Encrypt", wvoec::kControlAllowEncrypt,
|
||||
OEMCrypto_BufferType_Clear);
|
||||
if (result != OEMCrypto_SUCCESS) return result;
|
||||
if (algorithm != OEMCrypto_AES_CBC_128_NO_PADDING) {
|
||||
LOGE("[Generic_Encrypt(): algorithm bad");
|
||||
@@ -1292,8 +1306,9 @@ OEMCryptoResult SessionContext::Generic_Decrypt(const uint8_t* in_buffer,
|
||||
LOGE("[Generic_Decrypt(): CONTENT_KEY has wrong size");
|
||||
return OEMCrypto_ERROR_UNKNOWN_FAILURE;
|
||||
}
|
||||
OEMCryptoResult result = CheckKeyUse("Generic_Decrypt", wvoec::kControlAllowDecrypt,
|
||||
OEMCrypto_BufferType_Clear);
|
||||
OEMCryptoResult result =
|
||||
CheckKeyUse("Generic_Decrypt", wvoec::kControlAllowDecrypt,
|
||||
OEMCrypto_BufferType_Clear);
|
||||
if (result != OEMCrypto_SUCCESS) return result;
|
||||
|
||||
if (algorithm != OEMCrypto_AES_CBC_128_NO_PADDING) {
|
||||
@@ -1373,8 +1388,8 @@ OEMCryptoResult SessionContext::Generic_Verify(const uint8_t* in_buffer,
|
||||
LOGE("[Generic_Verify(): CONTENT_KEY has wrong size: %zu", key.size());
|
||||
return OEMCrypto_ERROR_UNKNOWN_FAILURE;
|
||||
}
|
||||
OEMCryptoResult result = CheckKeyUse("Generic_Verify", wvoec::kControlAllowVerify,
|
||||
OEMCrypto_BufferType_Clear);
|
||||
OEMCryptoResult result = CheckKeyUse(
|
||||
"Generic_Verify", wvoec::kControlAllowVerify, OEMCrypto_BufferType_Clear);
|
||||
if (result != OEMCrypto_SUCCESS) return result;
|
||||
if (algorithm != OEMCrypto_HMAC_SHA256) {
|
||||
LOGE("[Generic_Verify(): bad algorithm");
|
||||
@@ -1523,6 +1538,11 @@ bool SessionContext::DecryptMessage(const std::vector<uint8_t>& key,
|
||||
LOGE("[DecryptMessage(): OEMCrypto_ERROR_INVALID_CONTEXT]");
|
||||
return false;
|
||||
}
|
||||
if (message.size() % AES_BLOCK_SIZE != 0) {
|
||||
LOGE("[DecryptMessage(): bad buffer size]");
|
||||
return false;
|
||||
}
|
||||
|
||||
decrypted->resize(message.size());
|
||||
uint8_t iv_buffer[16];
|
||||
memcpy(iv_buffer, &iv[0], 16);
|
||||
@@ -1714,7 +1734,7 @@ OEMCryptoResult SessionContext::PatternDecryptCBC(
|
||||
const bool skip_block = (pattern_offset >= pattern->encrypt);
|
||||
pattern_offset = (pattern_offset + 1) % pattern_length;
|
||||
if (skip_block || (size < AES_BLOCK_SIZE)) {
|
||||
// If we are decrypting in-place, then this byte is already correct and
|
||||
// If we are decrypting in-place, then this block is already correct and
|
||||
// can be skipped.
|
||||
if (clear_data != cipher_data) {
|
||||
memcpy(&clear_data[l], &cipher_data[l], size);
|
||||
|
||||
Reference in New Issue
Block a user