147 lines
5.4 KiB
C++
147 lines
5.4 KiB
C++
// Copyright 2014 Google Inc. All rights reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file or at
|
|
// https://developers.google.com/open-source/licenses/bsd
|
|
//
|
|
// Defines command line flags for widevine_encryption.
|
|
|
|
#include "packager/app/widevine_encryption_flags.h"
|
|
|
|
#include "packager/base/logging.h"
|
|
#include "packager/base/strings/string_number_conversions.h"
|
|
|
|
DEFINE_bool(enable_widevine_encryption,
|
|
false,
|
|
"Enable encryption with Widevine license server/proxy. User should "
|
|
"provide either AES signing key (--aes_signing_key, "
|
|
"--aes_signing_iv) or RSA signing key (--rsa_signing_key_path).");
|
|
DEFINE_bool(enable_widevine_decryption,
|
|
false,
|
|
"Enable decryption with Widevine license server/proxy. User should "
|
|
"provide either AES signing key (--aes_signing_key, "
|
|
"--aes_signing_iv) or RSA signing key (--rsa_signing_key_path).");
|
|
DEFINE_string(key_server_url, "", "Key server url. Required for encryption and "
|
|
"decryption");
|
|
DEFINE_string(content_id, "", "Content Id (hex).");
|
|
DEFINE_string(policy,
|
|
"",
|
|
"The name of a stored policy, which specifies DRM content "
|
|
"rights.");
|
|
DEFINE_int32(max_sd_pixels,
|
|
768 * 576,
|
|
"If the video track has more pixels per frame than max_sd_pixels, "
|
|
"it is considered as HD, SD otherwise. Default: 768 * 576.");
|
|
DEFINE_string(signer, "", "The name of the signer.");
|
|
DEFINE_string(aes_signing_key,
|
|
"",
|
|
"AES signing key in hex string. --aes_signing_iv is required. "
|
|
"Exclusive with --rsa_signing_key_path.");
|
|
DEFINE_string(aes_signing_iv,
|
|
"",
|
|
"AES signing iv in hex string.");
|
|
DEFINE_string(rsa_signing_key_path,
|
|
"",
|
|
"Stores PKCS#1 RSA private key for request signing. Exclusive "
|
|
"with --aes_signing_key.");
|
|
DEFINE_int32(crypto_period_duration,
|
|
0,
|
|
"Crypto period duration in seconds. If it is non-zero, key "
|
|
"rotation is enabled.");
|
|
|
|
namespace {
|
|
|
|
static bool VerifyEncryptionAndDecryptionParams(const char* flag_name,
|
|
const std::string& flag_value) {
|
|
DCHECK(flag_name);
|
|
|
|
const std::string flag_name_str = flag_name;
|
|
bool is_common_param = (flag_name_str == "key_server_url") ||
|
|
(flag_name_str == "signer");
|
|
if (FLAGS_enable_widevine_encryption) {
|
|
if (flag_value.empty()) {
|
|
fprintf(stderr,
|
|
"ERROR: %s required if enable_widevine_encryption is true\n",
|
|
flag_name);
|
|
return false;
|
|
}
|
|
} else if (FLAGS_enable_widevine_decryption) {
|
|
if (is_common_param) {
|
|
if (flag_value.empty()) {
|
|
fprintf(stderr,
|
|
"ERROR: %s required if --enable_widevine_encryption or "
|
|
"--enable_widevine_decryption is true\n",
|
|
flag_name);
|
|
return false;
|
|
}
|
|
} else {
|
|
if (!flag_value.empty()) {
|
|
fprintf(stderr, "ERROR: %s should only be specified if "
|
|
"--enable_widevine_decryption is true\n", flag_name);
|
|
return false;
|
|
}
|
|
}
|
|
} else {
|
|
if (!flag_value.empty()) {
|
|
fprintf(stderr, "ERROR: %s should only be specified if %s"
|
|
" is true\n", flag_name, is_common_param ?
|
|
"--enable_widevine_encryption or --enable_widevine_decryption" :
|
|
"--enable_widevine_encryption");
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
static bool IsPositive(const char* flag_name, int flag_value) {
|
|
return flag_value > 0;
|
|
}
|
|
|
|
static bool VerifyAesRsaKey(const char* flag_name,
|
|
const std::string& flag_value) {
|
|
if (!FLAGS_enable_widevine_encryption)
|
|
return true;
|
|
const std::string flag_name_str = flag_name;
|
|
if (flag_name_str == "aes_signing_iv") {
|
|
if (!FLAGS_aes_signing_key.empty() && flag_value.empty()) {
|
|
fprintf(stderr,
|
|
"ERROR: --aes_signing_iv is required for --aes_signing_key.\n");
|
|
return false;
|
|
}
|
|
} else if (flag_name_str == "rsa_signing_key_path") {
|
|
if (FLAGS_aes_signing_key.empty() && flag_value.empty()) {
|
|
fprintf(stderr,
|
|
"ERROR: --aes_signing_key or --rsa_signing_key_path is "
|
|
"required.\n");
|
|
return false;
|
|
}
|
|
if (!FLAGS_aes_signing_key.empty() && !flag_value.empty()) {
|
|
fprintf(stderr,
|
|
"ERROR: --aes_signing_key and --rsa_signing_key_path are "
|
|
"exclusive.\n");
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool dummy_key_server_url_validator =
|
|
google::RegisterFlagValidator(&FLAGS_key_server_url,
|
|
&VerifyEncryptionAndDecryptionParams);
|
|
bool dummy_content_id_validator =
|
|
google::RegisterFlagValidator(&FLAGS_content_id,
|
|
&VerifyEncryptionAndDecryptionParams);
|
|
bool dummy_track_type_validator =
|
|
google::RegisterFlagValidator(&FLAGS_max_sd_pixels, &IsPositive);
|
|
bool dummy_signer_validator =
|
|
google::RegisterFlagValidator(&FLAGS_signer,
|
|
&VerifyEncryptionAndDecryptionParams);
|
|
bool dummy_aes_iv_validator =
|
|
google::RegisterFlagValidator(&FLAGS_aes_signing_iv,
|
|
&VerifyAesRsaKey);
|
|
bool dummy_rsa_key_file_validator =
|
|
google::RegisterFlagValidator(&FLAGS_rsa_signing_key_path,
|
|
&VerifyAesRsaKey);
|
|
|
|
} // anonymous namespace
|