1/********************************************************************** 2* Copyright (C) 2011 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 * @brief Erases installed Widevine keybox from secure storage 210 */ 211uint32_t drm_wv_remove_keybox(void); 212 213/** 214 * @brief Temporarily loads test keybox. 215 */ 216uint32_t drm_wv_load_test_keybox(void); 217 218#endif //__WV_DRM_API_H__ 219