From 7e5d01653150c406b69c3215dc10cc429d8de287 Mon Sep 17 00:00:00 2001 From: KongQun Yang Date: Wed, 11 Mar 2015 16:30:46 -0700 Subject: [PATCH] Reorder OEMCrypto definitions according to OEMCryptoCENC.h Merged from Widevine CDM repo: https://widevine-internal-review.googlesource.com/#/c/13510/ Change-Id: I0ce612a5ff2167704a87e3b3b650beaddf095c61 --- .../cdm/core/include/oemcrypto_adapter.h | 6 +- .../core/src/oemcrypto_adapter_dynamic.cpp | 155 ++++++++-------- libwvdrmengine/oemcrypto/include/level3.h | 64 +++---- .../oemcrypto/mock/src/oemcrypto_mock.cpp | 172 +++++++++--------- 4 files changed, 198 insertions(+), 199 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h b/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h index 6d96eb0a..3108a527 100644 --- a/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h +++ b/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h @@ -13,14 +13,14 @@ enum SecurityLevel { kLevelDefault, kLevel3 }; If one level is not available, the other will be used instead. */ OEMCryptoResult OEMCrypto_OpenSession(OEMCrypto_SESSION* session, SecurityLevel level); +OEMCryptoResult OEMCrypto_InstallKeybox(const uint8_t* keybox, + size_t keyBoxLength, + SecurityLevel level); OEMCryptoResult OEMCrypto_IsKeyboxValid(SecurityLevel level); OEMCryptoResult OEMCrypto_GetDeviceID(uint8_t* deviceID, size_t* idLength, SecurityLevel level); OEMCryptoResult OEMCrypto_GetKeyData(uint8_t* keyData, size_t* keyDataLength, SecurityLevel level); -OEMCryptoResult OEMCrypto_InstallKeybox(const uint8_t* keybox, - size_t keyBoxLength, - SecurityLevel level); uint32_t OEMCrypto_APIVersion(SecurityLevel level); const char* OEMCrypto_SecurityLevel(SecurityLevel level); bool OEMCrypto_SupportsUsageTable(SecurityLevel level); diff --git a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp index d4b07738..cc9d9a3e 100644 --- a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp +++ b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp @@ -66,21 +66,21 @@ typedef OEMCryptoResult (*L1_DecryptCTR_t)( OEMCrypto_SESSION session, const uint8_t* data_addr, size_t data_length, bool is_encrypted, const uint8_t* iv, size_t offset, const OEMCrypto_DestBufferDesc* out_buffer, uint8_t subsample_flags); -typedef OEMCryptoResult (*L1_InstallKeybox_t)(const uint8_t* keybox, - size_t keyBoxLength); -typedef OEMCryptoResult (*L1_IsKeyboxValid_t)(void); -typedef OEMCryptoResult (*L1_GetDeviceID_t)(uint8_t* deviceID, - size_t* idLength); -typedef OEMCryptoResult (*L1_GetKeyData_t)(uint8_t* keyData, - size_t* keyDataLength); -typedef OEMCryptoResult (*L1_GetRandom_t)(uint8_t* randomData, - size_t dataLength); typedef OEMCryptoResult (*L1_WrapKeybox_t)(const uint8_t* keybox, size_t keyBoxLength, uint8_t* wrappedKeybox, size_t* wrappedKeyBoxLength, const uint8_t* transportKey, size_t transportKeyLength); +typedef OEMCryptoResult (*L1_InstallKeybox_t)(const uint8_t* keybox, + size_t keyBoxLength); +typedef OEMCryptoResult (*L1_IsKeyboxValid_t)(); +typedef OEMCryptoResult (*L1_GetDeviceID_t)(uint8_t* deviceID, + size_t* idLength); +typedef OEMCryptoResult (*L1_GetKeyData_t)(uint8_t* keyData, + size_t* keyDataLength); +typedef OEMCryptoResult (*L1_GetRandom_t)(uint8_t* randomData, + size_t dataLength); typedef OEMCryptoResult (*L1_RewrapDeviceRSAKey_t)( OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, const uint8_t* signature, size_t signature_length, const uint32_t* nonce, @@ -102,31 +102,30 @@ typedef OEMCryptoResult (*L1_DeriveKeysFromSessionKey_t)( size_t enc_session_key_length, const uint8_t* mac_key_context, size_t mac_key_context_length, const uint8_t* enc_key_context, size_t enc_key_context_length); +typedef uint32_t (*L1_APIVersion_t)(); +typedef const char* (*L1_SecurityLevel_t)(); +typedef OEMCryptoResult (*L1_GetHDCPCapability_t)( + OEMCrypto_HDCP_Capability* current, OEMCrypto_HDCP_Capability* maximum); +typedef bool (*L1_SupportsUsageTable_t)(); +typedef OEMCryptoResult (*L1_GetMaxNumberOfSessions_t)(size_t* maximum); typedef OEMCryptoResult (*L1_Generic_Encrypt_t)( OEMCrypto_SESSION session, const uint8_t* in_buffer, size_t buffer_length, const uint8_t* iv, OEMCrypto_Algorithm algorithm, uint8_t* out_buffer); typedef OEMCryptoResult (*L1_Generic_Decrypt_t)( OEMCrypto_SESSION session, const uint8_t* in_buffer, size_t buffer_length, const uint8_t* iv, OEMCrypto_Algorithm algorithm, uint8_t* out_buffer); - typedef OEMCryptoResult (*L1_Generic_Sign_t)(OEMCrypto_SESSION session, const uint8_t* in_buffer, size_t buffer_length, OEMCrypto_Algorithm algorithm, uint8_t* signature, size_t* signature_length); - typedef OEMCryptoResult (*L1_Generic_Verify_t)(OEMCrypto_SESSION session, const uint8_t* in_buffer, size_t buffer_length, OEMCrypto_Algorithm algorithm, const uint8_t* signature, size_t signature_length); -typedef uint32_t (*L1_APIVersion_t)(); -typedef const char* (*L1_SecurityLevel_t)(); -typedef OEMCryptoResult (*L1_GetHDCPCapability_t)( - OEMCrypto_HDCP_Capability* current, OEMCrypto_HDCP_Capability* maximum); -typedef bool (*L1_SupportsUsageTable_t)(); typedef OEMCryptoResult (*L1_UpdateUsageTable_t)(); typedef OEMCryptoResult (*L1_DeactivateUsageEntry_t)(const uint8_t* pst, size_t pst_length); @@ -140,7 +139,6 @@ typedef OEMCryptoResult (*L1_DeleteUsageEntry_t)( const uint8_t* message, size_t message_length, const uint8_t* signature, size_t signature_length); typedef OEMCryptoResult (*L1_DeleteUsageTable_t)(); -typedef OEMCryptoResult (*L1_GetMaxNumberOfSessions_t)(size_t* maximum); struct FunctionPointers { uint32_t version; @@ -155,30 +153,30 @@ struct FunctionPointers { L1_RefreshKeys_t RefreshKeys; L1_SelectKey_t SelectKey; L1_DecryptCTR_t DecryptCTR; + L1_WrapKeybox_t WrapKeybox; L1_InstallKeybox_t InstallKeybox; L1_IsKeyboxValid_t IsKeyboxValid; L1_GetDeviceID_t GetDeviceID; L1_GetKeyData_t GetKeyData; L1_GetRandom_t GetRandom; - L1_WrapKeybox_t WrapKeybox; L1_RewrapDeviceRSAKey_t RewrapDeviceRSAKey; L1_LoadDeviceRSAKey_t LoadDeviceRSAKey; L1_GenerateRSASignature_t GenerateRSASignature; L1_DeriveKeysFromSessionKey_t DeriveKeysFromSessionKey; L1_APIVersion_t APIVersion; L1_SecurityLevel_t SecurityLevel; + L1_GetHDCPCapability_t GetHDCPCapability; + L1_SupportsUsageTable_t SupportsUsageTable; + L1_GetMaxNumberOfSessions_t GetMaxNumberOfSessions; L1_Generic_Encrypt_t Generic_Encrypt; L1_Generic_Decrypt_t Generic_Decrypt; L1_Generic_Sign_t Generic_Sign; L1_Generic_Verify_t Generic_Verify; - L1_GetHDCPCapability_t GetHDCPCapability; - L1_SupportsUsageTable_t SupportsUsageTable; L1_UpdateUsageTable_t UpdateUsageTable; L1_DeactivateUsageEntry_t DeactivateUsageEntry; L1_ReportUsage_t ReportUsage; L1_DeleteUsageEntry_t DeleteUsageEntry; L1_DeleteUsageTable_t DeleteUsageTable; - L1_GetMaxNumberOfSessions_t GetMaxNumberOfSessions; L1_LoadKeys_V8_t LoadKeys_V8; L1_GenerateRSASignature_V8_t GenerateRSASignature_V8; @@ -337,30 +335,31 @@ class Adapter { level3_.RefreshKeys = Level3_RefreshKeys; level3_.SelectKey = Level3_SelectKey; level3_.DecryptCTR = Level3_DecryptCTR; + level3_.WrapKeybox = Level3_WrapKeybox; level3_.InstallKeybox = Level3_InstallKeybox; level3_.IsKeyboxValid = Level3_IsKeyboxValid; level3_.GetDeviceID = Level3_GetDeviceID; level3_.GetKeyData = Level3_GetKeyData; level3_.GetRandom = Level3_GetRandom; - level3_.WrapKeybox = Level3_WrapKeybox; level3_.RewrapDeviceRSAKey = Level3_RewrapDeviceRSAKey; level3_.LoadDeviceRSAKey = Level3_LoadDeviceRSAKey; level3_.GenerateRSASignature = Level3_GenerateRSASignature; level3_.DeriveKeysFromSessionKey = Level3_DeriveKeysFromSessionKey; level3_.APIVersion = Level3_APIVersion; level3_.SecurityLevel = Level3_SecurityLevel; + level3_.GetHDCPCapability = Level3_GetHDCPCapability; + level3_.SupportsUsageTable = Level3_SupportsUsageTable; + level3_.GetMaxNumberOfSessions = Level3_GetMaxNumberOfSessions; level3_.Generic_Decrypt = Level3_Generic_Decrypt; level3_.Generic_Encrypt = Level3_Generic_Encrypt; level3_.Generic_Sign = Level3_Generic_Sign; level3_.Generic_Verify = Level3_Generic_Verify; - level3_.GetHDCPCapability = Level3_GetHDCPCapability; - level3_.SupportsUsageTable = Level3_SupportsUsageTable; level3_.UpdateUsageTable = Level3_UpdateUsageTable; level3_.DeactivateUsageEntry = Level3_DeactivateUsageEntry; level3_.ReportUsage = Level3_ReportUsage; level3_.DeleteUsageEntry = Level3_DeleteUsageEntry; level3_.DeleteUsageTable = Level3_DeleteUsageTable; - level3_.GetMaxNumberOfSessions = Level3_GetMaxNumberOfSessions; + level3_.version = Level3_APIVersion(); } @@ -449,6 +448,15 @@ OEMCryptoResult OEMCrypto_OpenSession(OEMCrypto_SESSION* session, return kAdapter->OpenSession(session, level); } +OEMCryptoResult OEMCrypto_InstallKeybox(const uint8_t* keybox, + size_t keyBoxLength, + SecurityLevel level) { + if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; + const FunctionPointers* fcn = kAdapter->get(level); + if (!fcn) return OEMCrypto_ERROR_INVALID_SESSION; + return fcn->InstallKeybox(keybox, keyBoxLength); +} + OEMCryptoResult OEMCrypto_IsKeyboxValid(SecurityLevel level) { if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; const FunctionPointers* fcn = kAdapter->get(level); @@ -472,15 +480,6 @@ OEMCryptoResult OEMCrypto_GetKeyData(uint8_t* keyData, size_t* keyDataLength, return fcn->GetKeyData(keyData, keyDataLength); } -OEMCryptoResult OEMCrypto_InstallKeybox(const uint8_t* keybox, - size_t keyBoxLength, - SecurityLevel level) { - if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; - const FunctionPointers* fcn = kAdapter->get(level); - if (!fcn) return OEMCrypto_ERROR_INVALID_SESSION; - return fcn->InstallKeybox(keybox, keyBoxLength); -} - uint32_t OEMCrypto_APIVersion(SecurityLevel level) { if (!kAdapter) return 0; const FunctionPointers* fcn = kAdapter->get(level); @@ -532,14 +531,6 @@ extern "C" OEMCryptoResult OEMCrypto_CloseSession(OEMCrypto_SESSION session) { return kAdapter->CloseSession(session); } -extern "C" OEMCryptoResult OEMCrypto_GenerateNonce(OEMCrypto_SESSION session, - uint32_t* nonce) { - if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; - LevelSession pair = kAdapter->get(session); - if (!pair.fcn) return OEMCrypto_ERROR_INVALID_SESSION; - return pair.fcn->GenerateNonce(pair.session, nonce); -} - extern "C" OEMCryptoResult OEMCrypto_GenerateDerivedKeys( OEMCrypto_SESSION session, const uint8_t* mac_key_context, uint32_t mac_key_context_length, const uint8_t* enc_key_context, @@ -552,6 +543,14 @@ extern "C" OEMCryptoResult OEMCrypto_GenerateDerivedKeys( enc_key_context_length); } +extern "C" OEMCryptoResult OEMCrypto_GenerateNonce(OEMCrypto_SESSION session, + uint32_t* nonce) { + if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; + LevelSession pair = kAdapter->get(session); + if (!pair.fcn) return OEMCrypto_ERROR_INVALID_SESSION; + return pair.fcn->GenerateNonce(pair.session, nonce); +} + extern "C" OEMCryptoResult OEMCrypto_GenerateSignature( OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, uint8_t* signature, size_t* signature_length) { @@ -614,6 +613,19 @@ extern "C" OEMCryptoResult OEMCrypto_DecryptCTR( subsample_flags); } +extern "C" OEMCryptoResult OEMCrypto_WrapKeybox(const uint8_t* keybox, + size_t keyBoxLength, + uint8_t* wrappedKeybox, + size_t* wrappedKeyBoxLength, + const uint8_t* transportKey, + size_t transportKeyLength) { + if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; + const FunctionPointers* fcn = kAdapter->get(kLevelDefault); + if (!fcn) return OEMCrypto_ERROR_INVALID_SESSION; + return fcn->WrapKeybox(keybox, keyBoxLength, wrappedKeybox, + wrappedKeyBoxLength, transportKey, transportKeyLength); +} + extern "C" OEMCryptoResult OEMCrypto_InstallKeybox(const uint8_t* keybox, size_t keyBoxLength) { return OEMCrypto_InstallKeybox(keybox, keyBoxLength, kLevelDefault); @@ -641,19 +653,6 @@ extern "C" OEMCryptoResult OEMCrypto_GetRandom(uint8_t* randomData, return fcn->GetRandom(randomData, dataLength); } -extern "C" OEMCryptoResult OEMCrypto_WrapKeybox(const uint8_t* keybox, - size_t keyBoxLength, - uint8_t* wrappedKeybox, - size_t* wrappedKeyBoxLength, - const uint8_t* transportKey, - size_t transportKeyLength) { - if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; - const FunctionPointers* fcn = kAdapter->get(kLevelDefault); - if (!fcn) return OEMCrypto_ERROR_INVALID_SESSION; - return fcn->WrapKeybox(keybox, keyBoxLength, wrappedKeybox, - wrappedKeyBoxLength, transportKey, transportKeyLength); -} - extern "C" OEMCryptoResult OEMCrypto_RewrapDeviceRSAKey( OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, const uint8_t* signature, size_t signature_length, const uint32_t* nonce, @@ -717,6 +716,29 @@ extern "C" const char* OEMCrypto_SecurityLevel() { return OEMCrypto_SecurityLevel(kLevelDefault); } +extern "C" OEMCryptoResult OEMCrypto_GetHDCPCapability( + OEMCrypto_HDCP_Capability* current, OEMCrypto_HDCP_Capability* maximum) { + if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; + const FunctionPointers* fcn = kAdapter->get(kLevelDefault); + if (!fcn) return OEMCrypto_ERROR_INVALID_SESSION; + if (fcn->version == 8) return OEMCrypto_ERROR_NOT_IMPLEMENTED; + return fcn->GetHDCPCapability(current, maximum); +} + +extern "C" bool OEMCrypto_SupportsUsageTable() { + return OEMCrypto_SupportsUsageTable(kLevelDefault); +} + +extern "C" OEMCryptoResult OEMCrypto_GetMaxNumberOfSessions(size_t* maximum) { + if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; + const FunctionPointers* fcn = kAdapter->get(kLevelDefault); + if (!fcn) return OEMCrypto_ERROR_UNKNOWN_FAILURE; + if (fcn->version < 10) { + return OEMCrypto_ERROR_NOT_IMPLEMENTED; + } + return fcn->GetMaxNumberOfSessions(maximum); +} + extern "C" OEMCryptoResult OEMCrypto_Generic_Encrypt( OEMCrypto_SESSION session, const uint8_t* in_buffer, size_t buffer_length, const uint8_t* iv, OEMCrypto_Algorithm algorithm, uint8_t* out_buffer) { @@ -761,19 +783,6 @@ extern "C" OEMCryptoResult OEMCrypto_Generic_Verify( algorithm, signature, signature_length); } -extern "C" OEMCryptoResult OEMCrypto_GetHDCPCapability( - OEMCrypto_HDCP_Capability* current, OEMCrypto_HDCP_Capability* maximum) { - if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; - const FunctionPointers* fcn = kAdapter->get(kLevelDefault); - if (!fcn) return OEMCrypto_ERROR_INVALID_SESSION; - if (fcn->version == 8) return OEMCrypto_ERROR_NOT_IMPLEMENTED; - return fcn->GetHDCPCapability(current, maximum); -} - -extern "C" bool OEMCrypto_SupportsUsageTable() { - return OEMCrypto_SupportsUsageTable(kLevelDefault); -} - extern "C" OEMCryptoResult OEMCrypto_UpdateUsageTable() { if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; const FunctionPointers* fcn1 = kAdapter->get(kLevelDefault); @@ -842,13 +851,3 @@ extern "C" OEMCryptoResult OEMCrypto_DeleteUsageTable() { if (fcn1 && fcn1 != fcn3 && fcn1->version > 8) sts = fcn1->DeleteUsageTable(); return sts; } - -extern "C" OEMCryptoResult OEMCrypto_GetMaxNumberOfSessions(size_t* maximum) { - if (!kAdapter) return OEMCrypto_ERROR_UNKNOWN_FAILURE; - const FunctionPointers* fcn = kAdapter->get(kLevelDefault); - if (!fcn) return OEMCrypto_ERROR_UNKNOWN_FAILURE; - if (fcn->version < 10) { - return OEMCrypto_ERROR_NOT_IMPLEMENTED; - } - return fcn->GetMaxNumberOfSessions(maximum); -} diff --git a/libwvdrmengine/oemcrypto/include/level3.h b/libwvdrmengine/oemcrypto/include/level3.h index 535c8ece..2d0ddb4c 100644 --- a/libwvdrmengine/oemcrypto/include/level3.h +++ b/libwvdrmengine/oemcrypto/include/level3.h @@ -93,19 +93,35 @@ OEMCryptoResult Level3_RefreshKeys(OEMCrypto_SESSION session, size_t signature_length, size_t num_keys, const OEMCrypto_KeyRefreshObject* key_array); +OEMCryptoResult Level3_QueryKeyControl(OEMCrypto_SESSION session, + const uint8_t* key_id, + size_t key_id_length, + uint8_t* key_control_block, + size_t* key_control_block_length); OEMCryptoResult Level3_SelectKey(const OEMCrypto_SESSION session, const uint8_t* key_id, size_t key_id_length); OEMCryptoResult Level3_DecryptCTR(OEMCrypto_SESSION session, - const uint8_t *data_addr, - size_t data_length, - bool is_encrypted, - const uint8_t *iv, - size_t block_offset, - const OEMCrypto_DestBufferDesc* out_buffer, - uint8_t subsample_flags); + const uint8_t *data_addr, + size_t data_length, + bool is_encrypted, + const uint8_t *iv, + size_t block_offset, + const OEMCrypto_DestBufferDesc* out_buffer, + uint8_t subsample_flags); +OEMCryptoResult Level3_CopyBuffer(const uint8_t *data_addr, + size_t data_length, + OEMCrypto_DestBufferDesc* out_buffer, + uint8_t subsample_flags); +OEMCryptoResult Level3_WrapKeybox(const uint8_t *keybox, + size_t keyBoxLength, + uint8_t *wrappedKeybox, + size_t *wrappedKeyBoxLength, + const uint8_t *transportKey, + size_t transportKeyLength); OEMCryptoResult Level3_InstallKeybox(const uint8_t *keybox, size_t keyBoxLength); +OEMCryptoResult Level3_LoadTestKeybox(); OEMCryptoResult Level3_IsKeyboxValid(void); OEMCryptoResult Level3_GetDeviceID(uint8_t* deviceID, size_t *idLength); @@ -113,12 +129,6 @@ OEMCryptoResult Level3_GetKeyData(uint8_t* keyData, size_t *keyDataLength); OEMCryptoResult Level3_GetRandom(uint8_t* randomData, size_t dataLength); -OEMCryptoResult Level3_WrapKeybox(const uint8_t *keybox, - size_t keyBoxLength, - uint8_t *wrappedKeybox, - size_t *wrappedKeyBoxLength, - const uint8_t *transportKey, - size_t transportKeyLength); OEMCryptoResult Level3_RewrapDeviceRSAKey(OEMCrypto_SESSION session, const uint8_t* message, size_t message_length, @@ -148,6 +158,11 @@ OEMCryptoResult Level3_DeriveKeysFromSessionKey(OEMCrypto_SESSION session, size_t enc_key_context_length); uint32_t Level3_APIVersion(); const char* Level3_SecurityLevel(); +OEMCryptoResult Level3_GetHDCPCapability(OEMCrypto_HDCP_Capability* current, + OEMCrypto_HDCP_Capability* maximum); +bool Level3_SupportsUsageTable(); +OEMCryptoResult Level3_GetNumberOfOpenSessions(size_t* count); +OEMCryptoResult Level3_GetMaxNumberOfSessions(size_t* maximum); OEMCryptoResult Level3_Generic_Encrypt(OEMCrypto_SESSION session, const uint8_t* in_buffer, size_t buffer_length, @@ -172,9 +187,6 @@ OEMCryptoResult Level3_Generic_Verify(OEMCrypto_SESSION session, OEMCrypto_Algorithm algorithm, const uint8_t* signature, size_t signature_length); -OEMCryptoResult Level3_GetHDCPCapability(OEMCrypto_HDCP_Capability *current, - OEMCrypto_HDCP_Capability *maximum); -bool Level3_SupportsUsageTable(); OEMCryptoResult Level3_UpdateUsageTable(); OEMCryptoResult Level3_DeactivateUsageEntry(const uint8_t *pst, size_t pst_length); @@ -190,21 +202,11 @@ OEMCryptoResult Level3_DeleteUsageEntry(OEMCrypto_SESSION session, size_t message_length, const uint8_t *signature, size_t signature_length); -OEMCryptoResult Level3_DeleteUsageTable(); -OEMCryptoResult Level3_GetMaxNumberOfSessions(size_t *maximum); -OEMCryptoResult Level3_GetCurrentNumberOfSessions(size_t *count); -OEMCryptoResult Level3_LoadTestKeybox(); -OEMCryptoResult Level3_CopyBuffer(const uint8_t *data_addr, - size_t data_length, - OEMCrypto_DestBufferDesc* out_buffer, - uint8_t subsample_flags); -OEMCryptoResult Level3_QueryKeyControl(OEMCrypto_SESSION session, - const uint8_t* key_id, - size_t key_id_length, - uint8_t* key_control_block, - size_t* key_control_block_length); OEMCryptoResult Level3_ForceDeleteUsageEntry(const uint8_t* pst, size_t pst_length); -}; -} +OEMCryptoResult Level3_DeleteUsageTable(); + +} // extern "C" +} // namespace wvoec3 + #endif // LEVEL3_OEMCRYPTO_H_ diff --git a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp index 626c1cdf..efbb56d2 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp +++ b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp @@ -107,50 +107,6 @@ OEMCryptoResult OEMCrypto_CloseSession(OEMCrypto_SESSION session) { } } -extern "C" -OEMCryptoResult OEMCrypto_GenerateNonce(OEMCrypto_SESSION session, - uint32_t* nonce) { - if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { - LOGI("-- OEMCryptoResult OEMCrypto_GenerateNonce" - "(OEMCrypto_SESSION session,\n"); - } - SessionContext* session_ctx = crypto_engine->FindSession(session); - if (!session_ctx || !session_ctx->isValid()) { - LOGE("[OEMCrypto_GenerateNonce(): ERROR_INVALID_SESSION]"); - return OEMCrypto_ERROR_INVALID_SESSION; - } - - // Prevent nonce flood. - static time_t last_nonce_time = 0; - static int nonce_count = 0; - time_t now = time(NULL); - if (now == last_nonce_time) { - nonce_count++; - if (nonce_count > 20) { - LOGE("[OEMCrypto_GenerateNonce(): Nonce Flood detected]"); - return OEMCrypto_ERROR_UNKNOWN_FAILURE; - } - } else { - nonce_count = 1; - last_nonce_time = now; - } - - uint32_t nonce_value; - uint8_t* nonce_string = reinterpret_cast(&nonce_value); - - // Generate 4 bytes of random data - if (!RAND_bytes(nonce_string, 4)) { - LOGE("[OEMCrypto_GenerateNonce(): Random bytes failure]"); - return OEMCrypto_ERROR_UNKNOWN_FAILURE; - } - session_ctx->AddNonce(nonce_value); - *nonce = nonce_value; - if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { - LOGI("nonce = %08x\n", nonce_value); - } - return OEMCrypto_SUCCESS; -} - extern "C" OEMCryptoResult OEMCrypto_GenerateDerivedKeys(OEMCrypto_SESSION session, const uint8_t* mac_key_context, @@ -200,6 +156,50 @@ OEMCryptoResult OEMCrypto_GenerateDerivedKeys(OEMCrypto_SESSION session, return OEMCrypto_SUCCESS; } +extern "C" +OEMCryptoResult OEMCrypto_GenerateNonce(OEMCrypto_SESSION session, + uint32_t* nonce) { + if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { + LOGI("-- OEMCryptoResult OEMCrypto_GenerateNonce" + "(OEMCrypto_SESSION session,\n"); + } + SessionContext* session_ctx = crypto_engine->FindSession(session); + if (!session_ctx || !session_ctx->isValid()) { + LOGE("[OEMCrypto_GenerateNonce(): ERROR_INVALID_SESSION]"); + return OEMCrypto_ERROR_INVALID_SESSION; + } + + // Prevent nonce flood. + static time_t last_nonce_time = 0; + static int nonce_count = 0; + time_t now = time(NULL); + if (now == last_nonce_time) { + nonce_count++; + if (nonce_count > 20) { + LOGE("[OEMCrypto_GenerateNonce(): Nonce Flood detected]"); + return OEMCrypto_ERROR_UNKNOWN_FAILURE; + } + } else { + nonce_count = 1; + last_nonce_time = now; + } + + uint32_t nonce_value; + uint8_t* nonce_string = reinterpret_cast(&nonce_value); + + // Generate 4 bytes of random data + if (!RAND_bytes(nonce_string, 4)) { + LOGE("[OEMCrypto_GenerateNonce(): Random bytes failure]"); + return OEMCrypto_ERROR_UNKNOWN_FAILURE; + } + session_ctx->AddNonce(nonce_value); + *nonce = nonce_value; + if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { + LOGI("nonce = %08x\n", nonce_value); + } + return OEMCrypto_SUCCESS; +} + extern "C" OEMCryptoResult OEMCrypto_GenerateSignature( OEMCrypto_SESSION session, @@ -298,8 +298,6 @@ OEMCryptoResult OEMCrypto_LoadKeys(OEMCrypto_SESSION session, } } - - if (NO_ERROR != crypto_engine->ValidateKeybox()) { LOGE("[OEMCrypto_LoadKeys(): ERROR_KEYBOX_INVALID]"); return OEMCrypto_ERROR_KEYBOX_INVALID; @@ -546,6 +544,26 @@ OEMCryptoResult OEMCrypto_DecryptCTR(OEMCrypto_SESSION session, is_encrypted, destination, buffer_type); } +extern "C" +OEMCryptoResult OEMCrypto_WrapKeybox(const uint8_t* keybox, + size_t keyBoxLength, + uint8_t* wrappedKeybox, + size_t* wrappedKeyBoxLength, + const uint8_t* transportKey, + size_t transportKeyLength) { + if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { + LOGI("-- OEMCryptoResult OEMCrypto_WrapKeybox(const uint8_t *keybox,\n"); + } + if (!keybox || !wrappedKeybox || !wrappedKeyBoxLength + || (keyBoxLength != *wrappedKeyBoxLength)) { + return OEMCrypto_ERROR_UNKNOWN_FAILURE; + } + // This implementation ignores the transport key. For test keys, we + // don't need to encrypt the keybox. + memcpy(wrappedKeybox, keybox, keyBoxLength); + return OEMCrypto_SUCCESS; +} + extern "C" OEMCryptoResult OEMCrypto_InstallKeybox(const uint8_t* keybox, size_t keyBoxLength) { @@ -635,26 +653,6 @@ OEMCryptoResult OEMCrypto_GetRandom(uint8_t* randomData, size_t dataLength) { return OEMCrypto_ERROR_UNKNOWN_FAILURE; } -extern "C" -OEMCryptoResult OEMCrypto_WrapKeybox(const uint8_t* keybox, - size_t keyBoxLength, - uint8_t* wrappedKeybox, - size_t* wrappedKeyBoxLength, - const uint8_t* transportKey, - size_t transportKeyLength) { - if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { - LOGI("-- OEMCryptoResult OEMCrypto_WrapKeybox(const uint8_t *keybox,\n"); - } - if (!keybox || !wrappedKeybox || !wrappedKeyBoxLength - || (keyBoxLength != *wrappedKeyBoxLength)) { - return OEMCrypto_ERROR_UNKNOWN_FAILURE; - } - // This implementation ignores the transport key. For test keys, we - // don't need to encrypt the keybox. - memcpy(wrappedKeybox, keybox, keyBoxLength); - return OEMCrypto_SUCCESS; -} - extern "C" OEMCryptoResult OEMCrypto_RewrapDeviceRSAKey(OEMCrypto_SESSION session, const uint8_t* message, @@ -1016,6 +1014,27 @@ OEMCryptoResult OEMCrypto_GetHDCPCapability( return OEMCrypto_SUCCESS; } +extern "C" +bool OEMCrypto_SupportsUsageTable() { + bool supports_usage = crypto_engine->supports_storage(); + if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { + LOGI("-- bool OEMCrypto_SupportsUsageTable(); // returns %s.\n", + (supports_usage ? "true" : "false")); + } + return supports_usage; +} + +extern "C" +OEMCryptoResult OEMCrypto_GetMaxNumberOfSessions(size_t* maximum) { + if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { + LOGI("-- OEMCryptoResult OEMCrypto_GetMaxNumberOfSessions(%p)\n", maximum); + } + if (maximum == NULL) return OEMCrypto_ERROR_UNKNOWN_FAILURE; + const size_t kMaxSupportedOEMCryptoSessions = 64; + *maximum = kMaxSupportedOEMCryptoSessions; + return OEMCrypto_SUCCESS; +} + extern "C" OEMCryptoResult OEMCrypto_Generic_Encrypt(OEMCrypto_SESSION session, const uint8_t* in_buffer, @@ -1173,16 +1192,6 @@ OEMCryptoResult OEMCrypto_Generic_Verify(OEMCrypto_SESSION session, signature, signature_length); } -extern "C" -bool OEMCrypto_SupportsUsageTable() { - bool supports_usage = crypto_engine->supports_storage(); - if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { - LOGI("-- bool OEMCrypto_SupportsUsageTable(); // returns %s.\n", - (supports_usage ? "true" : "false")); - } - return supports_usage; -} - extern "C" OEMCryptoResult OEMCrypto_UpdateUsageTable() { if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { @@ -1291,15 +1300,4 @@ OEMCryptoResult OEMCrypto_DeleteUsageTable() { return OEMCrypto_SUCCESS; } -extern "C" -OEMCryptoResult OEMCrypto_GetMaxNumberOfSessions(size_t *maximum) { - if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { - LOGI("-- OEMCryptoResult OEMCrypto_GetMaxNumberOfSessions(%p)\n", maximum); - } - if (maximum == NULL) return OEMCrypto_ERROR_UNKNOWN_FAILURE; - const size_t kMaxSupportedOEMCryptoSessions = 64; - *maximum = kMaxSupportedOEMCryptoSessions; - return OEMCrypto_SUCCESS; -} - } // namespace wvoec_mock