• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**********************************************************************
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 #ifndef __WV_MOD_DRM_API_H_
18 #define __WV_MOD_DRM_API_H_
19 
20 #include <inttypes.h>
21 #include "drm_common_api.h"
22 #include "wv_mod_oem_crypto.h"
23 
24 /*!
25  * Defines
26  */
27 #define DRM_WV_MOD_CLEAR_CONTENT_FLAG  (1)
28 #define DRM_WV_MOD_AUDIO_CONTENT_FLAG  (1 << 1)
29 #define DRM_WV_MOD_SECURE_CONTENT_FLAG (1 << 2)
30 
31 // HDCP version values
32 enum hdcp_version_type
33 {
34     DRM_WV_MOD_HDCP_VERSION_ANY = 0,
35     DRM_WV_MOD_HDCP_VERSION_1_0,
36     DRM_WV_MOD_HDCP_VERSION_2_0,
37     DRM_WV_MOD_HDCP_VERSION_2_1,
38     DRM_WV_MOD_HDCP_VERSION_2_2,
39     DRM_WV_MOD_HDCP_VERSION_NONE = 0xFF
40 };
41 
42 
43 /*!
44  * APIs
45  */
46 uint32_t drm_wv_mod_open_session(uint32_t *session_id);
47 
48 uint32_t drm_wv_mod_close_session(uint32_t session_id);
49 
50 uint32_t drm_wv_mod_start_playback(uint32_t session_id);
51 
52 uint32_t drm_wv_mod_stop_playback(uint32_t session_id);
53 
54 uint32_t drm_wv_mod_generate_derived_keys(uint32_t session_id,
55                                           const uint8_t *mac_key_context,
56                                           uint32_t mac_key_context_length,
57                                           const uint8_t *enc_key_context,
58                                           uint32_t enc_key_context_length);
59 
60 uint32_t drm_wv_mod_generate_nonce(uint32_t session_id,
61                                    uint32_t *nonce);
62 
63 uint32_t drm_wv_mod_generate_signature(uint32_t session_id,
64                                        const uint8_t *message,
65                                        uint32_t message_length,
66                                        uint8_t *signature,
67                                        uint32_t *signature_length);
68 
69 uint32_t drm_wv_mod_load_keys(uint32_t session_id,
70                               const uint8_t *message,
71                               uint32_t message_length,
72                               const uint8_t *signature,
73                               uint32_t signature_length,
74                               const uint8_t *enc_mac_keys_iv,
75                               const uint8_t *enc_mac_keys,
76                               uint32_t num_keys,
77                               const struct drm_wv_mod_key_object *key_array);
78 
79 uint32_t drm_wv_mod_refresh_keys(uint32_t session_id,
80                                  const uint8_t *message,
81                                  uint32_t message_length,
82                                  const uint8_t *signature,
83                                  uint32_t signature_length,
84                                  uint32_t num_keys,
85                                  const struct drm_wv_mod_key_refresh_object *key_array);
86 
87 uint32_t drm_wv_mod_select_key(uint32_t session_id,
88                                const uint8_t *key_id,
89                                uint32_t key_id_length);
90 
91 uint32_t drm_wv_mod_decrypt_ctr(uint32_t session_id,
92                                 const uint8_t *inp_data_buffer,
93                                 uint32_t inp_data_size,
94                                 uint8_t *out_data_buffer,
95                                 uint32_t out_data_size,
96                                 const uint8_t *iv,
97                                 uint8_t flags);
98 
99 uint32_t drm_wv_mod_rewrap_device_rsa_key(uint32_t session_id,
100                                           const uint8_t *message,
101                                           uint32_t message_length,
102                                           const uint8_t *signature,
103                                           uint32_t signature_length,
104                                           uint32_t *nonce,
105                                           const uint8_t *enc_rsa_key,
106                                           uint32_t enc_rsa_key_length,
107                                           const uint8_t *enc_rsa_key_iv,
108                                           uint8_t *wrapped_rsa_key,
109                                           uint32_t *wrapped_rsa_key_length);
110 
111 uint32_t drm_wv_mod_load_device_rsa_key(uint32_t session_id,
112                                         const uint8_t *wrapped_rsa_key,
113                                         uint32_t wrapped_rsa_key_length);
114 
115 uint32_t drm_wv_mod_generate_rsa_signature(uint32_t session_id,
116                                            const uint8_t *message,
117                                            uint32_t message_length,
118                                            uint8_t *signature,
119                                            uint32_t *signature_length);
120 
121 uint32_t drm_wv_mod_derive_keys_from_session_key(uint32_t session_id,
122                                                  const uint8_t *enc_session_key,
123                                                  uint32_t enc_session_key_length,
124                                                  const uint8_t *mac_key_context,
125                                                  uint32_t mac_key_context_length,
126                                                  const uint8_t *enc_key_context,
127                                                  uint32_t enc_key_context_length);
128 
129 uint32_t drm_wv_mod_generic_encrypt(uint32_t session_id,
130                                     const uint8_t *in_buffer,
131                                     uint32_t buffer_size,
132                                     const uint8_t *iv,
133                                     enum drm_wv_mod_algorithm algorithm,
134                                     uint8_t *out_buffer);
135 
136 uint32_t drm_wv_mod_generic_decrypt(uint32_t session_id,
137                                     const uint8_t *in_buffer,
138                                     uint32_t buffer_size,
139                                     const uint8_t *iv,
140                                     enum drm_wv_mod_algorithm algorithm,
141                                     uint8_t *out_buffer);
142 
143 uint32_t drm_wv_mod_generic_sign(uint32_t session_id,
144                                  const uint8_t *in_buffer,
145                                  uint32_t buffer_size,
146                                  enum drm_wv_mod_algorithm algorithm,
147                                  uint8_t *signature,
148                                  uint32_t *signature_size);
149 
150 uint32_t drm_wv_mod_generic_verify(uint32_t session_id,
151                                    const uint8_t *in_buffer,
152                                    uint32_t buffer_size,
153                                    enum drm_wv_mod_algorithm algorithm,
154                                    const uint8_t *signature,
155                                    uint32_t signature_size);
156 
157 /*! Version 9 specific APIs */
158 uint32_t drm_wv_mod_v9_load_keys(uint32_t session_id,
159                                  const uint8_t *message,
160                                  uint32_t message_length,
161                                  const uint8_t *signature,
162                                  uint32_t signature_length,
163                                  const uint8_t *enc_mac_keys_iv,
164                                  const uint8_t *enc_mac_keys,
165                                  uint32_t num_keys,
166                                  const struct drm_wv_mod_key_object *key_array,
167                                  const uint8_t *pst,
168                                  uint32_t pst_length);
169 
170 uint32_t drm_wv_mod_v9_generate_rsa_signature(uint32_t session_id,
171                                               const uint8_t *message,
172                                               uint32_t message_length,
173                                               uint8_t *signature,
174                                               uint32_t *signature_length,
175                                               enum drm_wv_mod_rsa_padding_scheme padding_scheme);
176 
177 
178 /**
179  * @brief Loads an existing usage table into chaabi secure memory
180  *
181  * This should be first called prior to load keys. Caller shall call
182  * drm_wv_mod_update_usage_table after making this call.
183  *
184  * @param[in] usage_table_data
185  *    Existing usage table blob to load. If NULL, chaabi will
186  *    return required table size.
187  * @param[in,out] data_size
188  *    Size of the passed-in usage_table_data, in bytes. This
189  *    will always be updated to the required table size.
190  * @param[in] system_time
191  *    current system time. Time in seconds since 1970.
192  */
193 uint32_t drm_wv_mod_load_usage_table(const uint8_t *const usage_table_data,
194                                      uint32_t *const data_size,
195                                      uint64_t system_time);
196 
197 /* @brief Update usage table and return it
198  *
199  * Chaabi will update the usage table from its TEE memory and set the flag
200  * is_updated.
201  *
202  * Upon returning DRM_WV_MOD_SUCCESS and is_updated == 1, caller should
203  * write save the usage table to the file system.
204  *
205  * @param[out] usage_table_data
206  *   Buffer where the usage table will be returned. Input is ignored.
207  *   This will only contain data if is_updated == 1.
208  * @param[in] data_size
209  *   Size of the usage_table_data buffer, which must be large enough to
210  *   hold the entire structure. This size can be obtained via the
211  *   load_usage_table API or by re-using the size of a previous table blob.
212  * @param[out] is_updated
213  *   Flag indicating if the table has changed since the last
214  *   update_usage_table or load_usage_table call.
215  *
216  * TODO: Return documentation
217  */
218 uint32_t drm_wv_mod_update_usage_table(uint8_t *const usage_table_data,
219                                        uint32_t data_size,
220                                        uint8_t *const is_updated);
221 
222 // NOTE: drm_wv_mod_update_usage_table shall be called after calling this
223 // function
224 // TODO: Documentation
225 uint32_t drm_wv_mod_deactivate_usage_entry(const uint8_t *const pst,
226                                            uint32_t pst_length);
227 
228 /**
229  * @brief Returns the usage entry information for a particular pst
230  *
231  * Caller shall call drm_wv_mod_update_usage_table after making this call.
232  *
233  * @param[in] session_id
234  *   Session ID to be associated with the pst entry
235  * @param[in] pst
236  *   Pointer to pst data used as an index into the usage table
237  * @param[in] pst_length
238  *   Length of pst buffer in bytes
239  * @param[out] pst_report_buffer
240  *   Pointer to caller-allocated memory where the usage report shall be placed
241  * @param[in,out] pst_report_buffer_length
242  *   Length of provided pst_report_buffer in bytes. Should be sizeof(pst) +
243  *   sizeof(struct OEMCrypto_PST_Report) in length. If extra space is provided,
244  *   this field will reflect the actual size of the returned report.
245  *
246  * TODO: Return documentation
247  */
248 uint32_t drm_wv_mod_report_usage(uint32_t session_id,
249                                  const uint8_t *const pst,
250                                  uint32_t pst_length,
251                                  uint8_t *const pst_report_buffer,
252                                  uint32_t *const pst_report_buffer_length);
253 
254 /**
255  * @brief Deletes a previously-reported entry from the usage table
256  *
257  * Caller shall call drm_wv_mod_update_usage_table after making this call.
258  *
259  * @param[in] session_id
260  *   Session ID previously associated with the pst
261  * @param[in] pst
262  *   Pointer to pst data used as an index into the usage table
263  * @param[in] pst_length
264  *   Length of pst buffer in bytes
265  * @param[in] msg
266  *   Pointer to message to be verified
267  * @param[in] msg_len
268  *   Length of msg buffer in bytes
269  * @param[in] signature
270  *   Pointer to signature to verify against
271  * @param[in] signature_length
272  *   Length of signature buffer in bytes
273  *
274  * TODO: Return Documentation
275  */
276 uint32_t drm_wv_mod_delete_usage_entry(uint32_t session_id,
277                                        const uint8_t *const pst,
278                                        uint32_t pst_length,
279                                        const uint8_t *const msg,
280                                        uint32_t msg_length,
281                                        const uint8_t *const signature,
282                                        uint32_t signature_length);
283 
284 // This will only clear Chaabi TEE memory. Caller is responsible for deleting
285 // usage table file from file system.
286 // TODO: Documentation
287 uint32_t drm_wv_mod_delete_usage_table(void);
288 
289 
290 /**
291  * brief Clear session context
292  *
293  * This API is used to reset all sessions context.
294  * Typically called to cleanup sessions resulting from a application crash.
295  */
296 uint32_t drm_wv_mod_reset_session_context(void);
297 
298 /**
299  * @brief Returns the maximum and current HDCP version supported by the device
300  *
301  * @param[out] current_ver
302  *   Current HDCP version supported by the device
303  * @param[out] maximum_ver
304  *   Maximum HDCP version supported by the device
305  *
306  */
307 uint32_t drm_wv_mod_get_hdcp_capability(enum hdcp_version_type *const current_ver,
308                                         enum hdcp_version_type *const maximum_ver);
309 
310 /*! Version 10 specific APIs. */
311 
312 /**
313  * @brief Get current number of open sessions along with maximum number of
314  * supported sessions.
315  */
316 uint32_t drm_wv_mod_get_num_sessions(uint32_t *open_sessions, uint32_t *max_sessions);
317 
318 /**
319  * @brief Deletes an entry from session usage table.
320  *
321  * This API is used to delete stale entries without a signed request from server.
322  */
323 uint32_t drm_wv_mod_force_delete_usage_entry(const uint8_t *pst, uint32_t pst_length);
324 
325 /**
326  * @brief Returns the decrypted key control block for the given key_id.
327  */
328 uint32_t drm_wv_mod_query_key_control(const uint32_t session_id,
329                                       const uint8_t *key_id,
330                                       uint32_t key_id_length,
331                                       uint8_t *key_control_block,
332                                       uint32_t *key_control_block_length);
333 
334 /*! Version 11 specific APIs */
335 uint32_t drm_wv_mod_security_patch_level(uint32_t *security_patch_level);
336 
337 uint32_t drm_wv_mod_api_version(uint32_t *api_version);
338 
339 uint32_t drm_wv_mod_decrypt_cenc(uint32_t session_id,
340                                  const uint8_t *inp_data_buffer,
341                                  uint32_t inp_data_size,
342                                  uint8_t *out_data_buffer,
343                                  uint32_t out_data_size,
344                                  const uint8_t *iv,
345                                  uint8_t flags);
346 
347 uint32_t drm_wv_mod_glue_block(uint32_t       session_id,
348                                uint8_t        *encrypted,
349                                const uint8_t  *cleartext,
350                                uint32_t       cleartext_length,
351                                const uint8_t  *iv);
352 
353 #endif /* __WV_MOD_DRM_API_H_ */
354