Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(771)

Side by Side Diff: media/cdm/aes_decryptor.cc

Issue 1920433003: EME: Address TODOs related to the removal of prefixed EME (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/cdm/aes_decryptor.h" 5 #include "media/cdm/aes_decryptor.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <list> 8 #include <list>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 EmeInitDataType init_data_type, 261 EmeInitDataType init_data_type,
262 const std::vector<uint8_t>& init_data, 262 const std::vector<uint8_t>& init_data,
263 std::unique_ptr<NewSessionCdmPromise> promise) { 263 std::unique_ptr<NewSessionCdmPromise> promise) {
264 std::string session_id(base::UintToString(next_session_id_++)); 264 std::string session_id(base::UintToString(next_session_id_++));
265 valid_sessions_.insert(session_id); 265 valid_sessions_.insert(session_id);
266 266
267 // For now, the AesDecryptor does not care about |session_type|. 267 // For now, the AesDecryptor does not care about |session_type|.
268 // TODO(jrummell): Validate |session_type|. 268 // TODO(jrummell): Validate |session_type|.
269 269
270 std::vector<uint8_t> message; 270 std::vector<uint8_t> message;
271 // TODO(jrummell): Since unprefixed will never send NULL, remove this check 271 std::vector<std::vector<uint8_t>> keys;
ddorwin 2016/06/23 01:06:47 I think we could have removed this before when we
272 // when prefixed EME is removed (http://crbug.com/249976). 272 switch (init_data_type) {
273 if (!init_data.empty()) { 273 case EmeInitDataType::WEBM:
274 std::vector<std::vector<uint8_t>> keys; 274 // |init_data| is simply the key needed.
275 switch (init_data_type) { 275 keys.push_back(init_data);
276 case EmeInitDataType::WEBM: 276 break;
277 // |init_data| is simply the key needed. 277 case EmeInitDataType::CENC:
278 keys.push_back(init_data);
279 break;
280 case EmeInitDataType::CENC:
281 #if defined(USE_PROPRIETARY_CODECS) 278 #if defined(USE_PROPRIETARY_CODECS)
282 // |init_data| is a set of 0 or more concatenated 'pssh' boxes. 279 // |init_data| is a set of 0 or more concatenated 'pssh' boxes.
283 if (!GetKeyIdsForCommonSystemId(init_data, &keys)) { 280 if (!GetKeyIdsForCommonSystemId(init_data, &keys)) {
284 promise->reject(NOT_SUPPORTED_ERROR, 0, 281 promise->reject(NOT_SUPPORTED_ERROR, 0, "No supported PSSH box found.");
285 "No supported PSSH box found."); 282 return;
286 return; 283 }
287 } 284 break;
288 break;
289 #else 285 #else
290 promise->reject(NOT_SUPPORTED_ERROR, 0, 286 promise->reject(NOT_SUPPORTED_ERROR, 0,
291 "Initialization data type CENC is not supported."); 287 "Initialization data type CENC is not supported.");
288 return;
289 #endif
290 case EmeInitDataType::KEYIDS: {
291 std::string init_data_string(init_data.begin(), init_data.end());
292 std::string error_message;
293 if (!ExtractKeyIdsFromKeyIdsInitData(init_data_string, &keys,
294 &error_message)) {
295 promise->reject(NOT_SUPPORTED_ERROR, 0, error_message);
292 return; 296 return;
293 #endif
294 case EmeInitDataType::KEYIDS: {
295 std::string init_data_string(init_data.begin(), init_data.end());
296 std::string error_message;
297 if (!ExtractKeyIdsFromKeyIdsInitData(init_data_string, &keys,
298 &error_message)) {
299 promise->reject(NOT_SUPPORTED_ERROR, 0, error_message);
300 return;
301 }
302 break;
303 } 297 }
304 default: 298 break;
305 NOTREACHED();
306 promise->reject(NOT_SUPPORTED_ERROR, 0,
307 "init_data_type not supported.");
308 return;
309 } 299 }
310 CreateLicenseRequest(keys, session_type, &message); 300 default:
301 NOTREACHED();
302 promise->reject(NOT_SUPPORTED_ERROR, 0, "init_data_type not supported.");
303 return;
311 } 304 }
305 CreateLicenseRequest(keys, session_type, &message);
312 306
313 promise->resolve(session_id); 307 promise->resolve(session_id);
314 308
315 // No URL needed for license requests. 309 // No URL needed for license requests.
316 GURL empty_gurl; 310 GURL empty_gurl;
317 session_message_cb_.Run(session_id, LICENSE_REQUEST, message, empty_gurl); 311 session_message_cb_.Run(session_id, LICENSE_REQUEST, message, empty_gurl);
318 } 312 }
319 313
320 void AesDecryptor::LoadSession(SessionType session_type, 314 void AesDecryptor::LoadSession(SessionType session_type,
321 const std::string& session_id, 315 const std::string& session_id,
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 valid_sessions_.erase(it); 403 valid_sessions_.erase(it);
410 404
411 // Close the session. 405 // Close the session.
412 DeleteKeysForSession(session_id); 406 DeleteKeysForSession(session_id);
413 promise->resolve(); 407 promise->resolve();
414 session_closed_cb_.Run(session_id); 408 session_closed_cb_.Run(session_id);
415 } 409 }
416 410
417 void AesDecryptor::RemoveSession(const std::string& session_id, 411 void AesDecryptor::RemoveSession(const std::string& session_id,
418 std::unique_ptr<SimpleCdmPromise> promise) { 412 std::unique_ptr<SimpleCdmPromise> promise) {
419 // AesDecryptor doesn't keep any persistent data, so this should be 413 NOTREACHED() << "AesDecryptor doesn't support persistent sessions.";
420 // NOT_REACHED().
421 // TODO(jrummell): Make sure persistent session types are rejected.
422 // http://crbug.com/384152.
423 //
424 // However, v0.1b calls to CancelKeyRequest() will call this, so close the
425 // session, if it exists.
426 // TODO(jrummell): Remove the close() call when prefixed EME is removed.
427 // http://crbug.com/249976.
428 if (valid_sessions_.find(session_id) != valid_sessions_.end()) {
429 CloseSession(session_id, std::move(promise));
430 return;
431 }
432
433 promise->reject(INVALID_ACCESS_ERROR, 0, "Session does not exist."); 414 promise->reject(INVALID_ACCESS_ERROR, 0, "Session does not exist.");
434 } 415 }
435 416
436 CdmContext* AesDecryptor::GetCdmContext() { 417 CdmContext* AesDecryptor::GetCdmContext() {
437 return this; 418 return this;
438 } 419 }
439 420
440 Decryptor* AesDecryptor::GetDecryptor() { 421 Decryptor* AesDecryptor::GetDecryptor() {
441 return this; 422 return this;
442 } 423 }
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 bool AesDecryptor::DecryptionKey::Init() { 589 bool AesDecryptor::DecryptionKey::Init() {
609 CHECK(!secret_.empty()); 590 CHECK(!secret_.empty());
610 decryption_key_.reset(crypto::SymmetricKey::Import( 591 decryption_key_.reset(crypto::SymmetricKey::Import(
611 crypto::SymmetricKey::AES, secret_)); 592 crypto::SymmetricKey::AES, secret_));
612 if (!decryption_key_) 593 if (!decryption_key_)
613 return false; 594 return false;
614 return true; 595 return true;
615 } 596 }
616 597
617 } // namespace media 598 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698