60 lines
2.2 KiB
C
60 lines
2.2 KiB
C
/* 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;
|
|
}
|
|
}
|