/* Copyright 2019 Google LLC. All Rights Reserved. This file and proprietary source code may only be used and distributed under the Widevine Master License Agreement. */ #include "oemcrypto_session_key_table.h" #include "string.h" #include "assert_interface.h" static CryptoKey** get_key_table(OEMCryptoSession* session, OEMCrypto_LicenseType license_type, uint32_t* num_keys) { ASSERT(session != NULL && num_keys != NULL, "Parameters are NULL"); ASSERT(license_type == OEMCrypto_ContentLicense || license_type == OEMCrypto_EntitlementLicense, "session has invalid license type"); if (license_type == OEMCrypto_ContentLicense) { *num_keys = session->num_content_keys; return session->content_keys; } else { *num_keys = session->num_entitlement_keys; return session->entitlement_keys; } } CryptoKey* FindKeyFromTable(OEMCryptoSession* session, bool is_content_key, const uint8_t* key_id, uint32_t key_id_length) { ASSERT(session != NULL && key_id != NULL && key_id_length != 0, "Parameters are NULL or 0"); uint32_t num_keys; ASSERT( session->license_type == OEMCrypto_EntitlementLicense || is_content_key, "Cannot get entitlement key for content license"); OEMCrypto_LicenseType license_type = is_content_key ? OEMCrypto_ContentLicense : OEMCrypto_EntitlementLicense; CryptoKey** key_table = get_key_table(session, license_type, &num_keys); for (uint32_t i = 0; i < num_keys; i++) { CryptoKey* key = key_table[i]; ASSERT(key != NULL, "key at index %d is NULL", i); if (key_id_length == key->key_id_size && memcmp(key->key_id, key_id, key_id_length) == 0) { return key; } } return NULL; } void UpdateDurationForAllKeys(OEMCryptoSession* session, KeyControlBlock key_control_block) { ASSERT(session != NULL, "session is NULL"); uint32_t num_keys; CryptoKey** key_table = get_key_table(session, session->license_type, &num_keys); for (uint32_t i = 0; i < num_keys; i++) { ASSERT(key_table[i] != NULL, "key at index %d is NULL", i); key_table[i]->key_control_block.duration = key_control_block.duration; } }