94 lines
3.0 KiB
C
94 lines
3.0 KiB
C
/* Copyright 2019 Google LLC. All Rights Reserved. This file and proprietary
|
|
source code may only be used and distributed under the Widevine
|
|
License Agreement. */
|
|
|
|
#include "oemcrypto_key.h"
|
|
|
|
#include <string.h>
|
|
|
|
#include "wtpi_abort_interface.h"
|
|
|
|
OEMCryptoResult OPKI_InitializeSymmetricKey(SymmetricKey* key,
|
|
SymmetricKeyType key_type,
|
|
KeySize key_size) {
|
|
if (key == NULL) return OEMCrypto_ERROR_INVALID_CONTEXT;
|
|
key->key_handle = NULL;
|
|
memset(key->key_id, 0, KEY_ID_MAX_SIZE);
|
|
key->key_id_size = 0;
|
|
key->key_type = key_type;
|
|
key->key_size = key_size;
|
|
memset(&key->key_control_block, 0, sizeof(key->key_control_block));
|
|
key->is_entitled_content_key = false;
|
|
return OEMCrypto_SUCCESS;
|
|
}
|
|
|
|
OEMCryptoResult OPKI_InitializeAsymmetricKey(
|
|
AsymmetricKey* key, AsymmetricKeyType key_type, const uint8_t* wrapped_key,
|
|
size_t wrapped_key_length, size_t key_size, uint32_t allowed_schemes) {
|
|
if (key == NULL || wrapped_key == NULL || wrapped_key_length == 0) {
|
|
return OEMCrypto_ERROR_INVALID_CONTEXT;
|
|
}
|
|
if (wrapped_key_length > sizeof(key->wrapped_key)) {
|
|
return OEMCrypto_ERROR_INVALID_CONTEXT;
|
|
}
|
|
key->key_type = key_type;
|
|
memcpy(key->wrapped_key, wrapped_key, wrapped_key_length);
|
|
key->wrapped_key_length = wrapped_key_length;
|
|
key->key_size = key_size;
|
|
key->allowed_schemes = allowed_schemes;
|
|
return OEMCrypto_SUCCESS;
|
|
}
|
|
|
|
OEMCryptoResult OPKI_FreeSymmetricKey(SymmetricKey* key) {
|
|
if (key == NULL) return OEMCrypto_ERROR_INVALID_CONTEXT;
|
|
if (key->key_handle != NULL) {
|
|
OEMCryptoResult result = WTPI_K1_FreeKeyHandle(key->key_handle);
|
|
if (result != OEMCrypto_SUCCESS) {
|
|
return result;
|
|
}
|
|
}
|
|
memset(key, 0, sizeof(SymmetricKey));
|
|
return OEMCrypto_SUCCESS;
|
|
}
|
|
|
|
OEMCryptoResult OPKI_FreeAsymmetricKey(AsymmetricKey* key) {
|
|
if (key == NULL) return OEMCrypto_ERROR_INVALID_CONTEXT;
|
|
memset(key, 0, sizeof(AsymmetricKey));
|
|
return OEMCrypto_SUCCESS;
|
|
}
|
|
|
|
bool OPKI_CheckKey(SymmetricKey* key, SymmetricKeyType key_type) {
|
|
return key != NULL && key->key_type == key_type;
|
|
}
|
|
|
|
bool OPKI_PrivateKeyTypeToAsymmetricKey(OEMCrypto_PrivateKeyType priv_key_type,
|
|
AsymmetricKeyType* asym_key_type) {
|
|
if (asym_key_type == NULL) return false;
|
|
switch (priv_key_type) {
|
|
case OEMCrypto_RSA_Private_Key:
|
|
*asym_key_type = DRM_RSA_PRIVATE_KEY;
|
|
return true;
|
|
case OEMCrypto_ECC_Private_Key:
|
|
*asym_key_type = DRM_ECC_PRIVATE_KEY;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool OPKI_AsymmetricKeyToPrivateKeyType(
|
|
AsymmetricKeyType asym_key_type, OEMCrypto_PrivateKeyType* priv_key_type) {
|
|
if (priv_key_type == NULL) return false;
|
|
switch (asym_key_type) {
|
|
case DRM_RSA_PRIVATE_KEY:
|
|
*priv_key_type = OEMCrypto_RSA_Private_Key;
|
|
return true;
|
|
case DRM_ECC_PRIVATE_KEY:
|
|
*priv_key_type = OEMCrypto_ECC_Private_Key;
|
|
return true;
|
|
case PROV40_ED25519_PRIVATE_KEY:
|
|
// ED25519 key can only be used in provisioning 4 BCC.
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|