summaryrefslogtreecommitdiffstats
path: root/dom/media/gmp/widevine-adapter/content_decryption_module_proxy.h
blob: d3edff8b37d573582c19626a3092626d8089bbd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// Copyright 2017 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 CDM_CONTENT_DECRYPTION_MODULE_PROXY_H_
#define CDM_CONTENT_DECRYPTION_MODULE_PROXY_H_

#include "content_decryption_module_export.h"

#if defined(_MSC_VER)
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef unsigned __int64 uint64_t;
#else
#  include <stdint.h>
#endif

namespace cdm {

class CDM_CLASS_API CdmProxyClient;

// A proxy class for the CDM.
// In general, the interpretation of the CdmProxy and CdmProxyClient method
// parameters are protocol dependent. For enum parameters, values outside the
// enum range may not work.
class CDM_CLASS_API CdmProxy {
 public:
  enum Function : uint32_t {
    // For Intel Negotiate Crypto SessionKey Exchange (CSME) path to call
    // ID3D11VideoContext::NegotiateCryptoSessionKeyExchange.
    kIntelNegotiateCryptoSessionKeyExchange = 1,
    // There will be more values in the future e.g. for D3D11 RSA method.
  };

  enum KeyType : uint32_t {
    kDecryptOnly = 0,
    kDecryptAndDecode = 1,
  };

  // Initializes the proxy. The results will be returned in
  // CdmProxyClient::OnInitialized().
  virtual void Initialize() = 0;

  // Processes and updates the state of the proxy.
  // |output_data_size| is required by some protocol to set up the output data.
  // The operation may fail if the |output_data_size| is wrong. The results will
  // be returned in CdmProxyClient::OnProcessed().
  virtual void Process(Function function, uint32_t crypto_session_id,
                       const uint8_t* input_data, uint32_t input_data_size,
                       uint32_t output_data_size) = 0;

  // Creates a crypto session for handling media.
  // If extra data has to be passed to further setup the media crypto session,
  // pass the data as |input_data|. The results will be returned in
  // CdmProxyClient::OnMediaCryptoSessionCreated().
  virtual void CreateMediaCryptoSession(const uint8_t* input_data,
                                        uint32_t input_data_size) = 0;

  // Sets a key for the session identified by |crypto_session_id|.
  virtual void SetKey(uint32_t crypto_session_id, const uint8_t* key_id,
                      uint32_t key_id_size, KeyType key_type,
                      const uint8_t* key_blob, uint32_t key_blob_size) = 0;

  // Removes a key for the session identified by |crypto_session_id|.
  virtual void RemoveKey(uint32_t crypto_session_id, const uint8_t* key_id,
                         uint32_t key_id_size) = 0;

 protected:
  CdmProxy() {}
  virtual ~CdmProxy() {}
};

// Responses to CdmProxy calls. All responses will be called asynchronously.
class CDM_CLASS_API CdmProxyClient {
 public:
  enum Status : uint32_t {
    kOk,
    kFail,
  };

  enum Protocol : uint32_t {
    kNone = 0,  // No protocol supported. Can be used in failure cases.
    kIntel,     // Method using Intel CSME.
    // There will be more values in the future e.g. kD3D11RsaHardware,
    // kD3D11RsaSoftware to use the D3D11 RSA method.
  };

  // Callback for Initialize(). If the proxy created a crypto session, then the
  // ID for the crypto session is |crypto_session_id|.
  virtual void OnInitialized(Status status, Protocol protocol,
                             uint32_t crypto_session_id) = 0;

  // Callback for Process(). |output_data| is the output of processing.
  virtual void OnProcessed(Status status, const uint8_t* output_data,
                           uint32_t output_data_size) = 0;

  // Callback for CreateMediaCryptoSession(). On success:
  // - |crypto_session_id| is the ID for the created crypto session.
  // - |output_data| is extra value, if any.
  // Otherwise, |crypto_session_id| and |output_data| should be ignored.
  virtual void OnMediaCryptoSessionCreated(Status status,
                                           uint32_t crypto_session_id,
                                           uint64_t output_data) = 0;

  // Callback for SetKey().
  virtual void OnKeySet(Status status) = 0;

  // Callback for RemoveKey().
  virtual void OnKeyRemoved(Status status) = 0;

  // Called when there is a hardware reset and all the hardware context is lost.
  virtual void NotifyHardwareReset() = 0;

 protected:
  CdmProxyClient() {}
  virtual ~CdmProxyClient() {}
};

}  // namespace cdm

#endif  // CDM_CONTENT_DECRYPTION_MODULE_PROXY_H_