Files
odkitee/oemcrypto_ta/oemcrypto_session_key_table.c
2020-07-24 12:03:58 -07:00

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;
}
}