DASH Media Packaging SDK
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator
widevine_encryption_flags.cc
1 // Copyright 2014 Google Inc. All rights reserved.
2 //
3 // Use of this source code is governed by a BSD-style
4 // license that can be found in the LICENSE file or at
5 // https://developers.google.com/open-source/licenses/bsd
6 //
7 // Defines command line flags for widevine_encryption.
8 
9 #include "packager/app/widevine_encryption_flags.h"
10 
11 #include "packager/app/validate_flag.h"
12 #include "packager/base/logging.h"
13 #include "packager/base/strings/string_piece.h"
14 #include "packager/base/strings/string_util.h"
15 
16 DEFINE_bool(enable_widevine_encryption,
17  false,
18  "Enable encryption with Widevine license server/proxy. User should "
19  "provide either AES signing key (--aes_signing_key, "
20  "--aes_signing_iv) or RSA signing key (--rsa_signing_key_path).");
21 DEFINE_bool(enable_widevine_decryption,
22  false,
23  "Enable decryption with Widevine license server/proxy. User should "
24  "provide either AES signing key (--aes_signing_key, "
25  "--aes_signing_iv) or RSA signing key (--rsa_signing_key_path).");
26 DEFINE_bool(include_common_pssh,
27  false,
28  "When using Widevine encryption, include an additional v1 PSSH box "
29  "for the common system ID that includes the key IDs. See: "
30  "https://goo.gl/507mKp");
31 DEFINE_string(key_server_url, "", "Key server url. Required for encryption and "
32  "decryption");
33 DEFINE_string(content_id, "", "Content Id (hex).");
34 DEFINE_string(policy,
35  "",
36  "The name of a stored policy, which specifies DRM content "
37  "rights.");
38 DEFINE_int32(max_sd_pixels,
39  768 * 576,
40  "The video track is considered SD if its max pixels per frame is "
41  "no higher than max_sd_pixels. Default: 442368 (768 x 576).");
42 DEFINE_int32(max_hd_pixels,
43  1920 * 1080,
44  "The video track is considered HD if its max pixels per frame is "
45  "higher than max_sd_pixels, but no higher than max_hd_pixels. "
46  "Default: 2073600 (1920 x 1080).");
47 DEFINE_int32(max_uhd1_pixels,
48  4096 * 2160,
49  "The video track is considered UHD1 if its max pixels per frame "
50  "is higher than max_hd_pixels, but no higher than max_uhd1_pixels."
51  " Otherwise it is UHD2. Default: 8847360 (4096 x 2160).");
52 DEFINE_string(signer, "", "The name of the signer.");
53 DEFINE_string(aes_signing_key,
54  "",
55  "AES signing key in hex string. --aes_signing_iv is required. "
56  "Exclusive with --rsa_signing_key_path.");
57 DEFINE_string(aes_signing_iv,
58  "",
59  "AES signing iv in hex string.");
60 DEFINE_string(rsa_signing_key_path,
61  "",
62  "Stores PKCS#1 RSA private key for request signing. Exclusive "
63  "with --aes_signing_key.");
64 DEFINE_int32(crypto_period_duration,
65  0,
66  "Crypto period duration in seconds. If it is non-zero, key "
67  "rotation is enabled.");
68 DEFINE_string(protection_scheme,
69  "cenc",
70  "Choose protection scheme, 'cenc' or 'cbc1' or pattern-based "
71  "protection schemes 'cens' or 'cbcs'.");
72 
73 namespace shaka {
74 
76  bool success = true;
77 
78  const bool widevine_crypto =
79  FLAGS_enable_widevine_encryption || FLAGS_enable_widevine_decryption;
80  const char widevine_crypto_label[] =
81  "--enable_widevine_encryption/decryption";
82  // key_server_url and signer (optional) are associated with
83  // enable_widevine_encryption and enable_widevine_descryption.
84  if (!ValidateFlag("key_server_url",
85  FLAGS_key_server_url,
86  widevine_crypto,
87  false,
88  widevine_crypto_label)) {
89  success = false;
90  }
91  if (!ValidateFlag("signer",
92  FLAGS_signer,
93  widevine_crypto,
94  true,
95  widevine_crypto_label)) {
96  success = false;
97  }
98  if (widevine_crypto && FLAGS_signer.empty() &&
99  base::StartsWith(base::StringPiece(FLAGS_key_server_url), "http",
100  base::CompareCase::INSENSITIVE_ASCII)) {
101  LOG(WARNING) << "--signer is likely required with "
102  "--enable_widevine_encryption/decryption.";
103  }
104 
105  const char widevine_encryption_label[] = "--enable_widevine_encryption";
106  // content_id and policy (optional) are associated with
107  // enable_widevine_encryption.
108  if (!ValidateFlag("content_id",
109  FLAGS_content_id,
110  FLAGS_enable_widevine_encryption,
111  false,
112  widevine_encryption_label)) {
113  success = false;
114  }
115  if (!ValidateFlag("policy",
116  FLAGS_policy,
117  FLAGS_enable_widevine_encryption,
118  true,
119  widevine_encryption_label)) {
120  success = false;
121  }
122  if (FLAGS_include_common_pssh && !FLAGS_enable_widevine_encryption) {
123  PrintError("--include_common_pssh is only valid with "
124  "--enable_widevine_encryption");
125  success = false;
126  }
127 
128  if (FLAGS_max_sd_pixels <= 0) {
129  PrintError("--max_sd_pixels must be positive.");
130  success = false;
131  }
132  if (FLAGS_max_hd_pixels <= 0) {
133  PrintError("--max_hd_pixels must be positive.");
134  success = false;
135  }
136  if (FLAGS_max_uhd1_pixels <= 0) {
137  PrintError("--max_uhd1_pixels must be positive.");
138  success = false;
139  }
140  if (FLAGS_max_hd_pixels <= FLAGS_max_sd_pixels) {
141  PrintError("--max_hd_pixels must be greater than --max_sd_pixels.");
142  success = false;
143  }
144  if (FLAGS_max_uhd1_pixels <= FLAGS_max_hd_pixels) {
145  PrintError("--max_uhd1_pixels must be greater than --max_hd_pixels.");
146  success = false;
147  }
148 
149  const bool aes = !FLAGS_signer.empty() && FLAGS_rsa_signing_key_path.empty();
150  const char aes_label[] =
151  "--signer is specified and exclusive with --rsa_signing_key_path";
152  // aes_signer_key and aes_signing_iv are associated with aes signing.
153  if (!ValidateFlag(
154  "aes_signing_key", FLAGS_aes_signing_key, aes, true, aes_label)) {
155  success = false;
156  }
157  if (!ValidateFlag(
158  "aes_signing_iv", FLAGS_aes_signing_iv, aes, true, aes_label)) {
159  success = false;
160  }
161 
162  const bool rsa = !FLAGS_signer.empty() && FLAGS_aes_signing_key.empty() &&
163  FLAGS_aes_signing_iv.empty();
164  const char rsa_label[] =
165  "--signer is specified and exclusive with --aes_signing_key/iv";
166  // rsa_signing_key_path is associated with rsa_signing.
167  if (!ValidateFlag("rsa_signing_key_path",
168  FLAGS_rsa_signing_key_path,
169  rsa,
170  true,
171  rsa_label)) {
172  success = false;
173  }
174 
175  if (!FLAGS_signer.empty() &&
176  (FLAGS_aes_signing_key.empty() || FLAGS_aes_signing_iv.empty()) &&
177  FLAGS_rsa_signing_key_path.empty()) {
178  PrintError(
179  "--aes_signing_key/iv or --rsa_signing_key_path is required with "
180  "--signer.");
181  success = false;
182  }
183 
184  if (FLAGS_crypto_period_duration < 0) {
185  PrintError("--crypto_period_duration should not be negative.");
186  success = false;
187  }
188  return success;
189 }
190 
191 } // namespace shaka
void PrintError(const std::string &error_message)
bool ValidateWidevineCryptoFlags()
bool ValidateFlag(const char *flag_name, const std::string &flag_value, bool condition, bool optional, const char *label)