Home | History | Annotate | Download | only in inc
      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  */
     50 struct 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  */
     70 struct 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 
     80 struct 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  */
     97 uint32_t drm_wv_set_entitlementkey(
     98     uint8_t *emm_keyptr,
     99     uint32_t emm_keylen);
    100 
    101 /*
    102  * Derive Widevine Control Word
    103  */
    104 uint32_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  */
    113 uint32_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  */
    124 uint32_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  */
    133 uint32_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  */
    144 uint32_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  */
    154 uint32_t drm_wv_decrypt_video(
    155     uint32_t session_id,
    156     struct drm_wv_video_cipher *video_info);
    157 
    158 
    159 uint32_t drm_wv_return_naluheaders(
    160     uint32_t session_id,
    161     struct drm_wv_nalu_headers *nalu_info);
    162 
    163 uint32_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  */
    189 uint32_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  */
    204 uint32_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  */
    211 uint32_t drm_wv_remove_keybox(void);
    212 
    213 /**
    214  * @brief Temporarily loads test keybox.
    215  */
    216 uint32_t drm_wv_load_test_keybox(void);
    217 
    218 #endif //__WV_DRM_API_H__
    219