This new format uses the SignedProvisioningMessage proto buffer definition so the client does not have to parse the message and signature from the JSON response separately. This change makes it more flexible to extend the fields in the SignedProvisioningMessage. Adds Apiary API key to the default provisioning server url. Fixes a bug in GetCertRequestResponse() where a LOGD() can generate a fault if there is no response data. Bug: 8620943 Merge of https://widevine-internal-review.googlesource.com/#/c/5230/ from Widevine CDM repository Change-Id: I4945ee2d16f88666e41edf990dd07102a9271105
136 lines
5.0 KiB
C++
136 lines
5.0 KiB
C++
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
|
|
#ifndef CDM_BASE_CDM_ENGINE_H_
|
|
#define CDM_BASE_CDM_ENGINE_H_
|
|
|
|
#include "timer.h"
|
|
#include "wv_cdm_types.h"
|
|
|
|
namespace wvcdm {
|
|
|
|
class CdmSession;
|
|
class CryptoEngine;
|
|
class WvCdmEventListener;
|
|
|
|
typedef std::map<CdmSessionId, CdmSession*> CdmSessionMap;
|
|
|
|
class CdmEngine : public TimerHandler {
|
|
public:
|
|
CdmEngine();
|
|
~CdmEngine();
|
|
|
|
// Session related methods
|
|
CdmResponseType OpenSession(const CdmKeySystem& key_system,
|
|
CdmSessionId* session_id);
|
|
CdmResponseType CloseSession(const CdmSessionId& session_id);
|
|
|
|
// License related methods
|
|
// Construct a valid license request
|
|
CdmResponseType GenerateKeyRequest(const CdmSessionId& session_id,
|
|
bool is_key_system_present,
|
|
const CdmKeySystem& key_system,
|
|
const CdmInitData& init_data,
|
|
const CdmLicenseType license_type,
|
|
CdmAppParameterMap& app_parameters,
|
|
CdmKeyMessage* key_request,
|
|
std::string* server_url);
|
|
|
|
// Accept license response and extract key info.
|
|
CdmResponseType AddKey(const CdmSessionId& session_id,
|
|
const CdmKeyResponse& key_data);
|
|
|
|
// Cancel session and unload keys.
|
|
CdmResponseType CancelKeyRequest(const CdmSessionId& session_id,
|
|
bool is_key_system_present,
|
|
const CdmKeySystem& key_system);
|
|
|
|
// Construct valid renewal request for the current session keys.
|
|
CdmResponseType GenerateRenewalRequest(const CdmSessionId& session_id,
|
|
CdmKeyMessage* key_request,
|
|
std::string* server_url);
|
|
|
|
// Accept renewal response and update key info.
|
|
CdmResponseType RenewKey(const CdmSessionId& session_id,
|
|
const CdmKeyResponse& key_data);
|
|
|
|
// Query system information
|
|
CdmResponseType QueryStatus(CdmQueryMap* info);
|
|
|
|
// Query license information
|
|
CdmResponseType QueryKeyStatus(const CdmSessionId& session_id,
|
|
CdmQueryMap* key_info);
|
|
|
|
// Query seesion control information
|
|
CdmResponseType QueryKeyControlInfo(const CdmSessionId& session_id,
|
|
CdmQueryMap* key_info);
|
|
|
|
// Provisioning related methods
|
|
CdmResponseType GetProvisioningRequest(CdmProvisioningRequest* request,
|
|
std::string* default_url);
|
|
|
|
CdmResponseType HandleProvisioningResponse(CdmProvisioningResponse& response);
|
|
|
|
// Secure stop related methods
|
|
CdmResponseType GetSecureStops(CdmSecureStops* secure_stops);
|
|
CdmResponseType ReleaseSecureStops(const CdmSecureStopReleaseMessage& message);
|
|
|
|
// Decryption and key related methods
|
|
// Accept encrypted buffer and return decrypted data.
|
|
CdmResponseType Decrypt(const CdmSessionId& session_id,
|
|
bool is_encrypted,
|
|
bool is_secure,
|
|
const KeyId& key_id,
|
|
const uint8_t* encrypt_buffer,
|
|
size_t encrypt_length,
|
|
const std::vector<uint8_t>& iv,
|
|
size_t block_offset,
|
|
void* decrypt_buffer,
|
|
size_t decrypt_buffer_offset,
|
|
bool is_video);
|
|
|
|
// Is the key known to any session?
|
|
bool IsKeyValid(const KeyId& key_id);
|
|
|
|
// Event listener related methods
|
|
bool AttachEventListener(const CdmSessionId& session_id,
|
|
WvCdmEventListener* listener);
|
|
bool DetachEventListener(const CdmSessionId& session_id,
|
|
WvCdmEventListener* listener);
|
|
private:
|
|
// private methods
|
|
// Cancel all sessions
|
|
bool CancelSessions();
|
|
void CleanupProvisioningSession(const CdmSessionId& cdm_session_id);
|
|
void ComposeJsonRequest(const std::string& message,
|
|
CdmProvisioningRequest* request);
|
|
|
|
// Parse a blob of multiple concatenated PSSH atoms to extract the first
|
|
// widevine pssh
|
|
// TODO(gmorgan): This should be done by the user of this class.
|
|
bool ExtractWidevinePssh(const CdmInitData& init_data,
|
|
CdmInitData* output);
|
|
bool ParseJsonResponse(const CdmProvisioningResponse& json_str,
|
|
const std::string& start_substr,
|
|
const std::string& end_substr,
|
|
std::string* result);
|
|
bool ValidateKeySystem(const CdmKeySystem& key_system);
|
|
|
|
// timer related methods to drive policy decisions
|
|
void EnablePolicyTimer();
|
|
void DisablePolicyTimer();
|
|
virtual void OnTimerEvent();
|
|
|
|
// instance variables
|
|
CdmSession* provisioning_session_;
|
|
CdmSessionMap sessions_;
|
|
|
|
// policy timer
|
|
Timer policy_timer_;
|
|
|
|
CORE_DISALLOW_COPY_AND_ASSIGN(CdmEngine);
|
|
};
|
|
|
|
} // namespace wvcdm
|
|
|
|
#endif // CDM_BASE_CDM_ENGINE_H_
|