Merge "Cleaned up OEMCrypto security level getter." into sc-dev

This commit is contained in:
Alex Dale
2021-04-09 20:59:39 +00:00
committed by Android (Google) Code Review

View File

@@ -490,37 +490,46 @@ CdmSecurityLevel CryptoSession::GetSecurityLevel() {
} }
CdmSecurityLevel CryptoSession::GetSecurityLevel( CdmSecurityLevel CryptoSession::GetSecurityLevel(
SecurityLevel requested_level) { SecurityLevel requested_security_level) {
LOGV("Getting security level: requested_level = %d", LOGV("Getting security level: requested_security_level = %d",
static_cast<int>(requested_level)); static_cast<int>(requested_security_level));
RETURN_IF_UNINITIALIZED(kSecurityLevelUninitialized); RETURN_IF_UNINITIALIZED(kSecurityLevelUninitialized);
const char* const level = WithOecReadLock("GetSecurityLevel", [&] {
std::string security_level; return OEMCrypto_SecurityLevel(requested_security_level);
WithOecReadLock("GetSecurityLevel", [&] {
security_level = OEMCrypto_SecurityLevel(requested_level);
}); });
if (level == nullptr) {
if ((security_level.size() != 2) || (security_level.at(0) != 'L')) { LOGE("Security level is null: requested_security_level = %d",
static_cast<int>(requested_security_level));
return kSecurityLevelUnknown; return kSecurityLevelUnknown;
} }
// Check length in the event of a bad pointer.
CdmSecurityLevel cdm_security_level; // |kMaxSecurityLevelLength| is a value larger than expected to
switch (security_level.at(1)) { // be able to detect an overrun.
case '1': constexpr size_t kMaxSecurityLevelLength = 5;
cdm_security_level = kSecurityLevelL1; const size_t length = strnlen(level, kMaxSecurityLevelLength);
break; constexpr size_t kExpectedSecurityLevelLength = 2;
case '2': if (length != kExpectedSecurityLevelLength) {
cdm_security_level = kSecurityLevelL2; LOGE(
break; "Unexpected security level length: "
case '3': "length = %zu, requested_security_level = %d",
cdm_security_level = kSecurityLevelL3; length, static_cast<int>(requested_security_level));
break; return kSecurityLevelUnknown;
default:
cdm_security_level = kSecurityLevelUnknown;
break;
} }
const std::string security_level(level);
return cdm_security_level; if (security_level == "L1") {
return kSecurityLevelL1;
}
if (security_level == "L2") {
return kSecurityLevelL2;
}
if (security_level == "L3") {
return kSecurityLevelL3;
}
LOGE(
"Ill-formed security level: "
"level = \"%s\", requested_security_level = %d",
security_level.c_str(), static_cast<int>(requested_security_level));
return kSecurityLevelUnknown;
} }
CdmResponseType CryptoSession::GetInternalDeviceUniqueId( CdmResponseType CryptoSession::GetInternalDeviceUniqueId(