Source release v3.0.0-0-g8d3792b-ce + third_party
Change-Id: I399e71ddfffcd436171d1c60283c63ab4658e0b1
This commit is contained in:
@@ -1,30 +0,0 @@
|
||||
// Copyright for the following files derived from the Chromium project
|
||||
// content_decryption_module.h
|
||||
//
|
||||
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following disclaimer
|
||||
// in the documentation and/or other materials provided with the
|
||||
// distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived from
|
||||
// this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
434
cdm/include/cdm.h
Normal file
434
cdm/include/cdm.h
Normal file
@@ -0,0 +1,434 @@
|
||||
// Copyright 2015 Google Inc. All Rights Reserved.
|
||||
// Based on the EME draft spec from 2015 June 01.
|
||||
// https://rawgit.com/w3c/encrypted-media/1cbedad/index.html
|
||||
// TODO: Verify behavior and update to June 12 draft.
|
||||
#ifndef WVCDM_CDM_CDM_H_
|
||||
#define WVCDM_CDM_CDM_H_
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef int int32_t;
|
||||
typedef __int64 int64_t;
|
||||
#else
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
// Define CDM_EXPORT to export functionality across shared library boundaries.
|
||||
#if defined(WIN32)
|
||||
# if defined(CDM_IMPLEMENTATION)
|
||||
# define CDM_EXPORT __declspec(dllexport)
|
||||
# else
|
||||
# define CDM_EXPORT __declspec(dllimport)
|
||||
# endif // defined(CDM_IMPLEMENTATION)
|
||||
#else // defined(WIN32)
|
||||
# if defined(CDM_IMPLEMENTATION)
|
||||
# define CDM_EXPORT __attribute__((visibility("default")))
|
||||
# else
|
||||
# define CDM_EXPORT
|
||||
# endif
|
||||
#endif // defined(WIN32)
|
||||
|
||||
namespace widevine {
|
||||
|
||||
class CDM_EXPORT Cdm {
|
||||
public:
|
||||
// Session types defined by EME.
|
||||
typedef enum {
|
||||
kTemporary = 0,
|
||||
kPersistent = 1,
|
||||
} SessionType;
|
||||
|
||||
// Message types defined by EME.
|
||||
typedef enum {
|
||||
kLicenseRequest = 0,
|
||||
kLicenseRenewal = 1,
|
||||
kLicenseRelease = 2,
|
||||
kIndividualizationRequest = 3,
|
||||
} MessageType;
|
||||
|
||||
typedef enum {
|
||||
// These are defined by Widevine:
|
||||
kSuccess = 0,
|
||||
kNeedsDeviceCertificate = 1,
|
||||
kSessionNotFound = 2,
|
||||
kDecryptError = 3,
|
||||
kNoKey = 4,
|
||||
// These are analogous to the errors used by EME:
|
||||
kInvalidAccess = 5,
|
||||
kNotSupported = 6,
|
||||
kInvalidState = 7,
|
||||
kQuotaExceeded = 8,
|
||||
// This covers errors that we do not expect (see logs for details):
|
||||
kUnexpectedError = 99999,
|
||||
} Status;
|
||||
|
||||
// These are the init data types defined by EME.
|
||||
typedef enum {
|
||||
kCenc = 0,
|
||||
kKeyIds = 1, // NOTE: not supported by Widevine at this time
|
||||
kWebM = 2,
|
||||
} InitDataType;
|
||||
|
||||
// These are key statuses defined by EME.
|
||||
typedef enum {
|
||||
kUsable = 0,
|
||||
kExpired = 1,
|
||||
kOutputNotAllowed = 2,
|
||||
kStatusPending = 3,
|
||||
kInternalError = 4,
|
||||
} KeyStatus;
|
||||
|
||||
// These are defined by Widevine. The CDM can be configured to decrypt in
|
||||
// three modes (dependent on OEMCrypto support).
|
||||
typedef enum {
|
||||
// Data is decrypted to an opaque handle.
|
||||
// Translates to OEMCrypto's OEMCrypto_BufferType_Secure.
|
||||
kOpaqueHandle = 0,
|
||||
|
||||
// Decrypted data never returned to the caller, but is decoded and rendered
|
||||
// by OEMCrypto.
|
||||
// Translates to OEMCrypto's OEMCrypto_BufferType_Direct.
|
||||
kDirectRender = 1,
|
||||
|
||||
// There is no secure output available, so all data is decrypted into a
|
||||
// clear buffer in main memory.
|
||||
// Translates to OEMCrypto's OEMCrypto_BufferType_Clear.
|
||||
kNoSecureOutput = 2,
|
||||
} SecureOutputType;
|
||||
|
||||
// Logging levels defined by Widevine.
|
||||
// See Cdm::initialize().
|
||||
typedef enum {
|
||||
kSilent = -1,
|
||||
kErrors = 0,
|
||||
kWarnings = 1,
|
||||
kInfo = 2,
|
||||
kDebug = 3,
|
||||
kVerbose = 4,
|
||||
} LogLevel;
|
||||
|
||||
// A map of key statuses.
|
||||
// See Cdm::getKeyStatuses().
|
||||
typedef std::map<std::string, KeyStatus> KeyStatusMap;
|
||||
|
||||
// An event listener interface provided by the application and attached to
|
||||
// each CDM session.
|
||||
// See Cdm::createSession().
|
||||
class IEventListener {
|
||||
public:
|
||||
// A message (license request, renewal, etc.) to be dispatched to the
|
||||
// application's license server.
|
||||
// The response, if successful, should be provided back to the CDM via a
|
||||
// call to Cdm::update().
|
||||
virtual void onMessage(const std::string& session_id,
|
||||
MessageType message_type,
|
||||
const std::string& message) = 0;
|
||||
|
||||
// There has been a change in the keys in the session or their status.
|
||||
virtual void onKeyStatusesChange(const std::string& session_id) = 0;
|
||||
|
||||
// A remove() operation has been completed.
|
||||
virtual void onRemoveComplete(const std::string& session_id) = 0;
|
||||
|
||||
protected:
|
||||
IEventListener() {}
|
||||
virtual ~IEventListener() {}
|
||||
};
|
||||
|
||||
// A storage interface provided by the application, independent of CDM
|
||||
// instances.
|
||||
// See Cdm::initialize().
|
||||
// NOTE: It is important for users of your application to be able to clear
|
||||
// stored data. Also, browsers or other multi-application systems should
|
||||
// store data separately per-app or per-origin.
|
||||
// See http://www.w3.org/TR/encrypted-media/#privacy-storedinfo.
|
||||
class IStorage {
|
||||
public:
|
||||
virtual bool read(const std::string& name,
|
||||
std::string* data) = 0;
|
||||
virtual bool write(const std::string& name,
|
||||
const std::string& data) = 0;
|
||||
virtual bool exists(const std::string& name) = 0;
|
||||
virtual bool remove(const std::string& name) = 0;
|
||||
virtual int32_t size(const std::string& name) = 0;
|
||||
|
||||
protected:
|
||||
IStorage() {}
|
||||
virtual ~IStorage() {}
|
||||
};
|
||||
|
||||
// A clock interface provided by the application, independent of CDM
|
||||
// instances.
|
||||
// See Cdm::initialize().
|
||||
class IClock {
|
||||
public:
|
||||
// Returns the current time in milliseconds since 1970 UTC.
|
||||
virtual int64_t now() = 0;
|
||||
|
||||
protected:
|
||||
IClock() {}
|
||||
virtual ~IClock() {}
|
||||
};
|
||||
|
||||
// A timer interface provided by the application, independent of CDM
|
||||
// instances.
|
||||
// See Cdm::initialize().
|
||||
class ITimer {
|
||||
public:
|
||||
class IClient {
|
||||
public:
|
||||
// Called by ITimer when a timer expires.
|
||||
virtual void onTimerExpired(void* context) = 0;
|
||||
|
||||
protected:
|
||||
IClient() {}
|
||||
virtual ~IClient() {}
|
||||
};
|
||||
|
||||
// Call |client->onTimerExpired(context)| after a delay of |delay_ms| ms.
|
||||
virtual void setTimeout(int64_t delay_ms,
|
||||
IClient* client,
|
||||
void* context) = 0;
|
||||
|
||||
protected:
|
||||
ITimer() {}
|
||||
virtual ~ITimer() {}
|
||||
};
|
||||
|
||||
// Client information, provided by the application, independent of CDM
|
||||
// instances.
|
||||
// See Cdm::initialize().
|
||||
// These parameters end up as client indentification in license requests.
|
||||
// All fields may be used by a license server proxy to drive business logic.
|
||||
// Some fields are required (indicated below), but please fill out as many
|
||||
// as make sense for your application.
|
||||
// No user-identifying information may be put in these fields!
|
||||
struct ClientInfo {
|
||||
// The name of the product or application, e.g. "TurtleTube"
|
||||
// Required.
|
||||
std::string product_name;
|
||||
|
||||
// The name of the company who makes the device, e.g. "Kubrick, Inc."
|
||||
// Required.
|
||||
std::string company_name;
|
||||
|
||||
// The name of the device, e.g. "HAL"
|
||||
std::string device_name;
|
||||
|
||||
// The device model, e.g. "HAL 9000"
|
||||
// Required.
|
||||
std::string model_name;
|
||||
|
||||
// The architecture of the device, e.g. "x86-64"
|
||||
std::string arch_name;
|
||||
|
||||
// Information about the build of the browser, application, or platform into
|
||||
// which the CDM is integrated, e.g. "v2.71828, 2038-01-19-03:14:07"
|
||||
std::string build_info;
|
||||
};
|
||||
|
||||
// Device certificate request information.
|
||||
// The structure is passed by the application to the library in as an output
|
||||
// parameter to Cdm::initialize().
|
||||
// All fields are filled in by the library to instruct the application to
|
||||
// handle device certificate requests, if needed.
|
||||
struct DeviceCertificateRequest {
|
||||
// If false, the library is ready to create and/or load sessions.
|
||||
// If true, a device certificate is needed first.
|
||||
// Sessions cannot be created or loaded until the device certificate has
|
||||
// been provisioned.
|
||||
bool needed;
|
||||
|
||||
// If |needed| is true, this string contains the URL that must be used to
|
||||
// provision a device certificate. The request must be a POST.
|
||||
std::string url;
|
||||
|
||||
// If |needed| is true, the response from the above-described HTTP POST
|
||||
// must be provided as an argument to this method.
|
||||
// Returns kSuccess if the provisioning was successful.
|
||||
// Any other return value means the provisioning failed and the CDM cannot
|
||||
// be used yet.
|
||||
Status acceptReply(const std::string& reply);
|
||||
};
|
||||
|
||||
// Initialize the CDM library and provide access to platform services.
|
||||
// All platform interfaces are required.
|
||||
// The |device_certificate_request| parameter will be filled in by
|
||||
// initialize().
|
||||
// See documentation for DeviceCertificateRequest for more information.
|
||||
// Logging is controlled by |verbosity|.
|
||||
// Must be called and must return kSuccess before create() is called.
|
||||
static Status initialize(
|
||||
SecureOutputType secure_output_type,
|
||||
const ClientInfo& client_info,
|
||||
IStorage* storage,
|
||||
IClock* clock,
|
||||
ITimer* timer,
|
||||
DeviceCertificateRequest* device_certificate_request,
|
||||
LogLevel verbosity);
|
||||
|
||||
// Query the CDM library version.
|
||||
static const char* version();
|
||||
|
||||
// Constructs a new CDM instance.
|
||||
// initialize() must be called first and must return kSuccess before a CDM
|
||||
// instance may be constructed.
|
||||
// The CDM may notify of events at any time via the provided |listener|,
|
||||
// which may not be NULL.
|
||||
// If |privacy_mode| is true, server certificates are required and will be
|
||||
// used to encrypt messages to the license server.
|
||||
// By using server certificates to encrypt communication with the license
|
||||
// server, device-identifying information cannot be extracted from the
|
||||
// license exchange process by an intermediate layer between the CDM and
|
||||
// the server.
|
||||
// This is particularly useful for browser environments, but is recommended
|
||||
// for use whenever possible.
|
||||
static Cdm* create(IEventListener* listener,
|
||||
bool privacy_mode);
|
||||
|
||||
virtual ~Cdm() {}
|
||||
|
||||
// Provides a server certificate to be used to encrypt messages to the
|
||||
// license server.
|
||||
// If |privacy_mode| was true in create() and setServerCertificate() is not
|
||||
// called, the CDM will attempt to provision a server certificate through
|
||||
// IEventListener::onMessage() with messageType == kIndividualizationRequest.
|
||||
// May not be called if |privacy_mode| was false.
|
||||
virtual Status setServerCertificate(const std::string& certificate) = 0;
|
||||
|
||||
// Creates a new session.
|
||||
// Do not use this to load an existing persistent session.
|
||||
// If successful, the session_id is returned via |sessionId|.
|
||||
virtual Status createSession(SessionType session_type,
|
||||
std::string* session_id) = 0;
|
||||
|
||||
// Generates a request based on the initData.
|
||||
// The request will be provided via a synchronous call to
|
||||
// IEventListener::onMessage().
|
||||
// This is done so that license requests and renewals follow the same flow.
|
||||
virtual Status generateRequest(const std::string& session_id,
|
||||
InitDataType init_data_type,
|
||||
const std::string& init_data) = 0;
|
||||
|
||||
// Loads an existing persisted session from storage.
|
||||
virtual Status load(const std::string& session_id) = 0;
|
||||
|
||||
// Provides messages, including licenses, to the CDM.
|
||||
// If the message is a successful response to a release message, stored
|
||||
// session data will be removed for the session.
|
||||
virtual Status update(const std::string& session_id,
|
||||
const std::string& response) = 0;
|
||||
|
||||
// The time, in milliseconds since 1970 UTC, after which the key(s) in the
|
||||
// session will no longer be usable to decrypt media data, or -1 if no such
|
||||
// time exists.
|
||||
virtual Status getExpiration(const std::string& session_id,
|
||||
int64_t* expiration) = 0;
|
||||
|
||||
// A map of known key IDs to the current status of the associated key.
|
||||
virtual Status getKeyStatuses(const std::string& session_id,
|
||||
KeyStatusMap* key_statuses) = 0;
|
||||
|
||||
// Indicates that the application no longer needs the session and the CDM
|
||||
// should release any resources associated with it and close it.
|
||||
// Does not generate release messages for persistent sessions.
|
||||
// Does not remove stored session data for persistent sessions.
|
||||
virtual Status close(const std::string& session_id) = 0;
|
||||
|
||||
// Removes stored session data associated with the session.
|
||||
// The session must be loaded before it can be removed.
|
||||
// Generates release messages, which must be delivered to the license server.
|
||||
// A reply from the license server must be provided via update() before the
|
||||
// session is fully removed.
|
||||
virtual Status remove(const std::string& session_id) = 0;
|
||||
|
||||
struct InputBuffer {
|
||||
public:
|
||||
InputBuffer()
|
||||
: key_id(NULL),
|
||||
key_id_length(0),
|
||||
iv(NULL),
|
||||
iv_length(0),
|
||||
data(NULL),
|
||||
data_length(0),
|
||||
block_offset(0),
|
||||
is_encrypted(true),
|
||||
is_video(true),
|
||||
first_subsample(true),
|
||||
last_subsample(true) {}
|
||||
|
||||
const uint8_t* key_id;
|
||||
uint32_t key_id_length;
|
||||
|
||||
// The IV is expected to be 16 bytes.
|
||||
const uint8_t* iv;
|
||||
uint32_t iv_length;
|
||||
|
||||
const uint8_t* data;
|
||||
uint32_t data_length;
|
||||
|
||||
// |data|'s offset within its 16-byte AES block, used for CENC subsamples.
|
||||
// Should start at 0 for each sample, then go up by |data_length| (mod 16)
|
||||
// after the |is_encrypted| part of each subsample.
|
||||
uint32_t block_offset;
|
||||
|
||||
// If false, copies the input data directly to the output buffer. Used for
|
||||
// secure output types, where the output buffer cannot be directly accessed
|
||||
// above the CDM.
|
||||
bool is_encrypted;
|
||||
|
||||
// Used by secure output type kDirectRender, where the secure hardware must
|
||||
// decode and render the decrypted content:
|
||||
bool is_video;
|
||||
bool first_subsample;
|
||||
bool last_subsample;
|
||||
};
|
||||
|
||||
struct OutputBuffer {
|
||||
OutputBuffer()
|
||||
: data(NULL),
|
||||
data_length(0),
|
||||
data_offset(0),
|
||||
is_secure(false) {}
|
||||
|
||||
// If |is_secure| is false or the secure output type is kNoSecureOutput,
|
||||
// this is a memory address in main memory.
|
||||
// If |is_secure| is true and the secure output type is kOpaqueHandle,
|
||||
// this is an opaque handle.
|
||||
// If |is_secure| is true and the secure output type is kDirectRender,
|
||||
// this is ignored.
|
||||
// See also SecureOutputType argument to initialize().
|
||||
uint8_t* data;
|
||||
|
||||
// The maximum amount of data that can be decrypted to the buffer in this
|
||||
// call, starting from |data|.
|
||||
// Must be at least as large as the input buffer's |data_length|.
|
||||
// This size accounts for the bytes that will be skipped by |data_offset|.
|
||||
uint32_t data_length;
|
||||
|
||||
// An offset applied to the output address.
|
||||
// Useful when |data| is an opaque handle rather than an address.
|
||||
uint32_t data_offset;
|
||||
|
||||
// False for clear buffers, true otherwise.
|
||||
// Must be false if the secure output type is kNoSecureOutput.
|
||||
// See also SecureOutputType argument to initialize().
|
||||
bool is_secure;
|
||||
};
|
||||
|
||||
// Decrypt the input as described by |input| and pass the output as described
|
||||
// in |output|.
|
||||
virtual Status decrypt(const InputBuffer& input,
|
||||
const OutputBuffer& output) = 0;
|
||||
|
||||
protected:
|
||||
Cdm() {}
|
||||
};
|
||||
|
||||
} // namespace widevine
|
||||
|
||||
#endif // WVCDM_CDM_CDM_H_
|
||||
@@ -1,27 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_CDM_HOST_CLOCK_H_
|
||||
#define WVCDM_CDM_CDM_HOST_CLOCK_H_
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class IClock {
|
||||
public:
|
||||
IClock(){}
|
||||
virtual ~IClock();
|
||||
virtual int64_t GetCurrentTimeInSeconds() = 0;
|
||||
};
|
||||
|
||||
class HostClock {
|
||||
friend class Clock;
|
||||
friend class IClock;
|
||||
public:
|
||||
static void SetClockInterface(IClock* iclock);
|
||||
int64_t GetCurrentTimeInSeconds();
|
||||
private:
|
||||
static IClock* impl_;
|
||||
};
|
||||
|
||||
} // namspace wvcdm
|
||||
|
||||
#endif // WVCDM_CDM_CDM_HOST_CLOCK_H_
|
||||
@@ -1,96 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_CDM_HOST_FILE_H_
|
||||
#define WVCDM_CDM_CDM_HOST_FILE_H_
|
||||
|
||||
#include "content_decryption_module.h"
|
||||
#include "file_store.h"
|
||||
#include "host_4_file_io_client.h"
|
||||
#include "scoped_ptr.h"
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class IFileFactory;
|
||||
|
||||
class IHostFile {
|
||||
public:
|
||||
virtual ~IHostFile() {}
|
||||
virtual bool Open(const std::string& name) = 0;
|
||||
virtual ssize_t Read(char* buffer, size_t bytes) = 0;
|
||||
virtual ssize_t Write(const char* buffer, size_t bytes) = 0;
|
||||
virtual bool Close() = 0;
|
||||
virtual bool Remove(const std::string& name) = 0;
|
||||
virtual ssize_t FileSize(const std::string& name) = 0;
|
||||
};
|
||||
|
||||
class File1Impl : public IHostFile {
|
||||
public:
|
||||
explicit File1Impl(cdm::Host_1* const host_1) : host_1_(host_1) {}
|
||||
virtual ~File1Impl() {}
|
||||
virtual bool Open(const std::string& name) OVERRIDE;
|
||||
virtual ssize_t Read(char* buffer, size_t bytes) OVERRIDE;
|
||||
virtual ssize_t Write(const char* buffer, size_t bytes) OVERRIDE;
|
||||
virtual bool Close() OVERRIDE;
|
||||
virtual bool Remove(const std::string& name) OVERRIDE;
|
||||
virtual ssize_t FileSize(const std::string& name) OVERRIDE;
|
||||
private:
|
||||
cdm::Host_1* const host_1_;
|
||||
std::string fname_;
|
||||
};
|
||||
|
||||
class File4Impl : public IHostFile {
|
||||
public:
|
||||
explicit File4Impl(cdm::Host_4* const host_4) :
|
||||
host_4_(host_4), host_4_file_io_client_(host_4) {}
|
||||
virtual ~File4Impl() {}
|
||||
virtual bool Open(const std::string& name) OVERRIDE;
|
||||
virtual ssize_t Read(char* buffer, size_t bytes) OVERRIDE;
|
||||
virtual ssize_t Write(const char* buffer, size_t bytes) OVERRIDE;
|
||||
virtual bool Close() OVERRIDE;
|
||||
virtual bool Remove(const std::string& name) OVERRIDE;
|
||||
virtual ssize_t FileSize(const std::string& name) OVERRIDE;
|
||||
private:
|
||||
cdm::Host_4* const host_4_;
|
||||
Host4FileIOClient host_4_file_io_client_;
|
||||
};
|
||||
|
||||
class File::Impl {
|
||||
public:
|
||||
explicit Impl(cdm::Host_1* const host_1) :
|
||||
file_api_(new File1Impl(host_1)) {}
|
||||
|
||||
explicit Impl(cdm::Host_4* const host_4) :
|
||||
file_api_(new File4Impl(host_4)) {}
|
||||
|
||||
virtual ~Impl() {}
|
||||
|
||||
static void RegisterFileFactory(IFileFactory* factory) { factory_ = factory; }
|
||||
|
||||
virtual bool Open(const std::string& name);
|
||||
virtual ssize_t Read(char* buffer, size_t bytes);
|
||||
virtual ssize_t Write(const char* buffer, size_t bytes);
|
||||
virtual bool Close();
|
||||
virtual bool Exists(const std::string& name);
|
||||
virtual bool Remove(const std::string& name);
|
||||
virtual ssize_t FileSize(const std::string& name);
|
||||
|
||||
private:
|
||||
static IFileFactory* factory_;
|
||||
friend class File;
|
||||
|
||||
scoped_ptr<IHostFile> file_api_;
|
||||
};
|
||||
|
||||
class IFileFactory {
|
||||
protected:
|
||||
IFileFactory() { File::Impl::RegisterFileFactory(this); }
|
||||
|
||||
virtual ~IFileFactory() {}
|
||||
|
||||
public:
|
||||
virtual File::Impl* NewFileImpl() = 0;
|
||||
};
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
#endif // WVCDM_CDM_CDM_HOST_FILE_H_
|
||||
@@ -1,45 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_CDM_HOST_TIMER_H_
|
||||
#define WVCDM_CDM_CDM_HOST_TIMER_H_
|
||||
|
||||
#include <cstddef>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "content_decryption_module.h"
|
||||
#include "timer.h"
|
||||
|
||||
namespace wvcdm {
|
||||
class ITimerFactory {
|
||||
public:
|
||||
virtual Timer::Impl* NewTimerImpl() = 0;
|
||||
};
|
||||
|
||||
class Timer::Impl {
|
||||
friend class wvcdm::Timer;
|
||||
typedef enum {kIdle, kRunning} TimerState;
|
||||
public:
|
||||
static void RegisterTimerFactory(ITimerFactory* factory);
|
||||
|
||||
explicit Impl(cdm::Host* const host);
|
||||
virtual ~Impl(){}
|
||||
|
||||
void Start(TimerHandler *handler, uint32_t time_in_secs);
|
||||
|
||||
void Stop();
|
||||
|
||||
bool IsRunning(){return state_ == kRunning;}
|
||||
|
||||
void OnTimerEvent();
|
||||
|
||||
private:
|
||||
static ITimerFactory* factory_;
|
||||
cdm::Host* const host_;
|
||||
TimerHandler* handler_;
|
||||
int64_t delay_ms_;
|
||||
TimerState state_;
|
||||
};
|
||||
} // namespace wvcdm
|
||||
|
||||
#endif // WVCDM_CDM_CDM_HOST_TIMER_H_
|
||||
2
cdm/include/cdm_version.h
Normal file
2
cdm/include/cdm_version.h
Normal file
@@ -0,0 +1,2 @@
|
||||
// Widevine CE CDM Version
|
||||
#define CDM_VERSION "v3.0.0-0-g8d3792b-ce"
|
||||
@@ -1,654 +0,0 @@
|
||||
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#ifndef WVCDM_CDM_CONTENT_DECRYPTION_MODULE_H_
|
||||
#define WVCDM_CDM_CONTENT_DECRYPTION_MODULE_H_
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
typedef unsigned char uint8_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef int int32_t;
|
||||
typedef __int64 int64_t;
|
||||
#else
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
// Define CDM_EXPORT so that functionality implemented by the CDM module
|
||||
// can be exported to consumers.
|
||||
#if defined(WIN32)
|
||||
|
||||
#if defined(CDM_IMPLEMENTATION)
|
||||
#define CDM_EXPORT __declspec(dllexport)
|
||||
#else
|
||||
#define CDM_EXPORT __declspec(dllimport)
|
||||
#endif // defined(CDM_IMPLEMENTATION)
|
||||
|
||||
#else // defined(WIN32)
|
||||
|
||||
#if defined(CDM_IMPLEMENTATION)
|
||||
#define CDM_EXPORT __attribute__((visibility("default")))
|
||||
#else
|
||||
#define CDM_EXPORT
|
||||
#endif
|
||||
|
||||
#endif // defined(WIN32)
|
||||
|
||||
// We maintain this macro for backward compatibility only.
|
||||
#define INITIALIZE_CDM_MODULE InitializeCdmModule
|
||||
|
||||
extern "C" {
|
||||
CDM_EXPORT void InitializeCdmModule();
|
||||
|
||||
CDM_EXPORT void DeinitializeCdmModule();
|
||||
|
||||
// Returns a pointer to the requested CDM Host interface upon success.
|
||||
// Returns NULL if the requested CDM Host interface is not supported.
|
||||
// The caller should cast the returned pointer to the type matching
|
||||
// |host_interface_version|.
|
||||
typedef void* (*GetCdmHostFunc)(int host_interface_version, void* user_data);
|
||||
|
||||
// Returns a pointer to the requested CDM upon success.
|
||||
// Returns NULL if an error occurs or the requested |cdm_interface_version| or
|
||||
// |key_system| is not supported or another error occurs.
|
||||
// The caller should cast the returned pointer to the type matching
|
||||
// |cdm_interface_version|.
|
||||
// Caller retains ownership of arguments and must call Destroy() on the returned
|
||||
// object.
|
||||
CDM_EXPORT void* CreateCdmInstance(
|
||||
int cdm_interface_version,
|
||||
const char* key_system, uint32_t key_system_size,
|
||||
GetCdmHostFunc get_cdm_host_func, void* user_data);
|
||||
|
||||
CDM_EXPORT const char* GetCdmVersion();
|
||||
}
|
||||
|
||||
namespace cdm {
|
||||
|
||||
class Host_1;
|
||||
class Host_4;
|
||||
|
||||
enum Status {
|
||||
kSuccess = 0,
|
||||
kNoKey = 2, // The required decryption key is not available.
|
||||
kSessionError = 3, // Session management error.
|
||||
kDecryptError = 4, // Decryption failed.
|
||||
kDecodeError = 5, // Error decoding audio or video.
|
||||
kRetry = 6, // Buffer temporarily cannot be accepted, delay and retry.
|
||||
kNeedsDeviceCertificate = 7 // A certificate is required for licensing.
|
||||
};
|
||||
|
||||
// This must be consistent with MediaKeyError defined in the
|
||||
// Encrypted media Extensions (EME) specification: http://goo.gl/IBjNCP
|
||||
enum MediaKeyError {
|
||||
kUnknownError = 1,
|
||||
kClientError = 2,
|
||||
kOutputError = 4,
|
||||
};
|
||||
|
||||
// The type of session to create. The valid types are defined in the spec:
|
||||
// http://goo.gl/vmc3pd
|
||||
enum SessionType {
|
||||
kTemporary = 0,
|
||||
kPersistent = 1,
|
||||
kProvisioning = 2,
|
||||
};
|
||||
|
||||
// The type of stream. Used in DecryptDecodeAndRender.
|
||||
enum StreamType {
|
||||
kStreamTypeAudio = 0,
|
||||
kStreamTypeVideo = 1
|
||||
};
|
||||
|
||||
// An input buffer can be split into several continuous subsamples.
|
||||
// A SubsampleEntry specifies the number of clear and cipher bytes in each
|
||||
// subsample. For example, the following buffer has three subsamples:
|
||||
//
|
||||
// |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
|
||||
// | clear1 | cipher1 | clear2 | cipher2 | clear3 | cipher3 |
|
||||
//
|
||||
// For decryption, all of the cipher bytes in a buffer should be concatenated
|
||||
// (in the subsample order) into a single logical stream. The clear bytes should
|
||||
// not be considered as part of decryption.
|
||||
//
|
||||
// Stream to decrypt: | cipher1 | cipher2 | cipher3 |
|
||||
// Decrypted stream: | decrypted1| decrypted2 | decrypted3 |
|
||||
//
|
||||
// After decryption, the decrypted bytes should be copied over the position
|
||||
// of the corresponding cipher bytes in the original buffer to form the output
|
||||
// buffer. Following the above example, the decrypted buffer should be:
|
||||
//
|
||||
// |<----- subsample1 ----->|<----- subsample2 ----->|<----- subsample3 ----->|
|
||||
// | clear1 | decrypted1| clear2 | decrypted2 | clear3 | decrypted3 |
|
||||
//
|
||||
struct SubsampleEntry {
|
||||
SubsampleEntry(uint32_t clear_bytes, uint32_t cipher_bytes)
|
||||
: clear_bytes(clear_bytes), cipher_bytes(cipher_bytes) {}
|
||||
|
||||
uint32_t clear_bytes;
|
||||
uint32_t cipher_bytes;
|
||||
};
|
||||
|
||||
// Represents an input buffer to be decrypted (and possibly decoded). It
|
||||
// does not own any pointers in this struct.
|
||||
struct InputBuffer {
|
||||
InputBuffer()
|
||||
: data(NULL),
|
||||
data_size(0),
|
||||
data_offset(0),
|
||||
key_id(NULL),
|
||||
key_id_size(0),
|
||||
iv(NULL),
|
||||
iv_size(0),
|
||||
subsamples(NULL),
|
||||
num_subsamples(0),
|
||||
timestamp(0) {}
|
||||
|
||||
const uint8_t* data; // Pointer to the beginning of the input data.
|
||||
uint32_t data_size; // Size (in bytes) of |data|.
|
||||
|
||||
uint32_t data_offset; // Number of bytes to be discarded before decryption.
|
||||
|
||||
const uint8_t* key_id; // Key ID to identify the decryption key.
|
||||
uint32_t key_id_size; // Size (in bytes) of |key_id|.
|
||||
|
||||
const uint8_t* iv; // Initialization vector.
|
||||
uint32_t iv_size; // Size (in bytes) of |iv|.
|
||||
|
||||
const struct SubsampleEntry* subsamples;
|
||||
uint32_t num_subsamples; // Number of subsamples in |subsamples|.
|
||||
|
||||
int64_t timestamp; // Presentation timestamp in microseconds.
|
||||
};
|
||||
|
||||
// Represents a buffer created by the Host.
|
||||
class Buffer {
|
||||
public:
|
||||
// Destroys the buffer in the same context as it was created.
|
||||
virtual void Destroy() = 0;
|
||||
|
||||
virtual int32_t Capacity() const = 0;
|
||||
virtual uint8_t* Data() = 0;
|
||||
virtual void SetSize(int32_t size) = 0;
|
||||
virtual int32_t Size() const = 0;
|
||||
|
||||
protected:
|
||||
Buffer() {}
|
||||
virtual ~Buffer() {}
|
||||
|
||||
private:
|
||||
Buffer(const Buffer&);
|
||||
void operator=(const Buffer&);
|
||||
};
|
||||
|
||||
// Represents a key-value map.
|
||||
// Both created and destroyed by the Host.
|
||||
// Data is filled in by the CDM.
|
||||
// Need not be implemented if QueryKeyStatus() is not called.
|
||||
class KeyValueMap {
|
||||
public:
|
||||
virtual void Set(const char* key, void* value, size_t value_size) = 0;
|
||||
|
||||
protected:
|
||||
KeyValueMap() {}
|
||||
virtual ~KeyValueMap() {}
|
||||
|
||||
private:
|
||||
KeyValueMap(const KeyValueMap&);
|
||||
void operator=(const KeyValueMap&);
|
||||
};
|
||||
|
||||
// Represents a decrypted block that has not been decoded.
|
||||
class DecryptedBlock {
|
||||
public:
|
||||
virtual void SetDecryptedBuffer(Buffer* buffer) = 0;
|
||||
virtual Buffer* DecryptedBuffer() = 0;
|
||||
|
||||
virtual void SetTimestamp(int64_t timestamp) = 0;
|
||||
virtual int64_t Timestamp() const = 0;
|
||||
|
||||
protected:
|
||||
DecryptedBlock() {}
|
||||
virtual ~DecryptedBlock() {}
|
||||
};
|
||||
|
||||
// The FileIO interface provides a way for the CDM to store data in a file in
|
||||
// persistent storage. This interface aims only at providing basic read/write
|
||||
// capabilities and should not be used as a full fledged file IO API.
|
||||
//
|
||||
// All methods that report their result via calling a method on FileIOClient
|
||||
// (currently, this is Open, Read, and Write) must call into FileIOClient on the
|
||||
// same thread they were called on and must do so before returning. This
|
||||
// restriction may be lifted in the future.
|
||||
//
|
||||
// Each domain (e.g. "example.com") and each CDM has it's own persistent
|
||||
// storage. All instances of a given CDM associated with a given domain share
|
||||
// the same persistent storage.
|
||||
//
|
||||
// Note to implementors of this interface:
|
||||
// Per-origin storage and the ability for users to clear it are important.
|
||||
// See http://www.w3.org/TR/encrypted-media/#privacy-storedinfo.
|
||||
class FileIO {
|
||||
public:
|
||||
// Opens the file with |file_name| for read and write.
|
||||
// FileIOClient::OnOpenComplete() will be called after the opening
|
||||
// operation finishes.
|
||||
// - When the file is opened by a CDM instance, it will be classified as "in
|
||||
// use". In this case other CDM instances in the same domain may receive
|
||||
// kInUse status when trying to open it.
|
||||
// - |file_name| should not include path separators.
|
||||
virtual void Open(const char* file_name, uint32_t file_name_size) = 0;
|
||||
|
||||
// Reads the contents of the file. FileIOClient::OnReadComplete() will be
|
||||
// called with the read status. Read() should not be called if a previous
|
||||
// Read() or Write() call is still pending; otherwise OnReadComplete() will
|
||||
// be called with kInUse.
|
||||
virtual void Read() = 0;
|
||||
|
||||
// Writes |data_size| bytes of |data| into the file.
|
||||
// FileIOClient::OnWriteComplete() will be called with the write status.
|
||||
// All existing contents in the file will be overwritten. Calling Write() with
|
||||
// NULL |data| will clear all contents in the file. Write() should not be
|
||||
// called if a previous Write() or Read() call is still pending; otherwise
|
||||
// OnWriteComplete() will be called with kInUse.
|
||||
virtual void Write(const uint8_t* data, uint32_t data_size) = 0;
|
||||
|
||||
// Closes the file if opened, destroys this FileIO object and releases any
|
||||
// resources allocated. The CDM must call this method when it finished using
|
||||
// this object. A FileIO object must not be used after Close() is called.
|
||||
virtual void Close() = 0;
|
||||
|
||||
protected:
|
||||
FileIO() {}
|
||||
virtual ~FileIO() {}
|
||||
};
|
||||
|
||||
// Responses to FileIO calls.
|
||||
class FileIOClient {
|
||||
public:
|
||||
enum Status {
|
||||
kSuccess = 0,
|
||||
kInUse,
|
||||
kError
|
||||
};
|
||||
|
||||
// Response to a FileIO::Open() call with the open |status|.
|
||||
virtual void OnOpenComplete(Status status) = 0;
|
||||
|
||||
// Response to a FileIO::Read() call to provide |data_size| bytes of |data|
|
||||
// read from the file.
|
||||
// - kSuccess indicates that all contents of the file has been successfully
|
||||
// read. In this case, 0 |data_size| means that the file is empty.
|
||||
// - kInUse indicates that there are other read/write operations pending.
|
||||
// - kError indicates read failure, e.g. the storage isn't open or cannot be
|
||||
// fully read.
|
||||
virtual void OnReadComplete(Status status,
|
||||
const uint8_t* data, uint32_t data_size) = 0;
|
||||
|
||||
// Response to a FileIO::Write() call.
|
||||
// - kSuccess indicates that all the data has been written into the file
|
||||
// successfully.
|
||||
// - kInUse indicates that there are other read/write operations pending.
|
||||
// - kError indicates write failure, e.g. the storage isn't open or cannot be
|
||||
// fully written. Upon write failure, the contents of the file should be
|
||||
// regarded as corrupt and should not used.
|
||||
virtual void OnWriteComplete(Status status) = 0;
|
||||
|
||||
protected:
|
||||
FileIOClient() {}
|
||||
virtual ~FileIOClient() {}
|
||||
};
|
||||
|
||||
// ContentDecryptionModule interface that all CDMs need to implement.
|
||||
// CDM interfaces are versioned for backward compatibility.
|
||||
// Note: ContentDecryptionModule implementations must use the Host
|
||||
// to allocate any Buffer that needs to be passed back to the caller.
|
||||
// Host implementations must call Buffer::Destroy() when a Buffer is created
|
||||
// that will never be returned to the caller.
|
||||
|
||||
// Based on chromium's ContentDecryptionModule_1.
|
||||
class ContentDecryptionModule_1 {
|
||||
public:
|
||||
static const int kVersion = 1002;
|
||||
typedef Host_1 Host;
|
||||
|
||||
// Generates a |key_request| given |type| and |init_data|.
|
||||
//
|
||||
// Returns kSuccess if the key request was successfully generated, in which
|
||||
// case the CDM must send the key message by calling Host::SendKeyMessage().
|
||||
// Returns kSessionError if any error happened, in which case the CDM must
|
||||
// send a key error by calling Host::SendKeyError().
|
||||
virtual Status GenerateKeyRequest(
|
||||
const char* type, int type_size,
|
||||
const uint8_t* init_data, int init_data_size) = 0;
|
||||
|
||||
// Adds the |key| to the CDM to be associated with |key_id|.
|
||||
//
|
||||
// Returns kSuccess if the key was successfully added, kSessionError
|
||||
// otherwise.
|
||||
virtual Status AddKey(const char* session_id, int session_id_size,
|
||||
const uint8_t* key, int key_size,
|
||||
const uint8_t* key_id, int key_id_size) = 0;
|
||||
|
||||
// Tests whether |key_id| is known to any current session.
|
||||
virtual bool IsKeyValid(const uint8_t* key_id, int key_id_size) = 0;
|
||||
|
||||
// Closes the session identified by |session_id| and releases all crypto
|
||||
// resources related to that session. After calling this, it is invalid to
|
||||
// refer to this session any more, because the session has been destroyed.
|
||||
//
|
||||
// Returns kSuccess if the session |session_id| was successfully closed and
|
||||
// all resources released, kSessionError otherwise.
|
||||
virtual Status CloseSession(const char* session_id, int session_id_size) = 0;
|
||||
|
||||
// Performs scheduled operation with |context| when the timer fires.
|
||||
virtual void TimerExpired(void* context) = 0;
|
||||
|
||||
// Decrypts the |encrypted_buffer|.
|
||||
//
|
||||
// Returns kSuccess if decryption succeeded, in which case the callee
|
||||
// should have filled the |decrypted_buffer| and passed the ownership of
|
||||
// |data| in |decrypted_buffer| to the caller.
|
||||
// Returns kNoKey if the CDM did not have the necessary decryption key
|
||||
// to decrypt.
|
||||
// Returns kDecryptError if any other error happened.
|
||||
// If the return value is not kSuccess, |decrypted_buffer| should be ignored
|
||||
// by the caller.
|
||||
virtual Status Decrypt(const InputBuffer& encrypted_buffer,
|
||||
DecryptedBlock* decrypted_buffer) = 0;
|
||||
|
||||
// Decrypts the |encrypted_buffer|, decodes the decrypted buffer, and passes
|
||||
// the video frame or audio samples to the rendering FW/HW. No data is
|
||||
// returned to the caller.
|
||||
//
|
||||
// Returns kSuccess if decryption, decoding, and rendering all succeeded.
|
||||
// Returns kNoKey if the CDM did not have the necessary decryption key
|
||||
// to decrypt.
|
||||
// Returns kRetry if |encrypted_buffer| cannot be accepted (e.g, video
|
||||
// pipeline is full). Caller should retry after a short delay.
|
||||
// Returns kDecryptError if any decryption error happened.
|
||||
// Returns kDecodeError if any decoding error happened.
|
||||
// If the return value is not kSuccess, |video_frame| should be ignored by
|
||||
// the caller.
|
||||
virtual Status DecryptDecodeAndRenderFrame(
|
||||
const InputBuffer& encrypted_buffer) = 0;
|
||||
|
||||
// Decrypts the |encrypted_buffer|, decodes the decrypted buffer into a
|
||||
// video frame, and passes the frame to the rendering FW/HW. No data
|
||||
// is returned.
|
||||
//
|
||||
// Returns kSuccess if decryption, decoding, and rendering all succeeded.
|
||||
// Returns kNoKey if the CDM did not have the necessary decryption key
|
||||
// to decrypt.
|
||||
// Returns kRetry if |encrypted_buffer| cannot be accepted (e.g., audio
|
||||
// pipeline is full). Caller should retry after a short delay.
|
||||
// Returns kDecryptError if any decryption error happened.
|
||||
// Returns kDecodeError if any decoding error happened.
|
||||
// If the return value is not kSuccess or kRetry, the audiostream has failed
|
||||
// and should be reset.
|
||||
virtual Status DecryptDecodeAndRenderSamples(
|
||||
const InputBuffer& encrypted_buffer) = 0;
|
||||
|
||||
// Destroys the object in the same context as it was created.
|
||||
virtual void Destroy() = 0;
|
||||
|
||||
// Provisioning-related methods.
|
||||
virtual Status GetProvisioningRequest(
|
||||
std::string* request, std::string* default_url) = 0;
|
||||
|
||||
virtual Status HandleProvisioningResponse(
|
||||
std::string& response) = 0;
|
||||
|
||||
protected:
|
||||
ContentDecryptionModule_1() {}
|
||||
virtual ~ContentDecryptionModule_1() {}
|
||||
};
|
||||
|
||||
// Based on chromium's ContentDecryptionModule_4 and ContentDecryptionModule_5.
|
||||
class ContentDecryptionModule_4 {
|
||||
public:
|
||||
static const int kVersion = 1004;
|
||||
typedef Host_4 Host;
|
||||
|
||||
// The non-decryption methods on this class, such as CreateSession(),
|
||||
// get passed a |session_id| for a MediaKeySession object. It must be used in
|
||||
// the reply via Host methods (e.g. Host::OnSessionMessage()).
|
||||
// Note: |session_id| is different from MediaKeySession's sessionId attribute,
|
||||
// which is referred to as |web_session_id| in this file.
|
||||
|
||||
// Creates a new session and generates a key request given |init_data| and
|
||||
// |session_type|. OnSessionCreated() will be called with a web session ID
|
||||
// once the session exists. OnSessionMessage() will subsequently be called
|
||||
// with the key request. A session represents hardware crypto resources,
|
||||
// (if any exist for the platform), which may be in limited supply.
|
||||
// For sessions of type kProvisioning, |mime_type| and |init_data| will be
|
||||
// ignored and may be NULL.
|
||||
virtual void CreateSession(uint32_t session_id,
|
||||
const char* mime_type, uint32_t mime_type_size,
|
||||
const uint8_t* init_data, uint32_t init_data_size,
|
||||
SessionType session_type) = 0;
|
||||
|
||||
// Creates a new session and loads a previous persistent session into it that
|
||||
// has a web session ID of |web_session_id|. OnSessionCreated() will be
|
||||
// called once the session is loaded.
|
||||
virtual void LoadSession(
|
||||
uint32_t session_id,
|
||||
const char* web_session_id, uint32_t web_session_id_length) = 0;
|
||||
|
||||
// Updates the session with |response|.
|
||||
virtual void UpdateSession(
|
||||
uint32_t session_id,
|
||||
const uint8_t* response, uint32_t response_size) = 0;
|
||||
|
||||
// Tests whether |key_id| is known to any current session.
|
||||
virtual bool IsKeyValid(const uint8_t* key_id, int key_id_size) = 0;
|
||||
|
||||
// Releases the resources for the session |session_id|.
|
||||
// After calling this, it is invalid to refer to this session any more.
|
||||
// If any hardware crypto resources were being used by this session, they will
|
||||
// be released.
|
||||
// If this session was a persistent session, this will NOT delete the
|
||||
// persisted data. The persisted data will be preserved so that the session
|
||||
// can be reloaded later with LoadSession(). To delete the persisted session,
|
||||
// use RemoveSession().
|
||||
virtual void ReleaseSession(uint32_t session_id) = 0;
|
||||
|
||||
// Creates a new session and generates a key release request for the
|
||||
// existing persistent session identified by |web_session_id|.
|
||||
// OnSessionCreated() will be called once the session exists.
|
||||
// OnSessionMessage() will subsequently be called with the key release
|
||||
// request.
|
||||
virtual void RemoveSession(
|
||||
uint32_t session_id,
|
||||
const char* web_session_id, uint32_t web_session_id_length) = 0;
|
||||
|
||||
// Signals to the CDM that it should use server certificates to protect the
|
||||
// privacy of the user. The primary use of this is when the application
|
||||
// driving the CDM is untrusted code, such as when a web browser allows a web
|
||||
// page's JavaScript to access the CDM. By using server certificates to
|
||||
// encrypt communication with the license server, device-identifying
|
||||
// information cannot be extracted from the license exchange process by a
|
||||
// malicious caller.
|
||||
// Unless you also call SetServerCertificate() to set a pre-cached server
|
||||
// certificate, the CDM will perform a certificate exchange with the server
|
||||
// prior to any key exchanges.
|
||||
// This method may not be called if any sessions are open. It is typically
|
||||
// called before any sessions have been opened, but may also be called if all
|
||||
// open sessions have been released.
|
||||
// Note that calling SetServerCertificate() implicitly calls this method as
|
||||
// well.
|
||||
virtual Status UsePrivacyMode() = 0;
|
||||
|
||||
// Provides a server certificate to be used to encrypt messages to the
|
||||
// license server. Calling this is like calling UsePrivacyMode(), except that
|
||||
// because the certificate is provided up-front, the CDM does not have to
|
||||
// perform a certificate exchange with the server.
|
||||
// This method may not be called if any sessions are open. It is typically
|
||||
// called before any sessions have been opened, but may also be called if all
|
||||
// open sessions have been released.
|
||||
// Note that calling this method also implicitly calls UsePrivacyMode().
|
||||
virtual Status SetServerCertificate(
|
||||
const uint8_t* server_certificate_data,
|
||||
uint32_t server_certificate_data_size) = 0;
|
||||
|
||||
// Performs scheduled operation with |context| when the timer fires.
|
||||
virtual void TimerExpired(void* context) = 0;
|
||||
|
||||
// Decrypts the |encrypted_buffer|.
|
||||
//
|
||||
// Returns kSuccess if decryption succeeded, in which case the callee
|
||||
// should have filled the |decrypted_buffer| and passed the ownership of
|
||||
// |data| in |decrypted_buffer| to the caller.
|
||||
// Returns kNoKey if the CDM did not have the necessary decryption key
|
||||
// to decrypt.
|
||||
// Returns kDecryptError if any other error happened.
|
||||
// If the return value is not kSuccess, |decrypted_buffer| should be ignored
|
||||
// by the caller.
|
||||
virtual Status Decrypt(const InputBuffer& encrypted_buffer,
|
||||
DecryptedBlock* decrypted_buffer) = 0;
|
||||
|
||||
// Decrypts the |encrypted_buffer|, decodes the decrypted buffer, and passes
|
||||
// the video or audio frames to the rendering FW/HW. No data is returned to
|
||||
// the caller.
|
||||
//
|
||||
// Returns kSuccess if decryption, decoding, and rendering all succeeded.
|
||||
// Returns kNoKey if the CDM did not have the necessary decryption key
|
||||
// to decrypt.
|
||||
// Returns kRetry if |encrypted_buffer| cannot be accepted (e.g, video
|
||||
// pipeline is full). Caller should retry after a short delay.
|
||||
// Returns kDecryptError if any decryption error happened.
|
||||
// Returns kDecodeError if any decoding error happened.
|
||||
virtual Status DecryptDecodeAndRender(const InputBuffer& encrypted_buffer,
|
||||
StreamType stream_type) = 0;
|
||||
|
||||
// Destroys the object in the same context as it was created.
|
||||
virtual void Destroy() = 0;
|
||||
|
||||
protected:
|
||||
ContentDecryptionModule_4() {}
|
||||
virtual ~ContentDecryptionModule_4() {}
|
||||
};
|
||||
|
||||
// Host interface that the CDM can call into to access browser side services.
|
||||
// Host interfaces are versioned for backward compatibility.
|
||||
|
||||
// Based on chromium's Host_1.
|
||||
class Host_1 {
|
||||
public:
|
||||
static const int kVersion = 1002;
|
||||
|
||||
// Returns a Buffer* containing non-zero members upon success, or NULL on
|
||||
// failure. The caller owns the Buffer* after this call. The buffer is not
|
||||
// guaranteed to be zero initialized. The capacity of the allocated Buffer
|
||||
// is guaranteed to be not less than |capacity|.
|
||||
virtual Buffer* Allocate(int32_t capacity) = 0;
|
||||
|
||||
// Requests the host to call ContentDecryptionModule::TimerExpired() in
|
||||
// |delay_ms| from now with |context|.
|
||||
virtual void SetTimer(int64_t delay_ms, void* context) = 0;
|
||||
|
||||
// Returns the current epoch wall time in seconds.
|
||||
virtual double GetCurrentWallTimeInSeconds() = 0;
|
||||
|
||||
// Sends a keymessage event to the application.
|
||||
// Length parameters should not include null termination.
|
||||
virtual void SendKeyMessage(
|
||||
const char* session_id, int32_t session_id_length,
|
||||
const char* message, int32_t message_length,
|
||||
const char* default_url, int32_t default_url_length) = 0;
|
||||
|
||||
// Sends a keyerror event to the application.
|
||||
// |session_id_length| should not include null termination.
|
||||
virtual void SendKeyError(const char* session_id,
|
||||
int32_t session_id_length,
|
||||
MediaKeyError error_code,
|
||||
uint32_t system_code) = 0;
|
||||
|
||||
// Version 1.3:
|
||||
// These virtual member functions extend the cdm::Host interface to allow
|
||||
// the CDM to query the host for various information.
|
||||
|
||||
// Asks the host to persist a name-value pair.
|
||||
virtual void SetPlatformString(const std::string& name,
|
||||
const std::string& value) = 0;
|
||||
|
||||
// Retrieves a value by name. If there is no such value, the Host should
|
||||
// set value to an empty string.
|
||||
virtual void GetPlatformString(const std::string& name,
|
||||
std::string* value) = 0;
|
||||
|
||||
protected:
|
||||
Host_1() {}
|
||||
virtual ~Host_1() {}
|
||||
};
|
||||
|
||||
// Based on chromium's Host_4 and Host_5.
|
||||
class Host_4 {
|
||||
public:
|
||||
static const int kVersion = 1004;
|
||||
|
||||
// Returns a Buffer* containing non-zero members upon success, or NULL on
|
||||
// failure. The caller owns the Buffer* after this call. The buffer is not
|
||||
// guaranteed to be zero initialized. The capacity of the allocated Buffer
|
||||
// is guaranteed to be not less than |capacity|.
|
||||
virtual Buffer* Allocate(uint32_t capacity) = 0;
|
||||
|
||||
// Requests the host to call ContentDecryptionModule::TimerFired() |delay_ms|
|
||||
// from now with |context|.
|
||||
virtual void SetTimer(int64_t delay_ms, void* context) = 0;
|
||||
|
||||
// Returns the current epoch wall time in seconds.
|
||||
virtual double GetCurrentWallTimeInSeconds() = 0;
|
||||
|
||||
// Called by the CDM when a session is created or loaded and the value for the
|
||||
// MediaKeySession's sessionId attribute is available (|web_session_id|).
|
||||
// This must be called before OnSessionMessage() or OnSessionUpdated() is
|
||||
// called for |session_id|. |web_session_id_length| should not include null
|
||||
// termination.
|
||||
// When called in response to LoadSession(), the |web_session_id| must be the
|
||||
// same as the |web_session_id| passed in LoadSession().
|
||||
virtual void OnSessionCreated(
|
||||
uint32_t session_id,
|
||||
const char* web_session_id, uint32_t web_session_id_length) = 0;
|
||||
|
||||
// Called by the CDM when it has a message for session |session_id|.
|
||||
// Length parameters should not include null termination.
|
||||
virtual void OnSessionMessage(
|
||||
uint32_t session_id,
|
||||
const char* message, uint32_t message_length,
|
||||
const char* destination_url, uint32_t destination_url_length) = 0;
|
||||
|
||||
// Called by the CDM when session |session_id| has been updated.
|
||||
virtual void OnSessionUpdated(uint32_t session_id) = 0;
|
||||
|
||||
// Called by the CDM when session |session_id| is closed.
|
||||
virtual void OnSessionClosed(uint32_t session_id) = 0;
|
||||
|
||||
// Called by the CDM when an error occurs in session |session_id|.
|
||||
virtual void OnSessionError(uint32_t session_id,
|
||||
Status error_code,
|
||||
uint32_t system_code) = 0;
|
||||
|
||||
// Creates a FileIO object from the host to do file IO operation. Returns NULL
|
||||
// if a FileIO object cannot be obtained. Once a valid FileIO object is
|
||||
// returned, |client| must be valid until FileIO::Close() is called. The
|
||||
// CDM can call this method multiple times to operate on different files.
|
||||
virtual FileIO* CreateFileIO(FileIOClient* client) = 0;
|
||||
|
||||
protected:
|
||||
Host_4() {}
|
||||
virtual ~Host_4() {}
|
||||
};
|
||||
|
||||
typedef ContentDecryptionModule_1 ContentDecryptionModule;
|
||||
const int kCdmInterfaceVersion = ContentDecryptionModule::kVersion;
|
||||
|
||||
typedef ContentDecryptionModule::Host Host;
|
||||
const int kHostInterfaceVersion = Host::kVersion;
|
||||
|
||||
} // namespace cdm
|
||||
|
||||
#endif // WVCDM_CDM_CONTENT_DECRYPTION_MODULE_H_
|
||||
@@ -1,54 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_HOST_4_FILE_IO_CLIENT_H_
|
||||
#define WVCDM_HOST_4_FILE_IO_CLIENT_H_
|
||||
|
||||
#include "content_decryption_module.h"
|
||||
#include "wv_cdm_common.h"
|
||||
#include "wv_cdm_types.h"
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class Host4FileIOClient : public cdm::FileIOClient {
|
||||
public:
|
||||
explicit Host4FileIOClient(cdm::Host_4* host)
|
||||
: host_(host),
|
||||
file_io_(NULL),
|
||||
status_(kSuccess),
|
||||
data_size_(0),
|
||||
buffer_(NULL),
|
||||
buffer_size_(0) {}
|
||||
~Host4FileIOClient();
|
||||
|
||||
bool Open(const std::string& name);
|
||||
bool Read(char* buffer, size_t buffer_size);
|
||||
bool ReadFileSize() { return Read(NULL, 0); }
|
||||
bool Write(const char* data, size_t data_size);
|
||||
bool Close();
|
||||
|
||||
// cdm::FileIOClient implementation
|
||||
virtual void OnOpenComplete(Status status) OVERRIDE;
|
||||
virtual void OnReadComplete(Status status, const uint8_t* data,
|
||||
uint32_t data_size) OVERRIDE;
|
||||
virtual void OnWriteComplete(Status status) OVERRIDE;
|
||||
|
||||
// Get the result of the last operation
|
||||
Status status() const { return status_; }
|
||||
uint32_t data_size() const { return data_size_; }
|
||||
|
||||
private:
|
||||
cdm::Host_4* host_;
|
||||
cdm::FileIO* file_io_;
|
||||
|
||||
// These hold the result of the last operation
|
||||
Status status_;
|
||||
uint32_t data_size_;
|
||||
char* buffer_;
|
||||
size_t buffer_size_;
|
||||
|
||||
CORE_DISALLOW_COPY_AND_ASSIGN(Host4FileIOClient);
|
||||
};
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
#endif // WVCDM_HOST_4_FILE_IO_CLIENT_H_
|
||||
@@ -1,33 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_HOST_EVENT_LISTENER_H_
|
||||
#define WVCDM_CDM_HOST_EVENT_LISTENER_H_
|
||||
|
||||
#include "cdm_engine.h"
|
||||
#include "content_decryption_module.h"
|
||||
#include "wv_cdm_common.h"
|
||||
#include "wv_cdm_event_listener.h"
|
||||
#include "wv_cdm_types.h"
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class HostEventListener : public WvCdmEventListener {
|
||||
public:
|
||||
HostEventListener(cdm::Host* host, CdmEngine* cdm_engine)
|
||||
: host_(host), cdm_engine_(cdm_engine) {}
|
||||
virtual ~HostEventListener() {}
|
||||
|
||||
// wvcdm::WvCdmEventListener implementation.
|
||||
virtual void OnEvent(const CdmSessionId& session_id,
|
||||
CdmEventType cdm_event) OVERRIDE;
|
||||
|
||||
private:
|
||||
cdm::Host* const host_;
|
||||
CdmEngine* const cdm_engine_;
|
||||
|
||||
CORE_DISALLOW_COPY_AND_ASSIGN(HostEventListener);
|
||||
};
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
#endif // WVCDM_CDM_HOST_EVENT_LISTENER_H_
|
||||
17
cdm/include/override.h
Normal file
17
cdm/include/override.h
Normal file
@@ -0,0 +1,17 @@
|
||||
// Copyright 2015 Google Inc. All Rights Reserved.
|
||||
// TODO: Import to core/, use everywhere.
|
||||
#ifndef WVCDM_CDM_OVERRIDE_H_
|
||||
#define WVCDM_CDM_OVERRIDE_H_
|
||||
|
||||
#define GCC_HAS_OVERRIDE ( \
|
||||
(__GNUC__ > 4) || \
|
||||
(__GNUC__ == 4 && __GNUC_MINOR__ >= 7) \
|
||||
)
|
||||
|
||||
#if defined(COMPILER_MSVC) || defined(__clang__) || GCC_HAS_OVERRIDE
|
||||
#define OVERRIDE override
|
||||
#else
|
||||
#define OVERRIDE
|
||||
#endif
|
||||
|
||||
#endif // WVCDM_CDM_OVERRIDE_H_
|
||||
30
cdm/include/properties_ce.h
Normal file
30
cdm/include/properties_ce.h
Normal file
@@ -0,0 +1,30 @@
|
||||
// Copyright 2015 Google Inc. All Rights Reserved.
|
||||
#ifndef WVCDM_CDM_PROPERTIES_CE_H_
|
||||
#define WVCDM_CDM_PROPERTIES_CE_H_
|
||||
|
||||
#include "cdm.h"
|
||||
|
||||
#if defined(UNIT_TEST)
|
||||
# include <gtest/gtest.h>
|
||||
#endif
|
||||
|
||||
namespace widevine {
|
||||
|
||||
class PropertiesCE {
|
||||
public:
|
||||
static Cdm::ClientInfo GetClientInfo();
|
||||
static Cdm::SecureOutputType GetSecureOutputType();
|
||||
|
||||
private:
|
||||
static void SetSecureOutputType(Cdm::SecureOutputType secure_output_type);
|
||||
static void SetClientInfo(const Cdm::ClientInfo& client_info);
|
||||
|
||||
friend class Cdm;
|
||||
#if defined(UNIT_TEST)
|
||||
FRIEND_TEST(CdmTest, DeviceCertificateRequest);
|
||||
#endif
|
||||
};
|
||||
|
||||
} // namespace widevine
|
||||
|
||||
#endif // WVCDM_CDM_PROPERTIES_CE_H_
|
||||
@@ -1,35 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_PROPERTIES_CONFIGURATION_H_
|
||||
#define WVCDM_CDM_PROPERTIES_CONFIGURATION_H_
|
||||
|
||||
#include "wv_cdm_constants.h"
|
||||
#include "properties.h"
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
// Set only one of the two below to true. If secure buffer
|
||||
// is selected, fallback to userspace buffers may occur
|
||||
// if L1/L2 OEMCrypto APIs fail.
|
||||
// Note: This is managed in the build configuration.
|
||||
const bool kPropertyOemCryptoUseSecureBuffers = PLATFORM_REQUIRES_SECURE_BUFFERS;
|
||||
const bool kPropertyOemCryptoUseFifo = true;
|
||||
const bool kPropertyOemCryptoUseUserSpaceBuffers = PLATFORM_USES_CLEAR_BUFFERS;
|
||||
|
||||
// If true, the unit tests require OEMCrypto to support usage tables.
|
||||
const bool kPropertyOemCryptoRequireUsageTable = false;
|
||||
|
||||
// If false, keyboxes will be used as client identification
|
||||
// and passed as the token in the license request.
|
||||
// The default value of false for PLATFORM_CERTIFICATE_PROV is set in
|
||||
// global_config.gypi. It can be overridden to true in the platform specific
|
||||
// .gypi files if you want your device to use certificates for provisioning.
|
||||
const bool kPropertyUseCertificatesAsIdentification = PLATFORM_CERTIFICATE_PROV;
|
||||
|
||||
// If true, device files will be moved to the directory specified by
|
||||
// Properties::GetDeviceFilesBasePath
|
||||
const bool kSecurityLevelPathBackwardCompatibilitySupport = false;
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
#endif // WVCDM_CDM_PROPERTIES_CONFIGURATION_H_
|
||||
@@ -1,12 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_WV_CDM_COMMON_H_
|
||||
#define WVCDM_CDM_WV_CDM_COMMON_H_
|
||||
|
||||
#if defined(COMPILER_MSVC) || defined(__clang__)
|
||||
#define OVERRIDE override
|
||||
#else
|
||||
#define OVERRIDE
|
||||
#endif
|
||||
|
||||
#endif // WVCDM_CDM_WV_CDM_COMMON_H_
|
||||
@@ -1,3 +0,0 @@
|
||||
// Widevine CDM Kit Version
|
||||
#define WV_CDM_VERSION "v2.2.0-0-903"
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_WV_CLIENT_PROPERTY_SET_H_
|
||||
#define WVCDM_CDM_WV_CLIENT_PROPERTY_SET_H_
|
||||
|
||||
#include "cdm_client_property_set.h"
|
||||
|
||||
#include "wv_cdm_types.h"
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class WVClientPropertySet : public CdmClientPropertySet {
|
||||
public:
|
||||
WVClientPropertySet()
|
||||
: use_privacy_mode_(false) {}
|
||||
|
||||
virtual ~WVClientPropertySet() {}
|
||||
|
||||
void set_security_level(const std::string& securityLevel) {
|
||||
security_level_ = securityLevel;
|
||||
}
|
||||
|
||||
virtual const std::string& security_level() const {
|
||||
return security_level_;
|
||||
}
|
||||
|
||||
void set_use_privacy_mode(bool usePrivacyMode) {
|
||||
use_privacy_mode_ = usePrivacyMode;
|
||||
}
|
||||
|
||||
virtual bool use_privacy_mode() const {
|
||||
return use_privacy_mode_;
|
||||
}
|
||||
|
||||
void set_service_certificate(const std::string& serviceCertificate) {
|
||||
service_certificate_ = serviceCertificate;
|
||||
}
|
||||
|
||||
virtual const std::string& service_certificate() const {
|
||||
return service_certificate_;
|
||||
}
|
||||
|
||||
virtual bool is_session_sharing_enabled() const {
|
||||
return true; // This is unused by common cdm but we need a definition
|
||||
// for the pure virtual methods.
|
||||
}
|
||||
|
||||
void set_is_session_sharing_enabled(bool shareKeys) {
|
||||
return; // This is unused by common cdm but we need a definition
|
||||
// for the pure virtual methods.
|
||||
}
|
||||
|
||||
virtual uint32_t session_sharing_id() const {
|
||||
return 1; // This is unused by common cdm but we need a
|
||||
// definition for the pure virtual methods.
|
||||
}
|
||||
|
||||
virtual void set_session_sharing_id(uint32_t id) {
|
||||
return; // This is unused by common cdm but we need a
|
||||
// definition for the pure virtual methods.
|
||||
}
|
||||
|
||||
private:
|
||||
CORE_DISALLOW_COPY_AND_ASSIGN(WVClientPropertySet);
|
||||
|
||||
std::string security_level_;
|
||||
bool use_privacy_mode_;
|
||||
std::string service_certificate_;
|
||||
};
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
#endif // WVCDM_CDM_WV_CLIENT_PROPERTY_SET_H_
|
||||
@@ -1,112 +0,0 @@
|
||||
// Copyright 2013 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_WV_CONTENT_DECRYPTION_MODULE_1_H_
|
||||
#define WVCDM_CDM_WV_CONTENT_DECRYPTION_MODULE_1_H_
|
||||
|
||||
#include "cdm_client_property_set.h"
|
||||
#include "cdm_engine.h"
|
||||
#include "cdm_host_clock.h"
|
||||
#include "cdm_host_file.h"
|
||||
|
||||
#include "clock.h"
|
||||
#include "content_decryption_module.h"
|
||||
#include "host_event_listener.h"
|
||||
|
||||
#include "wv_cdm_common.h"
|
||||
#include "wv_cdm_types.h"
|
||||
#include "wv_client_property_set.h"
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class WvContentDecryptionModule_1 : public cdm::ContentDecryptionModule_1,
|
||||
public IFileFactory,
|
||||
public IClock {
|
||||
public:
|
||||
explicit WvContentDecryptionModule_1(cdm::Host_1* host);
|
||||
|
||||
virtual ~WvContentDecryptionModule_1();
|
||||
|
||||
// cdm::ContentDecryptionModule_1 implementation.
|
||||
virtual cdm::Status GenerateKeyRequest(const char* type, int type_size,
|
||||
const uint8_t* init_data,
|
||||
int init_data_size) OVERRIDE;
|
||||
|
||||
virtual cdm::Status AddKey(const char* session_id, int session_id_size,
|
||||
const uint8_t* key, int key_size,
|
||||
const uint8_t* key_id, int key_id_size) OVERRIDE;
|
||||
|
||||
virtual bool IsKeyValid(const uint8_t* key_id, int key_id_size) OVERRIDE;
|
||||
|
||||
virtual cdm::Status CloseSession(const char* session_id,
|
||||
int session_id_size) OVERRIDE;
|
||||
|
||||
virtual void TimerExpired(void* context) OVERRIDE;
|
||||
|
||||
virtual cdm::Status Decrypt(const cdm::InputBuffer& encrypted_buffer,
|
||||
cdm::DecryptedBlock* decrypted_buffer) OVERRIDE;
|
||||
|
||||
virtual cdm::Status DecryptDecodeAndRenderFrame(
|
||||
const cdm::InputBuffer& encrypted_buffer) OVERRIDE;
|
||||
|
||||
virtual cdm::Status DecryptDecodeAndRenderSamples(
|
||||
const cdm::InputBuffer& encrypted_buffer) OVERRIDE;
|
||||
|
||||
virtual void Destroy() OVERRIDE;
|
||||
|
||||
virtual cdm::Status GetProvisioningRequest(
|
||||
std::string* request, std::string* default_url) OVERRIDE;
|
||||
|
||||
virtual cdm::Status HandleProvisioningResponse(
|
||||
std::string& response) OVERRIDE;
|
||||
|
||||
private:
|
||||
void EnablePolicyTimer();
|
||||
void DisablePolicyTimer();
|
||||
|
||||
virtual File::Impl* NewFileImpl() OVERRIDE;
|
||||
|
||||
virtual int64_t GetCurrentTimeInSeconds() OVERRIDE;
|
||||
|
||||
/* |parameters| is expected to be initialized with anything not related to
|
||||
* subsample parsing. |iv| is initialized by the caller, but may be modified
|
||||
* during decryption. |decrypted_block| may be NULL for L1 decrypts, since
|
||||
* no data is passed back to the caller. */
|
||||
cdm::Status DoSubsampleDecrypt(CdmDecryptionParameters& parameters,
|
||||
std::vector<uint8_t>& iv,
|
||||
const cdm::InputBuffer& encrypted_buffer,
|
||||
cdm::DecryptedBlock* decrypted_block);
|
||||
cdm::Status DoDecrypt(CdmDecryptionParameters& parameters,
|
||||
std::vector<uint8_t>& iv,
|
||||
const cdm::InputBuffer& encrypted_buffer,
|
||||
cdm::DecryptedBlock* decrypted_block);
|
||||
|
||||
/* |parameters| is expected to be initialized with everything required by
|
||||
* DoSubsampleDecrypt and DoDecrypt, plus |is_encrypted| and
|
||||
* |subsample_flags|. Counters and |iv| will be updated to prepare for
|
||||
* subsequent calls. */
|
||||
cdm::Status DecryptAndUpdateCounters(CdmDecryptionParameters& parameters,
|
||||
std::vector<uint8_t>& iv,
|
||||
const cdm::InputBuffer& encrypted_buffer,
|
||||
const size_t bytes,
|
||||
cdm::DecryptedBlock* decrypted_block,
|
||||
size_t& offset,
|
||||
size_t& encrypted_offset,
|
||||
uint32_t& block_ctr);
|
||||
|
||||
void SetSizesAndAllocate(size_t output_size,
|
||||
CdmDecryptionParameters& parameters,
|
||||
cdm::DecryptedBlock* decrypted_block);
|
||||
|
||||
cdm::Host_1* const host_;
|
||||
HostEventListener host_event_listener_;
|
||||
|
||||
CdmEngine cdm_engine_;
|
||||
WVClientPropertySet property_set_;
|
||||
bool timer_enabled_;
|
||||
|
||||
CORE_DISALLOW_COPY_AND_ASSIGN(WvContentDecryptionModule_1);
|
||||
};
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
#endif // WVCDM_CDM_WV_CONTENT_DECRYPTION_MODULE_1_H_
|
||||
@@ -1,155 +0,0 @@
|
||||
// Copyright 2014 Google Inc. All Rights Reserved.
|
||||
|
||||
#ifndef WVCDM_CDM_WV_CONTENT_DECRYPTION_MODULE_4_H_
|
||||
#define WVCDM_CDM_WV_CONTENT_DECRYPTION_MODULE_4_H_
|
||||
|
||||
#include "content_decryption_module.h"
|
||||
|
||||
#include "cdm_client_property_set.h"
|
||||
#include "cdm_engine.h"
|
||||
#include "cdm_host_clock.h"
|
||||
#include "cdm_host_file.h"
|
||||
#include "clock.h"
|
||||
#include "wv_cdm_common.h"
|
||||
#include "wv_cdm_event_listener.h"
|
||||
#include "wv_cdm_types.h"
|
||||
#include "wv_client_property_set.h"
|
||||
|
||||
#if defined(UNIT_TEST)
|
||||
# include "gtest/gtest_prod.h"
|
||||
#endif
|
||||
|
||||
namespace wvcdm {
|
||||
|
||||
class WvContentDecryptionModule_4 : public cdm::ContentDecryptionModule_4,
|
||||
public IFileFactory,
|
||||
public IClock,
|
||||
public WvCdmEventListener {
|
||||
public:
|
||||
explicit WvContentDecryptionModule_4(cdm::Host_4* host);
|
||||
|
||||
virtual ~WvContentDecryptionModule_4();
|
||||
|
||||
virtual void CreateSession(uint32_t session_id,
|
||||
const char* mime_type, uint32_t mime_type_size,
|
||||
const uint8_t* init_data, uint32_t init_data_size,
|
||||
cdm::SessionType session_type) OVERRIDE;
|
||||
|
||||
virtual void LoadSession(uint32_t session_id, const char* web_session_id,
|
||||
uint32_t web_session_id_length) OVERRIDE;
|
||||
|
||||
virtual void UpdateSession(uint32_t session_id, const uint8_t* response,
|
||||
uint32_t response_size) OVERRIDE;
|
||||
|
||||
virtual bool IsKeyValid(const uint8_t* key_id, int key_id_size) OVERRIDE;
|
||||
|
||||
virtual void ReleaseSession(uint32_t session_id) OVERRIDE;
|
||||
|
||||
virtual void RemoveSession(uint32_t session_id, const char* web_session_id,
|
||||
uint32_t web_session_id_length) OVERRIDE;
|
||||
|
||||
virtual cdm::Status UsePrivacyMode() OVERRIDE;
|
||||
|
||||
virtual cdm::Status SetServerCertificate(
|
||||
const uint8_t* server_certificate_data,
|
||||
uint32_t server_certificate_data_size) OVERRIDE;
|
||||
|
||||
virtual void TimerExpired(void* context) OVERRIDE;
|
||||
|
||||
virtual cdm::Status Decrypt(const cdm::InputBuffer& encrypted_buffer,
|
||||
cdm::DecryptedBlock* decrypted_buffer) OVERRIDE;
|
||||
|
||||
virtual cdm::Status DecryptDecodeAndRender(
|
||||
const cdm::InputBuffer& encrypted_buffer,
|
||||
cdm::StreamType stream_type) OVERRIDE;
|
||||
|
||||
virtual void Destroy() OVERRIDE;
|
||||
|
||||
// wvcdm::WvCdmEventListener implementation.
|
||||
virtual void OnEvent(const CdmSessionId& session_id,
|
||||
CdmEventType cdm_event) OVERRIDE;
|
||||
|
||||
private:
|
||||
class InternalSession {
|
||||
public:
|
||||
enum SessionType {
|
||||
kDecrypt = 1,
|
||||
kRelease = 2,
|
||||
kProvision = 3,
|
||||
};
|
||||
|
||||
InternalSession() : webid_(), session_type_(kDecrypt) {}
|
||||
InternalSession(const std::string& webid, SessionType session_type)
|
||||
: webid_(webid), session_type_(session_type) {}
|
||||
|
||||
const std::string& webid() const { return webid_; }
|
||||
bool is_decrypt() const { return session_type_ == kDecrypt; }
|
||||
bool is_release() const { return session_type_ == kRelease; }
|
||||
bool is_provision() const { return session_type_ == kProvision; }
|
||||
|
||||
private:
|
||||
std::string webid_;
|
||||
SessionType session_type_;
|
||||
};
|
||||
|
||||
void EnablePolicyTimer();
|
||||
void DisablePolicyTimer();
|
||||
|
||||
void CreateProvisionSession(uint32_t session_id);
|
||||
void UpdateProvisionSession(uint32_t session_id, const uint8_t* response,
|
||||
uint32_t response_size);
|
||||
|
||||
bool CallOpenSession(uint32_t session_id);
|
||||
|
||||
virtual File::Impl* NewFileImpl() OVERRIDE;
|
||||
|
||||
virtual int64_t GetCurrentTimeInSeconds() OVERRIDE;
|
||||
|
||||
/* |parameters| is expected to be initialized with anything not related to
|
||||
* subsample parsing. |iv| is initialized by the caller, but may be modified
|
||||
* during decryption. |decrypted_block| may be NULL for L1 decrypts, since
|
||||
* no data is passed back to the caller. */
|
||||
cdm::Status DoSubsampleDecrypt(CdmDecryptionParameters& parameters,
|
||||
std::vector<uint8_t>& iv,
|
||||
const cdm::InputBuffer& encrypted_buffer,
|
||||
cdm::DecryptedBlock* decrypted_block);
|
||||
cdm::Status DoDecrypt(CdmDecryptionParameters& parameters,
|
||||
std::vector<uint8_t>& iv,
|
||||
const cdm::InputBuffer& encrypted_buffer,
|
||||
cdm::DecryptedBlock* decrypted_block);
|
||||
|
||||
/* |parameters| is expected to be initialized with everything required by
|
||||
* DoSubsampleDecrypt and DoDecrypt, plus |is_encrypted| and
|
||||
* |subsample_flags|. Counters and |iv| will be updated to prepare for
|
||||
* subsequent calls. */
|
||||
cdm::Status DecryptAndUpdateCounters(CdmDecryptionParameters& parameters,
|
||||
std::vector<uint8_t>& iv,
|
||||
const cdm::InputBuffer& encrypted_buffer,
|
||||
const size_t bytes,
|
||||
cdm::DecryptedBlock* decrypted_block,
|
||||
size_t& offset, size_t& encrypted_offset,
|
||||
uint32_t& block_ctr);
|
||||
|
||||
void SetSizesAndAllocate(size_t output_size,
|
||||
CdmDecryptionParameters& parameters,
|
||||
cdm::DecryptedBlock* decrypted_block);
|
||||
|
||||
#if defined(UNIT_TEST)
|
||||
FRIEND_TEST(CdmApi4Test, UsePrivacyMode);
|
||||
FRIEND_TEST(CdmApi4Test, UsePrivacyModeFailsWithOpenSessions);
|
||||
FRIEND_TEST(CdmApi4Test, SetExplicitServerCertificate);
|
||||
FRIEND_TEST(CdmApi4Test, SetServerCertificateFailsWithOpenSessions);
|
||||
#endif
|
||||
|
||||
cdm::Host_4* const host_;
|
||||
WVClientPropertySet property_set_;
|
||||
CdmEngine cdm_engine_;
|
||||
std::map<uint32_t, InternalSession> session_map_;
|
||||
bool timer_enabled_;
|
||||
|
||||
CORE_DISALLOW_COPY_AND_ASSIGN(WvContentDecryptionModule_4);
|
||||
};
|
||||
|
||||
} // namespace wvcdm
|
||||
|
||||
#endif // WVCDM_CDM_WV_CONTENT_DECRYPTION_MODULE_4_H_
|
||||
Reference in New Issue
Block a user