blob: ff14ca90982bd75d18167cf629c0403b4a3c1695 [file] [log] [blame]
Thierry Strudel58ab4ce2014-09-25 22:01:08 -07001/*
2 * Copyright (C) 2014 Intel Corporation. All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/*!
18 * NOTE: Don't include this file. It is recommended to include sepdrm.h
19 */
20#ifndef __WV_DRM_API_H__
21#define __WV_DRM_API_H__
22
23#include <inttypes.h>
24#include "drm_common_api.h"
25#include "wv_fkp.h"
26
27/*!
28 * Defines
29 */
30#define NEW_FRAME_FLAG (1)
31#define PREV_PACKET_PARTIAL_BLOCK_FLAG (1 << 1)
32#define CLEAR_CONTENT_FLAG (1 << 2)
33
34/*!
35 * Structs
36 */
37
38/*
39 * This structure is used to provide necessary information for Widevine audio
40 * ciphertext decryption.
41 *
42 * The members are:
43 *
44 * iv - AES initialization vector.
45 * input_ciphertext_size - Input ciphertext data size in bytes.
46 * p_input_ciphertext - Pointer to the input ciphertext data buffer.
47 * output_plaintext_size - Output plaintext data size in bytes.
48 * p_output_plaintext - Pointer to the output plaintext data buffer.
49 */
50struct drm_wv_audio_data
51{
52 uint8_t iv[AES_IV_COUNTER_SIZE_IN_BYTES];
53 uint32_t input_ciphertext_size;
54 uint8_t *p_input_ciphertext;
55 uint32_t output_plaintext_size;
56 uint8_t *p_output_plaintext;
57};
58
59
60/*
61 * This structure is used to provide necessary information for Widevine video
62 * ciphertext decryption.
63 *
64 * The members are:
65 *
66 * iv - AES initialization vector.
67 * input_ciphertext_size - Input ciphertext data size in bytes.
68 * p_input_ciphertext - Pointer to the input ciphertext data.
69 */
70struct drm_wv_video_cipher
71{
72 uint8_t iv[AES_IV_COUNTER_SIZE_IN_BYTES];
73 uint32_t input_ciphertext_size;
74 uint8_t *p_input_ciphertext;
75 uint8_t flags;
76 uint8_t *p_output_enc_ciphertext;
77 uint32_t output_ciphertext_size;
78};
79
80struct drm_wv_nalu_headers
81{
82 uint32_t frame_size;
83 uint32_t parse_size;
84 uint8_t *p_enc_ciphertext;
85 uint32_t hdrs_buf_len;
86 uint8_t *p_hdrs_buf;
87};
88
89/*!
90 * Functions
91 */
92
93
94/*
95 * Set Widevine Asset Key
96 */
97uint32_t drm_wv_set_entitlementkey(
98 uint8_t *emm_keyptr,
99 uint32_t emm_keylen);
100
101/*
102 * Derive Widevine Control Word
103 */
104uint32_t drm_wv_derive_controlword(
105 uint8_t *cw_ptr,
106 uint32_t cw_len,
107 uint32_t *flags_ptr);
108
109/*
110 * Get Widevine Keybox infomation
111 * Retrieve the encypted kbox data and decrypt the encrypted kbox data
112 */
113uint32_t drm_wv_get_keyboxinfo(
114 uint8_t *key_data,
115 uint32_t *key_data_size,
116 uint8_t *device_id,
117 uint32_t *device_id_size);
118
119
120/*!
121 *@brief Create a widevine session
122 *
123 */
124uint32_t drm_wv_create_session(
125 uint32_t *session_id);
126
127
128/*
129 * @brief Creates a Widevine session for HLS content.
130 * @param[out] pSessionID Pointer to a variable that contains the session's ID
131 * number.
132 */
133uint32_t drm_wv_hls_create_session(
134 uint32_t *session_id);
135
136/*
137 * @brief Decrypts Widevine encrypted audio data
138 *
139 * @param session_id DRM Session ID number
140 * @param audio_info Pointer to a buffer containing Widevine audio information
141 *
142 * @return DRM_SUCCESSFUL The Widevine audio ciphertext was decrypted
143 */
144uint32_t drm_wv_decrypt_audio(
145 uint32_t session_id,
146 struct drm_wv_audio_data *audio_info);
147
148
149/*
150 * @brief Decrypts Widevine video ciphertext data into the IMR decryption buffer
151 * @param session_id DRM Session ID number
152 * @param video_info Pointer to the Widevine video data
153 */
154uint32_t drm_wv_decrypt_video(
155 uint32_t session_id,
156 struct drm_wv_video_cipher *video_info);
157
158
159uint32_t drm_wv_return_naluheaders(
160 uint32_t session_id,
161 struct drm_wv_nalu_headers *nalu_info);
162
163uint32_t drm_wv_keybox_provision(
164 struct wv_keybox *buf);
165
166
167/*
168 * @brief Encrypts a Widevine keybox with a device specific key.
169 *
170 * @param[in] p_keybox Pointer to a Widevine keybox. May be NULL if
171 * keybox_length is zero.
172 *
173 * @param[in] keybox_length Length of the Widevine keybox in bytes. If zero then
174 * only the size of an encrypted Widevine keybox is returned.
175 *
176 * @param[out] p_wrapped_keybox Pointer to a buffer for the returned encrypted
177 * Widevine keybox. May be NULL if keybox_length is zero.
178 *
179 * @param[out] p_wrapped_keybox_length Length of the encrypted Widevine keybox
180 * in bytes.
181 *
182 * @param[in] p_transport_key Pointer to a transport key. May be NULL if
183 * transport_key_length is zero.
184 *
185 * @param[in] transport_key_length Length of the transport key in bytes.
186 *
187 * A Widevine keybox encrypted with the transport key is not supported.
188 */
189uint32_t drm_wv_wrap_keybox(const uint8_t * const p_keybox,
190 const uint32_t keybox_length,
191 uint8_t * const p_wrapped_keybox,
192 uint32_t * const p_wrapped_keybox_length,
193 const uint8_t * const p_transport_key,
194 const uint32_t transport_key_length);
195
196
197/*
198 * @brief Decrypts a wrapped Widevine keybox and installs it into the device.
199 *
200 * @param[in] p_keybox Pointer to a wrapped Widevine keybox.
201 *
202 * @param[in] keybox_length Length of the Widevine keybox in bytes.
203 */
204uint32_t drm_wv_install_keybox(const uint8_t * const p_keybox,
205 const uint32_t keybox_length);
206
207
208
209
210#endif //__WV_DRM_API_H__