// Copyright 2018 Google LLC. All Rights Reserved. This file and proprietary // source code may only be used and distributed under the Widevine Master // License Agreement. // // Reference implementation of OEMCrypto APIs // // This file contains oemcrypto engine properties that would be for a // level 2 device that does not have persistant storage or a keybox. // Note: this is for illustration only. Production devices are rarely level 2. #include "oemcrypto_engine_ref.h" #include #include #include "log.h" #include "oem_cert.h" namespace wvoec_ref { class Prov30CryptoEngine : public CryptoEngine { public: explicit Prov30CryptoEngine(std::unique_ptr&& file_system) : CryptoEngine(std::move(file_system)) {} bool Initialize() override { if (!CryptoEngine::Initialize()) { return false; } const OEMCryptoResult result = InstallOemCertificate( kOEMPrivateKey, kOEMPrivateKeySize, kOEMPublicCert, kOEMPublicCertSize); return result == OEMCrypto_SUCCESS; } bool config_local_display_only() { return true; } // Returns the max HDCP version supported. OEMCrypto_HDCP_Capability config_maximum_hdcp_capability() { return HDCP_NO_DIGITAL_OUTPUT; } // Returns true if the client supports persistent storage of // offline usage table information. bool config_supports_usage_table() { return false; } // Returns true if the client uses a keybox as the root of trust. bool config_supports_keybox() { return false; } // This version uses an OEM Certificate. OEMCrypto_ProvisioningMethod config_provisioning_method() { return OEMCrypto_OEMCertificate; } // Returns "L3" for a software only library. L1 is for hardware protected // keys and data paths. L2 is for hardware protected keys but no data path // protection. const char* config_security_level() { return "L2"; } }; CryptoEngine* CryptoEngine::MakeCryptoEngine( std::unique_ptr&& file_system) { return new Prov30CryptoEngine(std::move(file_system)); } } // namespace wvoec_ref