bug: 8621521 This fixes a problem where insecure audio buffers were being passed incorrectly as secure buffers to the trusted environment's OEMCrypto_DecryptCTR. This is a merge of the following changes from the widevine git repository to android git repository: https://widevine-internal-review.googlesource.com/#/c/5163/2 Allow selection of secure/non-secure buffers https://widevine-internal-review.googlesource.com/#/c/5164/ Pass Secure Buffer Request to CDM Change-Id: Iec1192a216305c6cf92c359b15b148eccc6ce6ce
111 lines
3.2 KiB
C++
111 lines
3.2 KiB
C++
// Copyright 2012 Google Inc. All Rights Reserved.
|
|
|
|
#ifndef CDM_BASE_CDM_SESSION_H_
|
|
#define CDM_BASE_CDM_SESSION_H_
|
|
|
|
#include <set>
|
|
|
|
#include "crypto_session.h"
|
|
#include "license.h"
|
|
#include "policy_engine.h"
|
|
#include "wv_cdm_event_listener.h"
|
|
#include "wv_cdm_types.h"
|
|
|
|
namespace wvcdm {
|
|
|
|
// TODO(kqyang): Do we need it? CdmKey not defined yet
|
|
// typedef std::map<KeyId, CdmKey*> CdmSessionKeys;
|
|
|
|
class CdmSession {
|
|
public:
|
|
CdmSession() : session_id_(GenerateSessionId()), license_received_(false) {}
|
|
~CdmSession() {}
|
|
|
|
CdmResponseType Init();
|
|
|
|
bool DestroySession();
|
|
|
|
void set_key_system(const CdmKeySystem& ksystem) { key_system_ = ksystem; }
|
|
const CdmKeySystem& key_system() { return key_system_; }
|
|
|
|
const CdmSessionId& session_id() { return session_id_; }
|
|
|
|
bool VerifySession(const CdmKeySystem& key_system,
|
|
const CdmInitData& init_data);
|
|
|
|
CdmResponseType GenerateKeyRequest(const CdmInitData& pssh_data,
|
|
const CdmLicenseType license_type,
|
|
CdmAppParameterMap& app_parameters,
|
|
CdmKeyMessage* key_request);
|
|
|
|
// AddKey() - Accept license response and extract key info.
|
|
CdmResponseType AddKey(const CdmKeyResponse& key_response);
|
|
|
|
// CancelKeyRequest() - Cancel session.
|
|
CdmResponseType CancelKeyRequest();
|
|
|
|
// Query license information
|
|
CdmResponseType QueryKeyStatus(CdmQueryMap* key_info);
|
|
|
|
// Query session control info
|
|
CdmResponseType QueryKeyControlInfo(CdmQueryMap* key_info);
|
|
|
|
// Decrypt() - Accept encrypted buffer and return decrypted data.
|
|
CdmResponseType Decrypt(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);
|
|
|
|
// License renewal
|
|
// GenerateRenewalRequest() - Construct valid renewal request for the current
|
|
// session keys.
|
|
CdmResponseType GenerateRenewalRequest(CdmKeyMessage* key_request);
|
|
|
|
// RenewKey() - Accept renewal response and update key info.
|
|
CdmResponseType RenewKey(const CdmKeyResponse& key_response);
|
|
|
|
bool IsKeyValid(const KeyId& key_id);
|
|
|
|
bool AttachEventListener(WvCdmEventListener* listener);
|
|
bool DetachEventListener(WvCdmEventListener* listener);
|
|
|
|
void OnTimerEvent();
|
|
|
|
private:
|
|
|
|
// Generate unique ID for each new session.
|
|
CdmSessionId GenerateSessionId();
|
|
|
|
bool LoadDeviceCertificate(std::string* cert, std::string* wrapped_key);
|
|
|
|
// instance variables
|
|
const CdmSessionId session_id_;
|
|
CdmKeySystem key_system_;
|
|
CdmLicense license_parser_;
|
|
CryptoSession* crypto_session_;
|
|
PolicyEngine policy_engine_;
|
|
bool license_received_;
|
|
|
|
KeyId key_id_;
|
|
|
|
// Used for certificate based licensing
|
|
std::string wrapped_key_;
|
|
|
|
std::set<WvCdmEventListener*> listeners_;
|
|
|
|
// TODO(kqyang): CdmKey not defined yet
|
|
// CdmSessionKeys session_keys_;
|
|
|
|
CORE_DISALLOW_COPY_AND_ASSIGN(CdmSession);
|
|
};
|
|
|
|
} // namespace wvcdm
|
|
|
|
#endif // CDM_BASE_CDM_SESSION_H_
|