Fix media_cas_proxy_sdk build issue.
Add example binary for testing building the SDK after 'git clone' from our repo. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=227583629
This commit is contained in:
@@ -16,10 +16,10 @@
|
||||
#include "absl/synchronization/mutex.h"
|
||||
#include "util/endian/endian.h"
|
||||
#include "util/gtl/map_util.h"
|
||||
#include "util/status.h"
|
||||
#include "common/aes_cbc_util.h"
|
||||
#include "common/ecb_util.h"
|
||||
#include "common/sha_util.h"
|
||||
#include "common/status.h"
|
||||
|
||||
namespace widevine {
|
||||
|
||||
@@ -108,20 +108,20 @@ bool WvmTokenHandler::IsSystemIdKnown(uint32_t system_id) {
|
||||
return PreprovKeysMap::GetSingleton()->IsSystemIdKnown(system_id);
|
||||
}
|
||||
|
||||
util::Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
std::string* device_key_out,
|
||||
Cipher* cipher_out,
|
||||
bool* insecure_out) {
|
||||
Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
std::string* device_key_out,
|
||||
Cipher* cipher_out,
|
||||
bool* insecure_out) {
|
||||
const std::string default_make_model;
|
||||
return DecryptDeviceKey(token, default_make_model, device_key_out, cipher_out,
|
||||
insecure_out);
|
||||
}
|
||||
|
||||
util::Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
const std::string& make_model,
|
||||
std::string* device_key_out,
|
||||
Cipher* cipher_out,
|
||||
bool* insecure_out) {
|
||||
Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
const std::string& make_model,
|
||||
std::string* device_key_out,
|
||||
Cipher* cipher_out,
|
||||
bool* insecure_out) {
|
||||
DCHECK(device_key_out);
|
||||
// DCHECK below is commented out because preprov_keys_ being nullptr
|
||||
// is a valid test in wvm_token_handler_test.cc. If we have
|
||||
@@ -129,12 +129,11 @@ util::Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
// presubmit because evidently Kokoro does debug build.
|
||||
// DCHECK(preprov_keys_);
|
||||
if (token.size() < kKeyboxSizeBytes) {
|
||||
return util::Status(util::error::INVALID_ARGUMENT,
|
||||
"Keybox token is too short.");
|
||||
return Status(error::INVALID_ARGUMENT, "Keybox token is too short.");
|
||||
}
|
||||
if (PreprovKeysMap::GetSingleton()->IsEmpty()) {
|
||||
return util::Status(util::error::INVALID_ARGUMENT,
|
||||
"Pre-provisioning key map is nullptr.");
|
||||
return Status(error::INVALID_ARGUMENT,
|
||||
"Pre-provisioning key map is nullptr.");
|
||||
}
|
||||
|
||||
uint32_t system_id = GetSystemId(token);
|
||||
@@ -143,7 +142,7 @@ util::Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
std::vector<PreprovKey> key_vector =
|
||||
PreprovKeysMap::GetSingleton()->GetPreprovKeys(system_id);
|
||||
|
||||
util::Status status;
|
||||
Status status;
|
||||
// First pass through the matching system Ids is an attempt to find an
|
||||
// alternate preprov key specific to this make/model.
|
||||
const PreprovKey* preferred_ppk = NULL;
|
||||
@@ -162,8 +161,8 @@ util::Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
ppk.key_bytes, token, device_key_out, insecure_out, &version);
|
||||
if (version != 2) {
|
||||
// Only version 2 keyboxes supported.
|
||||
return util::Status(util::error::PERMISSION_DENIED,
|
||||
absl::StrCat("invalid-keybox-version ", version));
|
||||
return Status(error::PERMISSION_DENIED,
|
||||
absl::StrCat("invalid-keybox-version ", version));
|
||||
}
|
||||
if (status.ok()) {
|
||||
if (cipher_out) {
|
||||
@@ -176,8 +175,8 @@ util::Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
// Return error from last attempt.
|
||||
return status;
|
||||
}
|
||||
return util::Status(
|
||||
util::error::NOT_FOUND,
|
||||
return Status(
|
||||
error::NOT_FOUND,
|
||||
absl::StrCat("Unknown system id: ", system_id).c_str()); // NOLINT
|
||||
}
|
||||
|
||||
@@ -185,12 +184,13 @@ util::Status WvmTokenHandler::DecryptDeviceKey(absl::string_view token,
|
||||
// decrypted device key to encrypt the given asset key. Returns the encrypted
|
||||
// asset key in |result|.
|
||||
// On failure, returns an error from the Widevine Server SDK error space.
|
||||
util::Status WvmTokenHandler::GetEncryptedAssetKey(
|
||||
absl::string_view token, absl::string_view raw_asset_key,
|
||||
const std::string& make_model, std::string* result) {
|
||||
Status WvmTokenHandler::GetEncryptedAssetKey(absl::string_view token,
|
||||
absl::string_view raw_asset_key,
|
||||
const std::string& make_model,
|
||||
std::string* result) {
|
||||
std::string device_key;
|
||||
Cipher cipher = AES;
|
||||
util::Status status =
|
||||
Status status =
|
||||
DecryptDeviceKey(token, make_model, &device_key, &cipher, nullptr);
|
||||
if (!status.ok()) {
|
||||
return status;
|
||||
@@ -215,20 +215,19 @@ std::string WvmTokenHandler::GetEncryptedUniqueId(absl::string_view token) {
|
||||
return encrypted_unique_id;
|
||||
}
|
||||
|
||||
util::Status WvmTokenHandler::DecryptDeviceKeyWithPreprovKey(
|
||||
Status WvmTokenHandler::DecryptDeviceKeyWithPreprovKey(
|
||||
absl::string_view preprov_key, absl::string_view token,
|
||||
std::string* device_key_out) {
|
||||
return DecryptDeviceKeyWithPreprovKey(preprov_key, token, device_key_out,
|
||||
nullptr, nullptr);
|
||||
}
|
||||
|
||||
util::Status WvmTokenHandler::DecryptDeviceKeyWithPreprovKey(
|
||||
Status WvmTokenHandler::DecryptDeviceKeyWithPreprovKey(
|
||||
absl::string_view preprov_key, absl::string_view token,
|
||||
std::string* device_key_out, bool* insecure_out, uint32_t* version) {
|
||||
CHECK(device_key_out);
|
||||
if (token.size() < kKeyboxSizeBytes) {
|
||||
return util::Status(util::error::INVALID_ARGUMENT,
|
||||
"Keybox token is too short.");
|
||||
return Status(error::INVALID_ARGUMENT, "Keybox token is too short.");
|
||||
}
|
||||
if (version) {
|
||||
*version = BigEndian::Load32(token.data());
|
||||
@@ -243,7 +242,7 @@ util::Status WvmTokenHandler::DecryptDeviceKeyWithPreprovKey(
|
||||
if (unique_id.size() != 16) {
|
||||
// Decrypting 16 bytes should result in 16 bytes.
|
||||
LOG(WARNING) << "Internal error decrypting unique id from token.";
|
||||
return util::Status(util::error::INTERNAL, "Wrong size after decrypt/16.");
|
||||
return Status(error::INTERNAL, "Wrong size after decrypt/16.");
|
||||
}
|
||||
|
||||
absl::string_view encrypted_bits = token.substr(24, 48);
|
||||
@@ -252,7 +251,7 @@ util::Status WvmTokenHandler::DecryptDeviceKeyWithPreprovKey(
|
||||
if (decrypted_bits.size() != 48) {
|
||||
// Decrypting 48 bytes should result in 48 bytes.
|
||||
LOG(WARNING) << "Internal error decrypting device key from token.";
|
||||
return util::Status(util::error::INTERNAL, "Wrong size after decrypt/48.");
|
||||
return Status(error::INTERNAL, "Wrong size after decrypt/48.");
|
||||
}
|
||||
uint8_t keybox_flags = decrypted_bits[36];
|
||||
absl::string_view device_key =
|
||||
@@ -269,48 +268,43 @@ util::Status WvmTokenHandler::DecryptDeviceKeyWithPreprovKey(
|
||||
keybox_flags = 0;
|
||||
}
|
||||
if (expected_hash != actual_hash) {
|
||||
return util::Status(util::error::PERMISSION_DENIED,
|
||||
"Keybox validation failed.");
|
||||
return Status(error::PERMISSION_DENIED, "Keybox validation failed.");
|
||||
}
|
||||
*device_key_out = std::string(device_key);
|
||||
if (insecure_out) {
|
||||
*insecure_out = (keybox_flags & kKeyboxFlagInsecure) != 0;
|
||||
}
|
||||
return util::OkStatus();
|
||||
return OkStatus();
|
||||
}
|
||||
|
||||
util::Status WvmTokenHandler::EncryptAssetKey(absl::string_view device_key,
|
||||
absl::string_view raw_asset_key,
|
||||
Cipher cipher, std::string* result) {
|
||||
Status WvmTokenHandler::EncryptAssetKey(absl::string_view device_key,
|
||||
absl::string_view raw_asset_key,
|
||||
Cipher cipher, std::string* result) {
|
||||
CHECK(result);
|
||||
if (device_key.size() != 16) {
|
||||
return util::Status(util::error::INVALID_ARGUMENT,
|
||||
"Invalid device key: size != 16");
|
||||
return Status(error::INVALID_ARGUMENT, "Invalid device key: size != 16");
|
||||
}
|
||||
if (raw_asset_key.size() < 16) {
|
||||
return util::Status(util::error::INVALID_ARGUMENT,
|
||||
"Invalid asset key: size < 16");
|
||||
return Status(error::INVALID_ARGUMENT, "Invalid asset key: size < 16");
|
||||
}
|
||||
// Truncate extra characters in the key; wvm always uses 16.
|
||||
absl::string_view asset_key = raw_asset_key.substr(0, 16);
|
||||
switch (cipher) {
|
||||
case DES3:
|
||||
if (!crypto_util::Encrypt3DesEcb(device_key, asset_key, result)) {
|
||||
return util::Status(util::error::INTERNAL,
|
||||
"Error encrypting asset key with 3DES.");
|
||||
return Status(error::INTERNAL, "Error encrypting asset key with 3DES.");
|
||||
}
|
||||
return util::OkStatus();
|
||||
return OkStatus();
|
||||
case AES:
|
||||
if (!crypto_util::EncryptAesEcb(device_key, asset_key, result)) {
|
||||
return util::Status(util::error::INTERNAL,
|
||||
"Error encrypting asset key with AES.");
|
||||
return Status(error::INTERNAL, "Error encrypting asset key with AES.");
|
||||
}
|
||||
return util::OkStatus();
|
||||
return OkStatus();
|
||||
case PASS_THRU:
|
||||
result->assign(raw_asset_key.data(), raw_asset_key.size());
|
||||
return util::OkStatus();
|
||||
return OkStatus();
|
||||
default:
|
||||
return util::Status(util::error::INVALID_ARGUMENT, "Unknown cipher type");
|
||||
return Status(error::INVALID_ARGUMENT, "Unknown cipher type");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user