diff --git a/libwvdrmengine/cdm/core/include/cdm_engine.h b/libwvdrmengine/cdm/core/include/cdm_engine.h index 892578b1..67e5b29f 100644 --- a/libwvdrmengine/cdm/core/include/cdm_engine.h +++ b/libwvdrmengine/cdm/core/include/cdm_engine.h @@ -45,6 +45,20 @@ class CdmEngine { virtual CdmResponseType SetServiceCertificate( const std::string& certificate); + // Report whether the service certificate has been set. + virtual bool HasServiceCertificate(); + + // Generate and return a Service Certificate Request message. + // This message can be sent to the License Server to get a service + // certificate. + virtual bool GetServiceCertificateRequest(CdmKeyMessage* request); + + // Parse the message returned by the License Server in response to a + // Service Certificate Request message. Return the service certificate + // from the parsed response. + virtual CdmResponseType ParseServiceCertificateResponse( + const std::string& response, std::string* certificate); + // Session related methods virtual CdmResponseType OpenSession( const CdmKeySystem& key_system, CdmClientPropertySet* property_set, diff --git a/libwvdrmengine/cdm/core/include/device_files.h b/libwvdrmengine/cdm/core/include/device_files.h index 1f22860d..81b5547c 100644 --- a/libwvdrmengine/cdm/core/include/device_files.h +++ b/libwvdrmengine/cdm/core/include/device_files.h @@ -53,7 +53,9 @@ class DeviceFiles { virtual bool StoreCertificate(const std::string& certificate, const std::string& wrapped_private_key); virtual bool RetrieveCertificate(std::string* certificate, - std::string* wrapped_private_key); + std::string* wrapped_private_key, + std::string* serial_number, + uint32_t* system_id); virtual bool HasCertificate(); virtual bool RemoveCertificate(); @@ -152,6 +154,11 @@ class DeviceFiles { std::vector* usage_entry_info); private: + // Extract serial number and system ID from DRM Device certificate + bool ExtractDeviceInfo(const std::string& device_certificate, + std::string* serial_number, + uint32_t* system_id); + // Helpers that wrap the File interface and automatically handle hashing, as // well as adding the device files base path to to the file name. bool StoreFileWithHash(const std::string& name, @@ -175,7 +182,7 @@ class DeviceFiles { #if defined(UNIT_TEST) FRIEND_TEST(DeviceFilesSecurityLevelTest, SecurityLevel); FRIEND_TEST(DeviceCertificateStoreTest, StoreCertificate); - FRIEND_TEST(DeviceCertificateTest, ReadCertificate); + FRIEND_TEST(DeviceCertificateTest, DISABLED_ReadCertificate); FRIEND_TEST(DeviceCertificateTest, HasCertificate); FRIEND_TEST(DeviceFilesStoreTest, StoreLicense); FRIEND_TEST(DeviceFilesHlsAttributesTest, Delete); diff --git a/libwvdrmengine/cdm/core/include/license.h b/libwvdrmengine/cdm/core/include/license.h index dbfa37f2..11fc062e 100644 --- a/libwvdrmengine/cdm/core/include/license.h +++ b/libwvdrmengine/cdm/core/include/license.h @@ -29,8 +29,8 @@ class CdmLicense { virtual bool Init( ServiceCertificate* service_certificate, const std::string& client_token, - CdmClientTokenType client_token_type, CryptoSession* session, - PolicyEngine* policy_engine); + CdmClientTokenType client_token_type, const std::string& device_id, + CryptoSession* session, PolicyEngine* policy_engine); virtual CdmResponseType PrepareKeyRequest( const InitializationData& init_data, CdmLicenseType license_type, @@ -52,7 +52,6 @@ class CdmLicense { int64_t grace_period_end_time); virtual bool RestoreLicenseForRelease(const CdmKeyMessage& license_request, const CdmKeyResponse& license_response); - virtual bool HasInitData() { return stored_init_data_.get(); } virtual bool IsKeyLoaded(const KeyId& key_id); virtual std::string provider_session_token() { @@ -89,8 +88,8 @@ class CdmLicense { std::string server_url_; std::string client_token_; CdmClientTokenType client_token_type_; + std::string device_id_; const CdmSessionId session_id_; - scoped_ptr stored_init_data_; bool initialized_; std::set loaded_keys_; std::string provider_session_token_; diff --git a/libwvdrmengine/cdm/core/include/service_certificate.h b/libwvdrmengine/cdm/core/include/service_certificate.h index d185eecf..e9f0e88b 100644 --- a/libwvdrmengine/cdm/core/include/service_certificate.h +++ b/libwvdrmengine/cdm/core/include/service_certificate.h @@ -11,13 +11,11 @@ // Certificate Request to the target server to get one. Once the Service // Certificate is established for the session, it should not change. -#include "license_protocol.pb.h" -#include "wv_cdm_types.h" +#include -namespace video_widevine { -class SignedMessage; -class LicenseRequest; -} // namespace video_widevine +#include "license_protocol.pb.h" +#include "privacy_crypto.h" +#include "wv_cdm_types.h" namespace wvcdm { @@ -25,23 +23,16 @@ class CryptoSession; class ServiceCertificate { public: - ServiceCertificate() {} + ServiceCertificate() : has_certificate_(false) {} virtual ~ServiceCertificate() {} // Set up a new service certificate. // Accept a serialized video_widevine::SignedDrmDeviceCertificate message. virtual CdmResponseType Init(const std::string& signed_certificate); - // Initialize the service certificate. - // Set the certificate with no certificate and provider ID. - virtual void Clear(); - - // Current state of certificate. - // If !HasCertificate() and privacy mode is enabled, then should call - // PrepareRequest() and pass the request to the license server. - virtual bool HasCertificate() { return !certificate_.empty(); } - virtual bool HasProviderId() { return !provider_id_.empty(); } - virtual const std::string& provider_id() { return provider_id_; } + bool has_certificate() const { return has_certificate_; } + const std::string certificate() const { return certificate_; } + const std::string& provider_id() const { return provider_id_; } // Verify the signature for a message. virtual CdmResponseType VerifySignedMessage(const std::string& message, @@ -58,29 +49,23 @@ class ServiceCertificate { const video_widevine::ClientIdentification* clear_client_id, video_widevine::EncryptedClientIdentification* encrypted_client_id); - // Construct service certificate request. - virtual bool PrepareRequest(CdmKeyMessage* signed_request); - - // Parse service certificate response and make it usable. - virtual CdmResponseType HandleResponse( - const std::string& signed_respnse); - private: - // Verify the signature on the signed service certificate. - // Extract and save the certificate and provider_id. - // Expected format: serialized video_widevine::SignedDrmDeviceCertificate. - virtual CdmResponseType VerifyAndExtract( - const std::string& raw_certificate); - // True while waiting for response to service certificate request. - bool fetch_in_progress_; + // Track whether object holds valid certificate + bool has_certificate_; // Certificate, verified and extracted from signed message. std::string certificate_; + // Certificate serial number. + std::string serial_number_; + // Provider ID, extracted from certificate message. std::string provider_id_; + // Public key. + std::unique_ptr public_key_; + CORE_DISALLOW_COPY_AND_ASSIGN(ServiceCertificate); }; diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index cfce6c07..1cbefb88 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -179,9 +179,10 @@ enum CdmResponseType { UNPROVISION_ERROR_4, UNSUPPORTED_INIT_DATA, USAGE_INFO_NOT_FOUND, - LICENSE_RENEWAL_SERVICE_CERTIFICATE_GENERATION_ERROR, /* 140 */ + UNUSED_8, /* 140 */ + /* UNUSED_8 previously LICENSE_RENEWAL_SERVICE_CERTIFICATE_GENERATION_ERROR */ PARSE_SERVICE_CERTIFICATE_ERROR, - SERVICE_CERTIFICATE_TYPE_ERROR, + UNUSED_10, /* previously SERVICE_CERTIFICATE_TYPE_ERROR */ CLIENT_ID_GENERATE_RANDOM_ERROR, CLIENT_ID_AES_INIT_ERROR, CLIENT_ID_AES_ENCRYPT_ERROR, /* 145 */ @@ -196,7 +197,8 @@ enum CdmResponseType { UNUSED_2, /* previously INVALID_PARAMETERS_LIC_5 */ INVALID_PARAMETERS_LIC_6, INVALID_PARAMETERS_LIC_7, /* 155 */ - LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR, + UNUSED_9, + /* UNUSED_9 previously LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR */ CENC_INIT_DATA_UNAVAILABLE, PREPARE_CENC_CONTENT_ID_FAILED, WEBM_INIT_DATA_UNAVAILABLE, @@ -303,6 +305,15 @@ enum CdmResponseType { DELETE_USAGE_ERROR_1, /* 260 */ DELETE_USAGE_ERROR_2, DELETE_USAGE_ERROR_3, + PRIVACY_MODE_ERROR_1, + PRIVACY_MODE_ERROR_2, + PRIVACY_MODE_ERROR_3, /* 265 */ + EMPTY_RESPONSE_ERROR_1, + INVALID_PARAMETERS_ENG_24, + PARSE_RESPONSE_ERROR_1, + PARSE_RESPONSE_ERROR_2, + PARSE_RESPONSE_ERROR_3, /* 270 */ + PARSE_RESPONSE_ERROR_4, }; enum CdmKeyStatus { @@ -322,9 +333,6 @@ enum CdmLicenseType { kLicenseTypeOffline, kLicenseTypeStreaming, kLicenseTypeRelease, - // If the original request was saved to make a service certificate request, - // use Deferred for the license type in the subsequent request. - kLicenseTypeDeferred, // Like Streaming, but stricter. Does not permit storage of any kind. // Named after the 'temporary' session type in EME, which has this behavior. kLicenseTypeTemporary, diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index 707ba68c..062d61f4 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -30,6 +30,9 @@ const size_t kUsageReportsPerRequest = 1; namespace wvcdm { +using video_widevine::SignedMessage; +using video_widevine::LicenseError; + class UsagePropertySet : public CdmClientPropertySet { public: UsagePropertySet() {} @@ -84,6 +87,82 @@ CdmResponseType CdmEngine::SetServiceCertificate( return service_certificate_.Init(certificate); } +bool CdmEngine::HasServiceCertificate() { + return service_certificate_.has_certificate(); +} + +bool CdmEngine::GetServiceCertificateRequest(CdmKeyMessage* request) { + if (!request) { + LOGE("ServiceCertificate::PrepareRequest: no request parameter provided"); + return false; + } + SignedMessage message; + message.set_type(SignedMessage::SERVICE_CERTIFICATE_REQUEST); + message.SerializeToString(request); + + // Convert to base64. + std::vector request_vector(request->begin(), request->end()); + std::string request_b64 = Base64SafeEncodeNoPad(request_vector); + request->swap(request_b64); + return true; +} + +CdmResponseType CdmEngine::ParseServiceCertificateResponse( + const std::string& response, std::string* certificate) { + if (response.empty()) { + LOGE("CdmEngine::ParseServiceCertificateResponse: empty response"); + return EMPTY_RESPONSE_ERROR_1; + } + if (!certificate) { + LOGE("CdmEngine::ParseServiceCertificateResponse: null return parameter"); + return INVALID_PARAMETERS_ENG_24; + } + + // The response is base64 encoded - decode it before parsing the string. + std::string padded_response(response); + while (padded_response.size() % 4 != 0) { + padded_response = padded_response + "="; + } + std::vector raw_message = Base64SafeDecode(padded_response); + std::string raw_string(raw_message.begin(), raw_message.end()); + + SignedMessage signed_response; + if (!signed_response.ParseFromString(raw_string)) { + LOGE( + "CdmEngine::ParseServiceCertificateResponse: cannot parse response"); + return PARSE_RESPONSE_ERROR_1; + } + if (signed_response.type() == SignedMessage::SERVICE_CERTIFICATE) { + + CdmResponseType status; + status = service_certificate_.Init(signed_response.msg()); + if (status != NO_ERROR) { + LOGE( + "CdmEngine::ParseServiceCertificateResponse: certificate handling " + "failure, status=%d", status); + return PARSE_SERVICE_CERTIFICATE_ERROR; + } + certificate->assign(signed_response.msg()); + + } else if (signed_response.type() == SignedMessage::ERROR_RESPONSE) { + + LicenseError license_error; + if (!license_error.ParseFromString(signed_response.msg())) { + LOGE("CdmEngine::ParseServiceCertificateResponse: cannot parse " + "license error"); + return PARSE_RESPONSE_ERROR_2; + } + LOGE("CdmEngine::ParseServiceCertificateResponse: server returned error:" + "error code = %d", license_error.error_code()); + return PARSE_RESPONSE_ERROR_3; + } else { + LOGE( + "CdmEngine::ParseServiceCertificateResponse: response is wrong type"); + return PARSE_RESPONSE_ERROR_4; + } + return NO_ERROR; +} + CdmResponseType CdmEngine::OpenSession( const CdmKeySystem& key_system, CdmClientPropertySet* property_set, const CdmSessionId& forced_session_id, WvCdmEventListener* event_listener) { diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index 984edddd..e2551c8a 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -102,6 +102,7 @@ CdmResponseType CdmSession::Init( // client_token and client_token_type are determined here; they are needed // to initialize the license parser. std::string client_token; + std::string serial_number; CdmClientTokenType client_token_type = crypto_session_->GetPreProvisionTokenType(); if ((client_token_type == kClientTokenKeybox) && @@ -124,7 +125,8 @@ CdmResponseType CdmSession::Init( // License server client ID token is a stored certificate. Stage it or // indicate that provisioning is needed. Get token from stored certificate std::string wrapped_key; - if (!file_handle_->RetrieveCertificate(&client_token, &wrapped_key)) { + if (!file_handle_->RetrieveCertificate(&client_token, &wrapped_key, + &serial_number, nullptr)) { return NEED_PROVISIONING; } bool load_cert_sts; @@ -169,7 +171,7 @@ CdmResponseType CdmSession::Init( if (!license_parser_->Init( service_certificate, client_token, client_token_type, - crypto_session_.get(), policy_engine_.get())) + serial_number, crypto_session_.get(), policy_engine_.get())) return LICENSE_PARSER_INIT_ERROR; license_received_ = false; @@ -274,26 +276,6 @@ CdmResponseType CdmSession::GenerateKeyRequest( case kLicenseTypeRelease: is_release_ = true; break; - case kLicenseTypeDeferred: - // If you're going to pass Deferred, you must have empty init data in - // this call and stored init data from the previous call. - if (!init_data.IsEmpty() || !license_parser_->HasInitData()) { - return INVALID_LICENSE_TYPE; - } - // The arguments check out. - // The is_release_ and is_offline_ flags were already set last time based - // on the original license type. Do not change them, and use them to - // re-derive the original license type. - if (is_release_) { - license_type = kLicenseTypeRelease; - } else if (is_offline_) { - license_type = kLicenseTypeOffline; - } else if (is_temporary_) { - license_type = kLicenseTypeTemporary; - } else { - license_type = kLicenseTypeStreaming; - } - break; default: LOGE("CdmSession::GenerateKeyRequest: unrecognized license type: %ld", license_type); @@ -307,16 +289,14 @@ CdmResponseType CdmSession::GenerateKeyRequest( } else { key_request->type = kKeyRequestTypeInitial; - if (!license_parser_->HasInitData()) { - if (!init_data.is_supported()) { - LOGW("CdmSession::GenerateKeyRequest: unsupported init data type (%s)", - init_data.type().c_str()); - return UNSUPPORTED_INIT_DATA; - } - if (init_data.IsEmpty()) { - LOGW("CdmSession::GenerateKeyRequest: init data absent"); - return INIT_DATA_NOT_FOUND; - } + if (!init_data.is_supported()) { + LOGW("CdmSession::GenerateKeyRequest: unsupported init data type (%s)", + init_data.type().c_str()); + return UNSUPPORTED_INIT_DATA; + } + if (init_data.IsEmpty()) { + LOGW("CdmSession::GenerateKeyRequest: init data absent"); + return INIT_DATA_NOT_FOUND; } if (is_offline_ && key_set_id_.empty()) { LOGE("CdmSession::GenerateKeyRequest: Unable to generate key set ID"); @@ -328,16 +308,14 @@ CdmResponseType CdmSession::GenerateKeyRequest( init_data, license_type, app_parameters, &key_request->message, &key_request->url); - - if (KEY_MESSAGE != status) return status; + if (status != KEY_MESSAGE) + return status; key_request_ = key_request->message; if (is_offline_) { offline_init_data_ = init_data.data(); offline_release_server_url_ = key_request->url; - } - return KEY_MESSAGE; } } diff --git a/libwvdrmengine/cdm/core/src/cdm_session_map.cpp b/libwvdrmengine/cdm/core/src/cdm_session_map.cpp new file mode 100644 index 00000000..6fb06446 --- /dev/null +++ b/libwvdrmengine/cdm/core/src/cdm_session_map.cpp @@ -0,0 +1,71 @@ +// Copyright 2017 Google Inc. All Rights Reserved. + +#include "cdm_session_map.h" + +#include + +#include "cdm_session.h" +#include "log.h" + +namespace wvcdm { + +CdmSessionMap::~CdmSessionMap() { + AutoLock lock(lock_); + for (CdmIdToSessionMap::iterator i = sessions_.begin(); + i != sessions_.end(); ++i) { + i->second->Close(); + i->second.reset(); + } + sessions_.clear(); +} + +void CdmSessionMap::Add(const std::string& id, CdmSession* session) { + AutoLock lock(lock_); + sessions_[id].reset(session); +} + +bool CdmSessionMap::CloseSession(const std::string& id) { + AutoLock lock(lock_); + std::shared_ptr session; + if (!FindSessionNoLock(id, &session)) { + return false; + } + session->Close(); + sessions_.erase(id); + return true; +} + +bool CdmSessionMap::Exists(const std::string& id) { + AutoLock lock(lock_); + return sessions_.find(id) != sessions_.end(); +} + +bool CdmSessionMap::FindSession(const CdmSessionId& id, + std::shared_ptr* session) { + AutoLock lock(lock_); + return FindSessionNoLock(id, session); +} + +bool CdmSessionMap::FindSessionNoLock(const CdmSessionId& session_id, + std::shared_ptr* session) { + CdmIdToSessionMap::iterator iter = sessions_.find(session_id); + if (iter == sessions_.end()) { + return false; + } + *session = iter->second; + assert(session->get() != NULL); + return true; +} + +void CdmSessionMap::GetSessionList(CdmSessionList& sessions) { + sessions.clear(); + AutoLock lock(lock_); + for (CdmIdToSessionMap::iterator iter = sessions_.begin(); + iter != sessions_.end(); ++iter) { + if (!(iter->second)->IsClosed()) { + sessions.push_back(iter->second); + } + } +} + +} // namespace wvcdm diff --git a/libwvdrmengine/cdm/core/src/certificate_provisioning.cpp b/libwvdrmengine/cdm/core/src/certificate_provisioning.cpp index 5b0c2de3..b50dbda5 100644 --- a/libwvdrmengine/cdm/core/src/certificate_provisioning.cpp +++ b/libwvdrmengine/cdm/core/src/certificate_provisioning.cpp @@ -115,7 +115,7 @@ bool CertificateProvisioning::SetSpoidParameter( // Use the SPOID that has been pre-provided request->set_spoid(spoid); } else if (Properties::UseProviderIdInProvisioningRequest()) { - if (service_certificate_->HasProviderId()) { + if (!service_certificate_->provider_id().empty()) { request->set_provider_id(service_certificate_->provider_id()); } else { LOGE("CertificateProvisioning::SetSpoidParameter: Failure getting " @@ -190,7 +190,7 @@ CdmResponseType CertificateProvisioning::GetProvisioningRequest( client_id->set_type(token_type); #if 0 // TODO(gmorgan) Encrypt ClientIdentification. Pending Design. - if (service_certificate_->has_certificate()) { + if (service_certificate_->HasCertificate()) { EncryptedClientIdentification* encrypted_client_id = provisioning_request.mutable_encrypted_client_id(); CdmResponseType status; @@ -329,7 +329,8 @@ CdmResponseType CertificateProvisioning::HandleProvisioningResponse( // If Provisioning 3.0 (OEM Cert provisioned), verify that the // message is properly signed. if (crypto_session_.GetPreProvisionTokenType() == kClientTokenOemCert) { - if (!service_certificate_->VerifySignedMessage(signed_message, signature)) { + if (service_certificate_->VerifySignedMessage(signed_message, signature) + != NO_ERROR) { LOGE("HandleProvisioningResponse: message not properly signed"); return CERT_PROVISIONING_RESPONSE_ERROR_6; } diff --git a/libwvdrmengine/cdm/core/src/device_files.cpp b/libwvdrmengine/cdm/core/src/device_files.cpp index 119faee6..cd58e88b 100644 --- a/libwvdrmengine/cdm/core/src/device_files.cpp +++ b/libwvdrmengine/cdm/core/src/device_files.cpp @@ -6,6 +6,7 @@ #include #include "file_store.h" +#include "license_protocol.pb.h" #include "log.h" #include "properties.h" #include "string_conversions.h" @@ -41,6 +42,9 @@ using video_widevine_client::sdk:: using video_widevine_client::sdk:: UsageTableInfo_UsageEntryInfo_UsageEntryStorage_USAGE_INFO; +using video_widevine::SignedDrmDeviceCertificate; +using video_widevine::DrmDeviceCertificate; + namespace { const char kCertificateFileName[] = "cert.bin"; @@ -117,7 +121,9 @@ bool DeviceFiles::StoreCertificate(const std::string& certificate, } bool DeviceFiles::RetrieveCertificate(std::string* certificate, - std::string* wrapped_private_key) { + std::string* wrapped_private_key, + std::string* serial_number, + uint32_t* system_id) { if (!initialized_) { LOGW("DeviceFiles::RetrieveCertificate: not initialized"); return false; @@ -146,6 +152,42 @@ bool DeviceFiles::RetrieveCertificate(std::string* certificate, DeviceCertificate device_certificate = file.device_certificate(); *certificate = device_certificate.certificate(); *wrapped_private_key = device_certificate.wrapped_private_key(); + return ExtractDeviceInfo(device_certificate.certificate(), serial_number, + system_id); +} + +bool DeviceFiles::ExtractDeviceInfo(const std::string& device_certificate, + std::string* serial_number, + uint32_t* system_id) { + LOGI("ExtractDeviceInfo Entry"); + if (!serial_number && !system_id) { + LOGE("Invalid paramters to DeviceFiles::ExtractDeviceInfo"); + return false; + } + + // Get serial number and system ID from certificate + SignedDrmDeviceCertificate signed_drm_device_certificate; + if (!signed_drm_device_certificate.ParseFromString(device_certificate) || + !signed_drm_device_certificate.has_drm_certificate()) { + LOGE("DeviceFiles::ExtractDeviceInfo: fails parsing signed drm device " + "certificate."); + return false; + } + DrmDeviceCertificate drm_device_certificate; + if (!drm_device_certificate.ParseFromString( + signed_drm_device_certificate.drm_certificate()) || + (drm_device_certificate.type() != + video_widevine::DrmDeviceCertificate::DRM_USER_DEVICE)) { + LOGE("DeviceFiles::ExtractDeviceInfo: fails parsing drm device " + "certificate message."); + return false; + } + if (serial_number != NULL) { + *serial_number = drm_device_certificate.serial_number(); + } + if (system_id != NULL) { + *system_id = drm_device_certificate.system_id(); + } return true; } diff --git a/libwvdrmengine/cdm/core/src/license.cpp b/libwvdrmengine/cdm/core/src/license.cpp index 07664681..8bef079c 100644 --- a/libwvdrmengine/cdm/core/src/license.cpp +++ b/libwvdrmengine/cdm/core/src/license.cpp @@ -19,16 +19,16 @@ #include "wv_cdm_constants.h" namespace { -std::string kCompanyNameKey = "company_name"; -std::string kModelNameKey = "model_name"; -std::string kArchitectureNameKey = "architecture_name"; -std::string kDeviceNameKey = "device_name"; -std::string kProductNameKey = "product_name"; -std::string kBuildInfoKey = "build_info"; -std::string kDeviceIdKey = "device_id"; -std::string kWVCdmVersionKey = "widevine_cdm_version"; -std::string kOemCryptoSecurityPatchLevelKey = "oem_crypto_security_patch_level"; -} // namespace +const std::string kCompanyNameKey = "company_name"; +const std::string kModelNameKey = "model_name"; +const std::string kArchitectureNameKey = "architecture_name"; +const std::string kDeviceNameKey = "device_name"; +const std::string kProductNameKey = "product_name"; +const std::string kBuildInfoKey = "build_info"; +const std::string kDeviceIdKey = "device_id"; +const std::string kWVCdmVersionKey = "widevine_cdm_version"; +const std::string kOemCryptoSecurityPatchLevelKey = + "oem_crypto_security_patch_level"; const uint32_t kFourCcCbc1 = 0x63626331; const uint32_t kFourCcCbcs = 0x63626373; @@ -37,13 +37,13 @@ const uint32_t kFourCcLittleEndianCbcs = 0x73636263; const uint32_t kFourCcCenc = 0x63656e63; const uint32_t kFourCcCens = 0x63656e73; +} // namespace + namespace wvcdm { // Protobuf generated classes. using video_widevine::ClientIdentification; using video_widevine::ClientIdentification_ClientCapabilities; -using video_widevine:: - ClientIdentification_ClientCapabilities_CertificateKeyType; using video_widevine::ClientIdentification_NameValue; using video_widevine::DrmDeviceCertificate; using video_widevine::EncryptedClientIdentification; @@ -146,8 +146,8 @@ CdmLicense::~CdmLicense() {} bool CdmLicense::Init( ServiceCertificate* service_certificate, const std::string& client_token, - CdmClientTokenType client_token_type, CryptoSession* session, - PolicyEngine* policy_engine) { + CdmClientTokenType client_token_type, const std::string& device_id, + CryptoSession* session, PolicyEngine* policy_engine) { if (clock_.get() == NULL) { LOGE("CdmLicense::Init: clock parameter not provided"); return false; @@ -172,6 +172,7 @@ bool CdmLicense::Init( service_certificate_ = service_certificate; client_token_ = client_token; client_token_type_ = client_token_type; + device_id_ = device_id; crypto_session_ = session; policy_engine_ = policy_engine; initialized_ = true; @@ -186,12 +187,6 @@ CdmResponseType CdmLicense::PrepareKeyRequest( LOGE("CdmLicense::PrepareKeyRequest: not initialized"); return LICENSE_PARSER_NOT_INITIALIZED_4; } - if (init_data.IsEmpty() && stored_init_data_.get()) { - InitializationData restored_init_data = *stored_init_data_; - stored_init_data_.reset(); - return PrepareKeyRequest(restored_init_data, license_type, app_parameters, - signed_request, server_url); - } if (!init_data.is_supported()) { LOGE("CdmLicense::PrepareKeyRequest: unsupported init data type (%s)", init_data.type().c_str()); @@ -213,13 +208,10 @@ CdmResponseType CdmLicense::PrepareKeyRequest( // If privacy mode and no service certificate, initiate a // service certificate request. if (Properties::UsePrivacyMode(session_id_) && - !service_certificate_->HasCertificate()) { - stored_init_data_.reset(new InitializationData(init_data)); - *server_url = server_url_; - if (service_certificate_->PrepareRequest(signed_request)) { - return KEY_MESSAGE; - } - return LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR; + !service_certificate_->has_certificate()) { + LOGE("CdmLicense::PrepareKeyRequest: failure with privacy mode - " + "no service certificate."); + return PRIVACY_MODE_ERROR_1; } std::string request_id; @@ -304,12 +296,10 @@ CdmResponseType CdmLicense::PrepareKeyUpdateRequest( if (renew_with_client_id_) { if (Properties::UsePrivacyMode(session_id_) && - !service_certificate_->HasCertificate()) { - *server_url = server_url_; - if (service_certificate_->PrepareRequest(signed_request)) { - return KEY_MESSAGE; - } - return LICENSE_RENEWAL_SERVICE_CERTIFICATE_GENERATION_ERROR; + !service_certificate_->has_certificate()) { + LOGE("CdmLicense::PrepareKeyUpdateRequest: failure with privacy mode - " + "no service certificate."); + return PRIVACY_MODE_ERROR_2; } } @@ -424,14 +414,6 @@ CdmResponseType CdmLicense::HandleKeyResponse( switch (signed_response.type()) { case SignedMessage::LICENSE: break; - case SignedMessage::SERVICE_CERTIFICATE: { - CdmResponseType status; - status = service_certificate_->HandleResponse(signed_response.msg()); - if (status != NO_ERROR) { - return status; - } - return NEED_KEY; - } case SignedMessage::ERROR_RESPONSE: return HandleKeyErrorResponse(signed_response); default: @@ -543,14 +525,6 @@ CdmResponseType CdmLicense::HandleKeyUpdateResponse( switch (signed_response.type()) { case SignedMessage::LICENSE: break; - case SignedMessage::SERVICE_CERTIFICATE: { - CdmResponseType status; - status = service_certificate_->HandleResponse(signed_response.msg()); - if (status != NO_ERROR) { - return status; - } - return NEED_KEY; - } case SignedMessage::ERROR_RESPONSE: return HandleKeyErrorResponse(signed_response); default: @@ -876,7 +850,11 @@ CdmResponseType CdmLicense::PrepareClientId( client_info->set_name(kBuildInfoKey); client_info->set_value(value); } - if (crypto_session_->GetInternalDeviceUniqueId(&value)) { + if (!device_id_.empty()) { + client_info = client_id->add_client_info(); + client_info->set_name(kDeviceIdKey); + client_info->set_value(b2a_hex(device_id_)); + } else if (crypto_session_->GetInternalDeviceUniqueId(&value)) { client_info = client_id->add_client_info(); client_info->set_name(kDeviceIdKey); client_info->set_value(value); @@ -969,9 +947,9 @@ CdmResponseType CdmLicense::PrepareClientId( client_capabilities->set_srm_version(srm_version); if (Properties::UsePrivacyMode(session_id_)) { - if (!service_certificate_->HasCertificate()) { + if (service_certificate_->certificate().empty()) { LOGE("CdmLicense::PrepareClientId: Service Certificate not staged"); - return LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR; + return PRIVACY_MODE_ERROR_3; } EncryptedClientIdentification* encrypted_client_id = license_request->mutable_encrypted_client_id(); diff --git a/libwvdrmengine/cdm/core/src/privacy_crypto_openssl.cpp b/libwvdrmengine/cdm/core/src/privacy_crypto_openssl.cpp index c5f89ebd..c489cb25 100644 --- a/libwvdrmengine/cdm/core/src/privacy_crypto_openssl.cpp +++ b/libwvdrmengine/cdm/core/src/privacy_crypto_openssl.cpp @@ -199,7 +199,8 @@ static bool VerifyPSSSignature(EVP_PKEY *pkey, const std::string &message, goto err; } - if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) != 1) { + if (EVP_PKEY_CTX_set_signature_md(pctx, + const_cast(EVP_sha1())) != 1) { LOGE("EVP_PKEY_CTX_set_signature_md failed in VerifyPSSSignature"); goto err; } diff --git a/libwvdrmengine/cdm/core/src/service_certificate.cpp b/libwvdrmengine/cdm/core/src/service_certificate.cpp index 73f7586a..cf2b9815 100644 --- a/libwvdrmengine/cdm/core/src/service_certificate.cpp +++ b/libwvdrmengine/cdm/core/src/service_certificate.cpp @@ -11,41 +11,214 @@ namespace { // Service certificate for Google/Widevine Provisioning and License servers. -const unsigned char kServiceCertificateCAPublicKey[] = { - 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xb4, 0xfe, 0x39, - 0xc3, 0x65, 0x90, 0x03, 0xdb, 0x3c, 0x11, 0x97, 0x09, 0xe8, 0x68, 0xcd, - 0xf2, 0xc3, 0x5e, 0x9b, 0xf2, 0xe7, 0x4d, 0x23, 0xb1, 0x10, 0xdb, 0x87, - 0x65, 0xdf, 0xdc, 0xfb, 0x9f, 0x35, 0xa0, 0x57, 0x03, 0x53, 0x4c, 0xf6, - 0x6d, 0x35, 0x7d, 0xa6, 0x78, 0xdb, 0xb3, 0x36, 0xd2, 0x3f, 0x9c, 0x40, - 0xa9, 0x95, 0x26, 0x72, 0x7f, 0xb8, 0xbe, 0x66, 0xdf, 0xc5, 0x21, 0x98, - 0x78, 0x15, 0x16, 0x68, 0x5d, 0x2f, 0x46, 0x0e, 0x43, 0xcb, 0x8a, 0x84, - 0x39, 0xab, 0xfb, 0xb0, 0x35, 0x80, 0x22, 0xbe, 0x34, 0x23, 0x8b, 0xab, - 0x53, 0x5b, 0x72, 0xec, 0x4b, 0xb5, 0x48, 0x69, 0x53, 0x3e, 0x47, 0x5f, - 0xfd, 0x09, 0xfd, 0xa7, 0x76, 0x13, 0x8f, 0x0f, 0x92, 0xd6, 0x4c, 0xdf, - 0xae, 0x76, 0xa9, 0xba, 0xd9, 0x22, 0x10, 0xa9, 0x9d, 0x71, 0x45, 0xd6, - 0xd7, 0xe1, 0x19, 0x25, 0x85, 0x9c, 0x53, 0x9a, 0x97, 0xeb, 0x84, 0xd7, - 0xcc, 0xa8, 0x88, 0x82, 0x20, 0x70, 0x26, 0x20, 0xfd, 0x7e, 0x40, 0x50, - 0x27, 0xe2, 0x25, 0x93, 0x6f, 0xbc, 0x3e, 0x72, 0xa0, 0xfa, 0xc1, 0xbd, - 0x29, 0xb4, 0x4d, 0x82, 0x5c, 0xc1, 0xb4, 0xcb, 0x9c, 0x72, 0x7e, 0xb0, - 0xe9, 0x8a, 0x17, 0x3e, 0x19, 0x63, 0xfc, 0xfd, 0x82, 0x48, 0x2b, 0xb7, - 0xb2, 0x33, 0xb9, 0x7d, 0xec, 0x4b, 0xba, 0x89, 0x1f, 0x27, 0xb8, 0x9b, - 0x88, 0x48, 0x84, 0xaa, 0x18, 0x92, 0x0e, 0x65, 0xf5, 0xc8, 0x6c, 0x11, - 0xff, 0x6b, 0x36, 0xe4, 0x74, 0x34, 0xca, 0x8c, 0x33, 0xb1, 0xf9, 0xb8, - 0x8e, 0xb4, 0xe6, 0x12, 0xe0, 0x02, 0x98, 0x79, 0x52, 0x5e, 0x45, 0x33, - 0xff, 0x11, 0xdc, 0xeb, 0xc3, 0x53, 0xba, 0x7c, 0x60, 0x1a, 0x11, 0x3d, - 0x00, 0xfb, 0xd2, 0xb7, 0xaa, 0x30, 0xfa, 0x4f, 0x5e, 0x48, 0x77, 0x5b, - 0x17, 0xdc, 0x75, 0xef, 0x6f, 0xd2, 0x19, 0x6d, 0xdc, 0xbe, 0x7f, 0xb0, - 0x78, 0x8f, 0xdc, 0x82, 0x60, 0x4c, 0xbf, 0xe4, 0x29, 0x06, 0x5e, 0x69, - 0x8c, 0x39, 0x13, 0xad, 0x14, 0x25, 0xed, 0x19, 0xb2, 0xf2, 0x9f, 0x01, - 0x82, 0x0d, 0x56, 0x44, 0x88, 0xc8, 0x35, 0xec, 0x1f, 0x11, 0xb3, 0x24, - 0xe0, 0x59, 0x0d, 0x37, 0xe4, 0x47, 0x3c, 0xea, 0x4b, 0x7f, 0x97, 0x31, - 0x1c, 0x81, 0x7c, 0x94, 0x8a, 0x4c, 0x7d, 0x68, 0x15, 0x84, 0xff, 0xa5, - 0x08, 0xfd, 0x18, 0xe7, 0xe7, 0x2b, 0xe4, 0x47, 0x27, 0x12, 0x11, 0xb8, - 0x23, 0xec, 0x58, 0x93, 0x3c, 0xac, 0x12, 0xd2, 0x88, 0x6d, 0x41, 0x3d, - 0xc5, 0xfe, 0x1c, 0xdc, 0xb9, 0xf8, 0xd4, 0x51, 0x3e, 0x07, 0xe5, 0x03, - 0x6f, 0xa7, 0x12, 0xe8, 0x12, 0xf7, 0xb5, 0xce, 0xa6, 0x96, 0x55, 0x3f, - 0x78, 0xb4, 0x64, 0x82, 0x50, 0xd2, 0x33, 0x5f, 0x91, 0x02, 0x03, 0x01, - 0x00, 0x01}; +static const unsigned char kRootCertForDev[] = { + 0x0a, 0x9c, 0x03, 0x08, 0x00, 0x12, 0x01, 0x00, + 0x18, 0xc3, 0x94, 0x88, 0x8b, 0x05, 0x22, 0x8e, + 0x03, 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, + 0x81, 0x00, 0xc0, 0x00, 0x36, 0x6f, 0x8e, 0xe9, + 0xcf, 0x86, 0xdb, 0xcd, 0xdd, 0x4e, 0xfd, 0xcd, + 0x45, 0xbf, 0x6d, 0x96, 0x05, 0x00, 0xb8, 0x72, + 0xff, 0x9c, 0xb4, 0x39, 0xa8, 0xd8, 0xc0, 0x09, + 0x73, 0xc0, 0x24, 0x6a, 0x39, 0x4d, 0x36, 0x3f, + 0x9a, 0xe4, 0xb8, 0x76, 0xdc, 0x34, 0xe3, 0xee, + 0x5f, 0xdd, 0x13, 0x20, 0x08, 0xdc, 0x4e, 0x6f, + 0x4e, 0x9f, 0xc0, 0x36, 0xf9, 0xce, 0xc6, 0xb7, + 0xdb, 0xe0, 0x51, 0x2d, 0x30, 0x0b, 0xae, 0x0a, + 0x20, 0xd2, 0x29, 0x3c, 0x2c, 0x1d, 0x87, 0x65, + 0xeb, 0x5f, 0x93, 0xd7, 0x3f, 0x12, 0x08, 0x50, + 0x0e, 0x55, 0xf3, 0xf1, 0x19, 0xee, 0x18, 0x21, + 0x6e, 0xea, 0xb6, 0x0a, 0x4a, 0x0b, 0x9c, 0x72, + 0x37, 0xeb, 0x0b, 0x68, 0xfc, 0x52, 0x46, 0x62, + 0xd0, 0xa2, 0x99, 0x66, 0xe2, 0x2b, 0x74, 0xdd, + 0x5c, 0xaf, 0x9a, 0x03, 0xc4, 0x5d, 0x93, 0xfb, + 0xcd, 0x45, 0x9a, 0xee, 0xfb, 0x7b, 0x18, 0x94, + 0xc1, 0x8c, 0x82, 0x34, 0x7f, 0x02, 0x12, 0x21, + 0xfc, 0x40, 0xc1, 0x50, 0xc9, 0xf4, 0x7c, 0xd5, + 0x96, 0xbe, 0x55, 0x7f, 0x3c, 0x1d, 0x70, 0x34, + 0xb4, 0xa2, 0x03, 0xc4, 0x3f, 0x89, 0x60, 0xe4, + 0x24, 0x09, 0x1a, 0x74, 0xc4, 0xb6, 0x39, 0xf0, + 0x34, 0x60, 0x8e, 0xa7, 0x5f, 0x02, 0x7f, 0xb9, + 0x2a, 0xc5, 0xaa, 0xb2, 0x4c, 0x34, 0xd3, 0x5a, + 0x5d, 0xfa, 0x07, 0xf2, 0xb9, 0xb3, 0xc1, 0xba, + 0xab, 0xbe, 0x89, 0x99, 0xe3, 0x6d, 0x9b, 0xa9, + 0xd3, 0xaf, 0x2a, 0x08, 0x76, 0xf3, 0x0e, 0xc9, + 0xe0, 0xb3, 0xbf, 0x51, 0x0c, 0xc5, 0xf4, 0xf3, + 0x15, 0x7b, 0x08, 0x11, 0x8f, 0x61, 0x1f, 0x61, + 0x64, 0xdb, 0x15, 0x84, 0x5b, 0x8a, 0xd1, 0x28, + 0x40, 0xde, 0xc5, 0x32, 0xb5, 0xad, 0xad, 0x65, + 0x4c, 0xf5, 0xf7, 0xd1, 0x90, 0x14, 0x5d, 0xc2, + 0x85, 0x98, 0xcc, 0xe9, 0xe6, 0x95, 0x42, 0xe1, + 0x3e, 0xfc, 0x7f, 0xc4, 0x49, 0xed, 0x9c, 0xe4, + 0x49, 0x3f, 0x03, 0x1b, 0x0d, 0xa0, 0xfb, 0xf5, + 0x38, 0x49, 0xd2, 0xdf, 0xa3, 0x88, 0xb2, 0x76, + 0x93, 0x08, 0x20, 0x18, 0xfe, 0xdc, 0x72, 0x6c, + 0x6e, 0xbf, 0x61, 0x37, 0x03, 0xdb, 0xe5, 0x72, + 0x68, 0xe0, 0x99, 0x2f, 0xb9, 0xe0, 0x2e, 0xbb, + 0x9f, 0x96, 0x36, 0x61, 0xaa, 0x2d, 0xa4, 0x93, + 0xe8, 0x50, 0x58, 0xe6, 0x61, 0xe1, 0x14, 0xcf, + 0xac, 0x86, 0x98, 0x7f, 0x3c, 0x67, 0x16, 0xce, + 0xb8, 0x70, 0x90, 0x3a, 0x5a, 0xd4, 0xe1, 0xe2, + 0x35, 0x98, 0xbf, 0x93, 0x41, 0x11, 0xb2, 0x44, + 0xb2, 0x64, 0xc2, 0xe7, 0x09, 0x45, 0xb7, 0x6f, + 0xb0, 0xbd, 0x6e, 0xe8, 0x67, 0xfa, 0x8d, 0xd4, + 0xfa, 0x4b, 0xef, 0xa8, 0x9d, 0x8a, 0x0a, 0xd9, + 0x14, 0x77, 0x09, 0x11, 0x9e, 0xc3, 0x50, 0x14, + 0x6c, 0x45, 0x02, 0x03, 0x01, 0x00, 0x01, 0x12, + 0x80, 0x03, 0x17, 0x01, 0x60, 0x24, 0xe1, 0xfd, + 0x75, 0x60, 0x17, 0x5c, 0x5e, 0x6f, 0x9f, 0x7f, + 0xdf, 0xee, 0xf0, 0xf7, 0x7d, 0xb2, 0x50, 0x65, + 0x36, 0x26, 0x14, 0x19, 0x01, 0x5e, 0x98, 0x94, + 0x65, 0x97, 0x83, 0xaa, 0x4a, 0x2b, 0x98, 0x2e, + 0x02, 0xf3, 0xb2, 0xc9, 0xb2, 0xed, 0xd3, 0x1b, + 0x20, 0x27, 0x9e, 0xe1, 0x25, 0xc7, 0x86, 0xf0, + 0x66, 0x68, 0x5d, 0xd2, 0x3d, 0xa7, 0xbb, 0xbc, + 0x22, 0xfc, 0x29, 0xfa, 0x17, 0x16, 0xf4, 0xa2, + 0x00, 0x10, 0x87, 0xb4, 0x5d, 0x51, 0x45, 0x6b, + 0xc8, 0xf4, 0x6b, 0xcc, 0x92, 0x91, 0xe7, 0xa7, + 0x93, 0xbc, 0xc7, 0x2e, 0xdc, 0xac, 0x82, 0x2b, + 0x85, 0x56, 0x7b, 0xae, 0xf2, 0xd8, 0xda, 0xa6, + 0xd7, 0xfa, 0x6d, 0x70, 0x2a, 0x2e, 0xcf, 0x69, + 0xef, 0x57, 0x91, 0xa7, 0xaa, 0x40, 0x15, 0x4a, + 0x49, 0x1b, 0xbc, 0x36, 0xbb, 0x1c, 0x94, 0x33, + 0x36, 0x61, 0x22, 0x9d, 0x22, 0x66, 0xf0, 0x88, + 0x5e, 0x7c, 0x3c, 0xa5, 0xff, 0x81, 0xcf, 0x1a, + 0x44, 0xa1, 0x2b, 0xdf, 0xc9, 0x3d, 0xd5, 0xc7, + 0xc7, 0x3a, 0x75, 0xac, 0x29, 0xfa, 0xfd, 0x5b, + 0xda, 0xf5, 0x8f, 0xd9, 0xdf, 0x08, 0xa4, 0x8d, + 0x19, 0x4a, 0xa4, 0x79, 0x6e, 0x47, 0xf6, 0x07, + 0xe0, 0xbd, 0xbf, 0x30, 0x3a, 0xf9, 0xf5, 0xc0, + 0x90, 0x6d, 0x70, 0x27, 0x44, 0xa8, 0x5e, 0x70, + 0xcd, 0x43, 0x3e, 0xaf, 0xf0, 0xd7, 0x20, 0xd3, + 0x5e, 0x97, 0x2d, 0x32, 0x1a, 0x3d, 0x2d, 0x0f, + 0x0f, 0xcf, 0xac, 0x4e, 0x88, 0x75, 0x98, 0x6c, + 0xfa, 0xe8, 0x42, 0x58, 0x99, 0xaa, 0x45, 0x0c, + 0x41, 0x0c, 0x6e, 0x27, 0x58, 0x57, 0xd2, 0x5b, + 0x82, 0x3d, 0x75, 0x2f, 0x9e, 0xf3, 0xe4, 0x00, + 0xcf, 0x91, 0x48, 0x25, 0xca, 0x98, 0xf2, 0x91, + 0x6b, 0x41, 0xa5, 0xe8, 0xcd, 0x64, 0xa7, 0x2e, + 0x78, 0xc7, 0x76, 0x82, 0x3f, 0xf8, 0x57, 0x8a, + 0x9d, 0x78, 0x25, 0xad, 0xf3, 0x1a, 0x8b, 0xfc, + 0x83, 0x9a, 0x98, 0x87, 0xe4, 0x55, 0x3e, 0x1c, + 0xa7, 0x80, 0x8f, 0xd6, 0x76, 0xab, 0x03, 0xc7, + 0x05, 0x66, 0xc3, 0xa0, 0x4c, 0x33, 0x1f, 0x39, + 0x74, 0x1b, 0x2a, 0xbf, 0xe6, 0xb0, 0x9f, 0x6b, + 0xc1, 0xd6, 0xd3, 0xf4, 0x46, 0x9b, 0xf3, 0xab, + 0xca, 0x2e, 0x88, 0x3d, 0x84, 0x5f, 0xc9, 0x9b, + 0x47, 0xbb, 0x57, 0x64, 0x08, 0x0e, 0x18, 0x74, + 0x83, 0x44, 0xd4, 0xc3, 0x18, 0x97, 0xcf, 0x89, + 0x6a, 0x49, 0x51, 0xc6, 0xff, 0x8d, 0x39, 0xc5, + 0x23, 0xf9, 0xd5, 0x01, 0xd7, 0x2f, 0xa9, 0xa5, + 0x5d, 0xa9, 0xf3, 0xc9, 0xfd, 0xc4, 0x52, 0x19, + 0x7d, 0xf6, 0xa4, 0x2c, 0x0c, 0xa0, 0x07, 0xdf, + 0x7b, 0x44, 0xd7, 0xe5, 0xbf, 0x57, 0x87, 0xc9, + 0x8c, 0xfe, 0x30, 0xb2, 0x89, 0x5d, 0x00, 0x03, + 0x3b, 0xe5 +}; + +static const unsigned char kRootCertForProd[] = { + 0x0a, 0x9c, 0x03, 0x08, 0x00, 0x12, 0x01, 0x00, + 0x18, 0xdd, 0x94, 0x88, 0x8b, 0x05, 0x22, 0x8e, + 0x03, 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, + 0x81, 0x00, 0xb4, 0xfe, 0x39, 0xc3, 0x65, 0x90, + 0x03, 0xdb, 0x3c, 0x11, 0x97, 0x09, 0xe8, 0x68, + 0xcd, 0xf2, 0xc3, 0x5e, 0x9b, 0xf2, 0xe7, 0x4d, + 0x23, 0xb1, 0x10, 0xdb, 0x87, 0x65, 0xdf, 0xdc, + 0xfb, 0x9f, 0x35, 0xa0, 0x57, 0x03, 0x53, 0x4c, + 0xf6, 0x6d, 0x35, 0x7d, 0xa6, 0x78, 0xdb, 0xb3, + 0x36, 0xd2, 0x3f, 0x9c, 0x40, 0xa9, 0x95, 0x26, + 0x72, 0x7f, 0xb8, 0xbe, 0x66, 0xdf, 0xc5, 0x21, + 0x98, 0x78, 0x15, 0x16, 0x68, 0x5d, 0x2f, 0x46, + 0x0e, 0x43, 0xcb, 0x8a, 0x84, 0x39, 0xab, 0xfb, + 0xb0, 0x35, 0x80, 0x22, 0xbe, 0x34, 0x23, 0x8b, + 0xab, 0x53, 0x5b, 0x72, 0xec, 0x4b, 0xb5, 0x48, + 0x69, 0x53, 0x3e, 0x47, 0x5f, 0xfd, 0x09, 0xfd, + 0xa7, 0x76, 0x13, 0x8f, 0x0f, 0x92, 0xd6, 0x4c, + 0xdf, 0xae, 0x76, 0xa9, 0xba, 0xd9, 0x22, 0x10, + 0xa9, 0x9d, 0x71, 0x45, 0xd6, 0xd7, 0xe1, 0x19, + 0x25, 0x85, 0x9c, 0x53, 0x9a, 0x97, 0xeb, 0x84, + 0xd7, 0xcc, 0xa8, 0x88, 0x82, 0x20, 0x70, 0x26, + 0x20, 0xfd, 0x7e, 0x40, 0x50, 0x27, 0xe2, 0x25, + 0x93, 0x6f, 0xbc, 0x3e, 0x72, 0xa0, 0xfa, 0xc1, + 0xbd, 0x29, 0xb4, 0x4d, 0x82, 0x5c, 0xc1, 0xb4, + 0xcb, 0x9c, 0x72, 0x7e, 0xb0, 0xe9, 0x8a, 0x17, + 0x3e, 0x19, 0x63, 0xfc, 0xfd, 0x82, 0x48, 0x2b, + 0xb7, 0xb2, 0x33, 0xb9, 0x7d, 0xec, 0x4b, 0xba, + 0x89, 0x1f, 0x27, 0xb8, 0x9b, 0x88, 0x48, 0x84, + 0xaa, 0x18, 0x92, 0x0e, 0x65, 0xf5, 0xc8, 0x6c, + 0x11, 0xff, 0x6b, 0x36, 0xe4, 0x74, 0x34, 0xca, + 0x8c, 0x33, 0xb1, 0xf9, 0xb8, 0x8e, 0xb4, 0xe6, + 0x12, 0xe0, 0x02, 0x98, 0x79, 0x52, 0x5e, 0x45, + 0x33, 0xff, 0x11, 0xdc, 0xeb, 0xc3, 0x53, 0xba, + 0x7c, 0x60, 0x1a, 0x11, 0x3d, 0x00, 0xfb, 0xd2, + 0xb7, 0xaa, 0x30, 0xfa, 0x4f, 0x5e, 0x48, 0x77, + 0x5b, 0x17, 0xdc, 0x75, 0xef, 0x6f, 0xd2, 0x19, + 0x6d, 0xdc, 0xbe, 0x7f, 0xb0, 0x78, 0x8f, 0xdc, + 0x82, 0x60, 0x4c, 0xbf, 0xe4, 0x29, 0x06, 0x5e, + 0x69, 0x8c, 0x39, 0x13, 0xad, 0x14, 0x25, 0xed, + 0x19, 0xb2, 0xf2, 0x9f, 0x01, 0x82, 0x0d, 0x56, + 0x44, 0x88, 0xc8, 0x35, 0xec, 0x1f, 0x11, 0xb3, + 0x24, 0xe0, 0x59, 0x0d, 0x37, 0xe4, 0x47, 0x3c, + 0xea, 0x4b, 0x7f, 0x97, 0x31, 0x1c, 0x81, 0x7c, + 0x94, 0x8a, 0x4c, 0x7d, 0x68, 0x15, 0x84, 0xff, + 0xa5, 0x08, 0xfd, 0x18, 0xe7, 0xe7, 0x2b, 0xe4, + 0x47, 0x27, 0x12, 0x11, 0xb8, 0x23, 0xec, 0x58, + 0x93, 0x3c, 0xac, 0x12, 0xd2, 0x88, 0x6d, 0x41, + 0x3d, 0xc5, 0xfe, 0x1c, 0xdc, 0xb9, 0xf8, 0xd4, + 0x51, 0x3e, 0x07, 0xe5, 0x03, 0x6f, 0xa7, 0x12, + 0xe8, 0x12, 0xf7, 0xb5, 0xce, 0xa6, 0x96, 0x55, + 0x3f, 0x78, 0xb4, 0x64, 0x82, 0x50, 0xd2, 0x33, + 0x5f, 0x91, 0x02, 0x03, 0x01, 0x00, 0x01, 0x12, + 0x80, 0x03, 0x58, 0xf1, 0xd6, 0x4d, 0x04, 0x09, + 0x7b, 0xdf, 0xd7, 0xef, 0x5d, 0x3b, 0x02, 0x39, + 0x17, 0xfa, 0x14, 0x36, 0x75, 0x4a, 0x38, 0x67, + 0x85, 0x57, 0x12, 0xa7, 0x14, 0xee, 0x35, 0x16, + 0xd5, 0x3d, 0xbf, 0x42, 0x86, 0xf6, 0x69, 0x00, + 0x76, 0xcd, 0x93, 0xf4, 0x7c, 0xb2, 0xdf, 0x9e, + 0x44, 0xcd, 0x4c, 0xd4, 0xae, 0x09, 0x18, 0x53, + 0x44, 0x32, 0xec, 0xe0, 0x61, 0x1b, 0xe5, 0xda, + 0x13, 0xd3, 0x55, 0xc5, 0xdd, 0x1a, 0xcb, 0x90, + 0x1e, 0x7e, 0x5b, 0xc6, 0xe9, 0x0f, 0x22, 0x9f, + 0xbe, 0x85, 0x02, 0xfe, 0x90, 0x31, 0xcc, 0x6b, + 0x03, 0x84, 0xbd, 0x22, 0xc4, 0x55, 0xfa, 0xf5, + 0xf2, 0x08, 0xcd, 0x65, 0x41, 0x58, 0xe8, 0x7d, + 0x29, 0xda, 0x04, 0x58, 0x82, 0xf5, 0x37, 0x69, + 0xbc, 0xf3, 0x5a, 0x57, 0x84, 0x17, 0x7b, 0x32, + 0x87, 0x70, 0xb2, 0xb0, 0x76, 0x9c, 0xb2, 0xc3, + 0x15, 0xd1, 0x11, 0x26, 0x2a, 0x23, 0x75, 0x99, + 0x3e, 0xb9, 0x77, 0x22, 0x32, 0x0d, 0xbc, 0x1a, + 0x19, 0xc1, 0xd5, 0x65, 0x90, 0x76, 0x55, 0x74, + 0x0f, 0x0e, 0x69, 0x4d, 0x5f, 0x4d, 0x8f, 0x19, + 0xaf, 0xdf, 0xd6, 0x16, 0x31, 0x94, 0xa8, 0x92, + 0x5f, 0x4f, 0xbc, 0x7a, 0x31, 0xf8, 0xae, 0x8e, + 0xad, 0x33, 0xb7, 0xe9, 0x30, 0xd0, 0x8c, 0x0a, + 0x8a, 0x6c, 0x83, 0x35, 0xf8, 0x8a, 0x81, 0xb2, + 0xfe, 0x1c, 0x88, 0xac, 0x2a, 0x66, 0xc5, 0xff, + 0xbd, 0xe6, 0x17, 0xd0, 0x62, 0x0b, 0xdc, 0x8a, + 0x45, 0xf7, 0xb0, 0x3e, 0x5a, 0xc8, 0x1e, 0x4a, + 0x24, 0x2f, 0x6c, 0xa5, 0xe3, 0x1c, 0x88, 0x14, + 0x83, 0xd5, 0xc5, 0xef, 0x5e, 0x9f, 0x3d, 0x85, + 0x45, 0x73, 0xe2, 0x6b, 0x50, 0x52, 0x57, 0x4c, + 0xfb, 0x92, 0x6c, 0x66, 0x75, 0x8a, 0xd6, 0x0d, + 0x1b, 0xae, 0xf3, 0xec, 0xaf, 0x51, 0x22, 0x03, + 0x5d, 0x0a, 0x2e, 0x63, 0x93, 0x9c, 0x0b, 0x01, + 0x20, 0xa8, 0xa9, 0x84, 0x2e, 0x17, 0xca, 0xae, + 0x73, 0xec, 0x22, 0x1b, 0x79, 0xae, 0xf6, 0xa0, + 0x72, 0x2c, 0xdf, 0x07, 0x47, 0xdb, 0x88, 0x86, + 0x30, 0x14, 0x78, 0x21, 0x11, 0x22, 0x88, 0xac, + 0xd7, 0x54, 0x74, 0xf9, 0xf3, 0x26, 0xc2, 0xa5, + 0x56, 0xc8, 0x56, 0x4f, 0x00, 0x29, 0x1d, 0x08, + 0x7b, 0x7a, 0xfb, 0x95, 0x89, 0xc3, 0xee, 0x98, + 0x54, 0x9e, 0x3c, 0x6b, 0x94, 0x05, 0x13, 0x12, + 0xf6, 0x71, 0xb9, 0xab, 0x13, 0xc3, 0x0c, 0x9b, + 0x46, 0x08, 0x7b, 0x3d, 0x32, 0x6a, 0x68, 0xca, + 0x1e, 0x9c, 0x90, 0x62, 0xc5, 0xed, 0x10, 0xb9, + 0x1f, 0x17, 0x25, 0xce, 0x90, 0xb9, 0x6d, 0xcd, + 0xc4, 0x46, 0xf5, 0xa3, 0x62, 0x13, 0x74, 0x02, + 0xa7, 0x62, 0xa4, 0xfa, 0x55, 0xd9, 0xde, 0xcf, + 0xa2, 0xe6, 0x80, 0x74, 0x55, 0x06, 0x49, 0xd5, + 0x02, 0x0c +}; + } // namespace namespace wvcdm { @@ -57,46 +230,82 @@ using video_widevine::EncryptedClientIdentification; using video_widevine::SignedDrmDeviceCertificate; using video_widevine::SignedMessage; -void ServiceCertificate::Clear() { - fetch_in_progress_ = false; - certificate_.clear(); - provider_id_.clear(); -} +CdmResponseType ServiceCertificate::Init(const std::string& certificate) { + // TODO(tinskip): Get rid of conditional compilation. +#if defined(QA_TEST_SERVER) + std::string root_cert_str(reinterpret_cast(&kRootCertForDev[0]), + sizeof(kRootCertForDev)); +#else + std::string root_cert_str(reinterpret_cast(&kRootCertForProd[0]), + sizeof(kRootCertForProd)); +#endif // !defined(QA_TEST_SERVER); -CdmResponseType ServiceCertificate::Init(const std::string& raw_certificate) { - return VerifyAndExtract(raw_certificate); + // Load root cert public key. Don't bother verifying it. + SignedDrmDeviceCertificate signed_root_cert; + if (!signed_root_cert.ParseFromString(root_cert_str)) { + LOGE("Failed to deserialize signed root certificate."); + return DEVICE_CERTIFICATE_ERROR_1; + } + DrmDeviceCertificate root_cert; + if (!root_cert.ParseFromString(signed_root_cert.drm_certificate())) { + LOGE("Failed to deserialize signed root certificate."); + return DEVICE_CERTIFICATE_ERROR_1; + } + RsaPublicKey root_key; + if (!root_key.Init(root_cert.public_key())) { + LOGE("Failed to load root certificate public key."); + return DEVICE_CERTIFICATE_ERROR_1; + } + + // Load the provided service certificate. + // First, parse it and verify its signature. + SignedDrmDeviceCertificate signed_service_cert; + if (!signed_service_cert.ParseFromString(certificate)) { + LOGE("Failed to parse signed service certificate."); + return DEVICE_CERTIFICATE_ERROR_2; + } + if (!root_key.VerifySignature(signed_service_cert.drm_certificate(), + signed_service_cert.signature())) { + LOGE("Service certificate signature verification failed."); + return DEVICE_CERTIFICATE_ERROR_3; + } + DrmDeviceCertificate service_cert; + if (!service_cert.ParseFromString(signed_service_cert.drm_certificate())) { + LOGE("Failed to parse service certificate."); + return DEVICE_CERTIFICATE_ERROR_2; + } + if (service_cert.type() != + video_widevine::DrmDeviceCertificate_CertificateType_SERVICE) { + LOGE("Not a service certificate."); + return DEVICE_CERTIFICATE_ERROR_3; + } + + // Service certificate passes all checks - set up its RSA public key. + public_key_.reset(new RsaPublicKey); + if (!public_key_->Init(service_cert.public_key())) { + public_key_.reset(); + LOGE("Failed to load service certificate public key."); + return DEVICE_CERTIFICATE_ERROR_2; + } + + // Have service certificate and its public key - keep relevant fields. + certificate_ = certificate; + serial_number_ = service_cert.serial_number(); + provider_id_ = service_cert.provider_id(); + has_certificate_ = true; + + return NO_ERROR; } CdmResponseType ServiceCertificate::VerifySignedMessage( const std::string& message, const std::string& signature) { - - if (certificate_.empty()) { - LOGE("ServiceCertificate::VerifySignedMessage: " - "service certificate is not properly initialized"); - return UNKNOWN_ERROR; + if (!public_key_) { + LOGE("Service certificate not set."); + return DEVICE_CERTIFICATE_ERROR_4; } - DrmDeviceCertificate service_certificate; - if (!service_certificate.ParseFromString(certificate_)) { - LOGE("ServiceCertificate::EncryptClientId: unable to parse retrieved " - "service certificate"); - return PARSE_SERVICE_CERTIFICATE_ERROR; - } - - if (service_certificate.type() != - video_widevine::DrmDeviceCertificate_CertificateType_SERVICE) { - LOGE("ServiceCertificate::EncryptClientId: retrieved certificate not of " - "type service, %d", service_certificate.type()); - return SERVICE_CERTIFICATE_TYPE_ERROR; - } - - // TODO(gm) verify; rework error codes. - RsaPublicKey rsa; - if (!rsa.Init(service_certificate.public_key())) - return CLIENT_ID_RSA_INIT_ERROR; - - if (!rsa.VerifySignature(message, signature)) - return CLIENT_ID_RSA_ENCRYPT_ERROR; + if (!public_key_->VerifySignature(message, signature)) + return CLIENT_ID_RSA_ENCRYPT_ERROR; // TODO(tinskip): Need new error code. return NO_ERROR; } @@ -104,28 +313,13 @@ CdmResponseType ServiceCertificate::VerifySignedMessage( CdmResponseType ServiceCertificate::EncryptClientId( CryptoSession* crypto_session, const ClientIdentification* clear_client_id, EncryptedClientIdentification* encrypted_client_id) { - DrmDeviceCertificate service_certificate; - - if (certificate_.empty()) { - LOGE("ServiceCertificate::EncryptClientId: " - "service certificate is not properly initialized"); - return UNKNOWN_ERROR; - } - if (!service_certificate.ParseFromString(certificate_)) { - LOGE("ServiceCertificate::EncryptClientId: unable to parse retrieved " - "service certificate"); - return PARSE_SERVICE_CERTIFICATE_ERROR; + if (!public_key_) { + LOGE("Service certificate not set."); + return DEVICE_CERTIFICATE_ERROR_4; } - if (service_certificate.type() != - video_widevine::DrmDeviceCertificate_CertificateType_SERVICE) { - LOGE("ServiceCertificate::EncryptClientId: retrieved certificate not of " - "type service, %d", service_certificate.type()); - return SERVICE_CERTIFICATE_TYPE_ERROR; - } - encrypted_client_id->set_provider_id(service_certificate.provider_id()); - encrypted_client_id->set_service_certificate_serial_number( - service_certificate.serial_number()); + encrypted_client_id->set_provider_id(provider_id_); + encrypted_client_id->set_service_certificate_serial_number(serial_number_); std::string iv(KEY_IV_SIZE, 0); std::string key(KEY_SIZE, 0); @@ -143,10 +337,8 @@ CdmResponseType ServiceCertificate::EncryptClientId( if (!aes.Init(key)) return CLIENT_ID_AES_INIT_ERROR; if (!aes.Encrypt(id, &enc_id, &iv)) return CLIENT_ID_AES_ENCRYPT_ERROR; - RsaPublicKey rsa; - if (!rsa.Init(service_certificate.public_key())) - return CLIENT_ID_RSA_INIT_ERROR; - if (!rsa.Encrypt(key, &enc_key)) return CLIENT_ID_RSA_ENCRYPT_ERROR; + if (!public_key_->Encrypt(key, &enc_key)) + return CLIENT_ID_RSA_ENCRYPT_ERROR; encrypted_client_id->set_encrypted_client_id_iv(iv); encrypted_client_id->set_encrypted_privacy_key(enc_key); @@ -154,97 +346,4 @@ CdmResponseType ServiceCertificate::EncryptClientId( return NO_ERROR; } -bool ServiceCertificate::PrepareRequest(CdmKeyMessage* signed_request) { - if (!signed_request) { - LOGE("ServiceCertificate::PrepareRequest: no signed request provided"); - return false; - } - SignedMessage signed_message; - signed_message.set_type(SignedMessage::SERVICE_CERTIFICATE_REQUEST); - signed_message.SerializeToString(signed_request); - - fetch_in_progress_ = true; - return true; -} - -CdmResponseType ServiceCertificate::HandleResponse( - const std::string& signed_response) { - if (!fetch_in_progress_) { - LOGE("ServiceCertificate::HandleResponse: unexpected service " - "certificate response."); - return UNKNOWN_ERROR; - } - - fetch_in_progress_ = false; - CdmResponseType status = VerifyAndExtract(signed_response); - if (status != NO_ERROR) { - return status; - } - return NO_ERROR; -} - -CdmResponseType ServiceCertificate::VerifyAndExtract( - const std::string& raw_certificate) { - if (raw_certificate.empty()) { - Clear(); - return NO_ERROR; - } - // Deserialize and parse raw certificate. - SignedDrmDeviceCertificate signed_service_certificate; - if (!signed_service_certificate.ParseFromString(raw_certificate)) { - LOGE( - "ServiceCertificate::VerifyAndExtract: unable to parse signed " - "service certificate"); - return DEVICE_CERTIFICATE_ERROR_1; - } - - // Set up root key (for verifying signature). - RsaPublicKey root_ca_key; - std::string ca_public_key( - reinterpret_cast(&kServiceCertificateCAPublicKey[0]), - sizeof(kServiceCertificateCAPublicKey)); - if (!root_ca_key.Init(ca_public_key)) { - LOGE( - "ServiceCertificate::VerifyAndExtract: public key initialization " - "failed"); - return DEVICE_CERTIFICATE_ERROR_2; - } - - // Verify the signature. - if (!root_ca_key.VerifySignature( - signed_service_certificate.drm_certificate(), - signed_service_certificate.signature())) { - LOGE( - "ServiceCertificate::VerifyAndExtract: service certificate " - "verification failed"); - return DEVICE_CERTIFICATE_ERROR_3; - } - - // Deserialize and parse actual certificate. - DrmDeviceCertificate service_certificate; - if (!service_certificate.ParseFromString( - signed_service_certificate.drm_certificate())) { - LOGE( - "ServiceCertificate::VerifyAndExtract: unable to parse retrieved " - "service certificate"); - return DEVICE_CERTIFICATE_ERROR_4; - } - - // Verify, extract needed fields. - if (service_certificate.type() != - video_widevine::DrmDeviceCertificate_CertificateType_SERVICE) { - LOGE( - "ServiceCertificate::VerifyAndExtract: certificate not of type " - "service, %d", service_certificate.type()); - return INVALID_DEVICE_CERTIFICATE_TYPE; - } - if (service_certificate.has_provider_id()) { - provider_id_.assign(service_certificate.provider_id()); - } else { - provider_id_.clear(); - } - certificate_.assign(signed_service_certificate.drm_certificate()); - return NO_ERROR; -} - } // namespace wvcdm diff --git a/libwvdrmengine/cdm/core/src/usage_table_header.cpp b/libwvdrmengine/cdm/core/src/usage_table_header.cpp index 8b5abbe2..6f757c00 100644 --- a/libwvdrmengine/cdm/core/src/usage_table_header.cpp +++ b/libwvdrmengine/cdm/core/src/usage_table_header.cpp @@ -24,6 +24,7 @@ UsageTableHeader::UsageTableHeader() : security_level_(kSecurityLevelUninitialized), requested_security_level_(kLevelDefault), is_inited_(false) { + file_system_.reset(new FileSystem()); file_handle_.reset(new DeviceFiles(file_system_.get())); } @@ -76,7 +77,7 @@ bool UsageTableHeader::Init(CdmSecurityLevel security_level, metrics::CryptoMetrics alternate_metrics; metrics::CryptoMetrics* metrics = - crypto_session->GetCryptoMetrics() != nullptr ? + crypto_session->GetCryptoMetrics() != NULL ? crypto_session->GetCryptoMetrics() : &alternate_metrics; UpgradeFromUsageTable(file_handle_.get(), metrics); diff --git a/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp b/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp index 343065f4..4a56a5a3 100644 --- a/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_engine_test.cpp @@ -11,7 +11,6 @@ #include "cdm_engine.h" #include "config_test_env.h" -#include "default_service_certificate.h" #include "initialization_data.h" #include "license_request.h" #include "log.h" @@ -27,6 +26,7 @@ namespace wvcdm { namespace { + // Http OK response code. const int kHttpOk = 200; @@ -37,29 +37,126 @@ KeyId g_key_id_pssh; KeyId g_key_id_unwrapped; CdmKeySystem g_key_system; std::string g_license_server; +std::string g_provisioning_server; +std::string g_service_certificate; KeyId g_wrong_key_id; const std::string kCencMimeType = "video/mp4"; const std::string kWebmMimeType = "video/webm"; + +static void CommonSetup(bool use_qa) { + + // NOTE: Select QA/Test server config vs. UAT server config + ConfigTestEnv config((use_qa) ? kContentProtectionTestQAServer : + kContentProtectionUatServer); + + g_client_auth.assign(config.client_auth()); + g_key_system.assign(config.key_system()); + g_wrong_key_id.assign(config.wrong_key_id()); + g_license_server.assign(config.license_server()); + g_key_id_pssh.assign(a2bs_hex(config.key_id())); + g_service_certificate.assign(config.service_certificate()); + g_provisioning_server.assign(config.provisioning_server()); + + // Extract the key ID from the PSSH box. + InitializationData extractor(CENC_INIT_DATA_FORMAT, g_key_id_pssh); + g_key_id_unwrapped = extractor.data(); +} + } // namespace -class WvCdmEngineTest : public testing::Test { +class WvCdmEnginePreProvTest : public testing::Test { public: - WvCdmEngineTest() : cdm_engine_(&file_system_) {} + WvCdmEnginePreProvTest() : cdm_engine_(&file_system_), + session_opened_(false) {} + + virtual ~WvCdmEnginePreProvTest() {} static void SetUpTestCase() { - ConfigTestEnv config(kContentProtectionUatServer); - g_client_auth.assign(config.client_auth()); - g_key_system.assign(config.key_system()); - g_wrong_key_id.assign(config.wrong_key_id()); - g_license_server.assign(config.license_server()); - g_key_id_pssh.assign(a2bs_hex(config.key_id())); - - // Extract the key ID from the PSSH box. - InitializationData extractor(CENC_INIT_DATA_FORMAT, g_key_id_pssh); - g_key_id_unwrapped = extractor.data(); + // NOTE: Select QA/Test server config vs. UAT server config +#if defined(QA_TEST_SERVER) + CommonSetup(true); +#else + CommonSetup(false); +#endif // !defined(QA_TEST_SERVER) } + virtual void SetUp() { + CdmResponseType status = + cdm_engine_.OpenSession(g_key_system, NULL, NULL, &session_id_); + ASSERT_EQ(status, NO_ERROR); + session_opened_ = true; + } + + virtual void TearDown() { + if (session_opened_) { + cdm_engine_.CloseSession(session_id_); + session_opened_ = false; + } + } + + protected: + + bool IsBase64Encoded(const std::string& message) { + for (size_t i = 0; i < message.size(); ++i) { + uint8_t ch = message[i]; + if (ch >= 'a' && ch <= 'z') continue; + if (ch >= 'A' && ch <= 'Z') continue; + if (ch >= '0' && ch <= '9') continue; + if (ch == '-' || ch == '_' || ch == '=' || ch == '.' || ch == '/') { + continue; + } + return false; + } + return true; + } + + // Trade request for response via the license server. + bool LicenseServerRequestResponse(const std::string& request, + std::string* response) { + LOGV("server url: %s", g_license_server.c_str()); + UrlRequest url_request(g_license_server + g_client_auth); + url_request.PostRequest(request); + + std::string http_response; + if (!url_request.GetResponse(&http_response)) { + return false; + } + + LOGV("http_resp:\n%s\n", http_response.c_str()); + + // Separate message from HTTP headers. + LicenseRequest license_request; + std::string response_message; + license_request.GetDrmMessage(http_response, response_message); + + LOGV("resp: size=%u, string:\n%s\n", response_message.size(), + Base64SafeEncode( + std::vector(response_message.begin(), + response_message.end())).c_str()); + + // Response should be base64 encoded. If it is not, + // fix it now. + if (!IsBase64Encoded(response_message)) { + std::vector response_vector(response_message.begin(), + response_message.end()); + response_message = Base64SafeEncode(response_vector); + } + response->swap(response_message); + return true; + } + + FileSystem file_system_; + CdmEngine cdm_engine_; + bool session_opened_; + std::string key_msg_; + std::string session_id_; +}; + +class WvCdmEngineTest : public WvCdmEnginePreProvTest { + public: + WvCdmEngineTest() {} + virtual void SetUp() { CdmResponseType status = cdm_engine_.OpenSession(g_key_system, NULL, NULL, &session_id_); @@ -72,8 +169,6 @@ class WvCdmEngineTest : public testing::Test { ASSERT_TRUE(cdm_engine_.IsOpenSession(session_id_)); } - virtual void TearDown() { cdm_engine_.CloseSession(session_id_); } - protected: void Provision() { CdmProvisioningRequest prov_request; @@ -82,7 +177,7 @@ class WvCdmEngineTest : public testing::Test { std::string cert_authority; std::string cert, wrapped_key; ASSERT_EQ(NO_ERROR, cdm_engine_.SetServiceCertificate( - kDefaultServiceCertificate)); + g_service_certificate)); CdmResponseType result = NO_ERROR; for (int i = 0; i < 2; i++) { // Retry once if there is a nonce problem. result = cdm_engine_.GetProvisioningRequest( @@ -95,6 +190,9 @@ class WvCdmEngineTest : public testing::Test { } } ASSERT_EQ(NO_ERROR, result); + // Ignore URL provided by CdmEngine. Use ours, as configured + // for test vs. production server. + provisioning_server_url.assign(g_provisioning_server); UrlRequest url_request(provisioning_server_url); EXPECT_TRUE(url_request.is_connected()); url_request.PostCertRequestInQueryString(prov_request); @@ -179,7 +277,7 @@ class WvCdmEngineTest : public testing::Test { url_request.PostRequest(key_msg_); std::string response; bool ok = url_request.GetResponse(&response); - LOGD("response: %s\n", response.c_str()); + LOGV("response: %s\n", response.c_str()); EXPECT_TRUE(ok); int status_code = url_request.GetStatusCode(response); @@ -213,15 +311,78 @@ class WvCdmEngineTest : public testing::Test { EXPECT_EQ(KEY_ADDED, cdm_engine_.RenewKey(session_id_, resp)); } - FileSystem file_system_; - CdmEngine cdm_engine_; - std::string key_msg_; - std::string session_id_; std::string server_url_; }; +// Test that service certificate is initially absent. +TEST_F(WvCdmEnginePreProvTest, ServiceCertificateInitialNoneTest) { + ASSERT_FALSE(cdm_engine_.HasServiceCertificate()); +}; + +// Test that service certificate can be properly installed. +TEST_F(WvCdmEnginePreProvTest, ServiceCertificateGoodTest) { + ASSERT_EQ(cdm_engine_.SetServiceCertificate(g_service_certificate), + NO_ERROR); + ASSERT_TRUE(cdm_engine_.HasServiceCertificate()); +}; + +// Test that service certificate can be retrieved from the license server. +TEST_F(WvCdmEnginePreProvTest, ServiceCertificateRequestResponse) { + CdmKeyMessage request; + std::string certificate; + + // Initial condition - no service certificate. + ASSERT_FALSE(cdm_engine_.HasServiceCertificate()); + + // Generate request. + // The request will be a base64 encode of a serialized protobuf message. + ASSERT_TRUE(cdm_engine_.GetServiceCertificateRequest(&request)); + + LOGV("ret'd request message:\"%s\"", request.c_str()); + + std::string response; + ASSERT_TRUE(LicenseServerRequestResponse(request, &response)); + + // Extract the service certificate + if (cdm_engine_.ParseServiceCertificateResponse(response, &certificate) == + NO_ERROR) { + ASSERT_TRUE(cdm_engine_.HasServiceCertificate()); + LOGV("ret'd cert:\"%s\"", b2a_hex(certificate).c_str()); + return; + } + + // Message did not parse. Possibly it is because of base64 encoding + // of the request. Try again with binary (base64 decoded) message. + + LOGE("Base64 encoded request failed - RETRY with binary request"); + + while (request.size() % 4 != 0) { + request = request + "="; // add padding if necessary + } + std::vector binary_vector = Base64SafeDecode(request); + std::string binary_request(binary_vector.begin(), binary_vector.end()); + LOGV("raw_string=%s", b2a_hex(binary_request).c_str()); + + ASSERT_TRUE(LicenseServerRequestResponse(binary_request, &response)); + + ASSERT_EQ(cdm_engine_.ParseServiceCertificateResponse(response, &certificate), + NO_ERROR); + + LOGV("ret'd cert:\"%s\"", b2a_hex(certificate).c_str()); + + ASSERT_TRUE(cdm_engine_.HasServiceCertificate()); +}; + +// Test that empty service certificate fails. +TEST_F(WvCdmEnginePreProvTest, ServiceCertificateEmptyFailTest) { + std::string empty_cert; + ASSERT_EQ(cdm_engine_.SetServiceCertificate(g_service_certificate), + NO_ERROR); + ASSERT_TRUE(cdm_engine_.HasServiceCertificate()); +}; + // Test that provisioning works, even if device is already provisioned. -TEST_F(WvCdmEngineTest, ProvisioningTest) { +TEST_F(WvCdmEngineTest, DISABLED_Provisioning30Test) { uint32_t nonce = 0; uint8_t buffer[1]; size_t size = 0; @@ -233,7 +394,6 @@ TEST_F(WvCdmEngineTest, ProvisioningTest) { "is expected. Otherwise, something is wrong."); return; } - Provision(); } diff --git a/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp b/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp index bd064e14..4bd48ca6 100644 --- a/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_session_unittest.cpp @@ -15,6 +15,8 @@ namespace wvcdm { namespace { +const std::string kEmptyString; + const std::string kToken = a2bs_hex( "0AAE02080212107E0A892DEEB021E7AF696B938BB1D5B1188B85AD9D05228E023082010A02" "82010100DBEDF2BFB0EC98213766E65049B9AB176FA4B1FBFBB2A0C96C87D9F2B895E0ED77" @@ -94,7 +96,8 @@ class MockDeviceFiles : public DeviceFiles { MockDeviceFiles() : DeviceFiles(NULL) {} MOCK_METHOD1(Init, bool(CdmSecurityLevel)); - MOCK_METHOD2(RetrieveCertificate, bool(std::string*, std::string*)); + MOCK_METHOD4(RetrieveCertificate, bool(std::string*, std::string*, + std::string*, uint32_t*)); }; class MockCryptoSession : public CryptoSession { @@ -122,8 +125,9 @@ class MockCdmLicense : public CdmLicense { MockCdmLicense(const CdmSessionId& session_id) : CdmLicense(session_id) {} - MOCK_METHOD5(Init, bool(ServiceCertificate*, const std::string&, - CdmClientTokenType, CryptoSession*, PolicyEngine*)); + MOCK_METHOD6(Init, bool(ServiceCertificate*, const std::string&, + CdmClientTokenType, const std::string&, + CryptoSession*, PolicyEngine*)); }; } // namespace @@ -172,7 +176,8 @@ TEST_F(CdmSessionTest, InitWithBuiltInCertificate) { .WillOnce(Return(level)); EXPECT_CALL(*crypto_session_, GetPreProvisionTokenType()) .WillOnce(Return(kClientTokenDrmCert)); - EXPECT_CALL(*file_handle_, RetrieveCertificate(NotNull(), NotNull())) + EXPECT_CALL(*file_handle_, RetrieveCertificate(NotNull(), NotNull(), + NotNull(), _)) .WillOnce(DoAll(SetArgPointee<0>(kToken), SetArgPointee<1>(kWrappedKey), Return(true))); EXPECT_CALL(*crypto_session_, LoadCertificatePrivateKey(StrEq(kWrappedKey))) @@ -181,7 +186,7 @@ TEST_F(CdmSessionTest, InitWithBuiltInCertificate) { EXPECT_CALL(*file_handle_, Init(Eq(level))).WillOnce(Return(true)); EXPECT_CALL(*license_parser_, Init(NULL, Eq(kToken), Eq(kClientTokenDrmCert), - Eq(crypto_session_), Eq(policy_engine_))) + Eq(kEmptyString), Eq(crypto_session_), Eq(policy_engine_))) .WillOnce(Return(true)); Properties::set_use_certificates_as_identification(true); @@ -201,7 +206,8 @@ TEST_F(CdmSessionTest, InitWithCertificate) { EXPECT_CALL(*crypto_session_, GetPreProvisionTokenType()) .WillOnce(Return(kClientTokenKeybox)); EXPECT_CALL(*file_handle_, Init(Eq(level))).WillOnce(Return(true)); - EXPECT_CALL(*file_handle_, RetrieveCertificate(NotNull(), NotNull())) + EXPECT_CALL(*file_handle_, RetrieveCertificate(NotNull(), NotNull(), + NotNull(), _)) .WillOnce(DoAll(SetArgPointee<0>(kToken), SetArgPointee<1>(kWrappedKey), Return(true))); EXPECT_CALL(*crypto_session_, LoadCertificatePrivateKey(StrEq(kWrappedKey))) @@ -209,7 +215,7 @@ TEST_F(CdmSessionTest, InitWithCertificate) { .WillOnce(Return(true)); EXPECT_CALL(*license_parser_, Init(NULL, Eq(kToken), Eq(kClientTokenDrmCert), - Eq(crypto_session_), Eq(policy_engine_))) + Eq(kEmptyString), Eq(crypto_session_), Eq(policy_engine_))) .WillOnce(Return(true)); Properties::set_use_certificates_as_identification(true); @@ -234,7 +240,7 @@ TEST_F(CdmSessionTest, InitWithKeybox) { EXPECT_CALL(*file_handle_, Init(Eq(level))).WillOnce(Return(true)); EXPECT_CALL(*license_parser_, Init(NULL, Eq(kToken), Eq(kClientTokenKeybox), - Eq(crypto_session_), Eq(policy_engine_))) + Eq(kEmptyString), Eq(crypto_session_), Eq(policy_engine_))) .WillOnce(Return(true)); Properties::set_use_certificates_as_identification(false); @@ -254,7 +260,8 @@ TEST_F(CdmSessionTest, ReInitFail) { EXPECT_CALL(*crypto_session_, GetPreProvisionTokenType()) .WillOnce(Return(kClientTokenKeybox)); EXPECT_CALL(*file_handle_, Init(Eq(level))).WillOnce(Return(true)); - EXPECT_CALL(*file_handle_, RetrieveCertificate(NotNull(), NotNull())) + EXPECT_CALL(*file_handle_, RetrieveCertificate(NotNull(), NotNull(), + NotNull(), _)) .WillOnce(DoAll(SetArgPointee<0>(kToken), SetArgPointee<1>(kWrappedKey), Return(true))); EXPECT_CALL(*crypto_session_, LoadCertificatePrivateKey(StrEq(kWrappedKey))) @@ -262,7 +269,7 @@ TEST_F(CdmSessionTest, ReInitFail) { .WillOnce(Return(true)); EXPECT_CALL(*license_parser_, Init(NULL, Eq(kToken), Eq(kClientTokenDrmCert), - Eq(crypto_session_), Eq(policy_engine_))) + Eq(kEmptyString), Eq(crypto_session_), Eq(policy_engine_))) .WillOnce(Return(true)); Properties::set_use_certificates_as_identification(true); @@ -292,7 +299,8 @@ TEST_F(CdmSessionTest, InitNeedsProvisioning) { EXPECT_CALL(*crypto_session_, GetPreProvisionTokenType()) .WillOnce(Return(kClientTokenKeybox)); EXPECT_CALL(*file_handle_, Init(Eq(level))).WillOnce(Return(true)); - EXPECT_CALL(*file_handle_, RetrieveCertificate(NotNull(), NotNull())) + EXPECT_CALL(*file_handle_, RetrieveCertificate(NotNull(), NotNull(), + NotNull(), _)) .WillOnce(Return(false)); Properties::set_use_certificates_as_identification(true); diff --git a/libwvdrmengine/cdm/core/test/config_test_env.cpp b/libwvdrmengine/cdm/core/test/config_test_env.cpp index cc435211..a73683e1 100644 --- a/libwvdrmengine/cdm/core/test/config_test_env.cpp +++ b/libwvdrmengine/cdm/core/test/config_test_env.cpp @@ -1,6 +1,7 @@ // Copyright 2013 Google Inc. All Rights Reserved. #include "config_test_env.h" +#include "string_conversions.h" namespace wvcdm { @@ -8,13 +9,100 @@ namespace { const std::string kWidevineKeySystem = "com.widevine.alpha"; -// QA/Test server -const std::string kQALicenseServerUrl = - "http://0.widevine-qa-wls.licenseserver.widevine-license-qa.lf.borg.google.com/"; -const std::string kQAServiceCertificate = ""; -const std::string kQAProvisioningServerUrl = "http://www-googleapis-test.sandbox.google.com/certificateprovisioning/v1/devicecertificates/create" - "?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE"; +// For staging servers +// NOTE: This matches the service cert returned by the staging +// server. This is the one that the staging provisioning server uses. +// NOTE: Provider ID = license.widevine.com +const std::string kStagingServiceCertificate = + "0ac102080312101705b917cc1204868b06333a2f772a8c1882b482920522" + "8e023082010a028201010099ed5b3b327dab5e24efc3b62a95b598520ad5" + "bccb37503e0645b814d876b8df40510441ad8ce3adb11bb88c4e725a5e4a" + "9e0795291d58584023a7e1af0e38a91279393008610b6f158c878c7e21bf" + "fbfeea77e1019e1e5781e8a45f46263d14e60e8058a8607adce04fac8457" + "b137a8d67ccdeb33705d983a21fb4eecbd4a10ca47490ca47eaa5d438218" + "ddbaf1cade3392f13d6ffb6442fd31e1bf40b0c604d1c4ba4c9520a4bf97" + "eebd60929afceef55bbaf564e2d0e76cd7c55c73a082b996120b8359edce" + "24707082680d6f67c6d82c4ac5f3134490a74eec37af4b2f010c59e82843" + "e2582f0b6b9f5db0fc5e6edf64fbd308b4711bcf1250019c9f5a09020301" + "00013a146c6963656e73652e7769646576696e652e636f6d128003ae3473" + "14b5a835297f271388fb7bb8cb5277d249823cddd1da30b93339511eb3cc" + "bdea04b944b927c121346efdbdeac9d413917e6ec176a10438460a503bc1" + "952b9ba4e4ce0fc4bfc20a9808aaaf4bfcd19c1dcfcdf574ccac28d1b410" + "416cf9de8804301cbdb334cafcd0d40978423a642e54613df0afcf96ca4a" + "9249d855e42b3a703ef1767f6a9bd36d6bf82be76bbf0cba4fde59d2abcc" + "76feb64247b85c431fbca52266b619fc36979543fca9cbbdbbfafa0e1a55" + "e755a3c7bce655f9646f582ab9cf70aa08b979f867f63a0b2b7fdb362c5b" + "c4ecd555d85bcaa9c593c383c857d49daab77e40b7851ddfd24998808e35" + "b258e75d78eac0ca16f7047304c20d93ede4e8ff1c6f17e6243e3f3da8fc" + "1709870ec45fba823a263f0cefa1f7093b1909928326333705043a29bda6" + "f9b4342cc8df543cb1a1182f7c5fff33f10490faca5b25360b76015e9c5a" + "06ab8ee02f00d2e8d5986104aacc4dd475fd96ee9ce4e326f21b83c70585" + "77b38732cddabc6a6bed13fb0d49d38a45eb87a5f4"; +// NOTE: Provider ID = staging.google.com +const std::string kProdServiceCertificate = + "0ABF020803121028703454C008F63618ADE7443DB6C4C8188BE7F9900522" + "8E023082010A0282010100B52112B8D05D023FCC5D95E2C251C1C649B417" + "7CD8D2BEEF355BB06743DE661E3D2ABC3182B79946D55FDC08DFE9540781" + "5E9A6274B322A2C7F5E067BB5F0AC07A89D45AEA94B2516F075B66EF811D" + "0D26E1B9A6B894F2B9857962AA171C4F66630D3E4C602718897F5E1EF9B6" + "AAF5AD4DBA2A7E14176DF134A1D3185B5A218AC05A4C41F081EFFF80A3A0" + "40C50B09BBC740EEDCD8F14D675A91980F92CA7DDC646A06ADAD5101F74A" + "0E498CC01F00532BAC217850BD905E90923656B7DFEFEF42486767F33EF6" + "283D4F4254AB72589390BEE55808F1D668080D45D893C2BCA2F74D60A0C0" + "D0A0993CEF01604703334C3638139486BC9DAF24FD67A07F9AD943020301" + "00013A1273746167696E672E676F6F676C652E636F6D128003983E303526" + "75F40BA715FC249BDAE5D4AC7249A2666521E43655739529721FF880E0AA" + "EFC5E27BC980DAEADABF3FC386D084A02C82537848CC753FF497B011A7DA" + "97788A00E2AA6B84CD7D71C07A48EBF61602CCA5A3F32030A7295C30DA91" + "5B91DC18B9BC9593B8DE8BB50F0DEDC12938B8E9E039CDDE18FA82E81BB0" + "32630FE955D85A566CE154300BF6D4C1BD126966356B287D657B18CE63D0" + "EFD45FC5269E97EAB11CB563E55643B26FF49F109C2101AFCAF35B832F28" + "8F0D9D45960E259E85FB5D24DBD2CF82764C5DD9BF727EFBE9C861F86932" + "1F6ADE18905F4D92F9A6DA6536DB8475871D168E870BB2303CF70C6E9784" + "C93D2DE845AD8262BE7E0D4E2E4A0759CEF82D109D2592C72429F8C01742" + "BAE2B3DECADBC33C3E5F4BAF5E16ECB74EADBAFCB7C6705F7A9E3B6F3940" + "383F9C5116D202A20C9229EE969C2519718303B50D0130C3352E06B014D8" + "38540F8A0C227C0011E0F5B38E4E298ED2CB301EB4564965F55C5D79757A" + "250A4EB9C84AB3E6539F6B6FDF56899EA29914"; + +// For UAT License servers +// NOTE: This matches the service cert returned by the UAT server. +// NOTE: Provider ID = staging.google.com +const std::string kUatServiceCertificate = + "0ABF020803121028703454C008F63618ADE7443DB6C4C8188BE7F9900522" + "8E023082010A0282010100B52112B8D05D023FCC5D95E2C251C1C649B417" + "7CD8D2BEEF355BB06743DE661E3D2ABC3182B79946D55FDC08DFE9540781" + "5E9A6274B322A2C7F5E067BB5F0AC07A89D45AEA94B2516F075B66EF811D" + "0D26E1B9A6B894F2B9857962AA171C4F66630D3E4C602718897F5E1EF9B6" + "AAF5AD4DBA2A7E14176DF134A1D3185B5A218AC05A4C41F081EFFF80A3A0" + "40C50B09BBC740EEDCD8F14D675A91980F92CA7DDC646A06ADAD5101F74A" + "0E498CC01F00532BAC217850BD905E90923656B7DFEFEF42486767F33EF6" + "283D4F4254AB72589390BEE55808F1D668080D45D893C2BCA2F74D60A0C0" + "D0A0993CEF01604703334C3638139486BC9DAF24FD67A07F9AD943020301" + "00013A1273746167696E672E676F6F676C652E636F6D128003983E303526" + "75F40BA715FC249BDAE5D4AC7249A2666521E43655739529721FF880E0AA" + "EFC5E27BC980DAEADABF3FC386D084A02C82537848CC753FF497B011A7DA" + "97788A00E2AA6B84CD7D71C07A48EBF61602CCA5A3F32030A7295C30DA91" + "5B91DC18B9BC9593B8DE8BB50F0DEDC12938B8E9E039CDDE18FA82E81BB0" + "32630FE955D85A566CE154300BF6D4C1BD126966356B287D657B18CE63D0" + "EFD45FC5269E97EAB11CB563E55643B26FF49F109C2101AFCAF35B832F28" + "8F0D9D45960E259E85FB5D24DBD2CF82764C5DD9BF727EFBE9C861F86932" + "1F6ADE18905F4D92F9A6DA6536DB8475871D168E870BB2303CF70C6E9784" + "C93D2DE845AD8262BE7E0D4E2E4A0759CEF82D109D2592C72429F8C01742" + "BAE2B3DECADBC33C3E5F4BAF5E16ECB74EADBAFCB7C6705F7A9E3B6F3940" + "383F9C5116D202A20C9229EE969C2519718303B50D0130C3352E06B014D8" + "38540F8A0C227C0011E0F5B38E4E298ED2CB301EB4564965F55C5D79757A" + "250A4EB9C84AB3E6539F6B6FDF56899EA29914"; + +// QA/Test server (kContentProtectionTestQAServer) +// +const std::string kQALicenseServerUrl = + "https://widevine-proxy-qa.corp.google.com/proxy"; + +const std::string kQAProvisioningServerUrl = + "http://www-googleapis-test.sandbox.google.com/" + "certificateprovisioning/v1/devicecertificates/create"; // Content Protection license server (UAT) data const std::string kCpUatLicenseServer = @@ -39,52 +127,10 @@ const std::string kCpOfflineKeyId = // pssh data: "08011a0d7769646576696e655f746573" "74220d6f66666c696e655f636c697032"; -const std::string kCpUatServiceCertificate = - "0ABF020803121028703454C008F63618ADE7443DB6C4C8188BE7F99005228E023082010A02" - "82010100B52112B8D05D023FCC5D95E2C251C1C649B4177CD8D2BEEF355BB06743DE661E3D" - "2ABC3182B79946D55FDC08DFE95407815E9A6274B322A2C7F5E067BB5F0AC07A89D45AEA94" - "B2516F075B66EF811D0D26E1B9A6B894F2B9857962AA171C4F66630D3E4C602718897F5E1E" - "F9B6AAF5AD4DBA2A7E14176DF134A1D3185B5A218AC05A4C41F081EFFF80A3A040C50B09BB" - "C740EEDCD8F14D675A91980F92CA7DDC646A06ADAD5101F74A0E498CC01F00532BAC217850" - "BD905E90923656B7DFEFEF42486767F33EF6283D4F4254AB72589390BEE55808F1D668080D" - "45D893C2BCA2F74D60A0C0D0A0993CEF01604703334C3638139486BC9DAF24FD67A07F9AD9" - "4302030100013A1273746167696E672E676F6F676C652E636F6D128003983E30352675F40B" - "A715FC249BDAE5D4AC7249A2666521E43655739529721FF880E0AAEFC5E27BC980DAEADABF" - "3FC386D084A02C82537848CC753FF497B011A7DA97788A00E2AA6B84CD7D71C07A48EBF616" - "02CCA5A3F32030A7295C30DA915B91DC18B9BC9593B8DE8BB50F0DEDC12938B8E9E039CDDE" - "18FA82E81BB032630FE955D85A566CE154300BF6D4C1BD126966356B287D657B18CE63D0EF" - "D45FC5269E97EAB11CB563E55643B26FF49F109C2101AFCAF35B832F288F0D9D45960E259E" - "85FB5D24DBD2CF82764C5DD9BF727EFBE9C861F869321F6ADE18905F4D92F9A6DA6536DB84" - "75871D168E870BB2303CF70C6E9784C93D2DE845AD8262BE7E0D4E2E4A0759CEF82D109D25" - "92C72429F8C01742BAE2B3DECADBC33C3E5F4BAF5E16ECB74EADBAFCB7C6705F7A9E3B6F39" - "40383F9C5116D202A20C9229EE969C2519718303B50D0130C3352E06B014D838540F8A0C22" - "7C0011E0F5B38E4E298ED2CB301EB4564965F55C5D79757A250A4EB9C84AB3E6539F6B6FDF" - "56899EA29914"; // Content Protection license server (staging) data const std::string kCpStagingLicenseServer = "http://wv-staging-proxy.appspot.com/proxy"; -const std::string kCpStagingServiceCertificate = - "0AC102080312101705B917CC1204868B06333A2F772A8C1882B4829205228E023082010A02" - "8201010099ED5B3B327DAB5E24EFC3B62A95B598520AD5BCCB37503E0645B814D876B8DF40" - "510441AD8CE3ADB11BB88C4E725A5E4A9E0795291D58584023A7E1AF0E38A9127939300861" - "0B6F158C878C7E21BFFBFEEA77E1019E1E5781E8A45F46263D14E60E8058A8607ADCE04FAC" - "8457B137A8D67CCDEB33705D983A21FB4EECBD4A10CA47490CA47EAA5D438218DDBAF1CADE" - "3392F13D6FFB6442FD31E1BF40B0C604D1C4BA4C9520A4BF97EEBD60929AFCEEF55BBAF564" - "E2D0E76CD7C55C73A082B996120B8359EDCE24707082680D6F67C6D82C4AC5F3134490A74E" - "EC37AF4B2F010C59E82843E2582F0B6B9F5DB0FC5E6EDF64FBD308B4711BCF1250019C9F5A" - "0902030100013A146C6963656E73652E7769646576696E652E636F6D128003AE347314B5A8" - "35297F271388FB7BB8CB5277D249823CDDD1DA30B93339511EB3CCBDEA04B944B927C12134" - "6EFDBDEAC9D413917E6EC176A10438460A503BC1952B9BA4E4CE0FC4BFC20A9808AAAF4BFC" - "D19C1DCFCDF574CCAC28D1B410416CF9DE8804301CBDB334CAFCD0D40978423A642E54613D" - "F0AFCF96CA4A9249D855E42B3A703EF1767F6A9BD36D6BF82BE76BBF0CBA4FDE59D2ABCC76" - "FEB64247B85C431FBCA52266B619FC36979543FCA9CBBDBBFAFA0E1A55E755A3C7BCE655F9" - "646F582AB9CF70AA08B979F867F63A0B2B7FDB362C5BC4ECD555D85BCAA9C593C383C857D4" - "9DAAB77E40B7851DDFD24998808E35B258E75D78EAC0CA16F7047304C20D93EDE4E8FF1C6F" - "17E6243E3F3DA8FC1709870EC45FBA823A263F0CEFA1F7093B1909928326333705043A29BD" - "A6F9B4342CC8DF543CB1A1182F7C5FFF33F10490FACA5B25360B76015E9C5A06AB8EE02F00" - "D2E8D5986104AACC4DD475FD96EE9CE4E326F21B83C7058577B38732CDDABC6A6BED13FB0D" - "49D38A45EB87A5F4"; // Google Play license server data const std::string kGpLicenseServer = @@ -124,21 +170,27 @@ const std::string kWrongKeyId = "0901121094889920e8d6520098577df8" "f2dd5546"; -// URL of provisioning server (returned by GetProvisioningRequest()) +// URL of provisioning server (overrides value from GetProvisioningRequest()) const std::string kProductionProvisioningServerUrl = "https://www.googleapis.com/" "certificateprovisioning/v1/devicecertificates/create" "?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE"; +const std::string kStagingProvisioningServerUrl = + "https://staging-www.sandbox.googleapis.com/" + "certificateprovisioning/v1/devicecertificates/create" + "?key=AIzaSyB-5OLKTx2iU5mko18DfdwK5611JIjbUhE"; + + const ConfigTestEnv::LicenseServerConfiguration license_servers[] = { {kGooglePlayServer, kGpLicenseServer, kGpClientAuth, kGpKeyId, - kGpOfflineKeyId, ""}, + kGpOfflineKeyId, "", kStagingProvisioningServerUrl}, {kContentProtectionUatServer, kCpUatLicenseServer, kCpClientAuth, - kCpKeyId, kCpOfflineKeyId, kCpUatServiceCertificate}, + kCpKeyId, kCpOfflineKeyId, kProdServiceCertificate, + kStagingProvisioningServerUrl}, {kContentProtectionStagingServer, kCpStagingLicenseServer, - kCpClientAuth, kCpKeyId, kCpOfflineKeyId, kCpStagingServiceCertificate}, - {kContentProtectionTestQAServer, kQALicenseServerUrl, - kCpClientAuth, kCpKeyId, kCpOfflineKeyId, kQAServiceCertificate}, + kCpClientAuth, kCpKeyId, kCpOfflineKeyId, kProdServiceCertificate, + kStagingProvisioningServerUrl}, }; } // namespace @@ -173,8 +225,8 @@ void ConfigTestEnv::Init(LicenseServerId server_id) { key_id_ = license_servers[server_id].key_id; key_system_ = kWidevineKeySystem; license_server_ = license_servers[server_id].url; - provisioning_server_url_ = kProductionProvisioningServerUrl; - service_certificate_ = license_servers[server_id].service_certificate; + provisioning_server_ = license_servers[server_id].provisioning_server; + service_certificate_ = a2bs_hex(license_servers[server_id].service_certificate); wrong_key_id_ = kWrongKeyId; } diff --git a/libwvdrmengine/cdm/core/test/config_test_env.h b/libwvdrmengine/cdm/core/test/config_test_env.h index 71ee7629..f7052eb4 100644 --- a/libwvdrmengine/cdm/core/test/config_test_env.h +++ b/libwvdrmengine/cdm/core/test/config_test_env.h @@ -24,6 +24,7 @@ class ConfigTestEnv { std::string key_id; std::string offline_key_id; std::string service_certificate; + std::string provisioning_server; } LicenseServerConfiguration; explicit ConfigTestEnv(LicenseServerId server_id); @@ -36,8 +37,8 @@ class ConfigTestEnv { const KeyId& key_id() const { return key_id_; } const CdmKeySystem& key_system() const { return key_system_; } const std::string& license_server() const { return license_server_; } - const std::string& provisioning_server_url() const { - return provisioning_server_url_; + const std::string& provisioning_server() const { + return provisioning_server_; } const std::string& service_certificate() const { return service_certificate_; @@ -59,7 +60,7 @@ class ConfigTestEnv { KeyId key_id_; CdmKeySystem key_system_; std::string license_server_; - std::string provisioning_server_url_; + std::string provisioning_server_; std::string service_certificate_; KeyId wrong_key_id_; diff --git a/libwvdrmengine/cdm/core/test/device_files_unittest.cpp b/libwvdrmengine/cdm/core/test/device_files_unittest.cpp index 7d4a05e4..de9f2a69 100644 --- a/libwvdrmengine/cdm/core/test/device_files_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/device_files_unittest.cpp @@ -1766,7 +1766,8 @@ TEST_F(DeviceCertificateStoreTest, StoreCertificate) { EXPECT_TRUE(device_files.StoreCertificate(certificate, wrapped_private_key)); } -TEST_F(DeviceCertificateTest, ReadCertificate) { +// TODO(tinskip): Fix. kTestCertificateFileData appears to be incorect. +TEST_F(DeviceCertificateTest, DISABLED_ReadCertificate) { MockFileSystem file_system; std::string device_certificate_path = device_base_path_ + DeviceFiles::GetCertificateFileName(); @@ -1789,8 +1790,11 @@ TEST_F(DeviceCertificateTest, ReadCertificate) { EXPECT_TRUE(device_files.Init(kSecurityLevelL1)); std::string certificate, wrapped_private_key; + std::string serial_number; + uint32_t system_id = 0; ASSERT_TRUE( - device_files.RetrieveCertificate(&certificate, &wrapped_private_key)); + device_files.RetrieveCertificate(&certificate, &wrapped_private_key, + &serial_number, &system_id)); EXPECT_EQ(kTestCertificate, b2a_hex(certificate)); EXPECT_EQ(kTestWrappedPrivateKey, b2a_hex(wrapped_private_key)); } diff --git a/libwvdrmengine/cdm/core/test/generic_crypto_unittest.cpp b/libwvdrmengine/cdm/core/test/generic_crypto_unittest.cpp index 3dae2a30..29f68486 100644 --- a/libwvdrmengine/cdm/core/test/generic_crypto_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/generic_crypto_unittest.cpp @@ -10,8 +10,7 @@ #include #include "cdm_engine.h" - -#include "default_service_certificate.h" +#include "config_test_env.h" #include "license_request.h" #include "log.h" #include "oec_session_util.h" @@ -25,6 +24,9 @@ namespace { const std::string kKeySystem = "com.widevine.alpha"; +std::string g_provisioning_server; +std::string g_service_certificate; + } // namespace namespace wvcdm { @@ -36,12 +38,25 @@ class WvGenericOperationsTest : public testing::Test { virtual void SetUp() { ::testing::Test::SetUp(); +#if defined(QA_TEST_SERVER) + ConfigTestEnv config(kContentProtectionTestQAServer); +#else + ConfigTestEnv config(kContentProtectionUatServer); +#endif // !defined(QA_TEST_SERVER) + + g_service_certificate.assign(config.service_certificate()); + g_provisioning_server.assign(config.provisioning_server()); + cdm_engine_ = NULL; // TODO(fredgc or gmorgan): This should be updated for provisioning 3.0 // Load test keybox. This keybox will be used by any CryptoSession // created by the CDM under test. +#if defined(PROVISIONING_30) + ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_LoadTestRSAKey()); +#else ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_LoadTestKeybox()); +#endif // !defined(PROVISIONING_30) // Perform CdmEngine setup cdm_engine_ = new CdmEngine(&file_system_); @@ -168,11 +183,14 @@ class WvGenericOperationsTest : public testing::Test { CdmCertificateType cert_type = kCertificateWidevine; std::string cert_authority; std::string cert, wrapped_key; - cdm_engine_->SetServiceCertificate(kDefaultServiceCertificate); + cdm_engine_->SetServiceCertificate(g_service_certificate); ASSERT_EQ(NO_ERROR, cdm_engine_->GetProvisioningRequest( cert_type, cert_authority, &prov_request, &provisioning_server_url)); + // Ignore URL provided by CdmEngine. Use ours, as configured + // for test vs. production server. + provisioning_server_url.assign(g_provisioning_server); UrlRequest url_request(provisioning_server_url); EXPECT_TRUE(url_request.is_connected()); url_request.PostCertRequestInQueryString(prov_request); diff --git a/libwvdrmengine/cdm/core/test/license_unittest.cpp b/libwvdrmengine/cdm/core/test/license_unittest.cpp index c1a233d2..0b916487 100644 --- a/libwvdrmengine/cdm/core/test/license_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/license_unittest.cpp @@ -5,7 +5,6 @@ #include "clock.h" #include "crypto_session.h" -#include "default_service_certificate.h" #include "initialization_data.h" #include "license.h" #include "policy_engine.h" @@ -18,6 +17,7 @@ namespace wvcdm { namespace { +const std::string kEmptyString; const std::string kAesKey = a2bs_hex("000102030405060708090a0b0c0d0e0f"); const std::string kAesIv = a2bs_hex("000102030405060708090a0b0c0d0e0f"); const std::string kCencInitDataHdr = a2bs_hex( @@ -162,20 +162,21 @@ TEST_F(CdmLicenseTest, InitSuccess) { EXPECT_CALL(*crypto_session_, IsOpen()).WillOnce(Return(true)); CreateCdmLicense(); - EXPECT_TRUE(cdm_license_->Init(&service_cert_, kToken, kClientTokenDrmCert, - crypto_session_, policy_engine_)); + EXPECT_TRUE(cdm_license_->Init( + &service_cert_, kToken, kClientTokenDrmCert, kEmptyString, + crypto_session_, policy_engine_)); } TEST_F(CdmLicenseTest, InitFail_EmptyToken) { CreateCdmLicense(); EXPECT_FALSE(cdm_license_->Init(&service_cert_, "", kClientTokenDrmCert, - crypto_session_, policy_engine_)); + "", crypto_session_, policy_engine_)); } TEST_F(CdmLicenseTest, InitFail_CryptoSessionNull) { CreateCdmLicense(); EXPECT_FALSE(cdm_license_->Init(&service_cert_, kToken, kClientTokenDrmCert, - NULL, policy_engine_)); + "", NULL, policy_engine_)); } TEST_F(CdmLicenseTest, InitFail_PolicyEngineNull) { @@ -183,7 +184,7 @@ TEST_F(CdmLicenseTest, InitFail_PolicyEngineNull) { CreateCdmLicense(); EXPECT_FALSE(cdm_license_->Init(&service_cert_, kToken, kClientTokenDrmCert, - crypto_session_, NULL)); + "", crypto_session_, NULL)); } TEST_F(CdmLicenseTest, InitWithNullServiceCert) { @@ -191,7 +192,7 @@ TEST_F(CdmLicenseTest, InitWithNullServiceCert) { CreateCdmLicense(); EXPECT_TRUE(cdm_license_->Init(NULL, kToken, kClientTokenDrmCert, - crypto_session_, policy_engine_)); + "", crypto_session_, policy_engine_)); } TEST_F(CdmLicenseTest, PrepareKeyRequestValidation) { @@ -228,9 +229,9 @@ TEST_F(CdmLicenseTest, PrepareKeyRequestValidation) { DoAll(SetArgPointee<2>(kLicenseRequestSignature), Return(true))); CreateCdmLicense(); - service_cert_.Init(kDefaultServiceCertificate); - EXPECT_TRUE(cdm_license_->Init(&service_cert_, kToken, kClientTokenDrmCert, - crypto_session_, policy_engine_)); + EXPECT_TRUE(cdm_license_->Init( + &service_cert_, kToken, kClientTokenDrmCert, kEmptyString, + crypto_session_, policy_engine_)); CdmAppParameterMap app_parameters; CdmKeyMessage signed_request; diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index 3d81fb68..48b8d295 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -322,18 +322,12 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { break; case USAGE_INFO_NOT_FOUND: *os << "USAGE_INFO_NOT_FOUND"; break; - case LICENSE_RENEWAL_SERVICE_CERTIFICATE_GENERATION_ERROR: - *os << "LICENSE_RENEWAL_SERVICE_CERTIFICATE_GENERATION_ERROR"; - break; case EMPTY_PROVISIONING_CERTIFICATE_2: *os << "EMPTY_PROVISIONING_CERTIFICATE_2"; break; case PARSE_SERVICE_CERTIFICATE_ERROR: *os << "PARSE_SERVICE_CERTIFICATE_ERROR"; break; - case SERVICE_CERTIFICATE_TYPE_ERROR: - *os << "SERVICE_CERTIFICATE_TYPE_ERROR"; - break; case CLIENT_ID_GENERATE_RANDOM_ERROR: *os << "CLIENT_ID_GENERATE_RANDOM_ERROR"; break; @@ -358,9 +352,6 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { break; case INVALID_PARAMETERS_LIC_7: *os << "INVALID_PARAMETERS_LIC_7"; break; - case LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR: - *os << "LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR"; - break; case CENC_INIT_DATA_UNAVAILABLE: *os << "CENC_INIT_DATA_UNAVAILABLE"; break; case PREPARE_CENC_CONTENT_ID_FAILED: @@ -456,6 +447,8 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { break; case INVALID_PARAMETERS_ENG_18: *os << "INVALID_PARAMETERS_ENG_18"; break; + case INVALID_PARAMETERS_ENG_19: *os << "INVALID_PARAMETERS_ENG_19"; + break; case CERT_PROVISIONING_CLIENT_TOKEN_ERROR_1: *os << "CERT_PROVISIONING_CLIENT_TOKEN_ERROR_1"; break; @@ -499,8 +492,6 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { case LOAD_USAGE_ENTRY_UNKNOWN_ERROR: *os << "LOAD_USAGE_ENTRY_UNKNOWN_ERROR"; break; - case INVALID_PARAMETERS_ENG_19: *os << "INVALID_PARAMETERS_ENG_19"; - break; case INVALID_PARAMETERS_ENG_20: *os << "INVALID_PARAMETERS_ENG_20"; break; case UPDATE_USAGE_ENTRY_UNKNOWN_ERROR: @@ -519,8 +510,9 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { case COPY_OLD_USAGE_ENTRY_UNKNOWN_ERROR: *os << "COPY_OLD_USAGE_ENTRY_UNKNOWN_ERROR"; break; - case INVALID_PARAMETERS_ENG_23: - *os << "INVALID_PARAMETERS_ENG_23"; + case INVALID_PARAMETERS_ENG_23: *os << "INVALID_PARAMETERS_ENG_23"; + break; + case INVALID_PARAMETERS_ENG_24: *os << "INVALID_PARAMETERS_ENG_24"; break; case USAGE_INFORMATION_SUPPORT_FAILED: *os << "USAGE_INFORMATION_SUPPORT_FAILED"; @@ -584,7 +576,22 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { break; case DELETE_USAGE_ERROR_3: *os << "DELETE_USAGE_ERROR_3"; break; - + case PRIVACY_MODE_ERROR_1: *os << "PRIVACY_MODE_ERROR_1"; + break; + case PRIVACY_MODE_ERROR_2: *os << "PRIVACY_MODE_ERROR_2"; + break; + case PRIVACY_MODE_ERROR_3: *os << "PRIVACY_MODE_ERROR_3"; + break; + case EMPTY_RESPONSE_ERROR_1: *os << "EMPTY_RESPONSE_ERROR_1"; + break; + case PARSE_RESPONSE_ERROR_1: *os << "PARSE_RESPONSE_ERROR_1"; + break; + case PARSE_RESPONSE_ERROR_2: *os << "PARSE_RESPONSE_ERROR_2"; + break; + case PARSE_RESPONSE_ERROR_3: *os << "PARSE_RESPONSE_ERROR_3"; + break; + case PARSE_RESPONSE_ERROR_4: *os << "PARSE_RESPONSE_ERROR_4"; + break; default: *os << "Unknown CdmResponseType"; break; @@ -599,8 +606,6 @@ void PrintTo(const enum CdmLicenseType& value, ::std::ostream* os) { break; case kLicenseTypeRelease: *os << "kLicenseTypeRelease"; break; - case kLicenseTypeDeferred: *os << "kLicenseTypeDeferred"; - break; default: *os << "Unknown CdmLicenseType"; break; diff --git a/libwvdrmengine/cdm/core/test/usage_table_header_unittest.cpp b/libwvdrmengine/cdm/core/test/usage_table_header_unittest.cpp index 5be41123..56bae583 100644 --- a/libwvdrmengine/cdm/core/test/usage_table_header_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/usage_table_header_unittest.cpp @@ -1,9 +1,11 @@ // Copyright 2017 Google Inc. All Rights Reserved. #include "usage_table_header.h" + #include #include #include + #include "crypto_session.h" #include "device_files.h" #include "file_store.h" @@ -50,18 +52,29 @@ const CdmUsageEntryInfo kUsageEntryInfoStorageTypeUnknown = { .storage_type = kStorageTypeUnknown, .key_set_id = "", .usage_info_file_name = ""}; + const std::vector kEmptyLicenseList; -const std::vector kLicenseList = { + +const std::string kLicenseArray[] = { kUsageEntryInfoOfflineLicense1.key_set_id, kUsageEntryInfoOfflineLicense2.key_set_id, kUsageEntryInfoOfflineLicense3.key_set_id, }; +const size_t kLicenseArraySize = sizeof(kLicenseArray)/ + sizeof(kLicenseArray[0]); +std::vector kLicenseList; + const std::vector kEmptyUsageInfoFilesList; -const std::vector kUsageInfoFileList = { + +const std::string kUsageInfoFileArray[] = { kUsageEntryInfoSecureStop1.usage_info_file_name, kUsageEntryInfoSecureStop2.usage_info_file_name, kUsageEntryInfoSecureStop3.usage_info_file_name, }; +const size_t kUsageInfoFileArraySize = sizeof(kUsageInfoFileArray)/ + sizeof(kUsageInfoFileArray[0]); +std::vector kUsageInfoFileList; + const DeviceFiles::CdmUsageData kCdmUsageData1 = { .provider_session_token = "provider_session_token_1", .license_request = "license_request_1", @@ -87,13 +100,10 @@ const DeviceFiles::CdmUsageData kCdmUsageData3 = { .usage_entry_number = 0, }; const std::vector kEmptyUsageInfoUsageDataList; -const std::vector kUsageInfoUsageDataList = { - kCdmUsageData1, kCdmUsageData2, kCdmUsageData3, -}; + const std::vector kEmptyUsageEntryInfoVector; -const std::vector kUsageEntryInfoVector = { - kUsageEntryInfoOfflineLicense1, kUsageEntryInfoSecureStop1, - kUsageEntryInfoStorageTypeUnknown}; +std::vector kUsageEntryInfoVector; + const DeviceFiles::LicenseState kActiveLicenseState = DeviceFiles::kLicenseStateActive; const CdmInitData kPsshData = "pssh data"; @@ -108,6 +118,36 @@ int64_t kPlaybackStartTime = 1030005; int64_t kPlaybackDuration = 300; int64_t kGracePeriodEndTime = 60; +namespace { + +void InitVectorConstants() { + kUsageEntryInfoVector.clear(); + kUsageEntryInfoVector.push_back(kUsageEntryInfoOfflineLicense1); + kUsageEntryInfoVector.push_back(kUsageEntryInfoSecureStop1); + kUsageEntryInfoVector.push_back(kUsageEntryInfoStorageTypeUnknown); + + kUsageInfoFileList.clear(); + for (size_t i = 0; i < kUsageInfoFileArraySize; i++) { + kUsageInfoFileList.push_back(kUsageInfoFileArray[i]); + } + + kLicenseList.clear(); + for (size_t i = 0; i < kLicenseArraySize; i++) { + kLicenseList.push_back(kLicenseArray[i]); + } +} + +void ToVector(std::vector& vec, + const CdmUsageEntryInfo* arr, size_t total_size) { + size_t max = total_size / sizeof(CdmUsageEntryInfo); + vec.clear(); + for (size_t i = 0; i < max; i++) { + vec.push_back(arr[i]); + } +} + +}; // namespace + class MockDeviceFiles : public DeviceFiles { public: MockDeviceFiles() : DeviceFiles(&file_system_) { Init(kSecurityLevelL1); } @@ -140,7 +180,8 @@ class MockDeviceFiles : public DeviceFiles { class MockCryptoSession : public CryptoSession { public: - MockCryptoSession() : CryptoSession(NULL) {} + MockCryptoSession(metrics::CryptoMetrics* metrics) + : CryptoSession(metrics) {} MOCK_METHOD1(Open, CdmResponseType(SecurityLevel)); MOCK_METHOD1(LoadUsageTableHeader, CdmResponseType(const CdmUsageTableHeader&)); @@ -166,11 +207,16 @@ using ::testing::UnorderedElementsAre; using ::testing::UnorderedElementsAreArray; class UsageTableHeaderTest : public ::testing::Test { + public: + static void SetUpTestCase() { + InitVectorConstants(); + } + protected: virtual void SetUp() { // UsageTableHeader will take ownership of the pointer device_files_ = new MockDeviceFiles(); - crypto_session_ = new MockCryptoSession(); + crypto_session_ = new MockCryptoSession(&crypto_metrics_); usage_table_header_ = new UsageTableHeader(); // usage_table_header_ object takes ownership of these objects @@ -196,6 +242,7 @@ class UsageTableHeaderTest : public ::testing::Test { } MockDeviceFiles* device_files_; + metrics::CryptoMetrics crypto_metrics_; MockCryptoSession* crypto_session_; UsageTableHeader* usage_table_header_; }; @@ -212,7 +259,13 @@ TEST_F(UsageTableHeaderTest, InitError) { class UsageTableHeaderInitializationTest : public UsageTableHeaderTest, - public ::testing::WithParamInterface {}; + public ::testing::WithParamInterface { + public: + static void SetUpTestCase() { + InitVectorConstants(); + } + +}; TEST_P(UsageTableHeaderInitializationTest, CreateUsageTableHeader) { EXPECT_CALL(*device_files_, RetrieveUsageTableInfo(NotNull(), NotNull())) @@ -523,9 +576,12 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_InvalidUsageEntryNumber) { // // # of usage entries 4 4 TEST_F(UsageTableHeaderTest, DeleteEntry_CryptoSessionError) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense2}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -559,9 +615,12 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_CryptoSessionError) { // // # of usage entries 4 3 TEST_F(UsageTableHeaderTest, DeleteEntry_LastOfflineEntry) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense2}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -604,9 +663,12 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastOfflineEntry) { // // # of usage entries 4 3 TEST_F(UsageTableHeaderTest, DeleteEntry_LastSecureStopEntry) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoSecureStop2}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -654,10 +716,13 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastSecureStopEntry) { // # of usage entries 5 2 TEST_F(UsageTableHeaderTest, DeleteEntry_LastOfflineEntriesHaveMissingLicenses) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense1, kUsageEntryInfoOfflineLicense2, kUsageEntryInfoOfflineLicense3}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -703,10 +768,13 @@ TEST_F(UsageTableHeaderTest, // // # of usage entries 5 2 TEST_F(UsageTableHeaderTest, DeleteEntry_LastSecureStopEntriesAreMissing) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoSecureStop1, kUsageEntryInfoSecureStop2, kUsageEntryInfoSecureStop3}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -766,10 +834,13 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastSecureStopEntriesAreMissing) { // # of usage entries 5 2 TEST_F(UsageTableHeaderTest, DeleteEntry_LastOfflineEntriesHaveIncorrectUsageEntryNumber) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense1, kUsageEntryInfoOfflineLicense2, kUsageEntryInfoOfflineLicense3}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -832,10 +903,13 @@ TEST_F(UsageTableHeaderTest, // # of usage entries 5 2 TEST_F(UsageTableHeaderTest, DeleteEntry_LastSecureStopEntriesHaveIncorrectUsageEntryNumber) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoSecureStop1, kUsageEntryInfoSecureStop2, kUsageEntryInfoSecureStop3}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -907,10 +981,13 @@ TEST_F(UsageTableHeaderTest, // // # of usage entries 7 4 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreStorageTypeUnknown) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoSecureStop1, kUsageEntryInfoOfflineLicense1, kUsageEntryInfoOfflineLicense2, kUsageEntryInfoOfflineLicense3, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoStorageTypeUnknown}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -960,10 +1037,13 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreStorageTypeUnknown) { // # of usage entries 5 5 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntryIsOffline_MoveOfflineEntryFailed) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense1, kUsageEntryInfoOfflineLicense2, kUsageEntryInfoOfflineLicense3}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -1026,10 +1106,13 @@ TEST_F(UsageTableHeaderTest, // # of usage entries 5 5 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntryIsSecureStop_MoveSecureStopEntryFailed) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoSecureStop1, kUsageEntryInfoSecureStop2, kUsageEntryInfoSecureStop3}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -1099,11 +1182,14 @@ TEST_F(UsageTableHeaderTest, // # of usage entries 7 5 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreOfflineAndUnknown_MoveOfflineEntryFailed) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense1, kUsageEntryInfoOfflineLicense2, kUsageEntryInfoOfflineLicense3, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoStorageTypeUnknown}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -1177,11 +1263,14 @@ TEST_F(UsageTableHeaderTest, // # of usage entries 7 5 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreSecureStopAndUnknown_MoveOfflineEntryFailed) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoSecureStop1, kUsageEntryInfoSecureStop2, kUsageEntryInfoSecureStop3, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoStorageTypeUnknown}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -1250,10 +1339,13 @@ TEST_F(UsageTableHeaderTest, // // # of usage entries 5 4 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntryIsOffline) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense1, kUsageEntryInfoOfflineLicense2, kUsageEntryInfoOfflineLicense3}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -1364,10 +1456,13 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntryIsOffline) { // // # of usage entries 5 4 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntryIsSecureStop) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoSecureStop1, kUsageEntryInfoSecureStop2, kUsageEntryInfoSecureStop3}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -1463,11 +1558,14 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntryIsSecureStop) { // // # of usage entries 7 4 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreOfflineAndUnknknown) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense1, kUsageEntryInfoOfflineLicense2, kUsageEntryInfoOfflineLicense3, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoStorageTypeUnknown}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -1582,11 +1680,14 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreOfflineAndUnknknown) { // // # of usage entries 7 4 TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreSecureStopAndUnknknown) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoSecureStop1, kUsageEntryInfoSecureStop2, kUsageEntryInfoSecureStop3, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoStorageTypeUnknown}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); Init(kSecurityLevelL1, kUsageTableHeader, usage_entry_info_vector); uint32_t usage_entry_number_to_be_deleted = @@ -1663,9 +1764,12 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreSecureStopAndUnknknown) { // If the crypto session says the usage table header is stale, init should fail. TEST_F(UsageTableHeaderTest, StaleHeader) { - const std::vector usage_entry_info_vector = { + std::vector usage_entry_info_vector; + const CdmUsageEntryInfo usage_entry_info_array[] = { kUsageEntryInfoOfflineLicense1, kUsageEntryInfoSecureStop1, kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense2}; + ToVector(usage_entry_info_vector, usage_entry_info_array, + sizeof(usage_entry_info_array)); EXPECT_CALL(*device_files_, RetrieveUsageTableInfo(NotNull(), NotNull())) .WillOnce(DoAll(SetArgPointee<0>(kUsageTableHeader), diff --git a/libwvdrmengine/cdm/metrics/include/metrics_collections.h b/libwvdrmengine/cdm/metrics/include/metrics_collections.h index be161e2c..f047c1fa 100644 --- a/libwvdrmengine/cdm/metrics/include/metrics_collections.h +++ b/libwvdrmengine/cdm/metrics/include/metrics_collections.h @@ -10,9 +10,11 @@ #include #include +#include "counter_metric.h" #include "event_metric.h" #include "metrics.pb.h" #include "OEMCryptoCENC.h" +#include "value_metric.h" #include "wv_cdm_types.h" // This definition indicates that a given metric does not need timing @@ -86,70 +88,64 @@ class CryptoMetrics { void Serialize(drm_metrics::MetricsGroup* metrics); /* CRYPTO SESSION */ - EventMetric crypto_session_delete_all_usage_reports_; - EventMetric crypto_session_delete_multiple_usage_information_; + // TODO(blueeyes): Convert this to crypto_session_default_security_level_. + ValueMetric crypto_session_security_level_; + CounterMetric crypto_session_delete_all_usage_reports_; + CounterMetric crypto_session_delete_multiple_usage_information_; EventMetric crypto_session_generic_decrypt_; EventMetric crypto_session_generic_encrypt_; EventMetric crypto_session_generic_sign_; EventMetric crypto_session_generic_verify_; - EventMetric crypto_session_get_device_unique_id_; - EventMetric crypto_session_get_security_level_; - EventMetric crypto_session_get_system_id_; - EventMetric crypto_session_get_token_; - EventMetric<> crypto_session_life_span_; + CounterMetric crypto_session_get_device_unique_id_; + CounterMetric crypto_session_get_token_; + ValueMetric crypto_session_life_span_; EventMetric crypto_session_load_certificate_private_key_; - EventMetric crypto_session_open_; + EventMetric crypto_session_open_; // This is the requested security level. + ValueMetric crypto_session_system_id_; EventMetric crypto_session_update_usage_information_; - EventMetric crypto_session_usage_information_support_; + ValueMetric crypto_session_usage_information_support_; /* OEMCRYPTO */ - EventMetric oemcrypto_api_version_; - EventMetric oemcrypto_close_session_; - EventMetric oemcrypto_copy_buffer_; - EventMetric oemcrypto_deactivate_usage_entry_; + ValueMetric oemcrypto_api_version_; + CounterMetric oemcrypto_close_session_; + EventMetric oemcrypto_copy_buffer_; + ValueMetric oemcrypto_current_hdcp_capability_; + CounterMetric oemcrypto_deactivate_usage_entry_; EventMetric oemcrypto_decrypt_cenc_; - EventMetric oemcrypto_delete_usage_entry_; - EventMetric oemcrypto_delete_usage_table_; + CounterMetric oemcrypto_delete_usage_entry_; + CounterMetric oemcrypto_delete_usage_table_; EventMetric oemcrypto_derive_keys_from_session_key_; - EventMetric oemcrypto_force_delete_usage_entry_; + CounterMetric oemcrypto_force_delete_usage_entry_; EventMetric oemcrypto_generate_derived_keys_; - EventMetric oemcrypto_generate_nonce_; + CounterMetric oemcrypto_generate_nonce_; EventMetric oemcrypto_generate_rsa_signature_; EventMetric oemcrypto_generate_signature_; EventMetric oemcrypto_generic_decrypt_; EventMetric oemcrypto_generic_encrypt_; EventMetric oemcrypto_generic_sign_; EventMetric oemcrypto_generic_verify_; - EventMetric oemcrypto_get_device_id_; - EventMetric oemcrypto_get_hdcp_capability_; - EventMetric oemcrypto_get_key_data_; - EventMetric oemcrypto_get_max_number_of_sessions_; - EventMetric oemcrypto_get_number_of_open_sessions_; - EventMetric oemcrypto_get_oem_public_certificate_; - EventMetric oemcrypto_get_provisioning_method_; - EventMetric oemcrypto_get_random_; + CounterMetric oemcrypto_get_device_id_; + EventMetric oemcrypto_get_key_data_; + CounterMetric oemcrypto_get_oem_public_certificate_; + CounterMetric oemcrypto_get_random_; EventMetric oemcrypto_initialize_; - EventMetric oemcrypto_install_keybox_; - EventMetric oemcrypto_is_anti_rollback_hw_present_; - EventMetric oemcrypto_is_keybox_valid_; + EventMetric oemcrypto_install_keybox_; + ValueMetric oemcrypto_is_anti_rollback_hw_present_; + ValueMetric oemcrypto_is_keybox_valid_; EventMetric oemcrypto_load_device_rsa_key_; EventMetric oemcrypto_load_keys_; - EventMetric oemcrypto_load_test_keybox_; - EventMetric oemcrypto_load_test_rsa_key_; - EventMetric oemcrypto_open_session_; + ValueMetric oemcrypto_max_hdcp_capability_; + ValueMetric oemcrypto_max_number_of_sessions_; + ValueMetric oemcrypto_number_of_open_sessions_; + ValueMetric oemcrypto_provisioning_method_; EventMetric oemcrypto_refresh_keys_; - EventMetric oemcrypto_report_usage_; + CounterMetric oemcrypto_report_usage_; EventMetric oemcrypto_rewrap_device_rsa_key_; EventMetric oemcrypto_rewrap_device_rsa_key_30_; - EventMetric oemcrypto_security_level_; - EventMetric oemcrypto_security_patch_level_; + ValueMetric oemcrypto_security_patch_level_; EventMetric oemcrypto_select_key_; - EventMetric oemcrypto_supports_usage_table_; - EventMetric oemcrypto_update_usage_table_; + ValueMetric oemcrypto_supports_usage_table_; + CounterMetric oemcrypto_update_usage_table_; EventMetric oemcrypto_wrap_keybox_; - - /* Internal OEMCrypto Metrics */ - EventMetric oemcrypto_initialization_mode_; - EventMetric oemcrypto_l1_api_version_; }; // This class contains session-scoped metrics. All properties and @@ -179,10 +175,10 @@ class SessionMetrics { CryptoMetrics* GetCryptoMetrics() { return &crypto_metrics_; } // Metrics collected at the session level. - EventMetric<> cdm_session_life_span_; + ValueMetric cdm_session_life_span_; // Milliseconds. EventMetric cdm_session_renew_key_; - EventMetric cdm_session_restore_offline_session_; - EventMetric cdm_session_restore_usage_session_; + CounterMetric cdm_session_restore_offline_session_; + CounterMetric cdm_session_restore_usage_session_; // Serialize the session metrics to the provided |metric_group|. // |metric_group| is owned by the caller and must not be null. @@ -195,6 +191,45 @@ class SessionMetrics { CryptoMetrics crypto_metrics_; }; +// This class contains metrics for the OEMCrypto Dynamic Adapter. They are +// separated from other metrics because they need to be encapsulated in a +// singleton object. This is because the dynamic adapter uses the OEMCrypto +// function signatures and contract and cannot be extended to inject +// dependencies. +// +// Operations for this metrics class are serialized since these particular +// metrics may be accessed by a separate thread during intialize even as +// the metric may be serialized. +class OemCryptoDynamicAdapterMetrics { + public: + explicit OemCryptoDynamicAdapterMetrics(); + + // Set methods for OEMCrypto metrics. + void SetInitializationMode(OEMCryptoInitializationMode mode); + void SetL1ApiVersion(uint32_t version); + void SetL1MinApiVersion(uint32_t version); + + // Serialize the session metrics to the provided |metric_group|. + // |metric_group| is owned by the caller and must not be null. + void Serialize(drm_metrics::MetricsGroup* metric_group); + + // Clears the existing metric values. + void Clear(); + + private: + Lock adapter_lock_; + ValueMetric oemcrypto_initialization_mode_; + ValueMetric oemcrypto_l1_api_version_; + ValueMetric oemcrypto_l1_min_api_version_; +}; + +// This will fetch the singleton instance for dynamic adapter metrics. +// This method is safe only if we use C++ 11. In C++ 11, static function-local +// initialization is guaranteed to be threadsafe. We return the reference to +// avoid non-guaranteed destructor order problems. Effectively, the destructor +// is never run for the created instance. +OemCryptoDynamicAdapterMetrics& GetDynamicAdapterMetricsInstance(); + // This class contains engine-scoped metrics. All properties and // statistics related to operations within the engine, but outside // the scope of a session are recorded here. @@ -228,33 +263,39 @@ class EngineMetrics { void Serialize(drm_metrics::MetricsGroup* metric_group, bool completed_only, bool clear_serialized_sessions); + void SetAppPackageName(const std::string& app_package_name); + // Metrics recorded at the engine level. EventMetric cdm_engine_add_key_; - EventMetric cdm_engine_close_session_; - EventMetric cdm_engine_decrypt_; - EventMetric cdm_engine_find_session_for_key_; + ValueMetric cdm_engine_cdm_version_; + CounterMetric cdm_engine_close_session_; + ValueMetric cdm_engine_creation_time_millis_; + EventMetric cdm_engine_decrypt_; + CounterMetric cdm_engine_find_session_for_key_; EventMetric cdm_engine_generate_key_request_; EventMetric cdm_engine_get_provisioning_request_; EventMetric cdm_engine_get_usage_info_; EventMetric cdm_engine_handle_provisioning_response_; - EventMetric<> cdm_engine_life_span_; - EventMetric cdm_engine_open_key_set_session_; - EventMetric cdm_engine_open_session_; + ValueMetric cdm_engine_life_span_; // Milliseconds + CounterMetric cdm_engine_open_key_set_session_; + CounterMetric cdm_engine_open_session_; EventMetric cdm_engine_query_key_status_; - EventMetric cdm_engine_release_all_usage_info_; - EventMetric cdm_engine_release_usage_info_; - EventMetric cdm_engine_remove_keys_; + CounterMetric cdm_engine_release_all_usage_info_; + CounterMetric cdm_engine_release_usage_info_; + CounterMetric cdm_engine_remove_keys_; EventMetric cdm_engine_restore_key_; - EventMetric cdm_engine_unprovision_; + CounterMetric cdm_engine_unprovision_; private: Lock session_metrics_lock_; std::vector session_metrics_list_; CryptoMetrics crypto_metrics_; + std::string app_package_name_; void SerializeEngineMetrics(drm_metrics::MetricsGroup* out); }; } // namespace metrics } // namespace wvcdm -#endif + +#endif // WVCDM_METRICS_METRICS_GROUP_H_ diff --git a/libwvdrmengine/cdm/metrics/include/value_metric.h b/libwvdrmengine/cdm/metrics/include/value_metric.h index 6de010ee..5c0704ef 100644 --- a/libwvdrmengine/cdm/metrics/include/value_metric.h +++ b/libwvdrmengine/cdm/metrics/include/value_metric.h @@ -86,6 +86,12 @@ class ValueMetric : public MetricSerializable { // Get the current value of the metric. const T& GetValue() { return value_; } + // Clears the indicators that the metric or error was set. + void Clear() { + has_value_ = false; + has_error_ = false; + } + private: std::string metric_name_; T value_; diff --git a/libwvdrmengine/cdm/metrics/src/metrics.proto b/libwvdrmengine/cdm/metrics/src/metrics.proto index 4df1fe53..02c5af24 100644 --- a/libwvdrmengine/cdm/metrics/src/metrics.proto +++ b/libwvdrmengine/cdm/metrics/src/metrics.proto @@ -33,4 +33,7 @@ message MetricsGroup { // Allow multiple sub groups of metrics. repeated MetricsGroup metric_sub_group = 2; + + // Name of the application package associated with the metrics. + optional string app_package_name = 3; } diff --git a/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp b/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp index 34b9722c..f7a2a291 100644 --- a/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp +++ b/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp @@ -63,11 +63,13 @@ namespace wvcdm { namespace metrics { CryptoMetrics::CryptoMetrics() : + crypto_session_security_level_( + "/drm/widevine/crypto_session/security_level"), crypto_session_delete_all_usage_reports_( - "/drm/widevine/crypto_session/delete_all_usage_reports/time", + "/drm/widevine/crypto_session/delete_all_usage_reports", "error"), crypto_session_delete_multiple_usage_information_( - "/drm/widevine/crypto_session/delete_multiple_usage_information/time", + "/drm/widevine/crypto_session/delete_multiple_usage_information", "error"), crypto_session_generic_decrypt_( "/drm/widevine/crypto_session/generic_decrypt/time", @@ -90,20 +92,13 @@ CryptoMetrics::CryptoMetrics() : "length", "signing_algorithm"), crypto_session_get_device_unique_id_( - "/drm/widevine/crypto_session/get_device_unique_id/time", + "/drm/widevine/crypto_session/get_device_unique_id", "success"), - crypto_session_get_security_level_( - "/drm/widevine/crypto_session/get_security_level/time", - "security_level"), - crypto_session_get_system_id_( - "/drm/widevine/crypto_session/get_system_id/time", - "success", - "system_id"), crypto_session_get_token_( - "/drm/widevine/crypto_session/get_token/time", + "/drm/widevine/crypto_session/get_token", "success"), crypto_session_life_span_( - "/drm/widevine/crypto_session/life_span/time"), + "/drm/widevine/crypto_session/life_span"), crypto_session_load_certificate_private_key_( "/drm/widevine/crypto_session/load_certificate_private_key/time", "success"), @@ -111,48 +106,48 @@ CryptoMetrics::CryptoMetrics() : "/drm/widevine/crypto_session/open/time", "error", "requested_security_level"), + crypto_session_system_id_( + "/drm/widevine/crypto_session/system_id"), crypto_session_update_usage_information_( "/drm/widevine/crypto_session/update_usage_information/time", "error"), crypto_session_usage_information_support_( - "/drm/widevine/crypto_session/usage_information_support/time", - "success"), + "/drm/widevine/crypto_session/usage_information_support"), oemcrypto_api_version_( - "/drm/widevine/oemcrypto/api_version/time", - "version", - "requested_security_level"), + "/drm/widevine/oemcrypto/api_version"), oemcrypto_close_session_( - "/drm/widevine/oemcrypto/close_session/time", + "/drm/widevine/oemcrypto/close_session", "oemcrypto_error"), oemcrypto_copy_buffer_( "/drm/widevine/oemcrypto/copy_buffer/time", "oemcrypto_error", - "requested_security_level", "length"), + oemcrypto_current_hdcp_capability_( + "/drm/widevine/oemcrypto/current_hdcp_capability"), oemcrypto_deactivate_usage_entry_( - "/drm/widevine/oemcrypto/deactivate_usage_entry/time", + "/drm/widevine/oemcrypto/deactivate_usage_entry", "oemcrypto_error"), oemcrypto_decrypt_cenc_( "/drm/widevine/oemcrypto/decrypt_cenc/time", "oemcrypto_error", "length"), oemcrypto_delete_usage_entry_( - "/drm/widevine/oemcrypto/delete_usage_entry/time", + "/drm/widevine/oemcrypto/delete_usage_entry", "oemcrypto_error"), oemcrypto_delete_usage_table_( - "/drm/widevine/oemcrypto/delete_usage_table/time", + "/drm/widevine/oemcrypto/delete_usage_table", "oemcrypto_error"), oemcrypto_derive_keys_from_session_key_( "/drm/widevine/oemcrypto/derive_keys_from_session_key/time", "oemcrypto_error"), oemcrypto_force_delete_usage_entry_( - "/drm/widevine/oemcrypto/force_delete_usage_entry/time", + "/drm/widevine/oemcrypto/force_delete_usage_entry", "oemcrypto_error"), oemcrypto_generate_derived_keys_( "/drm/widevine/oemcrypto/generate_derived_keys/time", "oemcrypto_error"), oemcrypto_generate_nonce_( - "/drm/widevine/oemcrypto/generate_nonce/time", + "/drm/widevine/oemcrypto/generate_nonce", "oemcrypto_error"), oemcrypto_generate_rsa_signature_( "/drm/widevine/oemcrypto/generate_rsa_signature/time", @@ -179,73 +174,47 @@ CryptoMetrics::CryptoMetrics() : "oemcrypto_error", "length"), oemcrypto_get_device_id_( - "/drm/widevine/oemcrypto/get_device_id/time", - "oemcrypto_error", - "requested_security_level"), - oemcrypto_get_hdcp_capability_( - "/drm/widevine/oemcrypto/get_hdcp_capability/time", - "oemcrypto_error", - "requested_security_level"), + "/drm/widevine/oemcrypto/get_device_id", + "oemcrypto_error"), oemcrypto_get_key_data_( "/drm/widevine/oemcrypto/get_key_data/time", "oemcrypto_error", - "length", - "requested_security_level"), - oemcrypto_get_max_number_of_sessions_( - "/drm/widevine/oemcrypto/get_max_number_of_sessions/time", - "oemcrypto_error", - "requested_security_level"), - oemcrypto_get_number_of_open_sessions_( - "/drm/widevine/oemcrypto/get_number_of_open_sessions/time", - "oemcrypto_error", - "requested_security_level"), - oemcrypto_get_oem_public_certificate_( - "/drm/widevine/oemcrypto/get_oem_public_certificate/time", - "oemcrypto_error"), - oemcrypto_get_provisioning_method_( - "/drm/widevine/oemcrypto/get_provisioning_method/time", - "method", - "requested_security_level"), - oemcrypto_get_random_( - "/drm/widevine/oemcrypto/get_random/time", - "oemcrypto_error", "length"), + oemcrypto_get_oem_public_certificate_( + "/drm/widevine/oemcrypto/get_oem_public_certificate", + "oemcrypto_error"), + oemcrypto_get_random_( + "/drm/widevine/oemcrypto/get_random", + "oemcrypto_error"), oemcrypto_initialize_( "/drm/widevine/oemcrypto/initialize/time", "oemcrypto_error"), oemcrypto_install_keybox_( "/drm/widevine/oemcrypto/install_keybox/time", - "oemcrypto_error", - "requested_security_level"), + "oemcrypto_error"), oemcrypto_is_anti_rollback_hw_present_( - "/drm/widevine/oemcrypto/is_anti_rollback_hw_present/time", - "success", - "requested_security_level"), + "/drm/widevine/oemcrypto/is_anti_rollback_hw_present"), oemcrypto_is_keybox_valid_( - "/drm/widevine/oemcrypto/is_keybox_valid/time", - "oemcrypto_error", - "requested_security_level"), + "/drm/widevine/oemcrypto/is_keybox_valid"), oemcrypto_load_device_rsa_key_( "/drm/widevine/oemcrypto/load_device_rsa_key/time", "oemcrypto_error"), oemcrypto_load_keys_( "/drm/widevine/oemcrypto/load_keys/time", "oemcrypto_error"), - oemcrypto_load_test_keybox_( - "/drm/widevine/oemcrypto/load_test_keybox/time", - "oemcrypto_error"), - oemcrypto_load_test_rsa_key_( - "/drm/widevine/oemcrypto/load_test_rsa_key/time", - "oemcrypto_error"), - oemcrypto_open_session_( - "/drm/widevine/oemcrypto/open_session/time", - "oemcrypto_error", - "requested_security_level"), + oemcrypto_max_hdcp_capability_( + "/drm/widevine/oemcrypto/max_hdcp_capability"), + oemcrypto_max_number_of_sessions_( + "/drm/widevine/oemcrypto/max_number_of_sessions"), + oemcrypto_number_of_open_sessions_( + "/drm/widevine/oemcrypto/number_of_open_sessions"), + oemcrypto_provisioning_method_( + "/drm/widevine/oemcrypto/provisioning_method"), oemcrypto_refresh_keys_( "/drm/widevine/oemcrypto/refresh_keys/time", "oemcrypto_error"), oemcrypto_report_usage_( - "/drm/widevine/oemcrypto/report_usage/time", + "/drm/widevine/oemcrypto/report_usage", "oemcrypto_error"), oemcrypto_rewrap_device_rsa_key_( "/drm/widevine/oemcrypto/rewrap_device_rsa_key/time", @@ -253,38 +222,25 @@ CryptoMetrics::CryptoMetrics() : oemcrypto_rewrap_device_rsa_key_30_( "/drm/widevine/oemcrypto/rewrap_device_rsa_key_30/time", "oemcrypto_error"), - oemcrypto_security_level_( - "/drm/widevine/oemcrypto/security_level/time", - "security_level", - "requested_security_level"), oemcrypto_security_patch_level_( - "/drm/widevine/oemcrypto/security_patch_level/time", - "patch", - "requested_security_level"), + "/drm/widevine/oemcrypto/security_patch_level"), oemcrypto_select_key_( "/drm/widevine/oemcrypto/select_key/time", "oemcrypto_error"), oemcrypto_supports_usage_table_( - "/drm/widevine/oemcrypto/supports_usage_table/time", - "oemcrypto_error", - "requested_security_level"), + "/drm/widevine/oemcrypto/supports_usage_table"), oemcrypto_update_usage_table_( - "/drm/widevine/oemcrypto/update_usage_table/time", + "/drm/widevine/oemcrypto/update_usage_table", "oemcrypto_error"), oemcrypto_wrap_keybox_( "/drm/widevine/oemcrypto/wrap_keybox/time", - "oemcrypto_error"), - oemcrypto_initialization_mode_( - "/drm/widevine/oemcrypto/initialization_mode", - "initialization_mode"), - oemcrypto_l1_api_version_( - "/drm/widevine/oemcrypto/l1_api_version", - "version", - "min_version") {} + "oemcrypto_error") { +} void CryptoMetrics::Serialize(MetricsGroup* metrics) { ProtoMetricSerializer serializer(metrics); /* CRYPTO SESSION */ + crypto_session_security_level_.Serialize(&serializer); crypto_session_delete_all_usage_reports_.Serialize(&serializer); crypto_session_delete_multiple_usage_information_.Serialize(&serializer); crypto_session_generic_decrypt_.Serialize(&serializer); @@ -292,12 +248,11 @@ void CryptoMetrics::Serialize(MetricsGroup* metrics) { crypto_session_generic_sign_.Serialize(&serializer); crypto_session_generic_verify_.Serialize(&serializer); crypto_session_get_device_unique_id_.Serialize(&serializer); - crypto_session_get_security_level_.Serialize(&serializer); - crypto_session_get_system_id_.Serialize(&serializer); crypto_session_get_token_.Serialize(&serializer); crypto_session_life_span_.Serialize(&serializer); crypto_session_load_certificate_private_key_.Serialize(&serializer); crypto_session_open_.Serialize(&serializer); + crypto_session_system_id_.Serialize(&serializer); crypto_session_update_usage_information_.Serialize(&serializer); crypto_session_usage_information_support_.Serialize(&serializer); @@ -305,6 +260,7 @@ void CryptoMetrics::Serialize(MetricsGroup* metrics) { oemcrypto_api_version_.Serialize(&serializer); oemcrypto_close_session_.Serialize(&serializer); oemcrypto_copy_buffer_.Serialize(&serializer); + oemcrypto_current_hdcp_capability_.Serialize(&serializer); oemcrypto_deactivate_usage_entry_.Serialize(&serializer); oemcrypto_decrypt_cenc_.Serialize(&serializer); oemcrypto_delete_usage_entry_.Serialize(&serializer); @@ -320,12 +276,8 @@ void CryptoMetrics::Serialize(MetricsGroup* metrics) { oemcrypto_generic_sign_.Serialize(&serializer); oemcrypto_generic_verify_.Serialize(&serializer); oemcrypto_get_device_id_.Serialize(&serializer); - oemcrypto_get_hdcp_capability_.Serialize(&serializer); oemcrypto_get_key_data_.Serialize(&serializer); - oemcrypto_get_max_number_of_sessions_.Serialize(&serializer); - oemcrypto_get_number_of_open_sessions_.Serialize(&serializer); oemcrypto_get_oem_public_certificate_.Serialize(&serializer); - oemcrypto_get_provisioning_method_.Serialize(&serializer); oemcrypto_get_random_.Serialize(&serializer); oemcrypto_initialize_.Serialize(&serializer); oemcrypto_install_keybox_.Serialize(&serializer); @@ -333,36 +285,32 @@ void CryptoMetrics::Serialize(MetricsGroup* metrics) { oemcrypto_is_keybox_valid_.Serialize(&serializer); oemcrypto_load_device_rsa_key_.Serialize(&serializer); oemcrypto_load_keys_.Serialize(&serializer); - oemcrypto_load_test_keybox_.Serialize(&serializer); - oemcrypto_load_test_rsa_key_.Serialize(&serializer); - oemcrypto_open_session_.Serialize(&serializer); + oemcrypto_max_hdcp_capability_.Serialize(&serializer); + oemcrypto_max_number_of_sessions_.Serialize(&serializer); + oemcrypto_number_of_open_sessions_.Serialize(&serializer); + oemcrypto_provisioning_method_.Serialize(&serializer); oemcrypto_refresh_keys_.Serialize(&serializer); oemcrypto_report_usage_.Serialize(&serializer); oemcrypto_rewrap_device_rsa_key_.Serialize(&serializer); oemcrypto_rewrap_device_rsa_key_30_.Serialize(&serializer); - oemcrypto_security_level_.Serialize(&serializer); oemcrypto_security_patch_level_.Serialize(&serializer); oemcrypto_select_key_.Serialize(&serializer); oemcrypto_supports_usage_table_.Serialize(&serializer); oemcrypto_update_usage_table_.Serialize(&serializer); oemcrypto_wrap_keybox_.Serialize(&serializer); - - /* Internal OEMCrypto Metrics */ - oemcrypto_initialization_mode_.Serialize(&serializer); - oemcrypto_l1_api_version_.Serialize(&serializer); } SessionMetrics::SessionMetrics() : cdm_session_life_span_( - "/drm/widevine/cdm_session/life_span/time"), + "/drm/widevine/cdm_session/life_span"), cdm_session_renew_key_( "/drm/widevine/cdm_session/renew_key/time", "error"), cdm_session_restore_offline_session_( - "/drm/widevine/cdm_session/restore_offline_session/time", + "/drm/widevine/cdm_session/restore_offline_session", "error"), cdm_session_restore_usage_session_( - "/drm/widevine/cdm_session/restore_usage_session/time", + "/drm/widevine/cdm_session/restore_usage_session", "error"), completed_(false) { } @@ -382,18 +330,76 @@ void SessionMetrics::SerializeSessionMetrics(MetricsGroup* metric_group) { cdm_session_restore_usage_session_.Serialize(&serializer); } +OemCryptoDynamicAdapterMetrics::OemCryptoDynamicAdapterMetrics() : + oemcrypto_initialization_mode_( + "/drm/widevine/oemcrypto/initialization_mode"), + oemcrypto_l1_api_version_( + "/drm/widevine/oemcrypto/l1_api_version"), + oemcrypto_l1_min_api_version_( + "/drm/widevine/oemcrypto/l1_min_api_version") { +} + +void OemCryptoDynamicAdapterMetrics::SetInitializationMode( + OEMCryptoInitializationMode mode) { + AutoLock lock(adapter_lock_); + oemcrypto_initialization_mode_.Record(mode); +} + +void OemCryptoDynamicAdapterMetrics::SetL1ApiVersion(uint32_t version) { + AutoLock lock(adapter_lock_); + oemcrypto_l1_api_version_.Record(version); +} + +void OemCryptoDynamicAdapterMetrics::SetL1MinApiVersion(uint32_t version) { + AutoLock lock(adapter_lock_); + oemcrypto_l1_min_api_version_.Record(version); +} + +void OemCryptoDynamicAdapterMetrics::Serialize( + drm_metrics::MetricsGroup* metric_group) { + AutoLock lock(adapter_lock_); + ProtoMetricSerializer serializer(metric_group); + + oemcrypto_initialization_mode_.Serialize(&serializer); + oemcrypto_l1_api_version_.Serialize(&serializer); + oemcrypto_l1_min_api_version_.Serialize(&serializer); +} + +void OemCryptoDynamicAdapterMetrics::Clear() { + AutoLock lock(adapter_lock_); + + oemcrypto_initialization_mode_.Clear(); + oemcrypto_l1_api_version_.Clear(); + oemcrypto_l1_min_api_version_.Clear(); +} + +// This method returns a reference. This means that the destructor is never +// executed for the returned object. +OemCryptoDynamicAdapterMetrics& GetDynamicAdapterMetricsInstance() { + // This is safe in C++ 11 since the initialization is guaranteed to run + // only once regardless of multi-threaded access. + static OemCryptoDynamicAdapterMetrics* adapter_metrics = + new OemCryptoDynamicAdapterMetrics(); + return *adapter_metrics; +} + EngineMetrics::EngineMetrics() : cdm_engine_add_key_( "/drm/widevine/cdm_engine/add_key/time", "error"), + cdm_engine_cdm_version_( + "/drm/widevine/cdm_engine/version"), cdm_engine_close_session_( - "/drm/widevine/cdm_engine/close_session/time", + "/drm/widevine/cdm_engine/close_session", "error"), + cdm_engine_creation_time_millis_( + "/drm/widevine/cdm_engine/creation_time_millis"), cdm_engine_decrypt_( "/drm/widevine/cdm_engine/decrypt/time", - "error"), + "error", + "length"), cdm_engine_find_session_for_key_( - "/drm/widevine/cdm_engine/find_session_for_key/time", + "/drm/widevine/cdm_engine/find_session_for_key", "success"), cdm_engine_generate_key_request_( "/drm/widevine/cdm_engine/generate_key_request/time", @@ -408,36 +414,37 @@ EngineMetrics::EngineMetrics() : "/drm/widevine/cdm_engine/handle_provisioning_response/time", "error"), cdm_engine_life_span_( - "/drm/widevine/cdm_engine/life_span/time"), + "/drm/widevine/cdm_engine/life_span"), cdm_engine_open_key_set_session_( - "/drm/widevine/cdm_engine/open_key_set_session/time", + "/drm/widevine/cdm_engine/open_key_set_session", "error"), cdm_engine_open_session_( - "/drm/widevine/cdm_engine/open_session/time", + "/drm/widevine/cdm_engine/open_session", "error"), cdm_engine_query_key_status_( "/drm/widevine/cdm_engine/query_key_status/time", "error"), cdm_engine_release_all_usage_info_( - "/drm/widevine/cdm_engine/release_all_usage_info/time", + "/drm/widevine/cdm_engine/release_all_usage_info", "error"), cdm_engine_release_usage_info_( - "/drm/widevine/cdm_engine/release_usage_info/time", + "/drm/widevine/cdm_engine/release_usage_info", "error"), cdm_engine_remove_keys_( - "/drm/widevine/cdm_engine/remove_keys/time", + "/drm/widevine/cdm_engine/remove_keys", "error"), cdm_engine_restore_key_( "/drm/widevine/cdm_engine/restore_key/time", "error"), cdm_engine_unprovision_( - "/drm/widevine/cdm_engine/unprovision/time", + "/drm/widevine/cdm_engine/unprovision", "error", - "security_level") { + "security_level"), + app_package_name_("") { } EngineMetrics::~EngineMetrics() { - AutoLock kock(session_metrics_lock_); + AutoLock lock(session_metrics_lock_); std::vector::iterator i; if (!session_metrics_list_.empty()) { LOGV("EngineMetrics::~EngineMetrics. Session count: %d", @@ -471,13 +478,24 @@ void EngineMetrics::Serialize(drm_metrics::MetricsGroup* metric_group, bool clear_serialized_sessions) { AutoLock lock(session_metrics_lock_); + // Serialize the most recent metrics from the OemCyrpto dynamic adapter. + OemCryptoDynamicAdapterMetrics& adapter_metrics = + GetDynamicAdapterMetricsInstance(); + adapter_metrics.Serialize(metric_group); + if (!app_package_name_.empty()) { + metric_group->set_app_package_name(app_package_name_); + } SerializeEngineMetrics(metric_group); std::vector::iterator i; for (i = session_metrics_list_.begin(); i != session_metrics_list_.end(); /* no increment */) { bool serialized = false; if (!completed_only || (*i)->IsCompleted()) { - (*i)->Serialize(metric_group->add_metric_sub_group()); + MetricsGroup* metric_sub_group = metric_group->add_metric_sub_group(); + if (!app_package_name_.empty()) { + metric_sub_group->set_app_package_name(app_package_name_); + } + (*i)->Serialize(metric_sub_group); serialized = true; } @@ -490,10 +508,16 @@ void EngineMetrics::Serialize(drm_metrics::MetricsGroup* metric_group, } } +void EngineMetrics::SetAppPackageName(const std::string& app_package_name) { + app_package_name_ = app_package_name; +} + void EngineMetrics::SerializeEngineMetrics(MetricsGroup* metric_group) { ProtoMetricSerializer serializer(metric_group); cdm_engine_add_key_.Serialize(&serializer); + cdm_engine_cdm_version_.Serialize(&serializer); cdm_engine_close_session_.Serialize(&serializer); + cdm_engine_creation_time_millis_.Serialize(&serializer); cdm_engine_decrypt_.Serialize(&serializer); cdm_engine_find_session_for_key_.Serialize(&serializer); cdm_engine_generate_key_request_.Serialize(&serializer); diff --git a/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp b/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp index ee644414..ae51fade 100644 --- a/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp +++ b/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp @@ -58,7 +58,7 @@ TEST_F(EngineMetricsTest, AllEngineMetrics) { // Spot check some metrics. EXPECT_EQ("/drm/widevine/cdm_engine/add_key/time/count{error:2}", actual_metrics.metric(0).name()); - EXPECT_EQ("/drm/widevine/cdm_engine/close_session/time/mean{error:0}", + EXPECT_EQ("/drm/widevine/cdm_engine/close_session/count{error:0}", actual_metrics.metric(3).name()); EXPECT_EQ("/drm/widevine/cdm_engine/decrypt/time/mean{error:0}", actual_metrics.metric(5).name()); @@ -95,7 +95,7 @@ TEST_F(EngineMetricsTest, EngineAndCryptoMetrics) { "{error:0&length:1024&encryption_algorithm:1}", actual_metrics.metric(4).name()); EXPECT_EQ( - "/drm/widevine/crypto_session/get_device_unique_id/time/mean{success:0}", + "/drm/widevine/crypto_session/get_device_unique_id/count{success:0}", actual_metrics.metric(7).name()); EXPECT_EQ(4.0, actual_metrics.metric(7).value().double_value()); } @@ -266,7 +266,7 @@ TEST_F(SessionMetricsTest, AllSessionMetrics) { // Spot check some metrics. EXPECT_EQ("/drm/widevine/cdm_session/session_id", actual_metrics.metric(0).name()); - EXPECT_EQ("/drm/widevine/cdm_session/life_span/time/count", + EXPECT_EQ("/drm/widevine/cdm_session/life_span", actual_metrics.metric(1).name()); EXPECT_EQ("/drm/widevine/cdm_session/renew_key/time/mean{error:0}", actual_metrics.metric(4).name()); @@ -428,7 +428,7 @@ TEST_F(CryptoMetricsTest, AllCryptoMetrics) { // Spot check some metrics. EXPECT_EQ( - "/drm/widevine/crypto_session/delete_all_usage_reports/time/count" + "/drm/widevine/crypto_session/delete_all_usage_reports/count" "{error:0}", actual_metrics.metric(0).name()); EXPECT_EQ(1, actual_metrics.metric(0).value().int_value()); diff --git a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp index 0c3be8ff..365320b5 100644 --- a/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp +++ b/libwvdrmengine/cdm/src/wv_content_decryption_module.cpp @@ -400,7 +400,7 @@ bool WvContentDecryptionModule::IsValidServiceCertificate( ServiceCertificate cert; CdmResponseType status = cert.Init(certificate); if (status != NO_ERROR) return false; - return cert.HasCertificate(); + return cert.has_certificate(); } WvContentDecryptionModule::CdmInfo::CdmInfo() diff --git a/libwvdrmengine/cdm/test/wv_cdm_metrics_test.cpp b/libwvdrmengine/cdm/test/wv_cdm_metrics_test.cpp index a411808e..ab9bc760 100644 --- a/libwvdrmengine/cdm/test/wv_cdm_metrics_test.cpp +++ b/libwvdrmengine/cdm/test/wv_cdm_metrics_test.cpp @@ -13,7 +13,7 @@ using ::testing::Eq; using ::testing::StrEq; -using ::testing::Gt; +using ::testing::Ge; using ::testing::Test; using wvcdm::CdmResponseType; @@ -53,13 +53,17 @@ TEST_F(WvContentDecryptionModuleMetricsTest, EngineOnlyMetrics) { ASSERT_TRUE(metrics.ParseFromString(serialized_metrics)); EXPECT_THAT(metrics.metric_size(), Eq(0)); ASSERT_THAT(metrics.metric_sub_group_size(), Eq(1)); - ASSERT_THAT(metrics.metric_sub_group(0).metric_size(), Gt(0)); + ASSERT_THAT(metrics.metric_sub_group(0).metric_size(), Ge(6)); EXPECT_THAT(metrics.metric_sub_group(0).metric_sub_group_size(), Eq(0)); + EXPECT_THAT(metrics.metric_sub_group(0).metric(0).name(), + StrEq("/drm/widevine/oemcrypto/initialization_mode")); + // Can't check the initialization mode value. Different devices will have + // different values. EXPECT_THAT( - metrics.metric_sub_group(0).metric(0).name(), + metrics.metric_sub_group(0).metric(5).name(), StrEq("/drm/widevine/cdm_engine/" "get_provisioning_request/time/count{error:0}")); - EXPECT_THAT(metrics.metric_sub_group(0).metric(0).value().int_value(), Eq(1)); + EXPECT_THAT(metrics.metric_sub_group(0).metric(5).value().int_value(), Eq(1)); } @@ -83,13 +87,14 @@ TEST_F(WvContentDecryptionModuleMetricsTest, EngineAndSessionMetrics) { // The outer container will never have metrics. EXPECT_THAT(metrics.metric_size(), Eq(0)); ASSERT_THAT(metrics.metric_sub_group_size(), Eq(1)); - ASSERT_THAT(metrics.metric_sub_group(0).metric_size(), Gt(0)); + ASSERT_THAT(metrics.metric_sub_group(0).metric_size(), Ge(6)); - // Validate an engine-level metric. - EXPECT_THAT( - metrics.metric_sub_group(0).metric(0).name(), - StrEq("/drm/widevine/cdm_engine/open_session/time/count{error:7}")); - EXPECT_THAT(metrics.metric_sub_group(0).metric(0).value().int_value(), Eq(1)); + // Validate engine-level metrics. + EXPECT_THAT(metrics.metric_sub_group(0).metric(0).name(), + StrEq("/drm/widevine/oemcrypto/initialization_mode")); + EXPECT_THAT(metrics.metric_sub_group(0).metric(5).name(), + StrEq("/drm/widevine/cdm_engine/open_session/count{error:7}")); + EXPECT_THAT(metrics.metric_sub_group(0).metric(5).value().int_value(), Eq(1)); // Validate a session-level metric. EXPECT_THAT(metrics.metric_sub_group(0).metric_sub_group_size(), Eq(1)); @@ -101,7 +106,7 @@ TEST_F(WvContentDecryptionModuleMetricsTest, EngineAndSessionMetrics) { TEST_F(WvContentDecryptionModuleMetricsTest, MultipleEngineMetric) { CdmSessionId session_id; wvcdm::CdmKeySystem key_system("com.widevine"); - CdmIdentifier identifier = { "foo", "bar" }; + CdmIdentifier identifier = { "foo", "bar", "baz" }; // Openning the session will fail with NEEDS_PROVISIONING error. But it will // still create some session-level stats. @@ -128,17 +133,23 @@ TEST_F(WvContentDecryptionModuleMetricsTest, MultipleEngineMetric) { for (int i = 0; i < metrics.metric_sub_group_size(); i++) { // Validate the engine-level metric. - ASSERT_THAT(metrics.metric_sub_group(i).metric_size(), Gt(0)); - EXPECT_THAT( - metrics.metric_sub_group(i).metric(0).name(), - StrEq("/drm/widevine/cdm_engine/open_session/time/count{error:7}")); - EXPECT_THAT(metrics.metric_sub_group(i).metric(0).value().int_value(), Eq(1)); + ASSERT_THAT(metrics.metric_sub_group(i).metric_size(), Ge(6)); + EXPECT_THAT(metrics.metric_sub_group(i).metric(0).name(), + StrEq("/drm/widevine/oemcrypto/initialization_mode")); + EXPECT_THAT(metrics.metric_sub_group(i).metric(5).name(), + StrEq("/drm/widevine/cdm_engine/open_session/count{error:7}")); + EXPECT_THAT(metrics.metric_sub_group(i).metric(5).value().int_value(), + Eq(1)); + // Validate a session-level metric. EXPECT_THAT(metrics.metric_sub_group(i).metric_sub_group_size(), Eq(1)); EXPECT_THAT( metrics.metric_sub_group(i).metric_sub_group(0).metric(0).name(), StrEq("/drm/widevine/cdm_session/session_id")); } + + // Verify that the second metrics app package name is set. + EXPECT_THAT(metrics.metric_sub_group(1).app_package_name(), StrEq("baz")); } } diff --git a/libwvdrmengine/include/WVErrors.h b/libwvdrmengine/include/WVErrors.h index cd632ee5..f72328f9 100644 --- a/libwvdrmengine/include/WVErrors.h +++ b/libwvdrmengine/include/WVErrors.h @@ -264,10 +264,19 @@ enum { kDeleteUsageError1 = ERROR_DRM_VENDOR_MIN + 252, kDeleteUsageError2 = ERROR_DRM_VENDOR_MIN + 253, kDeleteUsageError3 = ERROR_DRM_VENDOR_MIN + 254, + kPrivacyModeError1 = ERROR_DRM_VENDOR_MIN + 255, + kPrivacyModeError2 = ERROR_DRM_VENDOR_MIN + 256, + kPrivacyModeError3 = ERROR_DRM_VENDOR_MIN + 257, + kEmptyResponseError1 = ERROR_DRM_VENDOR_MIN + 258, + kInvalidParametersEng24 = ERROR_DRM_VENDOR_MIN + 259, + kParseResponseError1 = ERROR_DRM_VENDOR_MIN + 260, + kParseResponseError2 = ERROR_DRM_VENDOR_MIN + 261, + kParseResponseError3 = ERROR_DRM_VENDOR_MIN + 262, + kParseResponseError4 = ERROR_DRM_VENDOR_MIN + 263, // This should always follow the last error code. // The offset value should be updated each time a new error code is added. - kErrorWVDrmMaxErrorUsed = ERROR_DRM_VENDOR_MIN + 254, + kErrorWVDrmMaxErrorUsed = ERROR_DRM_VENDOR_MIN + 263, // Used by crypto test mode kErrorTestMode = ERROR_DRM_VENDOR_MAX, diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index cdb3c442..e547ab51 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -288,12 +288,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kUnsupportedInitData; case wvcdm::USAGE_INFO_NOT_FOUND: return kUsageInfoNotFound; - case wvcdm::LICENSE_RENEWAL_SERVICE_CERTIFICATE_GENERATION_ERROR: - return kLicenseRenewalServiceCertificateGenerationError; case wvcdm::PARSE_SERVICE_CERTIFICATE_ERROR: return kParseServiceCertificateError; - case wvcdm::SERVICE_CERTIFICATE_TYPE_ERROR: - return kServiceCertificateTypeError; case wvcdm::CLIENT_ID_GENERATE_RANDOM_ERROR: return kClientIdGenerateRandomError; case wvcdm::CLIENT_ID_AES_INIT_ERROR: @@ -322,8 +318,6 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kInvalidParametersLic6; case wvcdm::INVALID_PARAMETERS_LIC_7: return kInvalidParametersLic7; - case wvcdm::LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR: - return kLicenseRequestServiceCertificateGenerationError; case wvcdm::CENC_INIT_DATA_UNAVAILABLE: return kCencInitDataUnavailable; case wvcdm::PREPARE_CENC_CONTENT_ID_FAILED: @@ -413,6 +407,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kInvalidParametersEng17; case wvcdm::INVALID_PARAMETERS_ENG_18: return kInvalidParametersEng18; + case wvcdm::INVALID_PARAMETERS_ENG_19: + return kInvalidParametersEng19; case wvcdm::CERT_PROVISIONING_CLIENT_TOKEN_ERROR_1: return kCertProvisioningClientTokenError1; case wvcdm::CERT_PROVISIONING_CLIENT_TOKEN_ERROR_2: @@ -443,8 +439,6 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kLoadUsageEntrySignatureFailure; case wvcdm::LOAD_USAGE_ENTRY_UNKNOWN_ERROR: return kLoadUsageEntryUnknownError; - case wvcdm::INVALID_PARAMETERS_ENG_19: - return kInvalidParametersEng19; case wvcdm::INVALID_PARAMETERS_ENG_20: return kInvalidParametersEng20; case wvcdm::UPDATE_USAGE_ENTRY_UNKNOWN_ERROR: @@ -461,6 +455,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kCopyOldUsageEntryUnknownError; case wvcdm::INVALID_PARAMETERS_ENG_23: return kInvalidParametersEng23; + case wvcdm::INVALID_PARAMETERS_ENG_24: + return kInvalidParametersEng24; case wvcdm::USAGE_INFORMATION_SUPPORT_FAILED: return kUsageInformationSupportFailed; case wvcdm::USAGE_SUPPORT_GET_API_FAILED: @@ -513,6 +509,22 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return kDeleteUsageError2; case wvcdm::DELETE_USAGE_ERROR_3: return kDeleteUsageError3; + case wvcdm::PRIVACY_MODE_ERROR_1: + return kPrivacyModeError1; + case wvcdm::PRIVACY_MODE_ERROR_2: + return kPrivacyModeError2; + case wvcdm::PRIVACY_MODE_ERROR_3: + return kPrivacyModeError3; + case wvcdm::EMPTY_RESPONSE_ERROR_1: + return kEmptyResponseError1; + case wvcdm::PARSE_RESPONSE_ERROR_1: + return kParseResponseError1; + case wvcdm::PARSE_RESPONSE_ERROR_2: + return kParseResponseError2; + case wvcdm::PARSE_RESPONSE_ERROR_3: + return kParseResponseError3; + case wvcdm::PARSE_RESPONSE_ERROR_4: + return kParseResponseError4; case wvcdm::UNUSED_1: case wvcdm::UNUSED_2: @@ -521,6 +533,9 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::UNUSED_5: case wvcdm::UNUSED_6: case wvcdm::UNUSED_7: + case wvcdm::UNUSED_8: + case wvcdm::UNUSED_9: + case wvcdm::UNUSED_10: return android::UNKNOWN_ERROR; } diff --git a/libwvdrmengine/include_hidl/mapErrors-inl.h b/libwvdrmengine/include_hidl/mapErrors-inl.h index d3f9e55d..d1de1e96 100644 --- a/libwvdrmengine/include_hidl/mapErrors-inl.h +++ b/libwvdrmengine/include_hidl/mapErrors-inl.h @@ -180,9 +180,7 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::UNPROVISION_ERROR_4: case wvcdm::UNSUPPORTED_INIT_DATA: case wvcdm::USAGE_INFO_NOT_FOUND: - case wvcdm::LICENSE_RENEWAL_SERVICE_CERTIFICATE_GENERATION_ERROR: case wvcdm::PARSE_SERVICE_CERTIFICATE_ERROR: - case wvcdm::SERVICE_CERTIFICATE_TYPE_ERROR: case wvcdm::CLIENT_ID_GENERATE_RANDOM_ERROR: case wvcdm::CLIENT_ID_AES_INIT_ERROR: case wvcdm::CLIENT_ID_AES_ENCRYPT_ERROR: @@ -194,7 +192,6 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::INVALID_PARAMETERS_LIC_4: case wvcdm::INVALID_PARAMETERS_LIC_6: case wvcdm::INVALID_PARAMETERS_LIC_7: - case wvcdm::LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR: case wvcdm::CENC_INIT_DATA_UNAVAILABLE: case wvcdm::PREPARE_CENC_CONTENT_ID_FAILED: case wvcdm::WEBM_INIT_DATA_UNAVAILABLE: @@ -293,6 +290,15 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::LIST_LICENSE_ERROR_1: case wvcdm::LIST_LICENSE_ERROR_2: case wvcdm::RELEASE_ALL_USAGE_INFO_ERROR_3: + case wvcdm::PRIVACY_MODE_ERROR_1: + case wvcdm::PRIVACY_MODE_ERROR_2: + case wvcdm::PRIVACY_MODE_ERROR_3: + case wvcdm::EMPTY_RESPONSE_ERROR_1: + case wvcdm::INVALID_PARAMETERS_ENG_24: + case wvcdm::PARSE_RESPONSE_ERROR_1: + case wvcdm::PARSE_RESPONSE_ERROR_2: + case wvcdm::PARSE_RESPONSE_ERROR_3: + case wvcdm::PARSE_RESPONSE_ERROR_4: ALOGW("Returns UNKNOWN error for legacy status: %d", res); return Status::ERROR_DRM_UNKNOWN; @@ -304,6 +310,9 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) { case wvcdm::UNUSED_5: case wvcdm::UNUSED_6: case wvcdm::UNUSED_7: + case wvcdm::UNUSED_8: + case wvcdm::UNUSED_9: + case wvcdm::UNUSED_10: return Status::ERROR_DRM_UNKNOWN; } diff --git a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp index 8b1b5a88..9d20462d 100644 --- a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp @@ -319,7 +319,7 @@ TEST_F(WVDrmPluginTest, ClosesSessions) { ASSERT_EQ(Status::OK, status); } -TEST_F(WVDrmPluginTest, ClosesSessionWithoutReturningError) { +TEST_F(WVDrmPluginTest, ClosesSessionWithError) { android::sp> cdm = new StrictMock(); StrictMock crypto; std::string appPackageName; @@ -329,7 +329,7 @@ TEST_F(WVDrmPluginTest, ClosesSessionWithoutReturningError) { WVDrmPlugin plugin(cdm.get(), appPackageName, &crypto, false); Status status = plugin.closeSession(toHidlVec(sessionId)); - ASSERT_EQ(Status::OK, status); + ASSERT_EQ(Status::ERROR_DRM_SESSION_NOT_OPENED, status); } // TODO b/35325611 Fix this disabled test diff --git a/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp index 286ec0d1..e00fbb82 100644 --- a/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp @@ -227,7 +227,7 @@ TEST_F(WVDrmPluginTest, ClosesSessions) { ASSERT_EQ(OK, res); } -TEST_F(WVDrmPluginTest, ClosesSessionWithoutReturningError) { +TEST_F(WVDrmPluginTest, ClosesSessionWithError) { android::sp> cdm = new StrictMock(); StrictMock crypto; WVDrmPlugin plugin(cdm.get(), &crypto); @@ -237,7 +237,7 @@ TEST_F(WVDrmPluginTest, ClosesSessionWithoutReturningError) { status_t res = plugin.closeSession(sessionId); - ASSERT_EQ(OK, res); + ASSERT_EQ(ERROR_DRM_SESSION_NOT_OPENED, res); } TEST_F(WVDrmPluginTest, GeneratesKeyRequests) { diff --git a/libwvdrmengine/oemcrypto/mock/src/oem_cert.cpp b/libwvdrmengine/oemcrypto/mock/src/oem_cert.cpp index e33d85ae..ecd4584e 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oem_cert.cpp +++ b/libwvdrmengine/oemcrypto/mock/src/oem_cert.cpp @@ -2,140 +2,773 @@ #include "oem_cert.h" -// TODO(fredgc, b/30141311): get a real certificate from server gang. -// TODO(fredgc): This is in PEM format. Is that what we want? -const uint8_t kOEMPublicCert[] = "-----BEGIN CERTIFICATE-----\n" - "MIIEOTCCAyGgAwIBAgIJAJNm87hSM9ZIMA0GCSqGSIb3DQEBCwUAMIGyMQswCQYD\n" - "VQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjERMA8GA1UEBwwIS2lya2xhbmQx\n" - "GDAWBgNVBAoMD0dvb2dsZSBXaWRldmluZTEXMBUGA1UECwwOVGVzdCBhbmQgRGVi\n" - "dWcxJjAkBgNVBAMMHU9FTUNyeXB0byBNb2NrIFJlZmVyZW5jZSBDb2RlMSAwHgYJ\n" - "KoZIhvcNAQkBFhFmcmVkZ2NAZ29vZ2xlLmNvbTAeFw0xNjEwMDYxODUzNDZaFw0x\n" - "NjEwMTYxODUzNDZaMIGyMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv\n" - "bjERMA8GA1UEBwwIS2lya2xhbmQxGDAWBgNVBAoMD0dvb2dsZSBXaWRldmluZTEX\n" - "MBUGA1UECwwOVGVzdCBhbmQgRGVidWcxJjAkBgNVBAMMHU9FTUNyeXB0byBNb2Nr\n" - "IFJlZmVyZW5jZSBDb2RlMSAwHgYJKoZIhvcNAQkBFhFmcmVkZ2NAZ29vZ2xlLmNv\n" - "bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMuQQOqS9Q6K/Di8G4xl\n" - "8pz6Ea90D1FLYzIZXd98Ybd94qwWHYaaNuTfTXvZH07fWxrc8HG44N51ArzZGEaT\n" - "h1O7Jt39qLGMirocCgQLxNI3SP7l/pXmsZBM20tYKOoSq7E68eFbXWp39LDOVElS\n" - "/Lib0QkcwmJd55Fnxk6PIscBqYQilLIglQheoDLcljmOd9Rcr59JTtDENfBJE+SC\n" - "ZD0Kckc2e6lBvy/VGKUqE2hmt00pFBugWsN+SkasLGst5/pTVZfTKOBd1E3OvfL3\n" - "qtli4bRyPVX23zSk/bCzxQO47pXe6nVna9m4Yk/LfwJfDIb+r1ErNwyZ4SmZLw6T\n" - "LrkCAwEAAaNQME4wHQYDVR0OBBYEFNx/l/kMs1AY9IhIphtjzR7cwIVBMB8GA1Ud\n" - "IwQYMBaAFNx/l/kMs1AY9IhIphtjzR7cwIVBMAwGA1UdEwQFMAMBAf8wDQYJKoZI\n" - "hvcNAQELBQADggEBAFSaXoWtFU/895lD1Sh/u6pdJcGuCJS0/s2scs95T1sglpfn\n" - "7pdTNtC1aniGuN0T+Aa2O95rJnS0W6RBGdKt1umFOcC7NfRBq1h7a1rn5wYicE5z\n" - "6rIumCSU4oniKMnQ5J+6LpKUFDVJt2W2o8LCKrHWgvcomo8B4ffdKrg+IKpS9Lxc\n" - "U3wyi27rRCyH004YpyE48hPXB3et6OmP2/Aw01d9LxTXieDh0HkhptEllV5EyGM2\n" - "nnRkbd21nHMkVUDzXYWDibxQj6PXw57smnjx7vTiZ1GoE72g2ENSwT1MQhoI59hy\n" - "WCKO91GNxZnyblSTrjLvzAY2hlVCauo7NmLG/yM=\n" - "-----END CERTIFICATE-----\n"; +namespace wvoec_mock { -const size_t kOEMPublicCertSize = sizeof(kOEMPublicCert); +extern const uint32_t kOEMSystemId_Prod = 7346; -// TODO(fredgc): get the private key that goes with the certificate above. -const uint8_t kOEMPrivateKey[] = { - 0x30, 0x82, 0x04, 0xbd, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, +extern const uint8_t kOEMPrivateKey_Prod[] = { + 0x30, 0x82, 0x06, 0xfe, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, - 0x04, 0xa7, 0x30, 0x82, 0x04, 0xa3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, - 0x01, 0x00, 0xcb, 0x90, 0x40, 0xea, 0x92, 0xf5, 0x0e, 0x8a, 0xfc, 0x38, - 0xbc, 0x1b, 0x8c, 0x65, 0xf2, 0x9c, 0xfa, 0x11, 0xaf, 0x74, 0x0f, 0x51, - 0x4b, 0x63, 0x32, 0x19, 0x5d, 0xdf, 0x7c, 0x61, 0xb7, 0x7d, 0xe2, 0xac, - 0x16, 0x1d, 0x86, 0x9a, 0x36, 0xe4, 0xdf, 0x4d, 0x7b, 0xd9, 0x1f, 0x4e, - 0xdf, 0x5b, 0x1a, 0xdc, 0xf0, 0x71, 0xb8, 0xe0, 0xde, 0x75, 0x02, 0xbc, - 0xd9, 0x18, 0x46, 0x93, 0x87, 0x53, 0xbb, 0x26, 0xdd, 0xfd, 0xa8, 0xb1, - 0x8c, 0x8a, 0xba, 0x1c, 0x0a, 0x04, 0x0b, 0xc4, 0xd2, 0x37, 0x48, 0xfe, - 0xe5, 0xfe, 0x95, 0xe6, 0xb1, 0x90, 0x4c, 0xdb, 0x4b, 0x58, 0x28, 0xea, - 0x12, 0xab, 0xb1, 0x3a, 0xf1, 0xe1, 0x5b, 0x5d, 0x6a, 0x77, 0xf4, 0xb0, - 0xce, 0x54, 0x49, 0x52, 0xfc, 0xb8, 0x9b, 0xd1, 0x09, 0x1c, 0xc2, 0x62, - 0x5d, 0xe7, 0x91, 0x67, 0xc6, 0x4e, 0x8f, 0x22, 0xc7, 0x01, 0xa9, 0x84, - 0x22, 0x94, 0xb2, 0x20, 0x95, 0x08, 0x5e, 0xa0, 0x32, 0xdc, 0x96, 0x39, - 0x8e, 0x77, 0xd4, 0x5c, 0xaf, 0x9f, 0x49, 0x4e, 0xd0, 0xc4, 0x35, 0xf0, - 0x49, 0x13, 0xe4, 0x82, 0x64, 0x3d, 0x0a, 0x72, 0x47, 0x36, 0x7b, 0xa9, - 0x41, 0xbf, 0x2f, 0xd5, 0x18, 0xa5, 0x2a, 0x13, 0x68, 0x66, 0xb7, 0x4d, - 0x29, 0x14, 0x1b, 0xa0, 0x5a, 0xc3, 0x7e, 0x4a, 0x46, 0xac, 0x2c, 0x6b, - 0x2d, 0xe7, 0xfa, 0x53, 0x55, 0x97, 0xd3, 0x28, 0xe0, 0x5d, 0xd4, 0x4d, - 0xce, 0xbd, 0xf2, 0xf7, 0xaa, 0xd9, 0x62, 0xe1, 0xb4, 0x72, 0x3d, 0x55, - 0xf6, 0xdf, 0x34, 0xa4, 0xfd, 0xb0, 0xb3, 0xc5, 0x03, 0xb8, 0xee, 0x95, - 0xde, 0xea, 0x75, 0x67, 0x6b, 0xd9, 0xb8, 0x62, 0x4f, 0xcb, 0x7f, 0x02, - 0x5f, 0x0c, 0x86, 0xfe, 0xaf, 0x51, 0x2b, 0x37, 0x0c, 0x99, 0xe1, 0x29, - 0x99, 0x2f, 0x0e, 0x93, 0x2e, 0xb9, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, - 0x82, 0x01, 0x00, 0x5d, 0xc7, 0x67, 0x20, 0xa9, 0xf3, 0x1b, 0x70, 0x0c, - 0x22, 0x57, 0x06, 0x99, 0xf7, 0x9d, 0x7d, 0x93, 0xf6, 0xf1, 0xcd, 0x96, - 0x00, 0xed, 0xaa, 0x15, 0x3a, 0x7a, 0x74, 0xaa, 0xe8, 0x99, 0x8f, 0xf5, - 0x0d, 0x32, 0x63, 0x07, 0xcf, 0xa3, 0xda, 0x6c, 0xc5, 0x55, 0x79, 0x01, - 0x63, 0x64, 0xa2, 0xa4, 0x0d, 0x84, 0xf7, 0xdf, 0x24, 0x39, 0x57, 0xce, - 0x9b, 0x11, 0xa8, 0x8d, 0x5b, 0x09, 0xcd, 0x19, 0x3b, 0x1e, 0xa9, 0xed, - 0x3d, 0x5e, 0x71, 0xca, 0xab, 0x80, 0x31, 0xbc, 0xfa, 0x3f, 0x9e, 0x18, - 0x92, 0xd5, 0x82, 0x23, 0xac, 0xd3, 0xc0, 0x96, 0xa7, 0xb0, 0x5e, 0x3c, - 0xfb, 0x18, 0xfe, 0xdf, 0xf7, 0x37, 0xd7, 0x8a, 0x2f, 0xcf, 0x0c, 0xd4, - 0x3d, 0x5f, 0xd0, 0x94, 0xb7, 0x16, 0x96, 0x35, 0xb2, 0x67, 0x70, 0x48, - 0x5c, 0xe8, 0xc5, 0xf5, 0xc6, 0xc9, 0x25, 0x07, 0xec, 0x0d, 0xa1, 0x74, - 0x09, 0x9d, 0xcd, 0x25, 0xa5, 0x7a, 0x2f, 0xa6, 0x4c, 0xba, 0x7d, 0x55, - 0x4f, 0x79, 0x83, 0xaa, 0xfa, 0x3a, 0xc0, 0xaf, 0xc2, 0x33, 0xb2, 0x9a, - 0x68, 0x89, 0x72, 0x2f, 0x86, 0x69, 0x28, 0x1b, 0xdc, 0xa2, 0x05, 0xe3, - 0xfc, 0x24, 0x4c, 0xe0, 0x02, 0xb7, 0x06, 0x4b, 0xe0, 0x88, 0xe9, 0x79, - 0x72, 0x46, 0x1c, 0x49, 0x5e, 0xfa, 0x2d, 0x29, 0xe5, 0xbf, 0x29, 0xfe, - 0xf2, 0xee, 0xeb, 0xe8, 0x4a, 0x8d, 0xdd, 0xfa, 0x8e, 0xb0, 0x65, 0x68, - 0x38, 0xa5, 0xb4, 0xd7, 0x75, 0xd7, 0x8c, 0x32, 0x51, 0xe3, 0x97, 0x00, - 0x91, 0x19, 0x87, 0xaa, 0xeb, 0x4b, 0xcf, 0xf9, 0x6b, 0xf2, 0x87, 0xb9, - 0x93, 0x4e, 0xd7, 0x5c, 0x27, 0xbb, 0x92, 0x29, 0x5e, 0xb8, 0xe9, 0x75, - 0xc0, 0xc6, 0xa3, 0x8a, 0xb7, 0x1e, 0x19, 0xce, 0xd9, 0x5a, 0xc1, 0x0f, - 0x6d, 0xa6, 0x4a, 0x56, 0x24, 0x10, 0x01, 0x02, 0x81, 0x81, 0x00, 0xe8, - 0x1b, 0x99, 0x55, 0x0e, 0x19, 0x8b, 0x48, 0x46, 0xb1, 0x36, 0xb0, 0xe8, - 0x15, 0x5f, 0x45, 0x8b, 0x09, 0xac, 0x82, 0xd1, 0x93, 0x6f, 0x8d, 0xed, - 0xe8, 0x80, 0x82, 0xe4, 0xbc, 0x33, 0x40, 0x50, 0x71, 0x3f, 0x2c, 0x20, - 0x46, 0x34, 0x3f, 0x27, 0xc3, 0x98, 0x66, 0x34, 0x99, 0x05, 0x06, 0x53, - 0x43, 0xdf, 0x52, 0x0b, 0x56, 0x1a, 0xde, 0x3f, 0xbf, 0xba, 0x61, 0xd3, - 0xcf, 0xfd, 0xee, 0x34, 0x71, 0x75, 0x9f, 0xfd, 0xc4, 0xb0, 0x8b, 0x26, - 0xb1, 0x77, 0x83, 0xd4, 0x90, 0x28, 0xc2, 0xb7, 0x52, 0x98, 0xa0, 0x6b, - 0x4b, 0x19, 0x8b, 0x28, 0xbb, 0x18, 0x3e, 0x29, 0x14, 0x7e, 0xa3, 0x87, - 0xf8, 0x4d, 0x8a, 0x67, 0x3a, 0xf6, 0xec, 0x04, 0x7b, 0xfb, 0x3e, 0xa5, - 0xe3, 0xbb, 0xb2, 0x35, 0xf2, 0xd1, 0x63, 0x55, 0xb6, 0x87, 0x07, 0xea, - 0xbb, 0x06, 0x62, 0xbf, 0xaa, 0xbb, 0x19, 0x02, 0x81, 0x81, 0x00, 0xe0, - 0x84, 0x77, 0xb0, 0xc1, 0x94, 0x89, 0xc6, 0x54, 0x78, 0x8a, 0xf0, 0xcd, - 0xa4, 0x88, 0x92, 0xb4, 0xc9, 0xf1, 0x1c, 0x60, 0xea, 0x6d, 0x1c, 0x1d, - 0x33, 0x92, 0x12, 0xe3, 0xe3, 0xd4, 0x11, 0xb6, 0x4d, 0x05, 0x93, 0xbc, - 0x19, 0x50, 0xfc, 0x20, 0xe6, 0x07, 0x4a, 0xbc, 0xb6, 0x4f, 0xc1, 0x81, - 0xc8, 0x71, 0xa7, 0xe2, 0x79, 0xb3, 0xc9, 0x43, 0x43, 0xca, 0x27, 0xe7, - 0x37, 0x5b, 0x20, 0x83, 0x14, 0x8f, 0xb7, 0xba, 0x6c, 0x19, 0x21, 0xd5, - 0x60, 0x87, 0xae, 0x45, 0xa8, 0x17, 0xd8, 0x73, 0xae, 0x65, 0xae, 0x83, - 0x26, 0xff, 0x4e, 0x4f, 0x95, 0xdc, 0xce, 0x12, 0x40, 0xe6, 0xdd, 0xf2, - 0x64, 0x84, 0x65, 0x86, 0x3e, 0xb4, 0xbe, 0x2d, 0x95, 0x74, 0x5c, 0xb2, - 0xc6, 0x7c, 0x84, 0x17, 0x06, 0xe8, 0x80, 0xc8, 0xfe, 0x79, 0x22, 0xe6, - 0xfa, 0x1f, 0xd2, 0x71, 0x84, 0x24, 0xa1, 0x02, 0x81, 0x80, 0x1d, 0x33, - 0x63, 0xad, 0xfc, 0xb1, 0x20, 0x01, 0xbe, 0xcb, 0x0a, 0xbb, 0x64, 0xe7, - 0x53, 0x6e, 0x17, 0x58, 0xe7, 0x38, 0x2a, 0x0f, 0xa7, 0x68, 0x2e, 0xb7, - 0x22, 0x7b, 0xd5, 0x35, 0x0c, 0x29, 0x9a, 0x35, 0x35, 0x22, 0x63, 0x09, - 0x12, 0x07, 0xa4, 0x04, 0x0a, 0x87, 0x49, 0x34, 0xbb, 0x1a, 0x19, 0x9d, - 0x9f, 0x59, 0xde, 0x0d, 0x3e, 0x22, 0x19, 0xd9, 0x10, 0x24, 0xc0, 0x96, - 0x19, 0x37, 0x3f, 0xa7, 0xca, 0x89, 0x8f, 0x4e, 0x90, 0x7b, 0x61, 0x29, - 0xd0, 0x84, 0x68, 0x58, 0x9e, 0x98, 0x28, 0xa2, 0x1e, 0x8b, 0x88, 0x14, - 0x11, 0xa9, 0x9d, 0x3d, 0x34, 0x86, 0x95, 0x7a, 0x7b, 0x98, 0x2d, 0x42, - 0x02, 0xd7, 0x57, 0xb7, 0x66, 0x5b, 0x39, 0x11, 0x34, 0x01, 0xa4, 0xb3, - 0x2a, 0xe8, 0xf7, 0xba, 0x8d, 0xb7, 0x36, 0x90, 0x59, 0x1a, 0x98, 0xe0, - 0x60, 0xa4, 0x49, 0xc2, 0xbb, 0xf9, 0x02, 0x81, 0x80, 0x06, 0x01, 0x65, - 0x16, 0x34, 0x47, 0x5d, 0xdc, 0x11, 0x3c, 0x5c, 0x33, 0x0e, 0xbd, 0x1c, - 0xee, 0x17, 0xa9, 0xe3, 0x2a, 0x28, 0x29, 0x7d, 0x1b, 0xa8, 0x68, 0x4d, - 0xba, 0xf5, 0x9f, 0x8d, 0x77, 0x9f, 0xd1, 0xb5, 0x99, 0x7b, 0x09, 0x8e, - 0x52, 0x00, 0x2b, 0x46, 0xfc, 0xa7, 0xc9, 0x94, 0x9e, 0x8f, 0x73, 0x26, - 0x1f, 0x20, 0x7e, 0xb2, 0xe1, 0x6a, 0x4c, 0x30, 0xe7, 0x1a, 0x57, 0x2f, - 0xb7, 0xd1, 0xe9, 0xc5, 0xe2, 0x5b, 0x39, 0x32, 0xfe, 0xe5, 0xaf, 0x3c, - 0x51, 0xdc, 0x09, 0x20, 0x02, 0x29, 0x2d, 0xfc, 0x08, 0x4b, 0xf7, 0xca, - 0x12, 0x75, 0x2c, 0x84, 0x08, 0x7b, 0x12, 0x83, 0x5a, 0x62, 0x76, 0x6f, - 0xd8, 0x2b, 0x5c, 0x18, 0x07, 0x92, 0x3e, 0x92, 0x2b, 0x3c, 0x98, 0xf4, - 0x91, 0xaf, 0xef, 0xfe, 0x5e, 0x1b, 0x82, 0x3b, 0x09, 0x44, 0xf6, 0x61, - 0xcd, 0x86, 0x3d, 0xcb, 0xa1, 0x02, 0x81, 0x81, 0x00, 0xe5, 0x81, 0xf6, - 0x6f, 0x37, 0xf4, 0xef, 0xc7, 0x0e, 0xdf, 0x39, 0xd0, 0x97, 0x68, 0x1c, - 0xd5, 0x12, 0x42, 0x00, 0x0e, 0xd1, 0x89, 0xdc, 0xf5, 0x24, 0x30, 0xb3, - 0xeb, 0xea, 0x64, 0x3c, 0x9e, 0xa2, 0xc3, 0x49, 0x3c, 0xed, 0x2d, 0x4e, - 0x9a, 0x00, 0x23, 0x71, 0xcc, 0x15, 0xda, 0x49, 0xdc, 0xab, 0xd1, 0x36, - 0xe1, 0x8c, 0x91, 0x6c, 0x5b, 0x47, 0x43, 0x34, 0xec, 0xcd, 0x0c, 0xd0, - 0x88, 0x7c, 0x5a, 0xd4, 0x91, 0x79, 0xe5, 0xe6, 0xd2, 0x5d, 0x2e, 0x14, - 0x26, 0x81, 0x94, 0x9f, 0x29, 0x2b, 0x3e, 0xd6, 0x2f, 0x2d, 0xd9, 0xec, - 0x88, 0x6a, 0xd3, 0x35, 0x71, 0x8a, 0xb2, 0xef, 0x22, 0xdc, 0xab, 0x26, - 0xf9, 0x4d, 0x4c, 0x08, 0x8e, 0x16, 0x5b, 0x56, 0xb6, 0x76, 0x61, 0x89, - 0x8a, 0x3a, 0xdb, 0xbb, 0x42, 0xe3, 0x50, 0x3f, 0xa1, 0x08, 0x82, 0xc2, - 0x92, 0xef, 0x8c, 0xc2, 0xca + 0x06, 0xe8, 0x30, 0x82, 0x06, 0xe4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, + 0x81, 0x00, 0xf5, 0x09, 0x64, 0x4a, 0x26, 0xfe, 0xc0, 0x98, 0x55, 0x6a, + 0x1d, 0x5d, 0x1c, 0xc7, 0x38, 0xaf, 0xfd, 0x49, 0x9e, 0x85, 0x3f, 0xd6, + 0x45, 0x0e, 0x99, 0x09, 0x85, 0x69, 0x84, 0x3c, 0xfe, 0x72, 0xa5, 0x56, + 0xfa, 0x11, 0x4f, 0x6b, 0x7d, 0x32, 0x2b, 0x0c, 0xbf, 0x8f, 0xac, 0x47, + 0x96, 0x22, 0x82, 0x3d, 0xf5, 0x64, 0x74, 0x7e, 0x62, 0x68, 0x74, 0xcd, + 0x0a, 0xec, 0x84, 0xc5, 0x15, 0x06, 0x0e, 0x5a, 0x2f, 0x20, 0xe3, 0xc9, + 0x67, 0xcd, 0xdd, 0x01, 0xb8, 0xb3, 0x18, 0x87, 0x8c, 0xa9, 0x58, 0x86, + 0x0f, 0xb6, 0xc3, 0x42, 0x7e, 0x87, 0x48, 0x5e, 0x10, 0x49, 0xc7, 0xd7, + 0xb7, 0xb8, 0xa6, 0x34, 0x08, 0x0c, 0x94, 0xf4, 0xbb, 0x2a, 0x06, 0xa4, + 0x4f, 0xec, 0xbc, 0xc4, 0x37, 0xbe, 0x99, 0x10, 0x23, 0x37, 0x24, 0xb1, + 0xdf, 0xcb, 0xe6, 0x3f, 0xc1, 0xf0, 0x0f, 0x04, 0x03, 0xc8, 0xb0, 0x1e, + 0xd6, 0xb8, 0xae, 0x77, 0xe1, 0x4d, 0x6d, 0x97, 0x69, 0x6d, 0x8a, 0x73, + 0x66, 0x32, 0x57, 0x6f, 0xcf, 0xea, 0x1e, 0x7b, 0x87, 0x03, 0x75, 0xb1, + 0xef, 0x83, 0x64, 0x26, 0xf1, 0x3f, 0xbf, 0xe6, 0x28, 0x03, 0x72, 0x57, + 0xbf, 0x47, 0x29, 0x99, 0x8f, 0x74, 0x1d, 0x01, 0x16, 0xad, 0xb2, 0xdf, + 0x80, 0xa4, 0xd3, 0x8b, 0xeb, 0x61, 0xd1, 0x40, 0x68, 0xb9, 0xa2, 0xa5, + 0xef, 0x2b, 0xe5, 0x78, 0xe8, 0x28, 0x88, 0x87, 0xb7, 0x53, 0x49, 0xbb, + 0xe4, 0xea, 0x0d, 0x5e, 0x96, 0xa5, 0xdd, 0x1f, 0x0b, 0x25, 0x8b, 0xb5, + 0x95, 0x46, 0xe7, 0xba, 0xb8, 0xc4, 0x0a, 0x36, 0xb1, 0x89, 0xeb, 0x27, + 0x5d, 0xd9, 0x97, 0x24, 0x59, 0xa3, 0x9b, 0xb0, 0x23, 0x0b, 0xd2, 0xec, + 0x65, 0x91, 0xf9, 0xf0, 0xa0, 0x74, 0x5f, 0xb4, 0xce, 0x22, 0x27, 0x18, + 0x37, 0xe2, 0x4b, 0xfc, 0x91, 0xf9, 0x09, 0x15, 0xe6, 0xdb, 0x06, 0x9b, + 0x4d, 0x82, 0xdc, 0x36, 0x14, 0x48, 0xc6, 0xd5, 0x87, 0xca, 0xec, 0x5a, + 0xa2, 0x29, 0x33, 0xef, 0x22, 0x0c, 0x4b, 0xbf, 0xe7, 0x2f, 0x95, 0xe1, + 0xd3, 0xa5, 0xd8, 0xaa, 0x44, 0x77, 0x29, 0xa3, 0x20, 0x33, 0xd2, 0x51, + 0xa2, 0xf9, 0x4a, 0x6f, 0xf7, 0x3e, 0xf7, 0x0b, 0x8a, 0xec, 0xc1, 0x99, + 0x1d, 0x47, 0xf3, 0x74, 0x02, 0x04, 0xab, 0x8e, 0x62, 0x4c, 0x9e, 0x00, + 0xc2, 0x84, 0xd7, 0xd0, 0xf8, 0xe4, 0x1c, 0x9d, 0x98, 0x15, 0xa8, 0x8f, + 0x08, 0x98, 0x4e, 0x5a, 0xfa, 0xd6, 0x60, 0x87, 0x12, 0xdc, 0x8e, 0xfd, + 0xcb, 0xb3, 0x13, 0x97, 0x7a, 0xa8, 0x8c, 0x56, 0x2e, 0x49, 0x26, 0x60, + 0xe9, 0x4a, 0xdc, 0xec, 0x3f, 0xf0, 0x94, 0xcd, 0x90, 0x8e, 0x7c, 0x21, + 0x3f, 0x80, 0x14, 0x33, 0xdd, 0xb0, 0x00, 0xe2, 0x09, 0x37, 0x06, 0xdd, + 0x17, 0x69, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x81, 0x00, + 0xa1, 0xc9, 0x44, 0xad, 0x6d, 0x17, 0xd1, 0x04, 0x03, 0x89, 0x5f, 0xbf, + 0xe5, 0xcb, 0x68, 0x13, 0x52, 0xf2, 0x33, 0xb7, 0x19, 0x12, 0x19, 0x60, + 0x6d, 0x0d, 0x0b, 0x48, 0x42, 0xe6, 0x9e, 0xbe, 0x05, 0x8a, 0xea, 0xeb, + 0x58, 0xfb, 0xc8, 0x9a, 0xc2, 0x2f, 0xd5, 0x9f, 0x40, 0x09, 0xb8, 0x08, + 0x2a, 0xe4, 0x4b, 0xcc, 0xba, 0xd9, 0xe3, 0x91, 0xc2, 0x64, 0xcb, 0x6c, + 0xa4, 0xb1, 0x17, 0x93, 0x7b, 0x10, 0x72, 0x83, 0x8d, 0xc2, 0xa2, 0x46, + 0x1b, 0x41, 0x12, 0xb9, 0x35, 0x5d, 0xf2, 0x32, 0xb1, 0xdf, 0x3a, 0x2a, + 0xda, 0xbb, 0x61, 0x9d, 0x62, 0xdb, 0xb0, 0x77, 0x76, 0x7a, 0x68, 0xb4, + 0x83, 0x10, 0x61, 0xac, 0x25, 0x01, 0x7d, 0x3e, 0x5f, 0x4a, 0x47, 0xf7, + 0x30, 0x1f, 0x82, 0x0a, 0xd7, 0x36, 0xff, 0x79, 0x5e, 0x42, 0x0f, 0x58, + 0xaa, 0x3a, 0xb8, 0x8b, 0x0e, 0xef, 0x00, 0xac, 0x96, 0x14, 0x96, 0x83, + 0x33, 0xb6, 0xb5, 0x4c, 0x91, 0x2a, 0x62, 0x92, 0xcf, 0xd2, 0x27, 0xcc, + 0xdf, 0x4c, 0x55, 0x03, 0xe8, 0x82, 0x78, 0xff, 0x80, 0xcb, 0x2e, 0x30, + 0x1b, 0x85, 0x56, 0xce, 0x57, 0x9e, 0xd8, 0x16, 0x86, 0x7d, 0x87, 0x2e, + 0xae, 0x39, 0xd4, 0xac, 0xbe, 0xa5, 0xc4, 0x5a, 0x85, 0x7a, 0xea, 0x8e, + 0x69, 0x9a, 0xbd, 0x9c, 0x45, 0x33, 0xf8, 0xb1, 0x70, 0xc1, 0x8c, 0xaa, + 0xad, 0x3d, 0x76, 0x08, 0x5b, 0x7d, 0x12, 0x93, 0x03, 0x70, 0xe6, 0x5f, + 0xb2, 0xac, 0x78, 0xae, 0xbe, 0xc5, 0x31, 0xc8, 0x6d, 0x2c, 0x1c, 0x2f, + 0x41, 0x37, 0xf6, 0x88, 0xd3, 0x80, 0x93, 0xed, 0x55, 0xb1, 0xaa, 0x49, + 0xe8, 0x42, 0xd0, 0x19, 0x20, 0x58, 0xe7, 0x2d, 0x10, 0xf2, 0x69, 0x49, + 0xe9, 0x47, 0x95, 0xbb, 0xce, 0xa7, 0xe9, 0x86, 0x46, 0x1c, 0xd1, 0x1f, + 0xd4, 0xa9, 0xeb, 0x28, 0x57, 0x78, 0x6c, 0xc6, 0x6f, 0x84, 0x3b, 0xb4, + 0x8c, 0xe5, 0xd3, 0x23, 0x8b, 0xbe, 0x83, 0x75, 0x5e, 0xea, 0xcd, 0x93, + 0xd2, 0x42, 0x86, 0xfd, 0x2b, 0x67, 0x72, 0xe0, 0x46, 0x9c, 0xf7, 0xc1, + 0xe9, 0x5d, 0xad, 0xac, 0xcb, 0x57, 0xb4, 0xe7, 0x87, 0x25, 0x7d, 0x5a, + 0x43, 0x90, 0xa3, 0x2e, 0xbf, 0x36, 0xbd, 0x4c, 0xba, 0xec, 0x0f, 0x21, + 0x51, 0xda, 0x66, 0xb8, 0x1e, 0xac, 0x33, 0xeb, 0xa1, 0x3e, 0x72, 0x15, + 0x10, 0x45, 0xc0, 0xe4, 0xdb, 0x04, 0x6d, 0xaf, 0x66, 0xc2, 0xfc, 0x35, + 0x04, 0x60, 0x7d, 0x2f, 0x5e, 0x9e, 0x83, 0xf6, 0x72, 0x92, 0x6a, 0x9f, + 0xba, 0x94, 0x97, 0x33, 0xe1, 0x1d, 0x42, 0xda, 0xad, 0xa5, 0x8b, 0xad, + 0x2f, 0x2f, 0x32, 0x16, 0x88, 0x54, 0x88, 0xb2, 0x85, 0xe2, 0x33, 0x08, + 0x43, 0xc8, 0x68, 0x69, 0xaa, 0xea, 0x9a, 0xbf, 0x41, 0x12, 0xe6, 0xf1, + 0x02, 0x81, 0xc1, 0x00, 0xfe, 0x96, 0xe7, 0xc8, 0x89, 0x61, 0x2b, 0x58, + 0xaa, 0xcd, 0x37, 0x46, 0x13, 0xa1, 0x2a, 0xc8, 0x1b, 0x76, 0xde, 0x4c, + 0xb3, 0x00, 0x4f, 0x6b, 0x02, 0xc0, 0x10, 0xef, 0x87, 0xe2, 0x6d, 0x7f, + 0x10, 0x57, 0xec, 0xde, 0x70, 0x60, 0xb5, 0x8f, 0x6d, 0x17, 0x35, 0xbd, + 0xfd, 0x6a, 0x2c, 0xbb, 0xf0, 0x48, 0x5b, 0x32, 0x41, 0xf6, 0xc0, 0x62, + 0x3a, 0x88, 0xc5, 0x41, 0x83, 0x85, 0x56, 0xa7, 0x11, 0xf4, 0xd2, 0xa9, + 0xb3, 0xa3, 0xcb, 0xae, 0xca, 0xee, 0x1c, 0x52, 0x7f, 0x04, 0x34, 0x61, + 0xb9, 0x8d, 0xa3, 0x26, 0x88, 0xce, 0x3d, 0xdb, 0x9c, 0xbf, 0xcc, 0xc4, + 0x38, 0x8b, 0xf2, 0xe4, 0x7e, 0xcc, 0x46, 0x86, 0x7a, 0x3c, 0xb7, 0x95, + 0x3f, 0xbd, 0x81, 0x45, 0xc3, 0x1d, 0xbb, 0xf8, 0x56, 0x6e, 0xa5, 0x88, + 0x2d, 0xff, 0x78, 0xc0, 0xc2, 0x4a, 0x4f, 0xea, 0xb8, 0x81, 0xf3, 0x96, + 0x5e, 0xd8, 0xcb, 0x96, 0x42, 0xa3, 0x21, 0x03, 0xc8, 0x00, 0xbf, 0x95, + 0xc7, 0x83, 0x80, 0xc6, 0xc2, 0x38, 0xe4, 0xaf, 0xb2, 0x0e, 0x80, 0x92, + 0x97, 0x21, 0x16, 0xce, 0x39, 0xd3, 0x95, 0xb7, 0xc3, 0x78, 0xe1, 0x1c, + 0xc0, 0x5a, 0xbc, 0x9b, 0x68, 0x3f, 0xd6, 0x42, 0xcd, 0xca, 0x0b, 0x6d, + 0x9f, 0xde, 0x6b, 0x98, 0x3b, 0x47, 0x57, 0xb9, 0x2d, 0x92, 0x52, 0x29, + 0xc5, 0xed, 0xb5, 0x0d, 0x02, 0x81, 0xc1, 0x00, 0xf6, 0x64, 0xef, 0xef, + 0x57, 0xdb, 0x06, 0xae, 0x36, 0x86, 0x11, 0xaf, 0x96, 0xb9, 0xb1, 0x29, + 0x53, 0xce, 0x24, 0x60, 0x96, 0x8f, 0xd0, 0xb7, 0x4b, 0x60, 0x1e, 0xb3, + 0x1f, 0xae, 0x15, 0x41, 0xf1, 0x56, 0xd6, 0xf3, 0x07, 0xf8, 0xd7, 0xdd, + 0x1c, 0x82, 0xe8, 0xe0, 0xff, 0xb3, 0x41, 0x0d, 0x41, 0x96, 0x0d, 0xf2, + 0x03, 0xb0, 0x68, 0xed, 0xda, 0x8b, 0x83, 0x18, 0x4d, 0xae, 0xaf, 0x72, + 0xa1, 0x82, 0xe5, 0x5a, 0xdc, 0x2a, 0x5f, 0x93, 0x29, 0xc7, 0x24, 0xa0, + 0x8e, 0x32, 0x4c, 0x0e, 0xca, 0x6d, 0x14, 0x69, 0x5b, 0x61, 0xc5, 0xdc, + 0x0e, 0x50, 0x0c, 0x14, 0x84, 0x8b, 0xee, 0x9e, 0x1e, 0x8c, 0x3d, 0xdb, + 0x24, 0xe7, 0x99, 0x6d, 0x3c, 0xaf, 0xe6, 0x3b, 0xaa, 0xb4, 0xe4, 0x42, + 0x13, 0x53, 0x3e, 0x02, 0x47, 0x0d, 0x3a, 0x2b, 0x97, 0x71, 0x9f, 0x1b, + 0x76, 0x2d, 0xe5, 0x9c, 0x5e, 0x46, 0x5f, 0x36, 0xbf, 0x18, 0xb1, 0x1d, + 0x9a, 0xeb, 0x4d, 0x5e, 0x83, 0xd5, 0x3e, 0x5f, 0xf2, 0x6a, 0x56, 0x79, + 0x0f, 0x54, 0xec, 0x41, 0xc0, 0xdc, 0x29, 0x42, 0x45, 0xae, 0x47, 0x1c, + 0x7a, 0xd5, 0xb7, 0x92, 0x1e, 0x66, 0xb8, 0x1a, 0x2f, 0x53, 0xd2, 0x6d, + 0x42, 0x3c, 0x6c, 0x02, 0x01, 0x03, 0x9e, 0x9a, 0x95, 0x35, 0x81, 0x21, + 0x53, 0x53, 0x16, 0xda, 0x8a, 0x80, 0x8c, 0xcd, 0x02, 0x81, 0xc1, 0x00, + 0xd5, 0xba, 0x05, 0xf7, 0x7a, 0x2d, 0x52, 0xe0, 0x6a, 0xf3, 0x40, 0xd5, + 0xd9, 0xa0, 0xd1, 0x73, 0x90, 0x6a, 0xe8, 0x10, 0x67, 0xad, 0x78, 0xfe, + 0x93, 0x1e, 0x7e, 0x99, 0x37, 0xf0, 0x44, 0x90, 0x09, 0x3e, 0x67, 0x22, + 0x0e, 0x21, 0x82, 0x0a, 0x58, 0x40, 0xc5, 0xe3, 0x2b, 0x9d, 0x38, 0xd4, + 0xc5, 0xd1, 0x58, 0x8e, 0x06, 0x86, 0x89, 0xd7, 0x6c, 0xe0, 0x69, 0x08, + 0xa8, 0xcb, 0x05, 0x85, 0xd8, 0x33, 0x39, 0xaf, 0x31, 0x99, 0xee, 0x62, + 0x5d, 0x06, 0x2c, 0x4c, 0xad, 0x48, 0xf0, 0x58, 0xa2, 0x17, 0x5f, 0xc1, + 0xf7, 0xd3, 0x7c, 0x66, 0xa3, 0x5e, 0xf9, 0x1e, 0x39, 0x82, 0x73, 0x74, + 0x93, 0x66, 0x16, 0x46, 0xca, 0xd3, 0xb2, 0x22, 0xdf, 0x91, 0xcd, 0xb6, + 0xad, 0x28, 0x87, 0x26, 0xe2, 0x18, 0x9d, 0x6a, 0x87, 0x83, 0x12, 0xf2, + 0x6f, 0xa9, 0x47, 0x11, 0xfb, 0xb7, 0x4c, 0xb1, 0x0e, 0x0a, 0xde, 0x4e, + 0xd4, 0xbe, 0x71, 0xf6, 0xe4, 0xae, 0x8c, 0x27, 0xc7, 0x88, 0x84, 0x51, + 0x57, 0xb7, 0xbf, 0x74, 0x27, 0xfc, 0xb8, 0xbf, 0x57, 0x94, 0x75, 0xba, + 0xc7, 0x1c, 0xf3, 0x71, 0x83, 0xee, 0x34, 0xbd, 0x98, 0x56, 0x14, 0x44, + 0x3a, 0xee, 0x6c, 0x87, 0x44, 0x8f, 0xbb, 0xac, 0x5a, 0x2b, 0xb5, 0x13, + 0xe5, 0x9f, 0xec, 0xeb, 0x0e, 0x70, 0xe9, 0xfd, 0x1b, 0xa6, 0x84, 0xf9, + 0x02, 0x81, 0xc0, 0x4e, 0x82, 0x26, 0xf9, 0x6a, 0x52, 0xfd, 0xb3, 0xf0, + 0xe7, 0x93, 0x27, 0x11, 0xad, 0xa5, 0x47, 0x77, 0xce, 0x8d, 0x44, 0xc1, + 0x74, 0x9d, 0x9a, 0x69, 0xc7, 0xfc, 0xc0, 0x32, 0x6d, 0xf3, 0x94, 0x09, + 0x64, 0x14, 0x25, 0x67, 0xfa, 0xe0, 0x3d, 0x31, 0xe2, 0x7c, 0x75, 0x84, + 0xc4, 0x07, 0x0c, 0x44, 0x43, 0x9d, 0xb9, 0xe9, 0x77, 0x02, 0x58, 0x17, + 0x74, 0xb0, 0x96, 0xc3, 0xd9, 0xcf, 0x49, 0x85, 0x31, 0x02, 0x07, 0x8b, + 0x73, 0x6c, 0xf4, 0xa5, 0x31, 0x30, 0xf8, 0x7f, 0x96, 0x83, 0x29, 0x8b, + 0x52, 0x6a, 0x58, 0x8f, 0xa7, 0x7d, 0xb5, 0xfa, 0x51, 0x83, 0x27, 0xde, + 0x7b, 0xff, 0xd2, 0x1e, 0x05, 0xad, 0x87, 0xf0, 0x20, 0x63, 0x80, 0xac, + 0xff, 0x97, 0x2a, 0x97, 0xdf, 0xff, 0x83, 0x16, 0x49, 0x45, 0xce, 0xcf, + 0xf8, 0xe4, 0xfa, 0x12, 0xcd, 0x3f, 0x57, 0x2e, 0xb6, 0xbd, 0x1c, 0xaf, + 0xe5, 0x58, 0x5d, 0x47, 0x52, 0x84, 0xcc, 0xdc, 0x19, 0xf1, 0x93, 0x16, + 0x0a, 0x92, 0x4f, 0x5c, 0x1c, 0x89, 0xe5, 0x14, 0xff, 0x88, 0x30, 0x03, + 0x55, 0xa3, 0x47, 0xdc, 0x90, 0x05, 0x54, 0x8b, 0xc7, 0x21, 0x30, 0xcb, + 0xc3, 0x0b, 0x12, 0x3c, 0xd6, 0x46, 0x8c, 0x4d, 0xb8, 0x96, 0xe9, 0xa4, + 0x8d, 0x14, 0xb2, 0x48, 0xac, 0xbd, 0xb2, 0x72, 0xac, 0x5c, 0xf1, 0xd1, + 0x83, 0xd8, 0x59, 0x02, 0x81, 0xc0, 0x2d, 0x65, 0xc1, 0xc7, 0x0f, 0xca, + 0xbc, 0x5d, 0xa1, 0x30, 0x28, 0x27, 0x51, 0xcc, 0xc9, 0x6c, 0x7b, 0x76, + 0x43, 0xa9, 0x77, 0xd8, 0x29, 0xa3, 0x80, 0x57, 0x3b, 0xe9, 0x72, 0x1c, + 0x51, 0x37, 0xc2, 0x0b, 0x74, 0xb7, 0xaa, 0x63, 0xd5, 0xe2, 0x9b, 0x3a, + 0x3c, 0x78, 0x50, 0xcb, 0x88, 0x1a, 0xd6, 0x59, 0xdc, 0xb3, 0x05, 0xbf, + 0xe5, 0xc5, 0xb5, 0xe3, 0x9b, 0xba, 0xe7, 0xbb, 0x4d, 0x45, 0xb3, 0x4c, + 0xf2, 0x48, 0x65, 0xe7, 0x6b, 0xee, 0x12, 0xc8, 0xd5, 0xea, 0xf0, 0x89, + 0xf9, 0x03, 0xa3, 0xd9, 0x5f, 0x62, 0x2d, 0x1a, 0x55, 0x51, 0x5d, 0xf6, + 0xca, 0x6e, 0x5f, 0xf0, 0x66, 0x02, 0xf4, 0x20, 0xe6, 0xe9, 0xc4, 0xd7, + 0x36, 0x8d, 0x00, 0xce, 0x23, 0xfd, 0x90, 0xd4, 0x19, 0x5c, 0xe9, 0xcb, + 0x23, 0xe2, 0x2c, 0xf5, 0xe1, 0x6f, 0x9d, 0xb5, 0xdf, 0xea, 0x51, 0xdd, + 0x02, 0xd8, 0x40, 0xd6, 0x7f, 0x4b, 0xdb, 0x0e, 0xe2, 0x27, 0x4d, 0x0d, + 0x9b, 0x2e, 0xf7, 0xc8, 0x22, 0xca, 0x63, 0x3c, 0x2c, 0xe5, 0xa8, 0x42, + 0x26, 0xd9, 0xfc, 0xdc, 0x42, 0xc8, 0x07, 0x64, 0xa2, 0x98, 0xae, 0xb4, + 0x57, 0x02, 0x02, 0xb2, 0x2d, 0xc8, 0x59, 0x73, 0x9b, 0xee, 0xc0, 0x9a, + 0x42, 0x9a, 0xef, 0xc2, 0x27, 0x24, 0x2b, 0x20, 0x92, 0xad, 0x50, 0xfe, + 0x2c, 0x2d, 0xb6, 0xb6, 0xb5, 0xba }; +extern const size_t kOEMPrivateKeySize_Prod = 1794; -const size_t kOEMPrivateKeySize = sizeof(kOEMPrivateKey); +extern const uint8_t kOEMPublicCert_Prod[] = { + 0x30, 0x82, 0x09, 0xf7, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x07, 0x02, 0xa0, 0x82, 0x09, 0xe8, 0x30, 0x82, 0x09, 0xe4, 0x02, + 0x01, 0x01, 0x31, 0x00, 0x30, 0x0f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x02, 0x04, 0x00, 0xa0, 0x82, 0x09, + 0xc8, 0x30, 0x82, 0x04, 0x1a, 0x30, 0x82, 0x03, 0x02, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x11, 0x00, 0xf2, 0xa1, 0x08, 0xdf, 0x12, 0x84, 0xb9, + 0x73, 0x6c, 0x23, 0x73, 0xe1, 0x1f, 0xf3, 0xac, 0x7a, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x30, 0x81, 0x8b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, + 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, + 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, + 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, + 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, + 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, + 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x30, 0x30, 0x2e, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x27, 0x47, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x20, 0x4f, 0x45, 0x4d, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x20, 0x69, 0x64, 0x3a, 0x20, 0x37, 0x33, 0x34, 0x36, 0x30, 0x1e, + 0x17, 0x0d, 0x31, 0x37, 0x30, 0x33, 0x31, 0x33, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x31, 0x32, 0x30, 0x38, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x6d, 0x31, 0x12, 0x30, 0x10, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x09, 0x37, 0x33, 0x34, 0x36, 0x2d, + 0x6c, 0x65, 0x61, 0x66, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, + 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, + 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, + 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, + 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x30, 0x82, 0x01, + 0xa2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x8f, 0x00, 0x30, 0x82, 0x01, + 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xf5, 0x09, 0x64, 0x4a, 0x26, 0xfe, + 0xc0, 0x98, 0x55, 0x6a, 0x1d, 0x5d, 0x1c, 0xc7, 0x38, 0xaf, 0xfd, 0x49, + 0x9e, 0x85, 0x3f, 0xd6, 0x45, 0x0e, 0x99, 0x09, 0x85, 0x69, 0x84, 0x3c, + 0xfe, 0x72, 0xa5, 0x56, 0xfa, 0x11, 0x4f, 0x6b, 0x7d, 0x32, 0x2b, 0x0c, + 0xbf, 0x8f, 0xac, 0x47, 0x96, 0x22, 0x82, 0x3d, 0xf5, 0x64, 0x74, 0x7e, + 0x62, 0x68, 0x74, 0xcd, 0x0a, 0xec, 0x84, 0xc5, 0x15, 0x06, 0x0e, 0x5a, + 0x2f, 0x20, 0xe3, 0xc9, 0x67, 0xcd, 0xdd, 0x01, 0xb8, 0xb3, 0x18, 0x87, + 0x8c, 0xa9, 0x58, 0x86, 0x0f, 0xb6, 0xc3, 0x42, 0x7e, 0x87, 0x48, 0x5e, + 0x10, 0x49, 0xc7, 0xd7, 0xb7, 0xb8, 0xa6, 0x34, 0x08, 0x0c, 0x94, 0xf4, + 0xbb, 0x2a, 0x06, 0xa4, 0x4f, 0xec, 0xbc, 0xc4, 0x37, 0xbe, 0x99, 0x10, + 0x23, 0x37, 0x24, 0xb1, 0xdf, 0xcb, 0xe6, 0x3f, 0xc1, 0xf0, 0x0f, 0x04, + 0x03, 0xc8, 0xb0, 0x1e, 0xd6, 0xb8, 0xae, 0x77, 0xe1, 0x4d, 0x6d, 0x97, + 0x69, 0x6d, 0x8a, 0x73, 0x66, 0x32, 0x57, 0x6f, 0xcf, 0xea, 0x1e, 0x7b, + 0x87, 0x03, 0x75, 0xb1, 0xef, 0x83, 0x64, 0x26, 0xf1, 0x3f, 0xbf, 0xe6, + 0x28, 0x03, 0x72, 0x57, 0xbf, 0x47, 0x29, 0x99, 0x8f, 0x74, 0x1d, 0x01, + 0x16, 0xad, 0xb2, 0xdf, 0x80, 0xa4, 0xd3, 0x8b, 0xeb, 0x61, 0xd1, 0x40, + 0x68, 0xb9, 0xa2, 0xa5, 0xef, 0x2b, 0xe5, 0x78, 0xe8, 0x28, 0x88, 0x87, + 0xb7, 0x53, 0x49, 0xbb, 0xe4, 0xea, 0x0d, 0x5e, 0x96, 0xa5, 0xdd, 0x1f, + 0x0b, 0x25, 0x8b, 0xb5, 0x95, 0x46, 0xe7, 0xba, 0xb8, 0xc4, 0x0a, 0x36, + 0xb1, 0x89, 0xeb, 0x27, 0x5d, 0xd9, 0x97, 0x24, 0x59, 0xa3, 0x9b, 0xb0, + 0x23, 0x0b, 0xd2, 0xec, 0x65, 0x91, 0xf9, 0xf0, 0xa0, 0x74, 0x5f, 0xb4, + 0xce, 0x22, 0x27, 0x18, 0x37, 0xe2, 0x4b, 0xfc, 0x91, 0xf9, 0x09, 0x15, + 0xe6, 0xdb, 0x06, 0x9b, 0x4d, 0x82, 0xdc, 0x36, 0x14, 0x48, 0xc6, 0xd5, + 0x87, 0xca, 0xec, 0x5a, 0xa2, 0x29, 0x33, 0xef, 0x22, 0x0c, 0x4b, 0xbf, + 0xe7, 0x2f, 0x95, 0xe1, 0xd3, 0xa5, 0xd8, 0xaa, 0x44, 0x77, 0x29, 0xa3, + 0x20, 0x33, 0xd2, 0x51, 0xa2, 0xf9, 0x4a, 0x6f, 0xf7, 0x3e, 0xf7, 0x0b, + 0x8a, 0xec, 0xc1, 0x99, 0x1d, 0x47, 0xf3, 0x74, 0x02, 0x04, 0xab, 0x8e, + 0x62, 0x4c, 0x9e, 0x00, 0xc2, 0x84, 0xd7, 0xd0, 0xf8, 0xe4, 0x1c, 0x9d, + 0x98, 0x15, 0xa8, 0x8f, 0x08, 0x98, 0x4e, 0x5a, 0xfa, 0xd6, 0x60, 0x87, + 0x12, 0xdc, 0x8e, 0xfd, 0xcb, 0xb3, 0x13, 0x97, 0x7a, 0xa8, 0x8c, 0x56, + 0x2e, 0x49, 0x26, 0x60, 0xe9, 0x4a, 0xdc, 0xec, 0x3f, 0xf0, 0x94, 0xcd, + 0x90, 0x8e, 0x7c, 0x21, 0x3f, 0x80, 0x14, 0x33, 0xdd, 0xb0, 0x00, 0xe2, + 0x09, 0x37, 0x06, 0xdd, 0x17, 0x69, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x16, 0x30, 0x14, 0x30, 0x12, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, + 0xd6, 0x79, 0x04, 0x01, 0x01, 0x04, 0x04, 0x02, 0x02, 0x1c, 0xb2, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x8e, 0x2d, 0x13, 0x1e, 0x60, + 0xaa, 0xda, 0x52, 0x53, 0x55, 0x64, 0x3a, 0xdc, 0xb6, 0x7a, 0xc0, 0xba, + 0xfa, 0xeb, 0x20, 0xab, 0xb6, 0x63, 0xcf, 0xcd, 0x9b, 0xdb, 0x71, 0xf3, + 0xa0, 0xd6, 0x91, 0xbf, 0x0c, 0xc1, 0xae, 0x8f, 0x02, 0x18, 0x00, 0x54, + 0xfb, 0x49, 0x03, 0x34, 0x8d, 0x92, 0x9d, 0x5d, 0x8d, 0xa8, 0x1c, 0x20, + 0x0f, 0x85, 0x60, 0xf9, 0xf6, 0x8b, 0xbb, 0x2b, 0x82, 0xce, 0xb3, 0xe2, + 0x91, 0xe7, 0xbd, 0x91, 0x61, 0x52, 0x36, 0x40, 0x9f, 0x2f, 0x5e, 0xa6, + 0x5d, 0x2f, 0xb3, 0x81, 0xe7, 0xf1, 0x87, 0xbe, 0xc5, 0x9d, 0x67, 0x5a, + 0xf7, 0x41, 0x1e, 0x73, 0xb0, 0x1e, 0xdc, 0x4f, 0x8d, 0x53, 0x21, 0x38, + 0x1b, 0xfd, 0x92, 0x43, 0x68, 0x83, 0x03, 0xd0, 0x9a, 0xca, 0x92, 0x14, + 0x73, 0x04, 0x94, 0x2a, 0x93, 0x22, 0x60, 0x5e, 0xee, 0xb6, 0xec, 0x0f, + 0xb0, 0xc8, 0x92, 0x97, 0xfb, 0x5d, 0xed, 0x1f, 0xa0, 0x5f, 0xe4, 0x98, + 0x2f, 0xf6, 0x13, 0x78, 0x99, 0xec, 0xb3, 0xf1, 0x0d, 0x27, 0xaa, 0x19, + 0x95, 0x39, 0xdb, 0xb0, 0x7b, 0x96, 0x74, 0x03, 0x5e, 0x51, 0xf5, 0x15, + 0x27, 0xce, 0xca, 0x0b, 0x2a, 0x0d, 0x43, 0xb3, 0x68, 0x17, 0x1e, 0x11, + 0x60, 0xd9, 0x84, 0x9b, 0xc3, 0x53, 0xce, 0xbd, 0xf4, 0x61, 0x51, 0x4b, + 0x41, 0x00, 0x7e, 0xe1, 0x5f, 0x69, 0xb3, 0x4a, 0x89, 0x7e, 0x47, 0x67, + 0xfd, 0x76, 0xf8, 0x94, 0x2f, 0x72, 0xb6, 0x14, 0x08, 0x2c, 0x16, 0x4e, + 0x9d, 0x37, 0x62, 0xbf, 0x11, 0x67, 0xc0, 0x70, 0x71, 0xec, 0x55, 0x51, + 0x4e, 0x46, 0x76, 0xb4, 0xc3, 0xeb, 0x52, 0x06, 0x17, 0x06, 0xce, 0x61, + 0x43, 0xce, 0x26, 0x80, 0x68, 0xb6, 0x2d, 0x57, 0xba, 0x8c, 0x7d, 0xb7, + 0xc5, 0x05, 0x2c, 0xf8, 0xa3, 0x69, 0xf8, 0x96, 0xad, 0xac, 0xd1, 0x30, + 0x82, 0x05, 0xa6, 0x30, 0x82, 0x03, 0x8e, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x10, 0x73, 0xd1, 0xe1, 0x1d, 0xa9, 0x75, 0xfd, 0x0c, 0xda, 0x7f, + 0xfa, 0x43, 0x3c, 0x26, 0xbd, 0x3d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x7e, 0x31, + 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, + 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, + 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, 0x6b, + 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, + 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, 0x65, + 0x76, 0x69, 0x6e, 0x65, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x1a, 0x77, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x65, 0x6d, 0x2d, 0x72, 0x6f, 0x6f, 0x74, + 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, + 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, 0x32, 0x34, 0x31, 0x5a, 0x17, 0x0d, + 0x32, 0x37, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, 0x32, 0x34, 0x31, + 0x5a, 0x30, 0x81, 0x8b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, + 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, + 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, + 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, + 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x30, 0x30, + 0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x27, 0x47, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x20, 0x4f, 0x45, 0x4d, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x20, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x20, 0x69, 0x64, 0x3a, 0x20, 0x37, 0x33, 0x34, 0x36, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x45, 0x13, 0xf2, + 0xb2, 0xcb, 0x4b, 0x0f, 0xb4, 0x44, 0x25, 0x9c, 0x8a, 0x68, 0x54, 0xd5, + 0x45, 0x1e, 0x15, 0x89, 0x5b, 0xb8, 0xce, 0xda, 0x5a, 0x42, 0xe6, 0x9a, + 0x8c, 0xc1, 0xcb, 0xe8, 0xc5, 0xf5, 0x8f, 0x49, 0x0e, 0x02, 0xef, 0x5e, + 0x97, 0x1a, 0x91, 0xa4, 0x94, 0xc3, 0x50, 0x13, 0xe5, 0x13, 0xb7, 0x7f, + 0x26, 0x53, 0x19, 0xb0, 0x37, 0xa5, 0xef, 0xe6, 0x2a, 0x39, 0xdc, 0x93, + 0x37, 0xe2, 0x3d, 0x7f, 0xcb, 0x4b, 0x93, 0xa2, 0xc3, 0x69, 0x78, 0xc9, + 0x01, 0xfa, 0x68, 0x3b, 0xe0, 0xe2, 0x22, 0x6c, 0xeb, 0xe4, 0x8a, 0xa8, + 0x3e, 0xf5, 0x20, 0x82, 0xa8, 0x62, 0x68, 0x59, 0x78, 0x24, 0xde, 0xef, + 0x47, 0x43, 0xb1, 0x6c, 0x38, 0x29, 0xd3, 0x69, 0x3f, 0xae, 0x35, 0x57, + 0x75, 0x80, 0xc9, 0x21, 0xe7, 0x01, 0xb9, 0x54, 0x8b, 0x6e, 0x4e, 0x2e, + 0x5a, 0x5b, 0x77, 0xa4, 0x22, 0xc2, 0x7b, 0x95, 0xb9, 0x39, 0x2c, 0xbd, + 0xc2, 0x1e, 0x02, 0xa6, 0xb2, 0xbc, 0x0f, 0x7a, 0xcb, 0xdc, 0xbc, 0xbc, + 0x90, 0x66, 0xe3, 0xca, 0x46, 0x53, 0x3e, 0x98, 0xff, 0x2e, 0x78, 0x9f, + 0xd3, 0xa1, 0x12, 0x93, 0x66, 0x7d, 0xcc, 0x94, 0x6b, 0xec, 0x19, 0x0e, + 0x20, 0x45, 0x22, 0x57, 0x6d, 0x9e, 0xd0, 0x89, 0xf2, 0xa9, 0x34, 0xdc, + 0xab, 0xa5, 0x73, 0x47, 0x38, 0xe3, 0x7f, 0x98, 0x3a, 0x61, 0xae, 0x6c, + 0x4d, 0xf2, 0x31, 0x90, 0xcb, 0x83, 0xc1, 0xee, 0xb4, 0xf2, 0x9a, 0x28, + 0x5f, 0xbb, 0x7d, 0x89, 0xdf, 0xa2, 0x31, 0xb6, 0x1d, 0x39, 0x2b, 0x70, + 0xbf, 0x1e, 0xad, 0xe1, 0x74, 0x94, 0x1d, 0xf8, 0xc5, 0x1a, 0x8d, 0x13, + 0x45, 0xf0, 0x6a, 0x80, 0x0c, 0x5d, 0xbb, 0x46, 0x8a, 0x43, 0xd0, 0xff, + 0x21, 0x39, 0x57, 0x53, 0x5b, 0x51, 0xf8, 0xa2, 0x8f, 0x7f, 0x27, 0xc7, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x10, 0x30, 0x82, 0x01, + 0x0c, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, + 0x04, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0xe8, 0xe9, 0xac, 0x16, 0x5c, 0x5e, 0xb2, 0xe8, 0xeb, 0xff, 0x57, 0x27, + 0x20, 0x08, 0x72, 0x63, 0x9b, 0xe5, 0xb5, 0x16, 0x30, 0x81, 0xb2, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0xaa, 0x30, 0x81, 0xa7, 0x80, 0x14, + 0x04, 0x94, 0x66, 0xaa, 0xf9, 0x61, 0x89, 0xb6, 0xdb, 0xb5, 0xf7, 0x13, + 0x38, 0x3d, 0x62, 0x84, 0xb8, 0x18, 0x0a, 0x8f, 0xa1, 0x81, 0x83, 0xa4, + 0x81, 0x80, 0x30, 0x7e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, + 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, + 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, + 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, + 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, + 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, + 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x23, 0x30, + 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1a, 0x77, 0x69, 0x64, 0x65, + 0x76, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x65, 0x6d, + 0x2d, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x82, 0x09, + 0x00, 0xdf, 0x86, 0x05, 0x31, 0x01, 0xbe, 0x9a, 0x9a, 0x30, 0x12, 0x06, + 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xd6, 0x79, 0x04, 0x01, 0x01, 0x04, + 0x04, 0x02, 0x02, 0x1c, 0xb2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, + 0x00, 0x25, 0xce, 0xd2, 0x02, 0x48, 0xbb, 0xbe, 0xfc, 0xb6, 0xa4, 0x87, + 0x87, 0xe0, 0x21, 0x7d, 0xfa, 0x23, 0xc3, 0x0d, 0x73, 0x8f, 0x46, 0xe7, + 0x09, 0x59, 0xda, 0x2e, 0x55, 0x59, 0xff, 0x3c, 0x1b, 0xf6, 0xf8, 0x9a, + 0xc4, 0x1c, 0xf7, 0xac, 0xca, 0xe7, 0x63, 0xf2, 0xc7, 0xd6, 0x0c, 0x2d, + 0xa6, 0xad, 0x55, 0xf4, 0x10, 0x0e, 0xa8, 0x82, 0x0f, 0x88, 0xb5, 0x44, + 0xe8, 0x8e, 0x84, 0x08, 0xf7, 0xdd, 0xe7, 0x10, 0xce, 0x71, 0x56, 0x57, + 0x3f, 0xed, 0x48, 0xee, 0xe2, 0x5d, 0x08, 0x0a, 0x58, 0xe4, 0xfe, 0xbc, + 0x8c, 0x27, 0x1a, 0x46, 0x3f, 0xd5, 0x2d, 0xdb, 0x0b, 0x71, 0x73, 0xd1, + 0x49, 0xf3, 0x5c, 0x86, 0x4d, 0x0a, 0xe1, 0xeb, 0x53, 0x21, 0x38, 0x4f, + 0xec, 0x1e, 0xc2, 0x68, 0x1f, 0x7d, 0xa6, 0x33, 0xe9, 0xa5, 0x37, 0x2a, + 0xef, 0xcd, 0x78, 0x56, 0xb3, 0x39, 0x60, 0xf4, 0xa5, 0xf9, 0x2b, 0x85, + 0xcf, 0xe6, 0x1c, 0x7c, 0x8a, 0x5d, 0xe8, 0x26, 0x02, 0xcf, 0x7a, 0x56, + 0x1f, 0xae, 0x0d, 0x71, 0x20, 0xee, 0xec, 0x3b, 0xae, 0x95, 0x25, 0x15, + 0xc8, 0xf6, 0x92, 0x5d, 0xb8, 0x9b, 0xc2, 0xb4, 0x95, 0x33, 0x13, 0x76, + 0x45, 0xbe, 0x21, 0xe2, 0x3a, 0x69, 0x66, 0xd7, 0xff, 0x22, 0x00, 0x89, + 0xc9, 0x44, 0xb6, 0x54, 0x38, 0x1f, 0x33, 0xe4, 0xda, 0x7b, 0x87, 0xf3, + 0x23, 0xed, 0xf5, 0x16, 0x08, 0xbe, 0x4b, 0xea, 0x91, 0x8f, 0x91, 0x8b, + 0x4e, 0xd1, 0x02, 0x06, 0xa2, 0x77, 0x15, 0x03, 0x46, 0x11, 0x7d, 0x5b, + 0xea, 0x7a, 0xf6, 0x86, 0x7d, 0x96, 0xb7, 0x73, 0x9b, 0x5b, 0x32, 0xc3, + 0xf8, 0x92, 0x36, 0xe3, 0xe3, 0x2f, 0xe8, 0xf1, 0x72, 0xec, 0x0d, 0x50, + 0xd4, 0x86, 0xc5, 0x62, 0x83, 0xf1, 0x2a, 0x4c, 0xd1, 0xbf, 0x76, 0x62, + 0xd4, 0x21, 0x11, 0x68, 0xb2, 0xd6, 0x8d, 0xc4, 0xf8, 0xe4, 0x70, 0x85, + 0x19, 0xa7, 0x82, 0x27, 0x2c, 0x24, 0x21, 0x7a, 0x3b, 0xad, 0x8a, 0xd3, + 0xae, 0xda, 0x78, 0x3c, 0x6c, 0xab, 0xa2, 0xaa, 0x36, 0xf0, 0x1c, 0x58, + 0xd4, 0x72, 0x5e, 0xe8, 0x8b, 0x41, 0x08, 0xf5, 0x85, 0xdd, 0xee, 0x99, + 0x12, 0xf4, 0xd6, 0x41, 0x83, 0x69, 0xe7, 0x79, 0x19, 0xa3, 0x74, 0xc4, + 0x34, 0x2a, 0x8a, 0x7e, 0x4d, 0xbb, 0x2c, 0x49, 0x19, 0xf7, 0x98, 0x98, + 0xfc, 0x81, 0xf7, 0x9b, 0x7f, 0xff, 0xd9, 0x66, 0xf4, 0x51, 0x14, 0x29, + 0x2a, 0x14, 0x1d, 0x4f, 0xbd, 0x91, 0xba, 0x6f, 0x32, 0x34, 0x3c, 0x40, + 0x28, 0x6c, 0x97, 0xf8, 0x6d, 0x38, 0xcd, 0xa3, 0x7b, 0x18, 0xc8, 0x77, + 0x58, 0x4d, 0x53, 0x30, 0x7f, 0x4d, 0x89, 0xca, 0x95, 0x6e, 0xb5, 0xb8, + 0x8e, 0xc8, 0x2d, 0x18, 0x2f, 0x52, 0x2a, 0xde, 0xac, 0x56, 0x8d, 0x8c, + 0x67, 0x14, 0xf6, 0xb9, 0xf1, 0x65, 0xd3, 0x22, 0x43, 0xa3, 0x98, 0x42, + 0x20, 0x43, 0x4c, 0xdf, 0xf2, 0xeb, 0x31, 0x8c, 0x0e, 0x53, 0x5b, 0x99, + 0x82, 0xc3, 0x48, 0x04, 0x53, 0xad, 0x96, 0xb6, 0x9f, 0x52, 0xcc, 0x01, + 0xc8, 0xb3, 0x87, 0x6b, 0x9e, 0xea, 0xa9, 0xeb, 0xda, 0xac, 0xf9, 0x6f, + 0xde, 0xa1, 0x44, 0x32, 0x52, 0x49, 0x47, 0xff, 0x65, 0x79, 0x1e, 0xc5, + 0x73, 0x17, 0xb3, 0x36, 0xfc, 0x45, 0xca, 0x90, 0x37, 0x59, 0x1e, 0x16, + 0xab, 0x09, 0x69, 0xcf, 0xda, 0x56, 0x51, 0xfd, 0xeb, 0xcf, 0xcb, 0x8f, + 0xb1, 0xc3, 0x45, 0x2b, 0x7c, 0x0a, 0xa5, 0x9c, 0x0d, 0x2c, 0xad, 0x1c, + 0xd3, 0x33, 0xdd, 0xfe, 0x93, 0x69, 0xa2, 0x4b, 0x4b, 0xcf, 0x1d, 0x20, + 0x98, 0x4a, 0x4f, 0x5b, 0xe9, 0x24, 0xca, 0xfa, 0x18, 0x11, 0x81, 0x8b, + 0x7a, 0xb4, 0x5a, 0xc8, 0xdf, 0x6f, 0x5f, 0x21, 0x07, 0x31, 0x00 +}; +extern const size_t kOEMPublicCertSize_Prod = 2555; + +extern const uint32_t kOEMSystemId_Dev = 2001093; + +extern const uint8_t kOEMPrivateKey_Dev[] = { + 0x30, 0x82, 0x06, 0xfd, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, + 0x06, 0xe7, 0x30, 0x82, 0x06, 0xe3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, + 0x81, 0x00, 0xda, 0x30, 0x9c, 0xd2, 0xd9, 0xdb, 0xb7, 0x25, 0x86, 0xdc, + 0x99, 0x87, 0x91, 0x40, 0xca, 0x02, 0x76, 0xc4, 0xc6, 0x00, 0xcb, 0x60, + 0x8c, 0xb2, 0x01, 0xde, 0x9d, 0x44, 0x4c, 0x72, 0x42, 0xc2, 0xf1, 0x96, + 0x13, 0xa2, 0x15, 0xb2, 0x9c, 0x09, 0x11, 0x73, 0x96, 0x4e, 0xd3, 0xda, + 0xb4, 0xaf, 0xd5, 0x69, 0x69, 0xd9, 0xbe, 0x19, 0x5e, 0x49, 0x21, 0x01, + 0xf7, 0x31, 0xdd, 0x14, 0xea, 0x41, 0x5e, 0x81, 0xc5, 0x76, 0xff, 0x50, + 0xba, 0xa7, 0x0b, 0x81, 0x22, 0xba, 0x2b, 0x58, 0x7b, 0x5d, 0xb3, 0xaf, + 0xd1, 0xb4, 0x66, 0x8e, 0x70, 0x55, 0xd8, 0x4d, 0x47, 0xb7, 0x00, 0x2c, + 0x52, 0x46, 0x33, 0xa1, 0x5f, 0xca, 0xd8, 0xb1, 0xc5, 0x04, 0x0e, 0xb7, + 0xd8, 0x0a, 0xca, 0x7c, 0x2a, 0x11, 0x3d, 0xec, 0x7f, 0x4c, 0xea, 0xaa, + 0x8e, 0x1d, 0xef, 0x9e, 0x2b, 0x9e, 0x79, 0x09, 0x7e, 0xf4, 0xd0, 0xa3, + 0x58, 0xb5, 0x4e, 0x1c, 0xfb, 0x07, 0x17, 0xc4, 0xef, 0x30, 0xa3, 0x91, + 0xb6, 0x5f, 0xf8, 0xdb, 0x05, 0x73, 0x85, 0x9b, 0xe1, 0x16, 0xf1, 0x8e, + 0xe4, 0x9f, 0xe7, 0x54, 0xcf, 0x52, 0x84, 0xe7, 0x71, 0xe7, 0x38, 0x67, + 0x8e, 0x96, 0x59, 0x9b, 0x97, 0xa2, 0xc0, 0x01, 0xd5, 0x41, 0x36, 0xfa, + 0xc1, 0x61, 0x96, 0x6c, 0x38, 0x7d, 0xdd, 0x1c, 0x24, 0x2e, 0x57, 0x67, + 0x7c, 0x70, 0xd1, 0x8a, 0x8a, 0xe2, 0x6f, 0x66, 0xd2, 0xaa, 0x3e, 0xfa, + 0x4c, 0x4a, 0x68, 0xba, 0x86, 0x6e, 0x33, 0xfe, 0x30, 0xd2, 0xf4, 0x96, + 0x58, 0xe2, 0x35, 0x94, 0x4f, 0x11, 0xc7, 0x0a, 0x21, 0xe5, 0xd4, 0x1a, + 0x3c, 0xfd, 0x82, 0xbb, 0x34, 0x21, 0xdb, 0x2f, 0xd8, 0xd1, 0xbe, 0x38, + 0xe8, 0x47, 0x45, 0x04, 0x27, 0xb0, 0x19, 0x65, 0x6f, 0x55, 0xcd, 0x56, + 0x3a, 0xcc, 0xc1, 0xaf, 0xce, 0x59, 0x2e, 0xe6, 0x89, 0x24, 0x48, 0x94, + 0xc8, 0x73, 0x45, 0xc8, 0xe5, 0x1d, 0xe1, 0xf8, 0x7d, 0x88, 0xe5, 0x07, + 0x42, 0xb2, 0x80, 0x17, 0xf6, 0x67, 0x2a, 0x33, 0xa0, 0xca, 0x81, 0x0e, + 0xc4, 0x99, 0x93, 0x02, 0x8c, 0x90, 0x1d, 0x46, 0xad, 0x61, 0xec, 0xca, + 0xdd, 0x8e, 0x8b, 0x9f, 0x32, 0xab, 0xbf, 0xfa, 0xa6, 0x28, 0xda, 0x63, + 0xa2, 0xf0, 0x20, 0x52, 0x26, 0x06, 0x05, 0x59, 0xe1, 0x4a, 0x8d, 0x5e, + 0x6a, 0x65, 0xd8, 0x8e, 0x6e, 0x49, 0xa4, 0xa8, 0xc0, 0xba, 0x7b, 0x21, + 0x31, 0x7a, 0xd1, 0xb5, 0x46, 0x9e, 0xa5, 0x45, 0xeb, 0xdf, 0x38, 0xc4, + 0x1e, 0x10, 0xc6, 0xb6, 0x83, 0x46, 0x96, 0x63, 0xe5, 0xef, 0x7c, 0xdb, + 0x65, 0x3e, 0xec, 0x42, 0x00, 0x71, 0x78, 0x83, 0xfc, 0x73, 0x4f, 0x4e, + 0xb9, 0x01, 0x80, 0xd4, 0x7d, 0xf2, 0x72, 0x8d, 0x41, 0x7b, 0xee, 0xb5, + 0xca, 0xf7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x80, 0x2b, + 0xeb, 0x6d, 0x25, 0xe4, 0x44, 0x9d, 0xf1, 0x27, 0xdc, 0x6f, 0xeb, 0x22, + 0x09, 0xf0, 0x9f, 0xde, 0x58, 0x6d, 0xa2, 0xeb, 0x4d, 0x5c, 0x04, 0xd8, + 0xeb, 0x7e, 0xac, 0xa8, 0xd6, 0xb7, 0x29, 0x96, 0x87, 0xa7, 0x1c, 0x11, + 0x52, 0x0a, 0xa6, 0xa8, 0xa4, 0xa3, 0xb4, 0xea, 0x60, 0x33, 0xce, 0xd1, + 0x1e, 0x8e, 0xf8, 0x0d, 0x93, 0xfd, 0xae, 0xaa, 0xbe, 0x42, 0x8b, 0xfe, + 0xfc, 0x9e, 0xca, 0xd9, 0xc3, 0x35, 0x84, 0x66, 0x90, 0x51, 0x82, 0x1e, + 0x86, 0xb7, 0xfe, 0xd1, 0x8a, 0xd6, 0x0a, 0x5e, 0x89, 0x1d, 0xa5, 0x3a, + 0x9f, 0xa1, 0x6d, 0x26, 0x45, 0x28, 0x12, 0x66, 0x2e, 0x85, 0xc1, 0x2b, + 0xd3, 0x67, 0xfc, 0xe4, 0xf1, 0xa3, 0xbe, 0xd5, 0x57, 0x9c, 0x5d, 0x4f, + 0xb4, 0xfe, 0xa2, 0xc9, 0xdc, 0x39, 0x23, 0xba, 0x78, 0xea, 0x72, 0x8c, + 0x31, 0x42, 0x86, 0x7b, 0xc6, 0xb5, 0x8f, 0x82, 0x0f, 0xdf, 0x63, 0x5f, + 0x7d, 0xe5, 0xe9, 0xdf, 0x96, 0xfc, 0xae, 0xc5, 0xbe, 0x26, 0xff, 0xda, + 0x8f, 0xfb, 0xe0, 0xed, 0x1c, 0x1b, 0x8b, 0x0a, 0xc4, 0xc0, 0xb0, 0x8f, + 0x58, 0x3b, 0x03, 0x59, 0x4d, 0x5d, 0x58, 0x35, 0xba, 0x62, 0xb1, 0x51, + 0x08, 0x48, 0xd5, 0xb1, 0xe0, 0xac, 0x94, 0x9c, 0x04, 0x8d, 0xb8, 0x9f, + 0x16, 0xd9, 0xa8, 0x3c, 0x41, 0xd5, 0xe6, 0x9e, 0x21, 0x6e, 0xa2, 0xc7, + 0xdb, 0x2a, 0xeb, 0x2d, 0x54, 0xbd, 0xa0, 0x16, 0x90, 0xa1, 0x73, 0x15, + 0xf1, 0x88, 0xb0, 0xa0, 0xa0, 0x5d, 0xf3, 0x1a, 0x7d, 0x60, 0x6c, 0x59, + 0xcd, 0x1a, 0xb6, 0x6a, 0x5b, 0xca, 0x4a, 0x86, 0x35, 0xc4, 0x9d, 0xfc, + 0x27, 0x38, 0x8c, 0x53, 0x69, 0x8e, 0xba, 0x4b, 0x1f, 0x4a, 0x31, 0x70, + 0x41, 0xc5, 0x7d, 0x35, 0xf0, 0xe6, 0xc8, 0x70, 0xc9, 0x83, 0x8e, 0x05, + 0xbe, 0x97, 0x82, 0xb2, 0x59, 0xfc, 0xb4, 0x63, 0x98, 0xa3, 0x3b, 0x17, + 0xdc, 0xe7, 0xa4, 0x30, 0xce, 0xd1, 0x76, 0xc7, 0x42, 0xce, 0x92, 0x1b, + 0xdd, 0xde, 0xa1, 0xdd, 0xeb, 0x88, 0xb4, 0xd0, 0x90, 0xb6, 0xe9, 0x91, + 0x3b, 0xb5, 0x2a, 0x8c, 0xad, 0x48, 0x15, 0xd3, 0x69, 0x46, 0xfe, 0x43, + 0x11, 0xd9, 0x5b, 0x56, 0x66, 0xb1, 0x5f, 0xf4, 0x0f, 0x68, 0xb5, 0x55, + 0x17, 0x5c, 0x41, 0xd7, 0xdc, 0x2d, 0xd2, 0x6a, 0x9c, 0xd8, 0xd0, 0x45, + 0xff, 0xc7, 0x30, 0x81, 0xc8, 0x57, 0xe6, 0x6e, 0x12, 0xd7, 0xa1, 0x6f, + 0x51, 0x9d, 0x0b, 0x7c, 0x00, 0xbd, 0xa7, 0xc5, 0x7e, 0x58, 0x9b, 0x6a, + 0xf3, 0xe6, 0x17, 0x43, 0x89, 0x04, 0xa0, 0xf5, 0x61, 0xa8, 0xf9, 0xff, + 0x5f, 0x9f, 0xa5, 0x4b, 0xa7, 0xdb, 0x60, 0xea, 0xb9, 0x80, 0x5d, 0x1c, + 0x58, 0x2a, 0x60, 0x96, 0x6a, 0xba, 0xc7, 0xf3, 0xfc, 0x13, 0x41, 0x02, + 0x81, 0xc1, 0x00, 0xf3, 0x45, 0x5f, 0x13, 0x38, 0xa4, 0x51, 0x17, 0x3a, + 0xf9, 0x4d, 0x9f, 0x71, 0x98, 0x26, 0x27, 0xfb, 0x81, 0xe6, 0x49, 0x88, + 0x8d, 0x2f, 0xc6, 0x13, 0x41, 0x08, 0xef, 0x8b, 0x7d, 0xec, 0x62, 0x73, + 0x02, 0x73, 0xa8, 0x98, 0x77, 0x4c, 0x46, 0x7c, 0x62, 0xec, 0x9e, 0xa7, + 0xab, 0x19, 0x21, 0x8c, 0x2f, 0xad, 0xb8, 0x17, 0x3b, 0x83, 0x9b, 0x32, + 0xb8, 0xf4, 0x49, 0x70, 0x47, 0x3c, 0x2a, 0xb0, 0x8f, 0xdc, 0x9a, 0xa4, + 0x3e, 0xef, 0x3e, 0xce, 0x43, 0x7e, 0x28, 0xdd, 0x9e, 0x46, 0xf0, 0x28, + 0x86, 0xbf, 0xdd, 0x2f, 0xf7, 0xc6, 0x1c, 0xa0, 0xec, 0x14, 0x54, 0x23, + 0xce, 0x32, 0xd5, 0xc5, 0x77, 0x7f, 0xf0, 0x8c, 0x8b, 0x39, 0x86, 0x9d, + 0x18, 0xb6, 0x2c, 0xc9, 0x65, 0x20, 0xcf, 0x58, 0xeb, 0xe7, 0x21, 0xc3, + 0x49, 0x7e, 0x1e, 0xa7, 0xe0, 0x8a, 0xe4, 0x1f, 0x77, 0x8c, 0x25, 0xfb, + 0x97, 0x05, 0x6b, 0x10, 0xa5, 0xff, 0x00, 0xb9, 0x5b, 0xf4, 0x6f, 0x06, + 0x50, 0xe7, 0xdf, 0xa2, 0x22, 0x71, 0x9f, 0x8c, 0x32, 0x04, 0x68, 0x5e, + 0x89, 0x04, 0x53, 0x99, 0x57, 0xf6, 0x70, 0x7a, 0x7f, 0x4d, 0xfe, 0xd0, + 0xf9, 0xc2, 0x52, 0xb3, 0x0e, 0x81, 0x95, 0xcb, 0xb6, 0x7d, 0x89, 0x46, + 0x04, 0x50, 0xce, 0xf1, 0x3e, 0xb8, 0x75, 0x57, 0xde, 0xa0, 0xf6, 0x5f, + 0xf1, 0x19, 0xeb, 0x02, 0x81, 0xc1, 0x00, 0xe5, 0x9b, 0x47, 0x51, 0xed, + 0x05, 0x0c, 0x94, 0xa4, 0x5b, 0xd0, 0x2d, 0x62, 0x2a, 0x02, 0x76, 0xc9, + 0x77, 0x32, 0x18, 0x8c, 0xc8, 0x85, 0x9a, 0x4e, 0x3b, 0x47, 0x4e, 0xb0, + 0x8f, 0x61, 0x03, 0xc1, 0xf5, 0xe3, 0x57, 0x12, 0xd6, 0xad, 0x42, 0xaf, + 0xe1, 0x37, 0xe2, 0x7a, 0xcf, 0xd7, 0x34, 0xbb, 0xb7, 0xa4, 0xfd, 0xd7, + 0x5a, 0x44, 0x09, 0xa1, 0xdf, 0x7b, 0x26, 0x74, 0xb7, 0x05, 0xf8, 0x46, + 0xd3, 0x33, 0x03, 0x09, 0xc4, 0xb7, 0x71, 0xba, 0x96, 0x55, 0x64, 0xa1, + 0x3f, 0x4f, 0xcb, 0x05, 0x97, 0x87, 0x8c, 0xeb, 0xd6, 0x66, 0x02, 0xe1, + 0x32, 0xed, 0x7b, 0xed, 0xad, 0xb7, 0x99, 0xba, 0x80, 0x36, 0x92, 0xcc, + 0xa9, 0x0a, 0x8a, 0x34, 0x8b, 0x9b, 0x34, 0x3b, 0x50, 0xf5, 0xd0, 0xeb, + 0x49, 0x96, 0xb0, 0xab, 0x10, 0x45, 0x53, 0xeb, 0x63, 0xc3, 0x51, 0x52, + 0xbf, 0xe9, 0xbd, 0x7a, 0x59, 0xe1, 0x3b, 0x62, 0xd7, 0x91, 0x47, 0x31, + 0x4c, 0x9c, 0x31, 0x42, 0x55, 0x88, 0x65, 0xcd, 0x3e, 0x72, 0xf0, 0x04, + 0xd0, 0x57, 0x13, 0x6f, 0x25, 0xde, 0x66, 0xa2, 0xe7, 0x4d, 0x1f, 0xd1, + 0xae, 0x19, 0x60, 0x68, 0xc3, 0xb4, 0xb4, 0x7b, 0xc5, 0x22, 0x8b, 0xf8, + 0x4e, 0xad, 0xc8, 0x8a, 0x40, 0xb8, 0xcc, 0x01, 0xe6, 0x0e, 0xe7, 0xbe, + 0x17, 0x65, 0x02, 0xb5, 0xa8, 0x24, 0x25, 0x02, 0x81, 0xc0, 0x3e, 0x4f, + 0x1c, 0x64, 0xfd, 0xf3, 0x08, 0x5a, 0x1c, 0xde, 0xd2, 0x04, 0xee, 0xc1, + 0x7b, 0xb4, 0x6d, 0xf4, 0xfd, 0x99, 0x04, 0x02, 0xb5, 0xa3, 0xd4, 0x36, + 0xaa, 0x25, 0x40, 0xe3, 0x45, 0xf2, 0x89, 0x66, 0xad, 0x5d, 0x17, 0x80, + 0x26, 0xe7, 0x3e, 0xe0, 0xcf, 0x9e, 0x6b, 0x6f, 0xa5, 0x86, 0x34, 0x33, + 0xda, 0x18, 0xf6, 0xca, 0x65, 0x91, 0x10, 0xd2, 0xd2, 0xaf, 0x24, 0xb4, + 0xfa, 0x32, 0x2c, 0xfb, 0x0c, 0x14, 0x07, 0xd1, 0x9e, 0xd1, 0xc5, 0x5f, + 0x00, 0x27, 0x53, 0x6c, 0x40, 0xdb, 0x2e, 0x66, 0x25, 0x2a, 0x70, 0x28, + 0xd4, 0x73, 0x6c, 0xbc, 0x4b, 0x10, 0xaa, 0x03, 0x1c, 0x7e, 0x28, 0x8f, + 0xcd, 0x13, 0x3d, 0xcc, 0x43, 0x35, 0xb9, 0x73, 0x24, 0xe6, 0x1f, 0xc7, + 0x69, 0x39, 0xf2, 0x9a, 0xa9, 0x9e, 0xba, 0x38, 0x4e, 0xb7, 0x67, 0x64, + 0x59, 0xee, 0xc8, 0x28, 0x84, 0x9b, 0x0d, 0xef, 0xc6, 0x91, 0x7f, 0xb8, + 0x24, 0xb2, 0x78, 0xc7, 0x96, 0xba, 0x01, 0x32, 0x23, 0xd1, 0xe1, 0xe3, + 0x54, 0x9a, 0xfa, 0xfb, 0xac, 0xa9, 0x56, 0xdd, 0x5d, 0x60, 0x54, 0x3c, + 0x75, 0x80, 0xa5, 0xbf, 0x89, 0xa8, 0xa4, 0xb9, 0xf4, 0x0d, 0xde, 0x92, + 0xee, 0x9a, 0x01, 0x8d, 0x82, 0x65, 0xf0, 0xab, 0x16, 0x4f, 0x8a, 0xf6, + 0xf7, 0xa4, 0x06, 0x97, 0x9d, 0x3e, 0xbd, 0xa0, 0x31, 0x75, 0x02, 0x81, + 0xc0, 0x1a, 0xe3, 0x9b, 0x6f, 0x99, 0xbd, 0x5c, 0xa2, 0xcf, 0xb8, 0xbc, + 0xe1, 0x83, 0xbc, 0x7d, 0xbb, 0x61, 0x8e, 0xa6, 0xfc, 0x3f, 0x08, 0x80, + 0xb4, 0xf8, 0x72, 0x72, 0xc0, 0x61, 0x66, 0xf9, 0x2a, 0x92, 0x7d, 0x74, + 0x59, 0x4f, 0x28, 0x7a, 0xf3, 0xf3, 0x5b, 0x01, 0xcb, 0x71, 0x2c, 0x83, + 0xfc, 0x75, 0xfb, 0x64, 0xc4, 0x21, 0x83, 0x3d, 0xb2, 0x8f, 0x15, 0x77, + 0xfb, 0xa1, 0xf1, 0x89, 0x2e, 0x71, 0x44, 0xec, 0x95, 0x6f, 0x80, 0x6d, + 0x27, 0x51, 0x7d, 0xa7, 0x94, 0x78, 0x59, 0xcc, 0xc3, 0x6e, 0xed, 0x36, + 0xff, 0xa6, 0xe2, 0xdd, 0xe1, 0x7a, 0x74, 0x17, 0x61, 0xcb, 0x0c, 0xec, + 0x12, 0x81, 0xc7, 0xe0, 0x1c, 0x43, 0x01, 0x8c, 0xed, 0x70, 0x87, 0xe4, + 0xee, 0x32, 0x00, 0x22, 0x39, 0x8c, 0x44, 0x7a, 0xf4, 0x47, 0xa4, 0x49, + 0x2a, 0x31, 0xc7, 0xe6, 0x28, 0xd0, 0xf3, 0x0e, 0xb1, 0x94, 0xf1, 0x8f, + 0xb1, 0xff, 0xba, 0x55, 0x16, 0x2c, 0x4c, 0xd7, 0x81, 0xe1, 0x4d, 0xd9, + 0x02, 0x6b, 0x0d, 0xe4, 0x31, 0xfd, 0xae, 0x54, 0x74, 0x3f, 0x31, 0x05, + 0x21, 0xa9, 0xf4, 0x42, 0x90, 0xf6, 0x62, 0x58, 0x30, 0x75, 0x34, 0x6e, + 0x26, 0x30, 0xd4, 0x7e, 0x5e, 0x3b, 0xff, 0x22, 0xd4, 0xf8, 0x73, 0xe9, + 0xf0, 0x62, 0x4c, 0x89, 0xf4, 0x53, 0xcb, 0xb3, 0x95, 0xa4, 0xa6, 0x83, + 0x4d, 0x02, 0x81, 0xc1, 0x00, 0xf0, 0x0f, 0xf2, 0x41, 0x51, 0x00, 0xb8, + 0x7d, 0x23, 0xfd, 0xeb, 0xb4, 0xe2, 0x18, 0x20, 0x09, 0x37, 0x77, 0x44, + 0xe3, 0x4b, 0x88, 0xac, 0xab, 0x39, 0x28, 0x9b, 0x50, 0x57, 0xc8, 0x16, + 0xf3, 0xeb, 0x5f, 0x7f, 0xc5, 0x3a, 0x53, 0x70, 0x11, 0x37, 0x6c, 0x50, + 0xc3, 0xc4, 0x13, 0x26, 0x56, 0x31, 0x63, 0x7b, 0x34, 0xd2, 0xde, 0x40, + 0x15, 0xaa, 0xf8, 0x27, 0x5b, 0x79, 0x5b, 0xeb, 0x2c, 0xb0, 0x6d, 0x50, + 0x84, 0x86, 0x75, 0xff, 0x4a, 0x8c, 0x19, 0xa4, 0x1a, 0x54, 0xca, 0x7c, + 0xc7, 0xe5, 0x86, 0xc0, 0xd7, 0xf7, 0xf8, 0xfb, 0x01, 0xf3, 0x30, 0x10, + 0xd6, 0x74, 0x24, 0x64, 0x9f, 0x95, 0x94, 0x25, 0xc9, 0x2c, 0x04, 0x19, + 0x84, 0xea, 0xcc, 0xe9, 0x3e, 0x10, 0x2f, 0xd9, 0x33, 0xf9, 0x4d, 0x08, + 0x55, 0x98, 0xe6, 0x39, 0xfe, 0x27, 0x11, 0x07, 0xb3, 0xb8, 0x66, 0x88, + 0x0a, 0xde, 0x1f, 0x2c, 0x90, 0xbf, 0xc8, 0x44, 0xac, 0xc4, 0xbe, 0x30, + 0x82, 0xa7, 0x5e, 0x11, 0xa0, 0xe7, 0xbd, 0x21, 0xa9, 0x18, 0xf4, 0xe1, + 0x9f, 0x4d, 0x9f, 0x43, 0xd5, 0x2b, 0xe5, 0xdd, 0x96, 0xa4, 0x5c, 0xdc, + 0x28, 0x9b, 0x9e, 0xd9, 0x0d, 0x04, 0xb6, 0x82, 0xe3, 0x75, 0xd1, 0xbb, + 0x4d, 0x2b, 0x49, 0x21, 0xb7, 0x8a, 0x7b, 0x47, 0x81, 0x57, 0x5a, 0x1e, + 0x09, 0xdc, 0xe8, 0xe5, 0x29 +}; +extern const size_t kOEMPrivateKeySize_Dev = 1793; + +extern const uint8_t kOEMPublicCert_Dev[] = { + 0x30, 0x82, 0x09, 0xff, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x07, 0x02, 0xa0, 0x82, 0x09, 0xf0, 0x30, 0x82, 0x09, 0xec, 0x02, + 0x01, 0x01, 0x31, 0x00, 0x30, 0x0f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x02, 0x04, 0x00, 0xa0, 0x82, 0x09, + 0xd0, 0x30, 0x82, 0x04, 0x20, 0x30, 0x82, 0x03, 0x08, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x10, 0x72, 0xa8, 0x0e, 0x1d, 0x3e, 0x4c, 0xec, 0x0c, + 0x57, 0xd8, 0xae, 0xf1, 0xe9, 0x43, 0xda, 0x2b, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, + 0x81, 0x8e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, + 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, + 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, + 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, + 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, + 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, + 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x33, 0x30, 0x31, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x20, 0x4f, 0x45, 0x4d, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x3b, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x20, 0x69, 0x64, 0x3a, 0x20, 0x32, 0x30, 0x30, 0x31, 0x30, 0x39, 0x33, + 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x33, 0x31, 0x37, 0x31, 0x31, + 0x30, 0x38, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x33, 0x31, + 0x35, 0x31, 0x31, 0x30, 0x38, 0x30, 0x36, 0x5a, 0x30, 0x70, 0x31, 0x15, + 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x32, 0x30, 0x30, + 0x31, 0x30, 0x39, 0x33, 0x2d, 0x6c, 0x65, 0x61, 0x66, 0x31, 0x0b, 0x30, + 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, + 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, + 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, + 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, + 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, + 0x6e, 0x65, 0x30, 0x82, 0x01, 0xa2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x8f, 0x00, 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xda, + 0x30, 0x9c, 0xd2, 0xd9, 0xdb, 0xb7, 0x25, 0x86, 0xdc, 0x99, 0x87, 0x91, + 0x40, 0xca, 0x02, 0x76, 0xc4, 0xc6, 0x00, 0xcb, 0x60, 0x8c, 0xb2, 0x01, + 0xde, 0x9d, 0x44, 0x4c, 0x72, 0x42, 0xc2, 0xf1, 0x96, 0x13, 0xa2, 0x15, + 0xb2, 0x9c, 0x09, 0x11, 0x73, 0x96, 0x4e, 0xd3, 0xda, 0xb4, 0xaf, 0xd5, + 0x69, 0x69, 0xd9, 0xbe, 0x19, 0x5e, 0x49, 0x21, 0x01, 0xf7, 0x31, 0xdd, + 0x14, 0xea, 0x41, 0x5e, 0x81, 0xc5, 0x76, 0xff, 0x50, 0xba, 0xa7, 0x0b, + 0x81, 0x22, 0xba, 0x2b, 0x58, 0x7b, 0x5d, 0xb3, 0xaf, 0xd1, 0xb4, 0x66, + 0x8e, 0x70, 0x55, 0xd8, 0x4d, 0x47, 0xb7, 0x00, 0x2c, 0x52, 0x46, 0x33, + 0xa1, 0x5f, 0xca, 0xd8, 0xb1, 0xc5, 0x04, 0x0e, 0xb7, 0xd8, 0x0a, 0xca, + 0x7c, 0x2a, 0x11, 0x3d, 0xec, 0x7f, 0x4c, 0xea, 0xaa, 0x8e, 0x1d, 0xef, + 0x9e, 0x2b, 0x9e, 0x79, 0x09, 0x7e, 0xf4, 0xd0, 0xa3, 0x58, 0xb5, 0x4e, + 0x1c, 0xfb, 0x07, 0x17, 0xc4, 0xef, 0x30, 0xa3, 0x91, 0xb6, 0x5f, 0xf8, + 0xdb, 0x05, 0x73, 0x85, 0x9b, 0xe1, 0x16, 0xf1, 0x8e, 0xe4, 0x9f, 0xe7, + 0x54, 0xcf, 0x52, 0x84, 0xe7, 0x71, 0xe7, 0x38, 0x67, 0x8e, 0x96, 0x59, + 0x9b, 0x97, 0xa2, 0xc0, 0x01, 0xd5, 0x41, 0x36, 0xfa, 0xc1, 0x61, 0x96, + 0x6c, 0x38, 0x7d, 0xdd, 0x1c, 0x24, 0x2e, 0x57, 0x67, 0x7c, 0x70, 0xd1, + 0x8a, 0x8a, 0xe2, 0x6f, 0x66, 0xd2, 0xaa, 0x3e, 0xfa, 0x4c, 0x4a, 0x68, + 0xba, 0x86, 0x6e, 0x33, 0xfe, 0x30, 0xd2, 0xf4, 0x96, 0x58, 0xe2, 0x35, + 0x94, 0x4f, 0x11, 0xc7, 0x0a, 0x21, 0xe5, 0xd4, 0x1a, 0x3c, 0xfd, 0x82, + 0xbb, 0x34, 0x21, 0xdb, 0x2f, 0xd8, 0xd1, 0xbe, 0x38, 0xe8, 0x47, 0x45, + 0x04, 0x27, 0xb0, 0x19, 0x65, 0x6f, 0x55, 0xcd, 0x56, 0x3a, 0xcc, 0xc1, + 0xaf, 0xce, 0x59, 0x2e, 0xe6, 0x89, 0x24, 0x48, 0x94, 0xc8, 0x73, 0x45, + 0xc8, 0xe5, 0x1d, 0xe1, 0xf8, 0x7d, 0x88, 0xe5, 0x07, 0x42, 0xb2, 0x80, + 0x17, 0xf6, 0x67, 0x2a, 0x33, 0xa0, 0xca, 0x81, 0x0e, 0xc4, 0x99, 0x93, + 0x02, 0x8c, 0x90, 0x1d, 0x46, 0xad, 0x61, 0xec, 0xca, 0xdd, 0x8e, 0x8b, + 0x9f, 0x32, 0xab, 0xbf, 0xfa, 0xa6, 0x28, 0xda, 0x63, 0xa2, 0xf0, 0x20, + 0x52, 0x26, 0x06, 0x05, 0x59, 0xe1, 0x4a, 0x8d, 0x5e, 0x6a, 0x65, 0xd8, + 0x8e, 0x6e, 0x49, 0xa4, 0xa8, 0xc0, 0xba, 0x7b, 0x21, 0x31, 0x7a, 0xd1, + 0xb5, 0x46, 0x9e, 0xa5, 0x45, 0xeb, 0xdf, 0x38, 0xc4, 0x1e, 0x10, 0xc6, + 0xb6, 0x83, 0x46, 0x96, 0x63, 0xe5, 0xef, 0x7c, 0xdb, 0x65, 0x3e, 0xec, + 0x42, 0x00, 0x71, 0x78, 0x83, 0xfc, 0x73, 0x4f, 0x4e, 0xb9, 0x01, 0x80, + 0xd4, 0x7d, 0xf2, 0x72, 0x8d, 0x41, 0x7b, 0xee, 0xb5, 0xca, 0xf7, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x17, 0x30, 0x15, 0x30, 0x13, 0x06, 0x0a, + 0x2b, 0x06, 0x01, 0x04, 0x01, 0xd6, 0x79, 0x04, 0x01, 0x01, 0x04, 0x05, + 0x02, 0x03, 0x1e, 0x88, 0xc5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, + 0x00, 0x17, 0x78, 0x3e, 0x21, 0x3a, 0x55, 0x67, 0xdc, 0xa6, 0x41, 0x46, + 0xcd, 0x41, 0x8f, 0x4d, 0x0c, 0x5f, 0xaa, 0x4c, 0x6d, 0xcc, 0xa1, 0xed, + 0x69, 0x9a, 0x59, 0xa0, 0xc1, 0x10, 0x9e, 0x96, 0x2b, 0x2f, 0x36, 0xfb, + 0x82, 0xc9, 0x5f, 0x71, 0x76, 0x00, 0x38, 0x8f, 0x32, 0xed, 0xec, 0x41, + 0x4a, 0x3b, 0x4e, 0x3b, 0x2f, 0xf9, 0x1e, 0x04, 0xdc, 0xc0, 0x14, 0x55, + 0xec, 0xdb, 0xba, 0x50, 0x6f, 0x0e, 0xc1, 0xec, 0xde, 0x5e, 0xf4, 0xa0, + 0x58, 0x9e, 0x41, 0x72, 0xbc, 0xb2, 0x1f, 0xb5, 0x7e, 0xc0, 0xa8, 0xb2, + 0xf4, 0xe5, 0xe6, 0x67, 0x99, 0x6b, 0x90, 0xbe, 0xd8, 0x14, 0x7a, 0x9a, + 0xbf, 0x7d, 0x3d, 0xdf, 0xfb, 0xb3, 0x88, 0x3e, 0x62, 0x1f, 0xef, 0xd0, + 0xc7, 0xb3, 0xfe, 0xde, 0x4e, 0x85, 0x15, 0xca, 0xaf, 0x39, 0xc8, 0x5c, + 0x47, 0x54, 0x48, 0x38, 0x97, 0x6c, 0x8c, 0x98, 0x55, 0x22, 0x43, 0x45, + 0xf9, 0xb5, 0x6c, 0x84, 0x32, 0xcb, 0x01, 0x1c, 0x3e, 0x94, 0xb1, 0x57, + 0x47, 0x8b, 0xcd, 0x26, 0x78, 0xa2, 0x5f, 0x88, 0x24, 0xb3, 0x2b, 0xb4, + 0x4d, 0x04, 0xb2, 0xbc, 0x84, 0x3e, 0x95, 0x41, 0xd7, 0x6a, 0x0d, 0x11, + 0x26, 0x96, 0x99, 0x14, 0xd8, 0x2c, 0x9a, 0xdb, 0x92, 0x95, 0xe5, 0x92, + 0x07, 0x55, 0xf6, 0x1b, 0x8c, 0x55, 0x87, 0x58, 0xe0, 0xd1, 0x39, 0xf3, + 0x91, 0x41, 0x32, 0x83, 0x0d, 0x06, 0x97, 0x28, 0x7d, 0x3b, 0x4d, 0x8d, + 0x26, 0xb4, 0x8c, 0x9b, 0x0a, 0xd2, 0x09, 0x8d, 0xd2, 0xa9, 0xbc, 0x54, + 0xad, 0xb4, 0x7a, 0x6c, 0xa4, 0xd4, 0x26, 0xea, 0xc7, 0xf1, 0x56, 0x9e, + 0xd6, 0xe0, 0xae, 0xc9, 0x40, 0x6f, 0x22, 0x23, 0x36, 0xaa, 0xb4, 0x01, + 0x65, 0xc6, 0x22, 0x65, 0x4e, 0x07, 0xf0, 0xd6, 0xe6, 0xb4, 0xa1, 0xb3, + 0xd6, 0x69, 0xeb, 0xd9, 0x26, 0x30, 0x82, 0x05, 0xa8, 0x30, 0x82, 0x03, + 0x90, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0xe5, 0xc7, 0xfc, + 0x08, 0x78, 0xc3, 0x6d, 0x1d, 0xec, 0xff, 0x0b, 0xe7, 0xb2, 0xca, 0xb1, + 0x89, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x0b, 0x05, 0x00, 0x30, 0x7d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, + 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, + 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, + 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, + 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, + 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, + 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, + 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x19, 0x77, 0x69, + 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, + 0x65, 0x6d, 0x2d, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x64, 0x65, 0x76, 0x30, + 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x33, 0x31, 0x37, 0x30, 0x30, 0x35, + 0x37, 0x32, 0x34, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x33, 0x31, 0x35, + 0x30, 0x30, 0x35, 0x37, 0x32, 0x34, 0x5a, 0x30, 0x81, 0x8e, 0x31, 0x0b, + 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, + 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, + 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, + 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, + 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, + 0x69, 0x6e, 0x65, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x2a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x4f, 0x45, 0x4d, + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x3b, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x64, 0x3a, + 0x20, 0x32, 0x30, 0x30, 0x31, 0x30, 0x39, 0x33, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x45, 0x13, 0xf2, 0xb2, 0xcb, 0x4b, + 0x0f, 0xb4, 0x44, 0x25, 0x9c, 0x8a, 0x68, 0x54, 0xd5, 0x45, 0x1e, 0x15, + 0x89, 0x5b, 0xb8, 0xce, 0xda, 0x5a, 0x42, 0xe6, 0x9a, 0x8c, 0xc1, 0xcb, + 0xe8, 0xc5, 0xf5, 0x8f, 0x49, 0x0e, 0x02, 0xef, 0x5e, 0x97, 0x1a, 0x91, + 0xa4, 0x94, 0xc3, 0x50, 0x13, 0xe5, 0x13, 0xb7, 0x7f, 0x26, 0x53, 0x19, + 0xb0, 0x37, 0xa5, 0xef, 0xe6, 0x2a, 0x39, 0xdc, 0x93, 0x37, 0xe2, 0x3d, + 0x7f, 0xcb, 0x4b, 0x93, 0xa2, 0xc3, 0x69, 0x78, 0xc9, 0x01, 0xfa, 0x68, + 0x3b, 0xe0, 0xe2, 0x22, 0x6c, 0xeb, 0xe4, 0x8a, 0xa8, 0x3e, 0xf5, 0x20, + 0x82, 0xa8, 0x62, 0x68, 0x59, 0x78, 0x24, 0xde, 0xef, 0x47, 0x43, 0xb1, + 0x6c, 0x38, 0x29, 0xd3, 0x69, 0x3f, 0xae, 0x35, 0x57, 0x75, 0x80, 0xc9, + 0x21, 0xe7, 0x01, 0xb9, 0x54, 0x8b, 0x6e, 0x4e, 0x2e, 0x5a, 0x5b, 0x77, + 0xa4, 0x22, 0xc2, 0x7b, 0x95, 0xb9, 0x39, 0x2c, 0xbd, 0xc2, 0x1e, 0x02, + 0xa6, 0xb2, 0xbc, 0x0f, 0x7a, 0xcb, 0xdc, 0xbc, 0xbc, 0x90, 0x66, 0xe3, + 0xca, 0x46, 0x53, 0x3e, 0x98, 0xff, 0x2e, 0x78, 0x9f, 0xd3, 0xa1, 0x12, + 0x93, 0x66, 0x7d, 0xcc, 0x94, 0x6b, 0xec, 0x19, 0x0e, 0x20, 0x45, 0x22, + 0x57, 0x6d, 0x9e, 0xd0, 0x89, 0xf2, 0xa9, 0x34, 0xdc, 0xab, 0xa5, 0x73, + 0x47, 0x38, 0xe3, 0x7f, 0x98, 0x3a, 0x61, 0xae, 0x6c, 0x4d, 0xf2, 0x31, + 0x90, 0xcb, 0x83, 0xc1, 0xee, 0xb4, 0xf2, 0x9a, 0x28, 0x5f, 0xbb, 0x7d, + 0x89, 0xdf, 0xa2, 0x31, 0xb6, 0x1d, 0x39, 0x2b, 0x70, 0xbf, 0x1e, 0xad, + 0xe1, 0x74, 0x94, 0x1d, 0xf8, 0xc5, 0x1a, 0x8d, 0x13, 0x45, 0xf0, 0x6a, + 0x80, 0x0c, 0x5d, 0xbb, 0x46, 0x8a, 0x43, 0xd0, 0xff, 0x21, 0x39, 0x57, + 0x53, 0x5b, 0x51, 0xf8, 0xa2, 0x8f, 0x7f, 0x27, 0xc7, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x82, 0x01, 0x0f, 0x30, 0x82, 0x01, 0x0b, 0x30, 0x12, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, + 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, + 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe8, 0xe9, 0xac, + 0x16, 0x5c, 0x5e, 0xb2, 0xe8, 0xeb, 0xff, 0x57, 0x27, 0x20, 0x08, 0x72, + 0x63, 0x9b, 0xe5, 0xb5, 0x16, 0x30, 0x81, 0xb0, 0x06, 0x03, 0x55, 0x1d, + 0x23, 0x04, 0x81, 0xa8, 0x30, 0x81, 0xa5, 0x80, 0x14, 0x7e, 0x03, 0xe5, + 0x06, 0x62, 0x3b, 0x2c, 0x21, 0xa5, 0x52, 0xa1, 0xe8, 0xee, 0x2c, 0xd2, + 0x52, 0xe4, 0xf6, 0xbb, 0x6e, 0xa1, 0x81, 0x81, 0xa4, 0x7f, 0x30, 0x7d, + 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, + 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, + 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, + 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, + 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, + 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x19, 0x77, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x65, 0x6d, 0x2d, 0x72, 0x6f, 0x6f, + 0x74, 0x2d, 0x64, 0x65, 0x76, 0x82, 0x09, 0x00, 0x95, 0xd7, 0xb5, 0xfc, + 0xcf, 0x8e, 0xcb, 0x51, 0x30, 0x13, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, + 0x01, 0xd6, 0x79, 0x04, 0x01, 0x01, 0x04, 0x05, 0x02, 0x03, 0x1e, 0x88, + 0xc5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x73, 0x48, 0x8c, + 0x6f, 0x11, 0xfe, 0x4b, 0x27, 0xca, 0xdd, 0x57, 0xfe, 0xcb, 0x27, 0xca, + 0xaf, 0x1c, 0x78, 0x4c, 0x95, 0x16, 0x2a, 0x11, 0x28, 0x9e, 0x2e, 0x93, + 0xa5, 0x1f, 0x3f, 0x80, 0x8d, 0x44, 0xc6, 0xaa, 0x12, 0x25, 0x6c, 0x6c, + 0xe3, 0xa7, 0x6d, 0xa3, 0xe1, 0xf5, 0x6a, 0x69, 0xb1, 0x18, 0x89, 0x0e, + 0x61, 0x4a, 0xa5, 0x5c, 0x0b, 0xf8, 0x7d, 0x2d, 0x8e, 0xbc, 0xf4, 0x2e, + 0x61, 0xa6, 0xf9, 0x32, 0xf8, 0x47, 0x8b, 0xf5, 0x3d, 0xd9, 0xb7, 0x3b, + 0x7d, 0xc6, 0xe5, 0x14, 0x8f, 0xeb, 0x72, 0x9e, 0x2b, 0xfc, 0x12, 0xef, + 0xa1, 0x26, 0xce, 0xad, 0xd5, 0x5c, 0x74, 0x50, 0x76, 0xf4, 0xd1, 0xac, + 0xdd, 0x09, 0x37, 0xde, 0xa8, 0xcd, 0x0b, 0x35, 0x89, 0x19, 0x66, 0xce, + 0x6b, 0x79, 0x1a, 0x86, 0x12, 0x7e, 0x60, 0xb4, 0x1c, 0x86, 0x34, 0x39, + 0xe5, 0x88, 0x55, 0x2b, 0x28, 0xd1, 0x7c, 0x11, 0x23, 0xa6, 0xef, 0x24, + 0xcb, 0x3b, 0xd2, 0x07, 0xe2, 0x54, 0x88, 0x41, 0xdc, 0x16, 0x16, 0x74, + 0x8a, 0x81, 0x2b, 0x53, 0x42, 0x17, 0xef, 0x87, 0xdd, 0x27, 0x8c, 0x23, + 0xcd, 0x2d, 0x2d, 0xde, 0x9c, 0x1a, 0x0e, 0xda, 0xd2, 0xbe, 0xb0, 0x8d, + 0x9d, 0x2b, 0x46, 0x54, 0x97, 0x8d, 0x24, 0x4f, 0x3e, 0x92, 0x25, 0xf6, + 0x04, 0xb7, 0x69, 0x5d, 0x1c, 0x80, 0x0e, 0x30, 0x9b, 0x37, 0xc6, 0xc1, + 0x6b, 0x1a, 0xda, 0xfe, 0x10, 0xcd, 0x0d, 0xa7, 0x56, 0xa0, 0x31, 0x97, + 0xe6, 0xa1, 0xb5, 0x6f, 0x40, 0x1a, 0xcc, 0x01, 0x52, 0xbc, 0x72, 0xfd, + 0x0a, 0x83, 0x8a, 0x2a, 0xea, 0xad, 0xc5, 0x1e, 0x12, 0x56, 0x23, 0x52, + 0xca, 0x35, 0xdb, 0xef, 0x45, 0x8c, 0x31, 0xa3, 0x1f, 0xe2, 0xb5, 0x9c, + 0xfe, 0xb8, 0x44, 0x3a, 0x09, 0xe1, 0x9e, 0x32, 0x2f, 0x7f, 0xac, 0x70, + 0x80, 0xc4, 0xa7, 0x29, 0x02, 0xad, 0xeb, 0xbd, 0x5d, 0x92, 0xbc, 0x85, + 0x6c, 0x10, 0x9b, 0x5f, 0x07, 0xfc, 0x94, 0x4d, 0xff, 0xa6, 0x37, 0x87, + 0x9e, 0x50, 0x33, 0x66, 0x29, 0xfd, 0x51, 0x62, 0x45, 0x5c, 0x45, 0x75, + 0xcd, 0xf1, 0x9b, 0x42, 0x0d, 0xa7, 0xe9, 0x91, 0xd6, 0x7c, 0x23, 0x5b, + 0xa1, 0xe8, 0x7b, 0xaf, 0xba, 0x75, 0x13, 0x24, 0x6e, 0x12, 0xf5, 0x44, + 0x29, 0x75, 0x22, 0xdc, 0xe5, 0xfa, 0xa6, 0x25, 0xa2, 0x76, 0x45, 0xf7, + 0xf9, 0x96, 0x73, 0x22, 0xd1, 0xf1, 0xe8, 0xd5, 0xa3, 0x46, 0x7f, 0x72, + 0x2c, 0x26, 0x61, 0x68, 0x89, 0xc9, 0x0a, 0xc5, 0x20, 0x78, 0x5b, 0xaa, + 0x59, 0x8d, 0x3e, 0x26, 0x75, 0x3b, 0x12, 0xba, 0xae, 0x5a, 0x42, 0x78, + 0x3f, 0xd7, 0xb2, 0x7f, 0x49, 0x68, 0xa3, 0xc8, 0xaa, 0xdb, 0xc4, 0x41, + 0x89, 0x9a, 0x12, 0xa4, 0x1c, 0x87, 0x25, 0x5c, 0x97, 0x33, 0x92, 0xd8, + 0x5f, 0x83, 0x2d, 0x47, 0x71, 0x86, 0x91, 0xbc, 0x36, 0x95, 0xb2, 0x72, + 0x4a, 0x9c, 0x67, 0xad, 0x76, 0x26, 0xda, 0x0b, 0x68, 0x49, 0x04, 0x29, + 0x0a, 0x4a, 0xa4, 0x9a, 0x8f, 0xd9, 0xfb, 0x39, 0xdc, 0x38, 0xa1, 0xf4, + 0x00, 0x6f, 0x6f, 0x9e, 0x99, 0x03, 0x7c, 0x8c, 0xc5, 0x3f, 0xfc, 0x63, + 0x9a, 0x4e, 0xd8, 0x21, 0x05, 0xd2, 0x2d, 0x9e, 0x07, 0xdf, 0xf6, 0x20, + 0xb8, 0xe7, 0xc2, 0x40, 0x49, 0x69, 0x76, 0xf9, 0xff, 0xeb, 0xb8, 0x27, + 0x94, 0x72, 0x37, 0x63, 0x8d, 0x3a, 0x2d, 0x4f, 0x57, 0x11, 0x5f, 0x3c, + 0x62, 0xa5, 0x39, 0x4d, 0x01, 0x3f, 0x58, 0xbf, 0x59, 0xb3, 0xd9, 0xa2, + 0xd7, 0x3a, 0xdd, 0x2a, 0x65, 0x97, 0x9b, 0xa7, 0x6d, 0xc0, 0x6b, 0x4a, + 0x46, 0xfe, 0x55, 0x46, 0x27, 0x75, 0x2c, 0x0a, 0x8b, 0xc4, 0xf9, 0x1e, + 0x20, 0x5a, 0xbf, 0xf7, 0x88, 0x31, 0x00 +}; +extern const size_t kOEMPublicCertSize_Dev = 2563; + +// Refer to the following in main modules +#if defined(DEV_OEM_CERTS) +const uint32_t kOEMSystemId = kOEMSystemId_Dev; + +const uint8_t* kOEMPrivateKey = kOEMPrivateKey_Dev; +const uint8_t* kOEMPublicCert = kOEMPublicCert_Dev; + +const size_t kOEMPrivateKeySize = kOEMPrivateKeySize_Dev; +const size_t kOEMPublicCertSize = kOEMPublicCertSize_Dev; +#else +const uint32_t kOEMSystemId = kOEMSystemId_Prod; + +const uint8_t* kOEMPrivateKey = kOEMPrivateKey_Prod; +const uint8_t* kOEMPublicCert = kOEMPublicCert_Prod; + +const size_t kOEMPrivateKeySize = kOEMPrivateKeySize_Prod; +const size_t kOEMPublicCertSize = kOEMPublicCertSize_Prod; +#endif // !defined(DEV_OEM_CERTS) + + +} // namespace wvoec_mock diff --git a/libwvdrmengine/oemcrypto/mock/src/oem_cert.h b/libwvdrmengine/oemcrypto/mock/src/oem_cert.h index db85d5ab..70b522ff 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oem_cert.h +++ b/libwvdrmengine/oemcrypto/mock/src/oem_cert.h @@ -5,767 +5,17 @@ #include #include -namespace { -const uint32_t kOEMSystemId_UAT = 7346; - -const uint8_t kOEMPrivateKey_UAT[] = { - 0x30, 0x82, 0x06, 0xfe, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, - 0x06, 0xe8, 0x30, 0x82, 0x06, 0xe4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, - 0x81, 0x00, 0xf5, 0x09, 0x64, 0x4a, 0x26, 0xfe, 0xc0, 0x98, 0x55, 0x6a, - 0x1d, 0x5d, 0x1c, 0xc7, 0x38, 0xaf, 0xfd, 0x49, 0x9e, 0x85, 0x3f, 0xd6, - 0x45, 0x0e, 0x99, 0x09, 0x85, 0x69, 0x84, 0x3c, 0xfe, 0x72, 0xa5, 0x56, - 0xfa, 0x11, 0x4f, 0x6b, 0x7d, 0x32, 0x2b, 0x0c, 0xbf, 0x8f, 0xac, 0x47, - 0x96, 0x22, 0x82, 0x3d, 0xf5, 0x64, 0x74, 0x7e, 0x62, 0x68, 0x74, 0xcd, - 0x0a, 0xec, 0x84, 0xc5, 0x15, 0x06, 0x0e, 0x5a, 0x2f, 0x20, 0xe3, 0xc9, - 0x67, 0xcd, 0xdd, 0x01, 0xb8, 0xb3, 0x18, 0x87, 0x8c, 0xa9, 0x58, 0x86, - 0x0f, 0xb6, 0xc3, 0x42, 0x7e, 0x87, 0x48, 0x5e, 0x10, 0x49, 0xc7, 0xd7, - 0xb7, 0xb8, 0xa6, 0x34, 0x08, 0x0c, 0x94, 0xf4, 0xbb, 0x2a, 0x06, 0xa4, - 0x4f, 0xec, 0xbc, 0xc4, 0x37, 0xbe, 0x99, 0x10, 0x23, 0x37, 0x24, 0xb1, - 0xdf, 0xcb, 0xe6, 0x3f, 0xc1, 0xf0, 0x0f, 0x04, 0x03, 0xc8, 0xb0, 0x1e, - 0xd6, 0xb8, 0xae, 0x77, 0xe1, 0x4d, 0x6d, 0x97, 0x69, 0x6d, 0x8a, 0x73, - 0x66, 0x32, 0x57, 0x6f, 0xcf, 0xea, 0x1e, 0x7b, 0x87, 0x03, 0x75, 0xb1, - 0xef, 0x83, 0x64, 0x26, 0xf1, 0x3f, 0xbf, 0xe6, 0x28, 0x03, 0x72, 0x57, - 0xbf, 0x47, 0x29, 0x99, 0x8f, 0x74, 0x1d, 0x01, 0x16, 0xad, 0xb2, 0xdf, - 0x80, 0xa4, 0xd3, 0x8b, 0xeb, 0x61, 0xd1, 0x40, 0x68, 0xb9, 0xa2, 0xa5, - 0xef, 0x2b, 0xe5, 0x78, 0xe8, 0x28, 0x88, 0x87, 0xb7, 0x53, 0x49, 0xbb, - 0xe4, 0xea, 0x0d, 0x5e, 0x96, 0xa5, 0xdd, 0x1f, 0x0b, 0x25, 0x8b, 0xb5, - 0x95, 0x46, 0xe7, 0xba, 0xb8, 0xc4, 0x0a, 0x36, 0xb1, 0x89, 0xeb, 0x27, - 0x5d, 0xd9, 0x97, 0x24, 0x59, 0xa3, 0x9b, 0xb0, 0x23, 0x0b, 0xd2, 0xec, - 0x65, 0x91, 0xf9, 0xf0, 0xa0, 0x74, 0x5f, 0xb4, 0xce, 0x22, 0x27, 0x18, - 0x37, 0xe2, 0x4b, 0xfc, 0x91, 0xf9, 0x09, 0x15, 0xe6, 0xdb, 0x06, 0x9b, - 0x4d, 0x82, 0xdc, 0x36, 0x14, 0x48, 0xc6, 0xd5, 0x87, 0xca, 0xec, 0x5a, - 0xa2, 0x29, 0x33, 0xef, 0x22, 0x0c, 0x4b, 0xbf, 0xe7, 0x2f, 0x95, 0xe1, - 0xd3, 0xa5, 0xd8, 0xaa, 0x44, 0x77, 0x29, 0xa3, 0x20, 0x33, 0xd2, 0x51, - 0xa2, 0xf9, 0x4a, 0x6f, 0xf7, 0x3e, 0xf7, 0x0b, 0x8a, 0xec, 0xc1, 0x99, - 0x1d, 0x47, 0xf3, 0x74, 0x02, 0x04, 0xab, 0x8e, 0x62, 0x4c, 0x9e, 0x00, - 0xc2, 0x84, 0xd7, 0xd0, 0xf8, 0xe4, 0x1c, 0x9d, 0x98, 0x15, 0xa8, 0x8f, - 0x08, 0x98, 0x4e, 0x5a, 0xfa, 0xd6, 0x60, 0x87, 0x12, 0xdc, 0x8e, 0xfd, - 0xcb, 0xb3, 0x13, 0x97, 0x7a, 0xa8, 0x8c, 0x56, 0x2e, 0x49, 0x26, 0x60, - 0xe9, 0x4a, 0xdc, 0xec, 0x3f, 0xf0, 0x94, 0xcd, 0x90, 0x8e, 0x7c, 0x21, - 0x3f, 0x80, 0x14, 0x33, 0xdd, 0xb0, 0x00, 0xe2, 0x09, 0x37, 0x06, 0xdd, - 0x17, 0x69, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x81, 0x00, - 0xa1, 0xc9, 0x44, 0xad, 0x6d, 0x17, 0xd1, 0x04, 0x03, 0x89, 0x5f, 0xbf, - 0xe5, 0xcb, 0x68, 0x13, 0x52, 0xf2, 0x33, 0xb7, 0x19, 0x12, 0x19, 0x60, - 0x6d, 0x0d, 0x0b, 0x48, 0x42, 0xe6, 0x9e, 0xbe, 0x05, 0x8a, 0xea, 0xeb, - 0x58, 0xfb, 0xc8, 0x9a, 0xc2, 0x2f, 0xd5, 0x9f, 0x40, 0x09, 0xb8, 0x08, - 0x2a, 0xe4, 0x4b, 0xcc, 0xba, 0xd9, 0xe3, 0x91, 0xc2, 0x64, 0xcb, 0x6c, - 0xa4, 0xb1, 0x17, 0x93, 0x7b, 0x10, 0x72, 0x83, 0x8d, 0xc2, 0xa2, 0x46, - 0x1b, 0x41, 0x12, 0xb9, 0x35, 0x5d, 0xf2, 0x32, 0xb1, 0xdf, 0x3a, 0x2a, - 0xda, 0xbb, 0x61, 0x9d, 0x62, 0xdb, 0xb0, 0x77, 0x76, 0x7a, 0x68, 0xb4, - 0x83, 0x10, 0x61, 0xac, 0x25, 0x01, 0x7d, 0x3e, 0x5f, 0x4a, 0x47, 0xf7, - 0x30, 0x1f, 0x82, 0x0a, 0xd7, 0x36, 0xff, 0x79, 0x5e, 0x42, 0x0f, 0x58, - 0xaa, 0x3a, 0xb8, 0x8b, 0x0e, 0xef, 0x00, 0xac, 0x96, 0x14, 0x96, 0x83, - 0x33, 0xb6, 0xb5, 0x4c, 0x91, 0x2a, 0x62, 0x92, 0xcf, 0xd2, 0x27, 0xcc, - 0xdf, 0x4c, 0x55, 0x03, 0xe8, 0x82, 0x78, 0xff, 0x80, 0xcb, 0x2e, 0x30, - 0x1b, 0x85, 0x56, 0xce, 0x57, 0x9e, 0xd8, 0x16, 0x86, 0x7d, 0x87, 0x2e, - 0xae, 0x39, 0xd4, 0xac, 0xbe, 0xa5, 0xc4, 0x5a, 0x85, 0x7a, 0xea, 0x8e, - 0x69, 0x9a, 0xbd, 0x9c, 0x45, 0x33, 0xf8, 0xb1, 0x70, 0xc1, 0x8c, 0xaa, - 0xad, 0x3d, 0x76, 0x08, 0x5b, 0x7d, 0x12, 0x93, 0x03, 0x70, 0xe6, 0x5f, - 0xb2, 0xac, 0x78, 0xae, 0xbe, 0xc5, 0x31, 0xc8, 0x6d, 0x2c, 0x1c, 0x2f, - 0x41, 0x37, 0xf6, 0x88, 0xd3, 0x80, 0x93, 0xed, 0x55, 0xb1, 0xaa, 0x49, - 0xe8, 0x42, 0xd0, 0x19, 0x20, 0x58, 0xe7, 0x2d, 0x10, 0xf2, 0x69, 0x49, - 0xe9, 0x47, 0x95, 0xbb, 0xce, 0xa7, 0xe9, 0x86, 0x46, 0x1c, 0xd1, 0x1f, - 0xd4, 0xa9, 0xeb, 0x28, 0x57, 0x78, 0x6c, 0xc6, 0x6f, 0x84, 0x3b, 0xb4, - 0x8c, 0xe5, 0xd3, 0x23, 0x8b, 0xbe, 0x83, 0x75, 0x5e, 0xea, 0xcd, 0x93, - 0xd2, 0x42, 0x86, 0xfd, 0x2b, 0x67, 0x72, 0xe0, 0x46, 0x9c, 0xf7, 0xc1, - 0xe9, 0x5d, 0xad, 0xac, 0xcb, 0x57, 0xb4, 0xe7, 0x87, 0x25, 0x7d, 0x5a, - 0x43, 0x90, 0xa3, 0x2e, 0xbf, 0x36, 0xbd, 0x4c, 0xba, 0xec, 0x0f, 0x21, - 0x51, 0xda, 0x66, 0xb8, 0x1e, 0xac, 0x33, 0xeb, 0xa1, 0x3e, 0x72, 0x15, - 0x10, 0x45, 0xc0, 0xe4, 0xdb, 0x04, 0x6d, 0xaf, 0x66, 0xc2, 0xfc, 0x35, - 0x04, 0x60, 0x7d, 0x2f, 0x5e, 0x9e, 0x83, 0xf6, 0x72, 0x92, 0x6a, 0x9f, - 0xba, 0x94, 0x97, 0x33, 0xe1, 0x1d, 0x42, 0xda, 0xad, 0xa5, 0x8b, 0xad, - 0x2f, 0x2f, 0x32, 0x16, 0x88, 0x54, 0x88, 0xb2, 0x85, 0xe2, 0x33, 0x08, - 0x43, 0xc8, 0x68, 0x69, 0xaa, 0xea, 0x9a, 0xbf, 0x41, 0x12, 0xe6, 0xf1, - 0x02, 0x81, 0xc1, 0x00, 0xfe, 0x96, 0xe7, 0xc8, 0x89, 0x61, 0x2b, 0x58, - 0xaa, 0xcd, 0x37, 0x46, 0x13, 0xa1, 0x2a, 0xc8, 0x1b, 0x76, 0xde, 0x4c, - 0xb3, 0x00, 0x4f, 0x6b, 0x02, 0xc0, 0x10, 0xef, 0x87, 0xe2, 0x6d, 0x7f, - 0x10, 0x57, 0xec, 0xde, 0x70, 0x60, 0xb5, 0x8f, 0x6d, 0x17, 0x35, 0xbd, - 0xfd, 0x6a, 0x2c, 0xbb, 0xf0, 0x48, 0x5b, 0x32, 0x41, 0xf6, 0xc0, 0x62, - 0x3a, 0x88, 0xc5, 0x41, 0x83, 0x85, 0x56, 0xa7, 0x11, 0xf4, 0xd2, 0xa9, - 0xb3, 0xa3, 0xcb, 0xae, 0xca, 0xee, 0x1c, 0x52, 0x7f, 0x04, 0x34, 0x61, - 0xb9, 0x8d, 0xa3, 0x26, 0x88, 0xce, 0x3d, 0xdb, 0x9c, 0xbf, 0xcc, 0xc4, - 0x38, 0x8b, 0xf2, 0xe4, 0x7e, 0xcc, 0x46, 0x86, 0x7a, 0x3c, 0xb7, 0x95, - 0x3f, 0xbd, 0x81, 0x45, 0xc3, 0x1d, 0xbb, 0xf8, 0x56, 0x6e, 0xa5, 0x88, - 0x2d, 0xff, 0x78, 0xc0, 0xc2, 0x4a, 0x4f, 0xea, 0xb8, 0x81, 0xf3, 0x96, - 0x5e, 0xd8, 0xcb, 0x96, 0x42, 0xa3, 0x21, 0x03, 0xc8, 0x00, 0xbf, 0x95, - 0xc7, 0x83, 0x80, 0xc6, 0xc2, 0x38, 0xe4, 0xaf, 0xb2, 0x0e, 0x80, 0x92, - 0x97, 0x21, 0x16, 0xce, 0x39, 0xd3, 0x95, 0xb7, 0xc3, 0x78, 0xe1, 0x1c, - 0xc0, 0x5a, 0xbc, 0x9b, 0x68, 0x3f, 0xd6, 0x42, 0xcd, 0xca, 0x0b, 0x6d, - 0x9f, 0xde, 0x6b, 0x98, 0x3b, 0x47, 0x57, 0xb9, 0x2d, 0x92, 0x52, 0x29, - 0xc5, 0xed, 0xb5, 0x0d, 0x02, 0x81, 0xc1, 0x00, 0xf6, 0x64, 0xef, 0xef, - 0x57, 0xdb, 0x06, 0xae, 0x36, 0x86, 0x11, 0xaf, 0x96, 0xb9, 0xb1, 0x29, - 0x53, 0xce, 0x24, 0x60, 0x96, 0x8f, 0xd0, 0xb7, 0x4b, 0x60, 0x1e, 0xb3, - 0x1f, 0xae, 0x15, 0x41, 0xf1, 0x56, 0xd6, 0xf3, 0x07, 0xf8, 0xd7, 0xdd, - 0x1c, 0x82, 0xe8, 0xe0, 0xff, 0xb3, 0x41, 0x0d, 0x41, 0x96, 0x0d, 0xf2, - 0x03, 0xb0, 0x68, 0xed, 0xda, 0x8b, 0x83, 0x18, 0x4d, 0xae, 0xaf, 0x72, - 0xa1, 0x82, 0xe5, 0x5a, 0xdc, 0x2a, 0x5f, 0x93, 0x29, 0xc7, 0x24, 0xa0, - 0x8e, 0x32, 0x4c, 0x0e, 0xca, 0x6d, 0x14, 0x69, 0x5b, 0x61, 0xc5, 0xdc, - 0x0e, 0x50, 0x0c, 0x14, 0x84, 0x8b, 0xee, 0x9e, 0x1e, 0x8c, 0x3d, 0xdb, - 0x24, 0xe7, 0x99, 0x6d, 0x3c, 0xaf, 0xe6, 0x3b, 0xaa, 0xb4, 0xe4, 0x42, - 0x13, 0x53, 0x3e, 0x02, 0x47, 0x0d, 0x3a, 0x2b, 0x97, 0x71, 0x9f, 0x1b, - 0x76, 0x2d, 0xe5, 0x9c, 0x5e, 0x46, 0x5f, 0x36, 0xbf, 0x18, 0xb1, 0x1d, - 0x9a, 0xeb, 0x4d, 0x5e, 0x83, 0xd5, 0x3e, 0x5f, 0xf2, 0x6a, 0x56, 0x79, - 0x0f, 0x54, 0xec, 0x41, 0xc0, 0xdc, 0x29, 0x42, 0x45, 0xae, 0x47, 0x1c, - 0x7a, 0xd5, 0xb7, 0x92, 0x1e, 0x66, 0xb8, 0x1a, 0x2f, 0x53, 0xd2, 0x6d, - 0x42, 0x3c, 0x6c, 0x02, 0x01, 0x03, 0x9e, 0x9a, 0x95, 0x35, 0x81, 0x21, - 0x53, 0x53, 0x16, 0xda, 0x8a, 0x80, 0x8c, 0xcd, 0x02, 0x81, 0xc1, 0x00, - 0xd5, 0xba, 0x05, 0xf7, 0x7a, 0x2d, 0x52, 0xe0, 0x6a, 0xf3, 0x40, 0xd5, - 0xd9, 0xa0, 0xd1, 0x73, 0x90, 0x6a, 0xe8, 0x10, 0x67, 0xad, 0x78, 0xfe, - 0x93, 0x1e, 0x7e, 0x99, 0x37, 0xf0, 0x44, 0x90, 0x09, 0x3e, 0x67, 0x22, - 0x0e, 0x21, 0x82, 0x0a, 0x58, 0x40, 0xc5, 0xe3, 0x2b, 0x9d, 0x38, 0xd4, - 0xc5, 0xd1, 0x58, 0x8e, 0x06, 0x86, 0x89, 0xd7, 0x6c, 0xe0, 0x69, 0x08, - 0xa8, 0xcb, 0x05, 0x85, 0xd8, 0x33, 0x39, 0xaf, 0x31, 0x99, 0xee, 0x62, - 0x5d, 0x06, 0x2c, 0x4c, 0xad, 0x48, 0xf0, 0x58, 0xa2, 0x17, 0x5f, 0xc1, - 0xf7, 0xd3, 0x7c, 0x66, 0xa3, 0x5e, 0xf9, 0x1e, 0x39, 0x82, 0x73, 0x74, - 0x93, 0x66, 0x16, 0x46, 0xca, 0xd3, 0xb2, 0x22, 0xdf, 0x91, 0xcd, 0xb6, - 0xad, 0x28, 0x87, 0x26, 0xe2, 0x18, 0x9d, 0x6a, 0x87, 0x83, 0x12, 0xf2, - 0x6f, 0xa9, 0x47, 0x11, 0xfb, 0xb7, 0x4c, 0xb1, 0x0e, 0x0a, 0xde, 0x4e, - 0xd4, 0xbe, 0x71, 0xf6, 0xe4, 0xae, 0x8c, 0x27, 0xc7, 0x88, 0x84, 0x51, - 0x57, 0xb7, 0xbf, 0x74, 0x27, 0xfc, 0xb8, 0xbf, 0x57, 0x94, 0x75, 0xba, - 0xc7, 0x1c, 0xf3, 0x71, 0x83, 0xee, 0x34, 0xbd, 0x98, 0x56, 0x14, 0x44, - 0x3a, 0xee, 0x6c, 0x87, 0x44, 0x8f, 0xbb, 0xac, 0x5a, 0x2b, 0xb5, 0x13, - 0xe5, 0x9f, 0xec, 0xeb, 0x0e, 0x70, 0xe9, 0xfd, 0x1b, 0xa6, 0x84, 0xf9, - 0x02, 0x81, 0xc0, 0x4e, 0x82, 0x26, 0xf9, 0x6a, 0x52, 0xfd, 0xb3, 0xf0, - 0xe7, 0x93, 0x27, 0x11, 0xad, 0xa5, 0x47, 0x77, 0xce, 0x8d, 0x44, 0xc1, - 0x74, 0x9d, 0x9a, 0x69, 0xc7, 0xfc, 0xc0, 0x32, 0x6d, 0xf3, 0x94, 0x09, - 0x64, 0x14, 0x25, 0x67, 0xfa, 0xe0, 0x3d, 0x31, 0xe2, 0x7c, 0x75, 0x84, - 0xc4, 0x07, 0x0c, 0x44, 0x43, 0x9d, 0xb9, 0xe9, 0x77, 0x02, 0x58, 0x17, - 0x74, 0xb0, 0x96, 0xc3, 0xd9, 0xcf, 0x49, 0x85, 0x31, 0x02, 0x07, 0x8b, - 0x73, 0x6c, 0xf4, 0xa5, 0x31, 0x30, 0xf8, 0x7f, 0x96, 0x83, 0x29, 0x8b, - 0x52, 0x6a, 0x58, 0x8f, 0xa7, 0x7d, 0xb5, 0xfa, 0x51, 0x83, 0x27, 0xde, - 0x7b, 0xff, 0xd2, 0x1e, 0x05, 0xad, 0x87, 0xf0, 0x20, 0x63, 0x80, 0xac, - 0xff, 0x97, 0x2a, 0x97, 0xdf, 0xff, 0x83, 0x16, 0x49, 0x45, 0xce, 0xcf, - 0xf8, 0xe4, 0xfa, 0x12, 0xcd, 0x3f, 0x57, 0x2e, 0xb6, 0xbd, 0x1c, 0xaf, - 0xe5, 0x58, 0x5d, 0x47, 0x52, 0x84, 0xcc, 0xdc, 0x19, 0xf1, 0x93, 0x16, - 0x0a, 0x92, 0x4f, 0x5c, 0x1c, 0x89, 0xe5, 0x14, 0xff, 0x88, 0x30, 0x03, - 0x55, 0xa3, 0x47, 0xdc, 0x90, 0x05, 0x54, 0x8b, 0xc7, 0x21, 0x30, 0xcb, - 0xc3, 0x0b, 0x12, 0x3c, 0xd6, 0x46, 0x8c, 0x4d, 0xb8, 0x96, 0xe9, 0xa4, - 0x8d, 0x14, 0xb2, 0x48, 0xac, 0xbd, 0xb2, 0x72, 0xac, 0x5c, 0xf1, 0xd1, - 0x83, 0xd8, 0x59, 0x02, 0x81, 0xc0, 0x2d, 0x65, 0xc1, 0xc7, 0x0f, 0xca, - 0xbc, 0x5d, 0xa1, 0x30, 0x28, 0x27, 0x51, 0xcc, 0xc9, 0x6c, 0x7b, 0x76, - 0x43, 0xa9, 0x77, 0xd8, 0x29, 0xa3, 0x80, 0x57, 0x3b, 0xe9, 0x72, 0x1c, - 0x51, 0x37, 0xc2, 0x0b, 0x74, 0xb7, 0xaa, 0x63, 0xd5, 0xe2, 0x9b, 0x3a, - 0x3c, 0x78, 0x50, 0xcb, 0x88, 0x1a, 0xd6, 0x59, 0xdc, 0xb3, 0x05, 0xbf, - 0xe5, 0xc5, 0xb5, 0xe3, 0x9b, 0xba, 0xe7, 0xbb, 0x4d, 0x45, 0xb3, 0x4c, - 0xf2, 0x48, 0x65, 0xe7, 0x6b, 0xee, 0x12, 0xc8, 0xd5, 0xea, 0xf0, 0x89, - 0xf9, 0x03, 0xa3, 0xd9, 0x5f, 0x62, 0x2d, 0x1a, 0x55, 0x51, 0x5d, 0xf6, - 0xca, 0x6e, 0x5f, 0xf0, 0x66, 0x02, 0xf4, 0x20, 0xe6, 0xe9, 0xc4, 0xd7, - 0x36, 0x8d, 0x00, 0xce, 0x23, 0xfd, 0x90, 0xd4, 0x19, 0x5c, 0xe9, 0xcb, - 0x23, 0xe2, 0x2c, 0xf5, 0xe1, 0x6f, 0x9d, 0xb5, 0xdf, 0xea, 0x51, 0xdd, - 0x02, 0xd8, 0x40, 0xd6, 0x7f, 0x4b, 0xdb, 0x0e, 0xe2, 0x27, 0x4d, 0x0d, - 0x9b, 0x2e, 0xf7, 0xc8, 0x22, 0xca, 0x63, 0x3c, 0x2c, 0xe5, 0xa8, 0x42, - 0x26, 0xd9, 0xfc, 0xdc, 0x42, 0xc8, 0x07, 0x64, 0xa2, 0x98, 0xae, 0xb4, - 0x57, 0x02, 0x02, 0xb2, 0x2d, 0xc8, 0x59, 0x73, 0x9b, 0xee, 0xc0, 0x9a, - 0x42, 0x9a, 0xef, 0xc2, 0x27, 0x24, 0x2b, 0x20, 0x92, 0xad, 0x50, 0xfe, - 0x2c, 0x2d, 0xb6, 0xb6, 0xb5, 0xba -}; - -const size_t kOEMPrivateKeySize_UAT = sizeof(kOEMPrivateKey_UAT); - -const uint8_t kOEMPublicCert_UAT[] = { - 0x30, 0x82, 0x09, 0xf7, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x07, 0x02, 0xa0, 0x82, 0x09, 0xe8, 0x30, 0x82, 0x09, 0xe4, 0x02, - 0x01, 0x01, 0x31, 0x00, 0x30, 0x0f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x02, 0x04, 0x00, 0xa0, 0x82, 0x09, - 0xc8, 0x30, 0x82, 0x04, 0x1a, 0x30, 0x82, 0x03, 0x02, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x11, 0x00, 0xf2, 0xa1, 0x08, 0xdf, 0x12, 0x84, 0xb9, - 0x73, 0x6c, 0x23, 0x73, 0xe1, 0x1f, 0xf3, 0xac, 0x7a, 0x30, 0x0d, 0x06, - 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, - 0x30, 0x81, 0x8b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, - 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, - 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, - 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, - 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, - 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, - 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x30, 0x30, 0x2e, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x27, 0x47, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x20, 0x4f, 0x45, 0x4d, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x20, 0x69, 0x64, 0x3a, 0x20, 0x37, 0x33, 0x34, 0x36, 0x30, 0x1e, - 0x17, 0x0d, 0x31, 0x37, 0x30, 0x33, 0x31, 0x33, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x39, 0x31, 0x32, 0x30, 0x38, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x30, 0x6d, 0x31, 0x12, 0x30, 0x10, - 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x09, 0x37, 0x33, 0x34, 0x36, 0x2d, - 0x6c, 0x65, 0x61, 0x66, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, - 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, - 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, - 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, - 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, - 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x30, 0x82, 0x01, - 0xa2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x8f, 0x00, 0x30, 0x82, 0x01, - 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xf5, 0x09, 0x64, 0x4a, 0x26, 0xfe, - 0xc0, 0x98, 0x55, 0x6a, 0x1d, 0x5d, 0x1c, 0xc7, 0x38, 0xaf, 0xfd, 0x49, - 0x9e, 0x85, 0x3f, 0xd6, 0x45, 0x0e, 0x99, 0x09, 0x85, 0x69, 0x84, 0x3c, - 0xfe, 0x72, 0xa5, 0x56, 0xfa, 0x11, 0x4f, 0x6b, 0x7d, 0x32, 0x2b, 0x0c, - 0xbf, 0x8f, 0xac, 0x47, 0x96, 0x22, 0x82, 0x3d, 0xf5, 0x64, 0x74, 0x7e, - 0x62, 0x68, 0x74, 0xcd, 0x0a, 0xec, 0x84, 0xc5, 0x15, 0x06, 0x0e, 0x5a, - 0x2f, 0x20, 0xe3, 0xc9, 0x67, 0xcd, 0xdd, 0x01, 0xb8, 0xb3, 0x18, 0x87, - 0x8c, 0xa9, 0x58, 0x86, 0x0f, 0xb6, 0xc3, 0x42, 0x7e, 0x87, 0x48, 0x5e, - 0x10, 0x49, 0xc7, 0xd7, 0xb7, 0xb8, 0xa6, 0x34, 0x08, 0x0c, 0x94, 0xf4, - 0xbb, 0x2a, 0x06, 0xa4, 0x4f, 0xec, 0xbc, 0xc4, 0x37, 0xbe, 0x99, 0x10, - 0x23, 0x37, 0x24, 0xb1, 0xdf, 0xcb, 0xe6, 0x3f, 0xc1, 0xf0, 0x0f, 0x04, - 0x03, 0xc8, 0xb0, 0x1e, 0xd6, 0xb8, 0xae, 0x77, 0xe1, 0x4d, 0x6d, 0x97, - 0x69, 0x6d, 0x8a, 0x73, 0x66, 0x32, 0x57, 0x6f, 0xcf, 0xea, 0x1e, 0x7b, - 0x87, 0x03, 0x75, 0xb1, 0xef, 0x83, 0x64, 0x26, 0xf1, 0x3f, 0xbf, 0xe6, - 0x28, 0x03, 0x72, 0x57, 0xbf, 0x47, 0x29, 0x99, 0x8f, 0x74, 0x1d, 0x01, - 0x16, 0xad, 0xb2, 0xdf, 0x80, 0xa4, 0xd3, 0x8b, 0xeb, 0x61, 0xd1, 0x40, - 0x68, 0xb9, 0xa2, 0xa5, 0xef, 0x2b, 0xe5, 0x78, 0xe8, 0x28, 0x88, 0x87, - 0xb7, 0x53, 0x49, 0xbb, 0xe4, 0xea, 0x0d, 0x5e, 0x96, 0xa5, 0xdd, 0x1f, - 0x0b, 0x25, 0x8b, 0xb5, 0x95, 0x46, 0xe7, 0xba, 0xb8, 0xc4, 0x0a, 0x36, - 0xb1, 0x89, 0xeb, 0x27, 0x5d, 0xd9, 0x97, 0x24, 0x59, 0xa3, 0x9b, 0xb0, - 0x23, 0x0b, 0xd2, 0xec, 0x65, 0x91, 0xf9, 0xf0, 0xa0, 0x74, 0x5f, 0xb4, - 0xce, 0x22, 0x27, 0x18, 0x37, 0xe2, 0x4b, 0xfc, 0x91, 0xf9, 0x09, 0x15, - 0xe6, 0xdb, 0x06, 0x9b, 0x4d, 0x82, 0xdc, 0x36, 0x14, 0x48, 0xc6, 0xd5, - 0x87, 0xca, 0xec, 0x5a, 0xa2, 0x29, 0x33, 0xef, 0x22, 0x0c, 0x4b, 0xbf, - 0xe7, 0x2f, 0x95, 0xe1, 0xd3, 0xa5, 0xd8, 0xaa, 0x44, 0x77, 0x29, 0xa3, - 0x20, 0x33, 0xd2, 0x51, 0xa2, 0xf9, 0x4a, 0x6f, 0xf7, 0x3e, 0xf7, 0x0b, - 0x8a, 0xec, 0xc1, 0x99, 0x1d, 0x47, 0xf3, 0x74, 0x02, 0x04, 0xab, 0x8e, - 0x62, 0x4c, 0x9e, 0x00, 0xc2, 0x84, 0xd7, 0xd0, 0xf8, 0xe4, 0x1c, 0x9d, - 0x98, 0x15, 0xa8, 0x8f, 0x08, 0x98, 0x4e, 0x5a, 0xfa, 0xd6, 0x60, 0x87, - 0x12, 0xdc, 0x8e, 0xfd, 0xcb, 0xb3, 0x13, 0x97, 0x7a, 0xa8, 0x8c, 0x56, - 0x2e, 0x49, 0x26, 0x60, 0xe9, 0x4a, 0xdc, 0xec, 0x3f, 0xf0, 0x94, 0xcd, - 0x90, 0x8e, 0x7c, 0x21, 0x3f, 0x80, 0x14, 0x33, 0xdd, 0xb0, 0x00, 0xe2, - 0x09, 0x37, 0x06, 0xdd, 0x17, 0x69, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, - 0x16, 0x30, 0x14, 0x30, 0x12, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, - 0xd6, 0x79, 0x04, 0x01, 0x01, 0x04, 0x04, 0x02, 0x02, 0x1c, 0xb2, 0x30, - 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, - 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x8e, 0x2d, 0x13, 0x1e, 0x60, - 0xaa, 0xda, 0x52, 0x53, 0x55, 0x64, 0x3a, 0xdc, 0xb6, 0x7a, 0xc0, 0xba, - 0xfa, 0xeb, 0x20, 0xab, 0xb6, 0x63, 0xcf, 0xcd, 0x9b, 0xdb, 0x71, 0xf3, - 0xa0, 0xd6, 0x91, 0xbf, 0x0c, 0xc1, 0xae, 0x8f, 0x02, 0x18, 0x00, 0x54, - 0xfb, 0x49, 0x03, 0x34, 0x8d, 0x92, 0x9d, 0x5d, 0x8d, 0xa8, 0x1c, 0x20, - 0x0f, 0x85, 0x60, 0xf9, 0xf6, 0x8b, 0xbb, 0x2b, 0x82, 0xce, 0xb3, 0xe2, - 0x91, 0xe7, 0xbd, 0x91, 0x61, 0x52, 0x36, 0x40, 0x9f, 0x2f, 0x5e, 0xa6, - 0x5d, 0x2f, 0xb3, 0x81, 0xe7, 0xf1, 0x87, 0xbe, 0xc5, 0x9d, 0x67, 0x5a, - 0xf7, 0x41, 0x1e, 0x73, 0xb0, 0x1e, 0xdc, 0x4f, 0x8d, 0x53, 0x21, 0x38, - 0x1b, 0xfd, 0x92, 0x43, 0x68, 0x83, 0x03, 0xd0, 0x9a, 0xca, 0x92, 0x14, - 0x73, 0x04, 0x94, 0x2a, 0x93, 0x22, 0x60, 0x5e, 0xee, 0xb6, 0xec, 0x0f, - 0xb0, 0xc8, 0x92, 0x97, 0xfb, 0x5d, 0xed, 0x1f, 0xa0, 0x5f, 0xe4, 0x98, - 0x2f, 0xf6, 0x13, 0x78, 0x99, 0xec, 0xb3, 0xf1, 0x0d, 0x27, 0xaa, 0x19, - 0x95, 0x39, 0xdb, 0xb0, 0x7b, 0x96, 0x74, 0x03, 0x5e, 0x51, 0xf5, 0x15, - 0x27, 0xce, 0xca, 0x0b, 0x2a, 0x0d, 0x43, 0xb3, 0x68, 0x17, 0x1e, 0x11, - 0x60, 0xd9, 0x84, 0x9b, 0xc3, 0x53, 0xce, 0xbd, 0xf4, 0x61, 0x51, 0x4b, - 0x41, 0x00, 0x7e, 0xe1, 0x5f, 0x69, 0xb3, 0x4a, 0x89, 0x7e, 0x47, 0x67, - 0xfd, 0x76, 0xf8, 0x94, 0x2f, 0x72, 0xb6, 0x14, 0x08, 0x2c, 0x16, 0x4e, - 0x9d, 0x37, 0x62, 0xbf, 0x11, 0x67, 0xc0, 0x70, 0x71, 0xec, 0x55, 0x51, - 0x4e, 0x46, 0x76, 0xb4, 0xc3, 0xeb, 0x52, 0x06, 0x17, 0x06, 0xce, 0x61, - 0x43, 0xce, 0x26, 0x80, 0x68, 0xb6, 0x2d, 0x57, 0xba, 0x8c, 0x7d, 0xb7, - 0xc5, 0x05, 0x2c, 0xf8, 0xa3, 0x69, 0xf8, 0x96, 0xad, 0xac, 0xd1, 0x30, - 0x82, 0x05, 0xa6, 0x30, 0x82, 0x03, 0x8e, 0xa0, 0x03, 0x02, 0x01, 0x02, - 0x02, 0x10, 0x73, 0xd1, 0xe1, 0x1d, 0xa9, 0x75, 0xfd, 0x0c, 0xda, 0x7f, - 0xfa, 0x43, 0x3c, 0x26, 0xbd, 0x3d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x7e, 0x31, - 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, - 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, - 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, 0x6b, - 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, - 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, 0x30, - 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, 0x65, - 0x76, 0x69, 0x6e, 0x65, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, 0x04, - 0x03, 0x0c, 0x1a, 0x77, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x65, 0x6d, 0x2d, 0x72, 0x6f, 0x6f, 0x74, - 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, - 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, 0x32, 0x34, 0x31, 0x5a, 0x17, 0x0d, - 0x32, 0x37, 0x30, 0x33, 0x31, 0x34, 0x30, 0x33, 0x30, 0x32, 0x34, 0x31, - 0x5a, 0x30, 0x81, 0x8b, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, - 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, - 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, - 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, - 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, - 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x30, 0x30, - 0x2e, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x27, 0x47, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x20, 0x4f, 0x45, 0x4d, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x20, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x20, 0x69, 0x64, 0x3a, 0x20, 0x37, 0x33, 0x34, 0x36, 0x30, - 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, - 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, - 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x45, 0x13, 0xf2, - 0xb2, 0xcb, 0x4b, 0x0f, 0xb4, 0x44, 0x25, 0x9c, 0x8a, 0x68, 0x54, 0xd5, - 0x45, 0x1e, 0x15, 0x89, 0x5b, 0xb8, 0xce, 0xda, 0x5a, 0x42, 0xe6, 0x9a, - 0x8c, 0xc1, 0xcb, 0xe8, 0xc5, 0xf5, 0x8f, 0x49, 0x0e, 0x02, 0xef, 0x5e, - 0x97, 0x1a, 0x91, 0xa4, 0x94, 0xc3, 0x50, 0x13, 0xe5, 0x13, 0xb7, 0x7f, - 0x26, 0x53, 0x19, 0xb0, 0x37, 0xa5, 0xef, 0xe6, 0x2a, 0x39, 0xdc, 0x93, - 0x37, 0xe2, 0x3d, 0x7f, 0xcb, 0x4b, 0x93, 0xa2, 0xc3, 0x69, 0x78, 0xc9, - 0x01, 0xfa, 0x68, 0x3b, 0xe0, 0xe2, 0x22, 0x6c, 0xeb, 0xe4, 0x8a, 0xa8, - 0x3e, 0xf5, 0x20, 0x82, 0xa8, 0x62, 0x68, 0x59, 0x78, 0x24, 0xde, 0xef, - 0x47, 0x43, 0xb1, 0x6c, 0x38, 0x29, 0xd3, 0x69, 0x3f, 0xae, 0x35, 0x57, - 0x75, 0x80, 0xc9, 0x21, 0xe7, 0x01, 0xb9, 0x54, 0x8b, 0x6e, 0x4e, 0x2e, - 0x5a, 0x5b, 0x77, 0xa4, 0x22, 0xc2, 0x7b, 0x95, 0xb9, 0x39, 0x2c, 0xbd, - 0xc2, 0x1e, 0x02, 0xa6, 0xb2, 0xbc, 0x0f, 0x7a, 0xcb, 0xdc, 0xbc, 0xbc, - 0x90, 0x66, 0xe3, 0xca, 0x46, 0x53, 0x3e, 0x98, 0xff, 0x2e, 0x78, 0x9f, - 0xd3, 0xa1, 0x12, 0x93, 0x66, 0x7d, 0xcc, 0x94, 0x6b, 0xec, 0x19, 0x0e, - 0x20, 0x45, 0x22, 0x57, 0x6d, 0x9e, 0xd0, 0x89, 0xf2, 0xa9, 0x34, 0xdc, - 0xab, 0xa5, 0x73, 0x47, 0x38, 0xe3, 0x7f, 0x98, 0x3a, 0x61, 0xae, 0x6c, - 0x4d, 0xf2, 0x31, 0x90, 0xcb, 0x83, 0xc1, 0xee, 0xb4, 0xf2, 0x9a, 0x28, - 0x5f, 0xbb, 0x7d, 0x89, 0xdf, 0xa2, 0x31, 0xb6, 0x1d, 0x39, 0x2b, 0x70, - 0xbf, 0x1e, 0xad, 0xe1, 0x74, 0x94, 0x1d, 0xf8, 0xc5, 0x1a, 0x8d, 0x13, - 0x45, 0xf0, 0x6a, 0x80, 0x0c, 0x5d, 0xbb, 0x46, 0x8a, 0x43, 0xd0, 0xff, - 0x21, 0x39, 0x57, 0x53, 0x5b, 0x51, 0xf8, 0xa2, 0x8f, 0x7f, 0x27, 0xc7, - 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x10, 0x30, 0x82, 0x01, - 0x0c, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, - 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x0e, 0x06, - 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, - 0x04, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, - 0xe8, 0xe9, 0xac, 0x16, 0x5c, 0x5e, 0xb2, 0xe8, 0xeb, 0xff, 0x57, 0x27, - 0x20, 0x08, 0x72, 0x63, 0x9b, 0xe5, 0xb5, 0x16, 0x30, 0x81, 0xb2, 0x06, - 0x03, 0x55, 0x1d, 0x23, 0x04, 0x81, 0xaa, 0x30, 0x81, 0xa7, 0x80, 0x14, - 0x04, 0x94, 0x66, 0xaa, 0xf9, 0x61, 0x89, 0xb6, 0xdb, 0xb5, 0xf7, 0x13, - 0x38, 0x3d, 0x62, 0x84, 0xb8, 0x18, 0x0a, 0x8f, 0xa1, 0x81, 0x83, 0xa4, - 0x81, 0x80, 0x30, 0x7e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, - 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, - 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, - 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, - 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, - 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, - 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x23, 0x30, - 0x21, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1a, 0x77, 0x69, 0x64, 0x65, - 0x76, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x65, 0x6d, - 0x2d, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x70, 0x72, 0x6f, 0x64, 0x82, 0x09, - 0x00, 0xdf, 0x86, 0x05, 0x31, 0x01, 0xbe, 0x9a, 0x9a, 0x30, 0x12, 0x06, - 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0xd6, 0x79, 0x04, 0x01, 0x01, 0x04, - 0x04, 0x02, 0x02, 0x1c, 0xb2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, - 0x00, 0x25, 0xce, 0xd2, 0x02, 0x48, 0xbb, 0xbe, 0xfc, 0xb6, 0xa4, 0x87, - 0x87, 0xe0, 0x21, 0x7d, 0xfa, 0x23, 0xc3, 0x0d, 0x73, 0x8f, 0x46, 0xe7, - 0x09, 0x59, 0xda, 0x2e, 0x55, 0x59, 0xff, 0x3c, 0x1b, 0xf6, 0xf8, 0x9a, - 0xc4, 0x1c, 0xf7, 0xac, 0xca, 0xe7, 0x63, 0xf2, 0xc7, 0xd6, 0x0c, 0x2d, - 0xa6, 0xad, 0x55, 0xf4, 0x10, 0x0e, 0xa8, 0x82, 0x0f, 0x88, 0xb5, 0x44, - 0xe8, 0x8e, 0x84, 0x08, 0xf7, 0xdd, 0xe7, 0x10, 0xce, 0x71, 0x56, 0x57, - 0x3f, 0xed, 0x48, 0xee, 0xe2, 0x5d, 0x08, 0x0a, 0x58, 0xe4, 0xfe, 0xbc, - 0x8c, 0x27, 0x1a, 0x46, 0x3f, 0xd5, 0x2d, 0xdb, 0x0b, 0x71, 0x73, 0xd1, - 0x49, 0xf3, 0x5c, 0x86, 0x4d, 0x0a, 0xe1, 0xeb, 0x53, 0x21, 0x38, 0x4f, - 0xec, 0x1e, 0xc2, 0x68, 0x1f, 0x7d, 0xa6, 0x33, 0xe9, 0xa5, 0x37, 0x2a, - 0xef, 0xcd, 0x78, 0x56, 0xb3, 0x39, 0x60, 0xf4, 0xa5, 0xf9, 0x2b, 0x85, - 0xcf, 0xe6, 0x1c, 0x7c, 0x8a, 0x5d, 0xe8, 0x26, 0x02, 0xcf, 0x7a, 0x56, - 0x1f, 0xae, 0x0d, 0x71, 0x20, 0xee, 0xec, 0x3b, 0xae, 0x95, 0x25, 0x15, - 0xc8, 0xf6, 0x92, 0x5d, 0xb8, 0x9b, 0xc2, 0xb4, 0x95, 0x33, 0x13, 0x76, - 0x45, 0xbe, 0x21, 0xe2, 0x3a, 0x69, 0x66, 0xd7, 0xff, 0x22, 0x00, 0x89, - 0xc9, 0x44, 0xb6, 0x54, 0x38, 0x1f, 0x33, 0xe4, 0xda, 0x7b, 0x87, 0xf3, - 0x23, 0xed, 0xf5, 0x16, 0x08, 0xbe, 0x4b, 0xea, 0x91, 0x8f, 0x91, 0x8b, - 0x4e, 0xd1, 0x02, 0x06, 0xa2, 0x77, 0x15, 0x03, 0x46, 0x11, 0x7d, 0x5b, - 0xea, 0x7a, 0xf6, 0x86, 0x7d, 0x96, 0xb7, 0x73, 0x9b, 0x5b, 0x32, 0xc3, - 0xf8, 0x92, 0x36, 0xe3, 0xe3, 0x2f, 0xe8, 0xf1, 0x72, 0xec, 0x0d, 0x50, - 0xd4, 0x86, 0xc5, 0x62, 0x83, 0xf1, 0x2a, 0x4c, 0xd1, 0xbf, 0x76, 0x62, - 0xd4, 0x21, 0x11, 0x68, 0xb2, 0xd6, 0x8d, 0xc4, 0xf8, 0xe4, 0x70, 0x85, - 0x19, 0xa7, 0x82, 0x27, 0x2c, 0x24, 0x21, 0x7a, 0x3b, 0xad, 0x8a, 0xd3, - 0xae, 0xda, 0x78, 0x3c, 0x6c, 0xab, 0xa2, 0xaa, 0x36, 0xf0, 0x1c, 0x58, - 0xd4, 0x72, 0x5e, 0xe8, 0x8b, 0x41, 0x08, 0xf5, 0x85, 0xdd, 0xee, 0x99, - 0x12, 0xf4, 0xd6, 0x41, 0x83, 0x69, 0xe7, 0x79, 0x19, 0xa3, 0x74, 0xc4, - 0x34, 0x2a, 0x8a, 0x7e, 0x4d, 0xbb, 0x2c, 0x49, 0x19, 0xf7, 0x98, 0x98, - 0xfc, 0x81, 0xf7, 0x9b, 0x7f, 0xff, 0xd9, 0x66, 0xf4, 0x51, 0x14, 0x29, - 0x2a, 0x14, 0x1d, 0x4f, 0xbd, 0x91, 0xba, 0x6f, 0x32, 0x34, 0x3c, 0x40, - 0x28, 0x6c, 0x97, 0xf8, 0x6d, 0x38, 0xcd, 0xa3, 0x7b, 0x18, 0xc8, 0x77, - 0x58, 0x4d, 0x53, 0x30, 0x7f, 0x4d, 0x89, 0xca, 0x95, 0x6e, 0xb5, 0xb8, - 0x8e, 0xc8, 0x2d, 0x18, 0x2f, 0x52, 0x2a, 0xde, 0xac, 0x56, 0x8d, 0x8c, - 0x67, 0x14, 0xf6, 0xb9, 0xf1, 0x65, 0xd3, 0x22, 0x43, 0xa3, 0x98, 0x42, - 0x20, 0x43, 0x4c, 0xdf, 0xf2, 0xeb, 0x31, 0x8c, 0x0e, 0x53, 0x5b, 0x99, - 0x82, 0xc3, 0x48, 0x04, 0x53, 0xad, 0x96, 0xb6, 0x9f, 0x52, 0xcc, 0x01, - 0xc8, 0xb3, 0x87, 0x6b, 0x9e, 0xea, 0xa9, 0xeb, 0xda, 0xac, 0xf9, 0x6f, - 0xde, 0xa1, 0x44, 0x32, 0x52, 0x49, 0x47, 0xff, 0x65, 0x79, 0x1e, 0xc5, - 0x73, 0x17, 0xb3, 0x36, 0xfc, 0x45, 0xca, 0x90, 0x37, 0x59, 0x1e, 0x16, - 0xab, 0x09, 0x69, 0xcf, 0xda, 0x56, 0x51, 0xfd, 0xeb, 0xcf, 0xcb, 0x8f, - 0xb1, 0xc3, 0x45, 0x2b, 0x7c, 0x0a, 0xa5, 0x9c, 0x0d, 0x2c, 0xad, 0x1c, - 0xd3, 0x33, 0xdd, 0xfe, 0x93, 0x69, 0xa2, 0x4b, 0x4b, 0xcf, 0x1d, 0x20, - 0x98, 0x4a, 0x4f, 0x5b, 0xe9, 0x24, 0xca, 0xfa, 0x18, 0x11, 0x81, 0x8b, - 0x7a, 0xb4, 0x5a, 0xc8, 0xdf, 0x6f, 0x5f, 0x21, 0x07, 0x31, 0x00 -}; - -const size_t kOEMPublicCertSize_UAT = sizeof(kOEMPublicCert_UAT); - -const uint32_t kOEMSystemId_TEST = 2001093; - -const uint8_t kOEMPrivateKey_TEST[] = { - 0x30, 0x82, 0x06, 0xfd, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, - 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, - 0x06, 0xe7, 0x30, 0x82, 0x06, 0xe3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, - 0x81, 0x00, 0xda, 0x30, 0x9c, 0xd2, 0xd9, 0xdb, 0xb7, 0x25, 0x86, 0xdc, - 0x99, 0x87, 0x91, 0x40, 0xca, 0x02, 0x76, 0xc4, 0xc6, 0x00, 0xcb, 0x60, - 0x8c, 0xb2, 0x01, 0xde, 0x9d, 0x44, 0x4c, 0x72, 0x42, 0xc2, 0xf1, 0x96, - 0x13, 0xa2, 0x15, 0xb2, 0x9c, 0x09, 0x11, 0x73, 0x96, 0x4e, 0xd3, 0xda, - 0xb4, 0xaf, 0xd5, 0x69, 0x69, 0xd9, 0xbe, 0x19, 0x5e, 0x49, 0x21, 0x01, - 0xf7, 0x31, 0xdd, 0x14, 0xea, 0x41, 0x5e, 0x81, 0xc5, 0x76, 0xff, 0x50, - 0xba, 0xa7, 0x0b, 0x81, 0x22, 0xba, 0x2b, 0x58, 0x7b, 0x5d, 0xb3, 0xaf, - 0xd1, 0xb4, 0x66, 0x8e, 0x70, 0x55, 0xd8, 0x4d, 0x47, 0xb7, 0x00, 0x2c, - 0x52, 0x46, 0x33, 0xa1, 0x5f, 0xca, 0xd8, 0xb1, 0xc5, 0x04, 0x0e, 0xb7, - 0xd8, 0x0a, 0xca, 0x7c, 0x2a, 0x11, 0x3d, 0xec, 0x7f, 0x4c, 0xea, 0xaa, - 0x8e, 0x1d, 0xef, 0x9e, 0x2b, 0x9e, 0x79, 0x09, 0x7e, 0xf4, 0xd0, 0xa3, - 0x58, 0xb5, 0x4e, 0x1c, 0xfb, 0x07, 0x17, 0xc4, 0xef, 0x30, 0xa3, 0x91, - 0xb6, 0x5f, 0xf8, 0xdb, 0x05, 0x73, 0x85, 0x9b, 0xe1, 0x16, 0xf1, 0x8e, - 0xe4, 0x9f, 0xe7, 0x54, 0xcf, 0x52, 0x84, 0xe7, 0x71, 0xe7, 0x38, 0x67, - 0x8e, 0x96, 0x59, 0x9b, 0x97, 0xa2, 0xc0, 0x01, 0xd5, 0x41, 0x36, 0xfa, - 0xc1, 0x61, 0x96, 0x6c, 0x38, 0x7d, 0xdd, 0x1c, 0x24, 0x2e, 0x57, 0x67, - 0x7c, 0x70, 0xd1, 0x8a, 0x8a, 0xe2, 0x6f, 0x66, 0xd2, 0xaa, 0x3e, 0xfa, - 0x4c, 0x4a, 0x68, 0xba, 0x86, 0x6e, 0x33, 0xfe, 0x30, 0xd2, 0xf4, 0x96, - 0x58, 0xe2, 0x35, 0x94, 0x4f, 0x11, 0xc7, 0x0a, 0x21, 0xe5, 0xd4, 0x1a, - 0x3c, 0xfd, 0x82, 0xbb, 0x34, 0x21, 0xdb, 0x2f, 0xd8, 0xd1, 0xbe, 0x38, - 0xe8, 0x47, 0x45, 0x04, 0x27, 0xb0, 0x19, 0x65, 0x6f, 0x55, 0xcd, 0x56, - 0x3a, 0xcc, 0xc1, 0xaf, 0xce, 0x59, 0x2e, 0xe6, 0x89, 0x24, 0x48, 0x94, - 0xc8, 0x73, 0x45, 0xc8, 0xe5, 0x1d, 0xe1, 0xf8, 0x7d, 0x88, 0xe5, 0x07, - 0x42, 0xb2, 0x80, 0x17, 0xf6, 0x67, 0x2a, 0x33, 0xa0, 0xca, 0x81, 0x0e, - 0xc4, 0x99, 0x93, 0x02, 0x8c, 0x90, 0x1d, 0x46, 0xad, 0x61, 0xec, 0xca, - 0xdd, 0x8e, 0x8b, 0x9f, 0x32, 0xab, 0xbf, 0xfa, 0xa6, 0x28, 0xda, 0x63, - 0xa2, 0xf0, 0x20, 0x52, 0x26, 0x06, 0x05, 0x59, 0xe1, 0x4a, 0x8d, 0x5e, - 0x6a, 0x65, 0xd8, 0x8e, 0x6e, 0x49, 0xa4, 0xa8, 0xc0, 0xba, 0x7b, 0x21, - 0x31, 0x7a, 0xd1, 0xb5, 0x46, 0x9e, 0xa5, 0x45, 0xeb, 0xdf, 0x38, 0xc4, - 0x1e, 0x10, 0xc6, 0xb6, 0x83, 0x46, 0x96, 0x63, 0xe5, 0xef, 0x7c, 0xdb, - 0x65, 0x3e, 0xec, 0x42, 0x00, 0x71, 0x78, 0x83, 0xfc, 0x73, 0x4f, 0x4e, - 0xb9, 0x01, 0x80, 0xd4, 0x7d, 0xf2, 0x72, 0x8d, 0x41, 0x7b, 0xee, 0xb5, - 0xca, 0xf7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01, 0x80, 0x2b, - 0xeb, 0x6d, 0x25, 0xe4, 0x44, 0x9d, 0xf1, 0x27, 0xdc, 0x6f, 0xeb, 0x22, - 0x09, 0xf0, 0x9f, 0xde, 0x58, 0x6d, 0xa2, 0xeb, 0x4d, 0x5c, 0x04, 0xd8, - 0xeb, 0x7e, 0xac, 0xa8, 0xd6, 0xb7, 0x29, 0x96, 0x87, 0xa7, 0x1c, 0x11, - 0x52, 0x0a, 0xa6, 0xa8, 0xa4, 0xa3, 0xb4, 0xea, 0x60, 0x33, 0xce, 0xd1, - 0x1e, 0x8e, 0xf8, 0x0d, 0x93, 0xfd, 0xae, 0xaa, 0xbe, 0x42, 0x8b, 0xfe, - 0xfc, 0x9e, 0xca, 0xd9, 0xc3, 0x35, 0x84, 0x66, 0x90, 0x51, 0x82, 0x1e, - 0x86, 0xb7, 0xfe, 0xd1, 0x8a, 0xd6, 0x0a, 0x5e, 0x89, 0x1d, 0xa5, 0x3a, - 0x9f, 0xa1, 0x6d, 0x26, 0x45, 0x28, 0x12, 0x66, 0x2e, 0x85, 0xc1, 0x2b, - 0xd3, 0x67, 0xfc, 0xe4, 0xf1, 0xa3, 0xbe, 0xd5, 0x57, 0x9c, 0x5d, 0x4f, - 0xb4, 0xfe, 0xa2, 0xc9, 0xdc, 0x39, 0x23, 0xba, 0x78, 0xea, 0x72, 0x8c, - 0x31, 0x42, 0x86, 0x7b, 0xc6, 0xb5, 0x8f, 0x82, 0x0f, 0xdf, 0x63, 0x5f, - 0x7d, 0xe5, 0xe9, 0xdf, 0x96, 0xfc, 0xae, 0xc5, 0xbe, 0x26, 0xff, 0xda, - 0x8f, 0xfb, 0xe0, 0xed, 0x1c, 0x1b, 0x8b, 0x0a, 0xc4, 0xc0, 0xb0, 0x8f, - 0x58, 0x3b, 0x03, 0x59, 0x4d, 0x5d, 0x58, 0x35, 0xba, 0x62, 0xb1, 0x51, - 0x08, 0x48, 0xd5, 0xb1, 0xe0, 0xac, 0x94, 0x9c, 0x04, 0x8d, 0xb8, 0x9f, - 0x16, 0xd9, 0xa8, 0x3c, 0x41, 0xd5, 0xe6, 0x9e, 0x21, 0x6e, 0xa2, 0xc7, - 0xdb, 0x2a, 0xeb, 0x2d, 0x54, 0xbd, 0xa0, 0x16, 0x90, 0xa1, 0x73, 0x15, - 0xf1, 0x88, 0xb0, 0xa0, 0xa0, 0x5d, 0xf3, 0x1a, 0x7d, 0x60, 0x6c, 0x59, - 0xcd, 0x1a, 0xb6, 0x6a, 0x5b, 0xca, 0x4a, 0x86, 0x35, 0xc4, 0x9d, 0xfc, - 0x27, 0x38, 0x8c, 0x53, 0x69, 0x8e, 0xba, 0x4b, 0x1f, 0x4a, 0x31, 0x70, - 0x41, 0xc5, 0x7d, 0x35, 0xf0, 0xe6, 0xc8, 0x70, 0xc9, 0x83, 0x8e, 0x05, - 0xbe, 0x97, 0x82, 0xb2, 0x59, 0xfc, 0xb4, 0x63, 0x98, 0xa3, 0x3b, 0x17, - 0xdc, 0xe7, 0xa4, 0x30, 0xce, 0xd1, 0x76, 0xc7, 0x42, 0xce, 0x92, 0x1b, - 0xdd, 0xde, 0xa1, 0xdd, 0xeb, 0x88, 0xb4, 0xd0, 0x90, 0xb6, 0xe9, 0x91, - 0x3b, 0xb5, 0x2a, 0x8c, 0xad, 0x48, 0x15, 0xd3, 0x69, 0x46, 0xfe, 0x43, - 0x11, 0xd9, 0x5b, 0x56, 0x66, 0xb1, 0x5f, 0xf4, 0x0f, 0x68, 0xb5, 0x55, - 0x17, 0x5c, 0x41, 0xd7, 0xdc, 0x2d, 0xd2, 0x6a, 0x9c, 0xd8, 0xd0, 0x45, - 0xff, 0xc7, 0x30, 0x81, 0xc8, 0x57, 0xe6, 0x6e, 0x12, 0xd7, 0xa1, 0x6f, - 0x51, 0x9d, 0x0b, 0x7c, 0x00, 0xbd, 0xa7, 0xc5, 0x7e, 0x58, 0x9b, 0x6a, - 0xf3, 0xe6, 0x17, 0x43, 0x89, 0x04, 0xa0, 0xf5, 0x61, 0xa8, 0xf9, 0xff, - 0x5f, 0x9f, 0xa5, 0x4b, 0xa7, 0xdb, 0x60, 0xea, 0xb9, 0x80, 0x5d, 0x1c, - 0x58, 0x2a, 0x60, 0x96, 0x6a, 0xba, 0xc7, 0xf3, 0xfc, 0x13, 0x41, 0x02, - 0x81, 0xc1, 0x00, 0xf3, 0x45, 0x5f, 0x13, 0x38, 0xa4, 0x51, 0x17, 0x3a, - 0xf9, 0x4d, 0x9f, 0x71, 0x98, 0x26, 0x27, 0xfb, 0x81, 0xe6, 0x49, 0x88, - 0x8d, 0x2f, 0xc6, 0x13, 0x41, 0x08, 0xef, 0x8b, 0x7d, 0xec, 0x62, 0x73, - 0x02, 0x73, 0xa8, 0x98, 0x77, 0x4c, 0x46, 0x7c, 0x62, 0xec, 0x9e, 0xa7, - 0xab, 0x19, 0x21, 0x8c, 0x2f, 0xad, 0xb8, 0x17, 0x3b, 0x83, 0x9b, 0x32, - 0xb8, 0xf4, 0x49, 0x70, 0x47, 0x3c, 0x2a, 0xb0, 0x8f, 0xdc, 0x9a, 0xa4, - 0x3e, 0xef, 0x3e, 0xce, 0x43, 0x7e, 0x28, 0xdd, 0x9e, 0x46, 0xf0, 0x28, - 0x86, 0xbf, 0xdd, 0x2f, 0xf7, 0xc6, 0x1c, 0xa0, 0xec, 0x14, 0x54, 0x23, - 0xce, 0x32, 0xd5, 0xc5, 0x77, 0x7f, 0xf0, 0x8c, 0x8b, 0x39, 0x86, 0x9d, - 0x18, 0xb6, 0x2c, 0xc9, 0x65, 0x20, 0xcf, 0x58, 0xeb, 0xe7, 0x21, 0xc3, - 0x49, 0x7e, 0x1e, 0xa7, 0xe0, 0x8a, 0xe4, 0x1f, 0x77, 0x8c, 0x25, 0xfb, - 0x97, 0x05, 0x6b, 0x10, 0xa5, 0xff, 0x00, 0xb9, 0x5b, 0xf4, 0x6f, 0x06, - 0x50, 0xe7, 0xdf, 0xa2, 0x22, 0x71, 0x9f, 0x8c, 0x32, 0x04, 0x68, 0x5e, - 0x89, 0x04, 0x53, 0x99, 0x57, 0xf6, 0x70, 0x7a, 0x7f, 0x4d, 0xfe, 0xd0, - 0xf9, 0xc2, 0x52, 0xb3, 0x0e, 0x81, 0x95, 0xcb, 0xb6, 0x7d, 0x89, 0x46, - 0x04, 0x50, 0xce, 0xf1, 0x3e, 0xb8, 0x75, 0x57, 0xde, 0xa0, 0xf6, 0x5f, - 0xf1, 0x19, 0xeb, 0x02, 0x81, 0xc1, 0x00, 0xe5, 0x9b, 0x47, 0x51, 0xed, - 0x05, 0x0c, 0x94, 0xa4, 0x5b, 0xd0, 0x2d, 0x62, 0x2a, 0x02, 0x76, 0xc9, - 0x77, 0x32, 0x18, 0x8c, 0xc8, 0x85, 0x9a, 0x4e, 0x3b, 0x47, 0x4e, 0xb0, - 0x8f, 0x61, 0x03, 0xc1, 0xf5, 0xe3, 0x57, 0x12, 0xd6, 0xad, 0x42, 0xaf, - 0xe1, 0x37, 0xe2, 0x7a, 0xcf, 0xd7, 0x34, 0xbb, 0xb7, 0xa4, 0xfd, 0xd7, - 0x5a, 0x44, 0x09, 0xa1, 0xdf, 0x7b, 0x26, 0x74, 0xb7, 0x05, 0xf8, 0x46, - 0xd3, 0x33, 0x03, 0x09, 0xc4, 0xb7, 0x71, 0xba, 0x96, 0x55, 0x64, 0xa1, - 0x3f, 0x4f, 0xcb, 0x05, 0x97, 0x87, 0x8c, 0xeb, 0xd6, 0x66, 0x02, 0xe1, - 0x32, 0xed, 0x7b, 0xed, 0xad, 0xb7, 0x99, 0xba, 0x80, 0x36, 0x92, 0xcc, - 0xa9, 0x0a, 0x8a, 0x34, 0x8b, 0x9b, 0x34, 0x3b, 0x50, 0xf5, 0xd0, 0xeb, - 0x49, 0x96, 0xb0, 0xab, 0x10, 0x45, 0x53, 0xeb, 0x63, 0xc3, 0x51, 0x52, - 0xbf, 0xe9, 0xbd, 0x7a, 0x59, 0xe1, 0x3b, 0x62, 0xd7, 0x91, 0x47, 0x31, - 0x4c, 0x9c, 0x31, 0x42, 0x55, 0x88, 0x65, 0xcd, 0x3e, 0x72, 0xf0, 0x04, - 0xd0, 0x57, 0x13, 0x6f, 0x25, 0xde, 0x66, 0xa2, 0xe7, 0x4d, 0x1f, 0xd1, - 0xae, 0x19, 0x60, 0x68, 0xc3, 0xb4, 0xb4, 0x7b, 0xc5, 0x22, 0x8b, 0xf8, - 0x4e, 0xad, 0xc8, 0x8a, 0x40, 0xb8, 0xcc, 0x01, 0xe6, 0x0e, 0xe7, 0xbe, - 0x17, 0x65, 0x02, 0xb5, 0xa8, 0x24, 0x25, 0x02, 0x81, 0xc0, 0x3e, 0x4f, - 0x1c, 0x64, 0xfd, 0xf3, 0x08, 0x5a, 0x1c, 0xde, 0xd2, 0x04, 0xee, 0xc1, - 0x7b, 0xb4, 0x6d, 0xf4, 0xfd, 0x99, 0x04, 0x02, 0xb5, 0xa3, 0xd4, 0x36, - 0xaa, 0x25, 0x40, 0xe3, 0x45, 0xf2, 0x89, 0x66, 0xad, 0x5d, 0x17, 0x80, - 0x26, 0xe7, 0x3e, 0xe0, 0xcf, 0x9e, 0x6b, 0x6f, 0xa5, 0x86, 0x34, 0x33, - 0xda, 0x18, 0xf6, 0xca, 0x65, 0x91, 0x10, 0xd2, 0xd2, 0xaf, 0x24, 0xb4, - 0xfa, 0x32, 0x2c, 0xfb, 0x0c, 0x14, 0x07, 0xd1, 0x9e, 0xd1, 0xc5, 0x5f, - 0x00, 0x27, 0x53, 0x6c, 0x40, 0xdb, 0x2e, 0x66, 0x25, 0x2a, 0x70, 0x28, - 0xd4, 0x73, 0x6c, 0xbc, 0x4b, 0x10, 0xaa, 0x03, 0x1c, 0x7e, 0x28, 0x8f, - 0xcd, 0x13, 0x3d, 0xcc, 0x43, 0x35, 0xb9, 0x73, 0x24, 0xe6, 0x1f, 0xc7, - 0x69, 0x39, 0xf2, 0x9a, 0xa9, 0x9e, 0xba, 0x38, 0x4e, 0xb7, 0x67, 0x64, - 0x59, 0xee, 0xc8, 0x28, 0x84, 0x9b, 0x0d, 0xef, 0xc6, 0x91, 0x7f, 0xb8, - 0x24, 0xb2, 0x78, 0xc7, 0x96, 0xba, 0x01, 0x32, 0x23, 0xd1, 0xe1, 0xe3, - 0x54, 0x9a, 0xfa, 0xfb, 0xac, 0xa9, 0x56, 0xdd, 0x5d, 0x60, 0x54, 0x3c, - 0x75, 0x80, 0xa5, 0xbf, 0x89, 0xa8, 0xa4, 0xb9, 0xf4, 0x0d, 0xde, 0x92, - 0xee, 0x9a, 0x01, 0x8d, 0x82, 0x65, 0xf0, 0xab, 0x16, 0x4f, 0x8a, 0xf6, - 0xf7, 0xa4, 0x06, 0x97, 0x9d, 0x3e, 0xbd, 0xa0, 0x31, 0x75, 0x02, 0x81, - 0xc0, 0x1a, 0xe3, 0x9b, 0x6f, 0x99, 0xbd, 0x5c, 0xa2, 0xcf, 0xb8, 0xbc, - 0xe1, 0x83, 0xbc, 0x7d, 0xbb, 0x61, 0x8e, 0xa6, 0xfc, 0x3f, 0x08, 0x80, - 0xb4, 0xf8, 0x72, 0x72, 0xc0, 0x61, 0x66, 0xf9, 0x2a, 0x92, 0x7d, 0x74, - 0x59, 0x4f, 0x28, 0x7a, 0xf3, 0xf3, 0x5b, 0x01, 0xcb, 0x71, 0x2c, 0x83, - 0xfc, 0x75, 0xfb, 0x64, 0xc4, 0x21, 0x83, 0x3d, 0xb2, 0x8f, 0x15, 0x77, - 0xfb, 0xa1, 0xf1, 0x89, 0x2e, 0x71, 0x44, 0xec, 0x95, 0x6f, 0x80, 0x6d, - 0x27, 0x51, 0x7d, 0xa7, 0x94, 0x78, 0x59, 0xcc, 0xc3, 0x6e, 0xed, 0x36, - 0xff, 0xa6, 0xe2, 0xdd, 0xe1, 0x7a, 0x74, 0x17, 0x61, 0xcb, 0x0c, 0xec, - 0x12, 0x81, 0xc7, 0xe0, 0x1c, 0x43, 0x01, 0x8c, 0xed, 0x70, 0x87, 0xe4, - 0xee, 0x32, 0x00, 0x22, 0x39, 0x8c, 0x44, 0x7a, 0xf4, 0x47, 0xa4, 0x49, - 0x2a, 0x31, 0xc7, 0xe6, 0x28, 0xd0, 0xf3, 0x0e, 0xb1, 0x94, 0xf1, 0x8f, - 0xb1, 0xff, 0xba, 0x55, 0x16, 0x2c, 0x4c, 0xd7, 0x81, 0xe1, 0x4d, 0xd9, - 0x02, 0x6b, 0x0d, 0xe4, 0x31, 0xfd, 0xae, 0x54, 0x74, 0x3f, 0x31, 0x05, - 0x21, 0xa9, 0xf4, 0x42, 0x90, 0xf6, 0x62, 0x58, 0x30, 0x75, 0x34, 0x6e, - 0x26, 0x30, 0xd4, 0x7e, 0x5e, 0x3b, 0xff, 0x22, 0xd4, 0xf8, 0x73, 0xe9, - 0xf0, 0x62, 0x4c, 0x89, 0xf4, 0x53, 0xcb, 0xb3, 0x95, 0xa4, 0xa6, 0x83, - 0x4d, 0x02, 0x81, 0xc1, 0x00, 0xf0, 0x0f, 0xf2, 0x41, 0x51, 0x00, 0xb8, - 0x7d, 0x23, 0xfd, 0xeb, 0xb4, 0xe2, 0x18, 0x20, 0x09, 0x37, 0x77, 0x44, - 0xe3, 0x4b, 0x88, 0xac, 0xab, 0x39, 0x28, 0x9b, 0x50, 0x57, 0xc8, 0x16, - 0xf3, 0xeb, 0x5f, 0x7f, 0xc5, 0x3a, 0x53, 0x70, 0x11, 0x37, 0x6c, 0x50, - 0xc3, 0xc4, 0x13, 0x26, 0x56, 0x31, 0x63, 0x7b, 0x34, 0xd2, 0xde, 0x40, - 0x15, 0xaa, 0xf8, 0x27, 0x5b, 0x79, 0x5b, 0xeb, 0x2c, 0xb0, 0x6d, 0x50, - 0x84, 0x86, 0x75, 0xff, 0x4a, 0x8c, 0x19, 0xa4, 0x1a, 0x54, 0xca, 0x7c, - 0xc7, 0xe5, 0x86, 0xc0, 0xd7, 0xf7, 0xf8, 0xfb, 0x01, 0xf3, 0x30, 0x10, - 0xd6, 0x74, 0x24, 0x64, 0x9f, 0x95, 0x94, 0x25, 0xc9, 0x2c, 0x04, 0x19, - 0x84, 0xea, 0xcc, 0xe9, 0x3e, 0x10, 0x2f, 0xd9, 0x33, 0xf9, 0x4d, 0x08, - 0x55, 0x98, 0xe6, 0x39, 0xfe, 0x27, 0x11, 0x07, 0xb3, 0xb8, 0x66, 0x88, - 0x0a, 0xde, 0x1f, 0x2c, 0x90, 0xbf, 0xc8, 0x44, 0xac, 0xc4, 0xbe, 0x30, - 0x82, 0xa7, 0x5e, 0x11, 0xa0, 0xe7, 0xbd, 0x21, 0xa9, 0x18, 0xf4, 0xe1, - 0x9f, 0x4d, 0x9f, 0x43, 0xd5, 0x2b, 0xe5, 0xdd, 0x96, 0xa4, 0x5c, 0xdc, - 0x28, 0x9b, 0x9e, 0xd9, 0x0d, 0x04, 0xb6, 0x82, 0xe3, 0x75, 0xd1, 0xbb, - 0x4d, 0x2b, 0x49, 0x21, 0xb7, 0x8a, 0x7b, 0x47, 0x81, 0x57, 0x5a, 0x1e, - 0x09, 0xdc, 0xe8, 0xe5, 0x29 -}; - -const size_t kOEMPrivateKeySize_TEST = sizeof(kOEMPrivateKey_TEST); - -const uint8_t kOEMPublicCert_TEST[] = { - 0x30, 0x82, 0x09, 0xff, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, - 0x01, 0x07, 0x02, 0xa0, 0x82, 0x09, 0xf0, 0x30, 0x82, 0x09, 0xec, 0x02, - 0x01, 0x01, 0x31, 0x00, 0x30, 0x0f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, - 0xf7, 0x0d, 0x01, 0x07, 0x01, 0xa0, 0x02, 0x04, 0x00, 0xa0, 0x82, 0x09, - 0xd0, 0x30, 0x82, 0x04, 0x20, 0x30, 0x82, 0x03, 0x08, 0xa0, 0x03, 0x02, - 0x01, 0x02, 0x02, 0x10, 0x72, 0xa8, 0x0e, 0x1d, 0x3e, 0x4c, 0xec, 0x0c, - 0x57, 0xd8, 0xae, 0xf1, 0xe9, 0x43, 0xda, 0x2b, 0x30, 0x0d, 0x06, 0x09, - 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, - 0x81, 0x8e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, - 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, - 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, - 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, - 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, - 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, - 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x33, 0x30, 0x31, 0x06, - 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x20, 0x4f, 0x45, 0x4d, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x3b, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x20, 0x69, 0x64, 0x3a, 0x20, 0x32, 0x30, 0x30, 0x31, 0x30, 0x39, 0x33, - 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x33, 0x31, 0x37, 0x31, 0x31, - 0x30, 0x38, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x33, 0x31, - 0x35, 0x31, 0x31, 0x30, 0x38, 0x30, 0x36, 0x5a, 0x30, 0x70, 0x31, 0x15, - 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x32, 0x30, 0x30, - 0x31, 0x30, 0x39, 0x33, 0x2d, 0x6c, 0x65, 0x61, 0x66, 0x31, 0x0b, 0x30, - 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, - 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, - 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, - 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, - 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, - 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, - 0x6e, 0x65, 0x30, 0x82, 0x01, 0xa2, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, - 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, - 0x8f, 0x00, 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xda, - 0x30, 0x9c, 0xd2, 0xd9, 0xdb, 0xb7, 0x25, 0x86, 0xdc, 0x99, 0x87, 0x91, - 0x40, 0xca, 0x02, 0x76, 0xc4, 0xc6, 0x00, 0xcb, 0x60, 0x8c, 0xb2, 0x01, - 0xde, 0x9d, 0x44, 0x4c, 0x72, 0x42, 0xc2, 0xf1, 0x96, 0x13, 0xa2, 0x15, - 0xb2, 0x9c, 0x09, 0x11, 0x73, 0x96, 0x4e, 0xd3, 0xda, 0xb4, 0xaf, 0xd5, - 0x69, 0x69, 0xd9, 0xbe, 0x19, 0x5e, 0x49, 0x21, 0x01, 0xf7, 0x31, 0xdd, - 0x14, 0xea, 0x41, 0x5e, 0x81, 0xc5, 0x76, 0xff, 0x50, 0xba, 0xa7, 0x0b, - 0x81, 0x22, 0xba, 0x2b, 0x58, 0x7b, 0x5d, 0xb3, 0xaf, 0xd1, 0xb4, 0x66, - 0x8e, 0x70, 0x55, 0xd8, 0x4d, 0x47, 0xb7, 0x00, 0x2c, 0x52, 0x46, 0x33, - 0xa1, 0x5f, 0xca, 0xd8, 0xb1, 0xc5, 0x04, 0x0e, 0xb7, 0xd8, 0x0a, 0xca, - 0x7c, 0x2a, 0x11, 0x3d, 0xec, 0x7f, 0x4c, 0xea, 0xaa, 0x8e, 0x1d, 0xef, - 0x9e, 0x2b, 0x9e, 0x79, 0x09, 0x7e, 0xf4, 0xd0, 0xa3, 0x58, 0xb5, 0x4e, - 0x1c, 0xfb, 0x07, 0x17, 0xc4, 0xef, 0x30, 0xa3, 0x91, 0xb6, 0x5f, 0xf8, - 0xdb, 0x05, 0x73, 0x85, 0x9b, 0xe1, 0x16, 0xf1, 0x8e, 0xe4, 0x9f, 0xe7, - 0x54, 0xcf, 0x52, 0x84, 0xe7, 0x71, 0xe7, 0x38, 0x67, 0x8e, 0x96, 0x59, - 0x9b, 0x97, 0xa2, 0xc0, 0x01, 0xd5, 0x41, 0x36, 0xfa, 0xc1, 0x61, 0x96, - 0x6c, 0x38, 0x7d, 0xdd, 0x1c, 0x24, 0x2e, 0x57, 0x67, 0x7c, 0x70, 0xd1, - 0x8a, 0x8a, 0xe2, 0x6f, 0x66, 0xd2, 0xaa, 0x3e, 0xfa, 0x4c, 0x4a, 0x68, - 0xba, 0x86, 0x6e, 0x33, 0xfe, 0x30, 0xd2, 0xf4, 0x96, 0x58, 0xe2, 0x35, - 0x94, 0x4f, 0x11, 0xc7, 0x0a, 0x21, 0xe5, 0xd4, 0x1a, 0x3c, 0xfd, 0x82, - 0xbb, 0x34, 0x21, 0xdb, 0x2f, 0xd8, 0xd1, 0xbe, 0x38, 0xe8, 0x47, 0x45, - 0x04, 0x27, 0xb0, 0x19, 0x65, 0x6f, 0x55, 0xcd, 0x56, 0x3a, 0xcc, 0xc1, - 0xaf, 0xce, 0x59, 0x2e, 0xe6, 0x89, 0x24, 0x48, 0x94, 0xc8, 0x73, 0x45, - 0xc8, 0xe5, 0x1d, 0xe1, 0xf8, 0x7d, 0x88, 0xe5, 0x07, 0x42, 0xb2, 0x80, - 0x17, 0xf6, 0x67, 0x2a, 0x33, 0xa0, 0xca, 0x81, 0x0e, 0xc4, 0x99, 0x93, - 0x02, 0x8c, 0x90, 0x1d, 0x46, 0xad, 0x61, 0xec, 0xca, 0xdd, 0x8e, 0x8b, - 0x9f, 0x32, 0xab, 0xbf, 0xfa, 0xa6, 0x28, 0xda, 0x63, 0xa2, 0xf0, 0x20, - 0x52, 0x26, 0x06, 0x05, 0x59, 0xe1, 0x4a, 0x8d, 0x5e, 0x6a, 0x65, 0xd8, - 0x8e, 0x6e, 0x49, 0xa4, 0xa8, 0xc0, 0xba, 0x7b, 0x21, 0x31, 0x7a, 0xd1, - 0xb5, 0x46, 0x9e, 0xa5, 0x45, 0xeb, 0xdf, 0x38, 0xc4, 0x1e, 0x10, 0xc6, - 0xb6, 0x83, 0x46, 0x96, 0x63, 0xe5, 0xef, 0x7c, 0xdb, 0x65, 0x3e, 0xec, - 0x42, 0x00, 0x71, 0x78, 0x83, 0xfc, 0x73, 0x4f, 0x4e, 0xb9, 0x01, 0x80, - 0xd4, 0x7d, 0xf2, 0x72, 0x8d, 0x41, 0x7b, 0xee, 0xb5, 0xca, 0xf7, 0x02, - 0x03, 0x01, 0x00, 0x01, 0xa3, 0x17, 0x30, 0x15, 0x30, 0x13, 0x06, 0x0a, - 0x2b, 0x06, 0x01, 0x04, 0x01, 0xd6, 0x79, 0x04, 0x01, 0x01, 0x04, 0x05, - 0x02, 0x03, 0x1e, 0x88, 0xc5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, - 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, - 0x00, 0x17, 0x78, 0x3e, 0x21, 0x3a, 0x55, 0x67, 0xdc, 0xa6, 0x41, 0x46, - 0xcd, 0x41, 0x8f, 0x4d, 0x0c, 0x5f, 0xaa, 0x4c, 0x6d, 0xcc, 0xa1, 0xed, - 0x69, 0x9a, 0x59, 0xa0, 0xc1, 0x10, 0x9e, 0x96, 0x2b, 0x2f, 0x36, 0xfb, - 0x82, 0xc9, 0x5f, 0x71, 0x76, 0x00, 0x38, 0x8f, 0x32, 0xed, 0xec, 0x41, - 0x4a, 0x3b, 0x4e, 0x3b, 0x2f, 0xf9, 0x1e, 0x04, 0xdc, 0xc0, 0x14, 0x55, - 0xec, 0xdb, 0xba, 0x50, 0x6f, 0x0e, 0xc1, 0xec, 0xde, 0x5e, 0xf4, 0xa0, - 0x58, 0x9e, 0x41, 0x72, 0xbc, 0xb2, 0x1f, 0xb5, 0x7e, 0xc0, 0xa8, 0xb2, - 0xf4, 0xe5, 0xe6, 0x67, 0x99, 0x6b, 0x90, 0xbe, 0xd8, 0x14, 0x7a, 0x9a, - 0xbf, 0x7d, 0x3d, 0xdf, 0xfb, 0xb3, 0x88, 0x3e, 0x62, 0x1f, 0xef, 0xd0, - 0xc7, 0xb3, 0xfe, 0xde, 0x4e, 0x85, 0x15, 0xca, 0xaf, 0x39, 0xc8, 0x5c, - 0x47, 0x54, 0x48, 0x38, 0x97, 0x6c, 0x8c, 0x98, 0x55, 0x22, 0x43, 0x45, - 0xf9, 0xb5, 0x6c, 0x84, 0x32, 0xcb, 0x01, 0x1c, 0x3e, 0x94, 0xb1, 0x57, - 0x47, 0x8b, 0xcd, 0x26, 0x78, 0xa2, 0x5f, 0x88, 0x24, 0xb3, 0x2b, 0xb4, - 0x4d, 0x04, 0xb2, 0xbc, 0x84, 0x3e, 0x95, 0x41, 0xd7, 0x6a, 0x0d, 0x11, - 0x26, 0x96, 0x99, 0x14, 0xd8, 0x2c, 0x9a, 0xdb, 0x92, 0x95, 0xe5, 0x92, - 0x07, 0x55, 0xf6, 0x1b, 0x8c, 0x55, 0x87, 0x58, 0xe0, 0xd1, 0x39, 0xf3, - 0x91, 0x41, 0x32, 0x83, 0x0d, 0x06, 0x97, 0x28, 0x7d, 0x3b, 0x4d, 0x8d, - 0x26, 0xb4, 0x8c, 0x9b, 0x0a, 0xd2, 0x09, 0x8d, 0xd2, 0xa9, 0xbc, 0x54, - 0xad, 0xb4, 0x7a, 0x6c, 0xa4, 0xd4, 0x26, 0xea, 0xc7, 0xf1, 0x56, 0x9e, - 0xd6, 0xe0, 0xae, 0xc9, 0x40, 0x6f, 0x22, 0x23, 0x36, 0xaa, 0xb4, 0x01, - 0x65, 0xc6, 0x22, 0x65, 0x4e, 0x07, 0xf0, 0xd6, 0xe6, 0xb4, 0xa1, 0xb3, - 0xd6, 0x69, 0xeb, 0xd9, 0x26, 0x30, 0x82, 0x05, 0xa8, 0x30, 0x82, 0x03, - 0x90, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x11, 0x00, 0xe5, 0xc7, 0xfc, - 0x08, 0x78, 0xc3, 0x6d, 0x1d, 0xec, 0xff, 0x0b, 0xe7, 0xb2, 0xca, 0xb1, - 0x89, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x0b, 0x05, 0x00, 0x30, 0x7d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, - 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, - 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, - 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, - 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, - 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, - 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, - 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x19, 0x77, 0x69, - 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, - 0x65, 0x6d, 0x2d, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x64, 0x65, 0x76, 0x30, - 0x1e, 0x17, 0x0d, 0x31, 0x37, 0x30, 0x33, 0x31, 0x37, 0x30, 0x30, 0x35, - 0x37, 0x32, 0x34, 0x5a, 0x17, 0x0d, 0x32, 0x37, 0x30, 0x33, 0x31, 0x35, - 0x30, 0x30, 0x35, 0x37, 0x32, 0x34, 0x5a, 0x30, 0x81, 0x8e, 0x31, 0x0b, - 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, - 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, 0x57, 0x61, - 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, 0x6b, 0x6c, - 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0a, - 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, 0x30, 0x0f, - 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, 0x65, 0x76, - 0x69, 0x6e, 0x65, 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x03, - 0x0c, 0x2a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x4f, 0x45, 0x4d, - 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x3b, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x64, 0x3a, - 0x20, 0x32, 0x30, 0x30, 0x31, 0x30, 0x39, 0x33, 0x30, 0x82, 0x01, 0x22, - 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, - 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, - 0x02, 0x82, 0x01, 0x01, 0x00, 0xa5, 0x45, 0x13, 0xf2, 0xb2, 0xcb, 0x4b, - 0x0f, 0xb4, 0x44, 0x25, 0x9c, 0x8a, 0x68, 0x54, 0xd5, 0x45, 0x1e, 0x15, - 0x89, 0x5b, 0xb8, 0xce, 0xda, 0x5a, 0x42, 0xe6, 0x9a, 0x8c, 0xc1, 0xcb, - 0xe8, 0xc5, 0xf5, 0x8f, 0x49, 0x0e, 0x02, 0xef, 0x5e, 0x97, 0x1a, 0x91, - 0xa4, 0x94, 0xc3, 0x50, 0x13, 0xe5, 0x13, 0xb7, 0x7f, 0x26, 0x53, 0x19, - 0xb0, 0x37, 0xa5, 0xef, 0xe6, 0x2a, 0x39, 0xdc, 0x93, 0x37, 0xe2, 0x3d, - 0x7f, 0xcb, 0x4b, 0x93, 0xa2, 0xc3, 0x69, 0x78, 0xc9, 0x01, 0xfa, 0x68, - 0x3b, 0xe0, 0xe2, 0x22, 0x6c, 0xeb, 0xe4, 0x8a, 0xa8, 0x3e, 0xf5, 0x20, - 0x82, 0xa8, 0x62, 0x68, 0x59, 0x78, 0x24, 0xde, 0xef, 0x47, 0x43, 0xb1, - 0x6c, 0x38, 0x29, 0xd3, 0x69, 0x3f, 0xae, 0x35, 0x57, 0x75, 0x80, 0xc9, - 0x21, 0xe7, 0x01, 0xb9, 0x54, 0x8b, 0x6e, 0x4e, 0x2e, 0x5a, 0x5b, 0x77, - 0xa4, 0x22, 0xc2, 0x7b, 0x95, 0xb9, 0x39, 0x2c, 0xbd, 0xc2, 0x1e, 0x02, - 0xa6, 0xb2, 0xbc, 0x0f, 0x7a, 0xcb, 0xdc, 0xbc, 0xbc, 0x90, 0x66, 0xe3, - 0xca, 0x46, 0x53, 0x3e, 0x98, 0xff, 0x2e, 0x78, 0x9f, 0xd3, 0xa1, 0x12, - 0x93, 0x66, 0x7d, 0xcc, 0x94, 0x6b, 0xec, 0x19, 0x0e, 0x20, 0x45, 0x22, - 0x57, 0x6d, 0x9e, 0xd0, 0x89, 0xf2, 0xa9, 0x34, 0xdc, 0xab, 0xa5, 0x73, - 0x47, 0x38, 0xe3, 0x7f, 0x98, 0x3a, 0x61, 0xae, 0x6c, 0x4d, 0xf2, 0x31, - 0x90, 0xcb, 0x83, 0xc1, 0xee, 0xb4, 0xf2, 0x9a, 0x28, 0x5f, 0xbb, 0x7d, - 0x89, 0xdf, 0xa2, 0x31, 0xb6, 0x1d, 0x39, 0x2b, 0x70, 0xbf, 0x1e, 0xad, - 0xe1, 0x74, 0x94, 0x1d, 0xf8, 0xc5, 0x1a, 0x8d, 0x13, 0x45, 0xf0, 0x6a, - 0x80, 0x0c, 0x5d, 0xbb, 0x46, 0x8a, 0x43, 0xd0, 0xff, 0x21, 0x39, 0x57, - 0x53, 0x5b, 0x51, 0xf8, 0xa2, 0x8f, 0x7f, 0x27, 0xc7, 0x02, 0x03, 0x01, - 0x00, 0x01, 0xa3, 0x82, 0x01, 0x0f, 0x30, 0x82, 0x01, 0x0b, 0x30, 0x12, - 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, - 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, - 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x1d, - 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xe8, 0xe9, 0xac, - 0x16, 0x5c, 0x5e, 0xb2, 0xe8, 0xeb, 0xff, 0x57, 0x27, 0x20, 0x08, 0x72, - 0x63, 0x9b, 0xe5, 0xb5, 0x16, 0x30, 0x81, 0xb0, 0x06, 0x03, 0x55, 0x1d, - 0x23, 0x04, 0x81, 0xa8, 0x30, 0x81, 0xa5, 0x80, 0x14, 0x7e, 0x03, 0xe5, - 0x06, 0x62, 0x3b, 0x2c, 0x21, 0xa5, 0x52, 0xa1, 0xe8, 0xee, 0x2c, 0xd2, - 0x52, 0xe4, 0xf6, 0xbb, 0x6e, 0xa1, 0x81, 0x81, 0xa4, 0x7f, 0x30, 0x7d, - 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, - 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0a, - 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x74, 0x6f, 0x6e, 0x31, 0x11, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x08, 0x4b, 0x69, 0x72, - 0x6b, 0x6c, 0x61, 0x6e, 0x64, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, - 0x04, 0x0a, 0x0c, 0x06, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x31, 0x11, - 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x57, 0x69, 0x64, - 0x65, 0x76, 0x69, 0x6e, 0x65, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, - 0x04, 0x03, 0x0c, 0x19, 0x77, 0x69, 0x64, 0x65, 0x76, 0x69, 0x6e, 0x65, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x65, 0x6d, 0x2d, 0x72, 0x6f, 0x6f, - 0x74, 0x2d, 0x64, 0x65, 0x76, 0x82, 0x09, 0x00, 0x95, 0xd7, 0xb5, 0xfc, - 0xcf, 0x8e, 0xcb, 0x51, 0x30, 0x13, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, - 0x01, 0xd6, 0x79, 0x04, 0x01, 0x01, 0x04, 0x05, 0x02, 0x03, 0x1e, 0x88, - 0xc5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, - 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01, 0x00, 0x73, 0x48, 0x8c, - 0x6f, 0x11, 0xfe, 0x4b, 0x27, 0xca, 0xdd, 0x57, 0xfe, 0xcb, 0x27, 0xca, - 0xaf, 0x1c, 0x78, 0x4c, 0x95, 0x16, 0x2a, 0x11, 0x28, 0x9e, 0x2e, 0x93, - 0xa5, 0x1f, 0x3f, 0x80, 0x8d, 0x44, 0xc6, 0xaa, 0x12, 0x25, 0x6c, 0x6c, - 0xe3, 0xa7, 0x6d, 0xa3, 0xe1, 0xf5, 0x6a, 0x69, 0xb1, 0x18, 0x89, 0x0e, - 0x61, 0x4a, 0xa5, 0x5c, 0x0b, 0xf8, 0x7d, 0x2d, 0x8e, 0xbc, 0xf4, 0x2e, - 0x61, 0xa6, 0xf9, 0x32, 0xf8, 0x47, 0x8b, 0xf5, 0x3d, 0xd9, 0xb7, 0x3b, - 0x7d, 0xc6, 0xe5, 0x14, 0x8f, 0xeb, 0x72, 0x9e, 0x2b, 0xfc, 0x12, 0xef, - 0xa1, 0x26, 0xce, 0xad, 0xd5, 0x5c, 0x74, 0x50, 0x76, 0xf4, 0xd1, 0xac, - 0xdd, 0x09, 0x37, 0xde, 0xa8, 0xcd, 0x0b, 0x35, 0x89, 0x19, 0x66, 0xce, - 0x6b, 0x79, 0x1a, 0x86, 0x12, 0x7e, 0x60, 0xb4, 0x1c, 0x86, 0x34, 0x39, - 0xe5, 0x88, 0x55, 0x2b, 0x28, 0xd1, 0x7c, 0x11, 0x23, 0xa6, 0xef, 0x24, - 0xcb, 0x3b, 0xd2, 0x07, 0xe2, 0x54, 0x88, 0x41, 0xdc, 0x16, 0x16, 0x74, - 0x8a, 0x81, 0x2b, 0x53, 0x42, 0x17, 0xef, 0x87, 0xdd, 0x27, 0x8c, 0x23, - 0xcd, 0x2d, 0x2d, 0xde, 0x9c, 0x1a, 0x0e, 0xda, 0xd2, 0xbe, 0xb0, 0x8d, - 0x9d, 0x2b, 0x46, 0x54, 0x97, 0x8d, 0x24, 0x4f, 0x3e, 0x92, 0x25, 0xf6, - 0x04, 0xb7, 0x69, 0x5d, 0x1c, 0x80, 0x0e, 0x30, 0x9b, 0x37, 0xc6, 0xc1, - 0x6b, 0x1a, 0xda, 0xfe, 0x10, 0xcd, 0x0d, 0xa7, 0x56, 0xa0, 0x31, 0x97, - 0xe6, 0xa1, 0xb5, 0x6f, 0x40, 0x1a, 0xcc, 0x01, 0x52, 0xbc, 0x72, 0xfd, - 0x0a, 0x83, 0x8a, 0x2a, 0xea, 0xad, 0xc5, 0x1e, 0x12, 0x56, 0x23, 0x52, - 0xca, 0x35, 0xdb, 0xef, 0x45, 0x8c, 0x31, 0xa3, 0x1f, 0xe2, 0xb5, 0x9c, - 0xfe, 0xb8, 0x44, 0x3a, 0x09, 0xe1, 0x9e, 0x32, 0x2f, 0x7f, 0xac, 0x70, - 0x80, 0xc4, 0xa7, 0x29, 0x02, 0xad, 0xeb, 0xbd, 0x5d, 0x92, 0xbc, 0x85, - 0x6c, 0x10, 0x9b, 0x5f, 0x07, 0xfc, 0x94, 0x4d, 0xff, 0xa6, 0x37, 0x87, - 0x9e, 0x50, 0x33, 0x66, 0x29, 0xfd, 0x51, 0x62, 0x45, 0x5c, 0x45, 0x75, - 0xcd, 0xf1, 0x9b, 0x42, 0x0d, 0xa7, 0xe9, 0x91, 0xd6, 0x7c, 0x23, 0x5b, - 0xa1, 0xe8, 0x7b, 0xaf, 0xba, 0x75, 0x13, 0x24, 0x6e, 0x12, 0xf5, 0x44, - 0x29, 0x75, 0x22, 0xdc, 0xe5, 0xfa, 0xa6, 0x25, 0xa2, 0x76, 0x45, 0xf7, - 0xf9, 0x96, 0x73, 0x22, 0xd1, 0xf1, 0xe8, 0xd5, 0xa3, 0x46, 0x7f, 0x72, - 0x2c, 0x26, 0x61, 0x68, 0x89, 0xc9, 0x0a, 0xc5, 0x20, 0x78, 0x5b, 0xaa, - 0x59, 0x8d, 0x3e, 0x26, 0x75, 0x3b, 0x12, 0xba, 0xae, 0x5a, 0x42, 0x78, - 0x3f, 0xd7, 0xb2, 0x7f, 0x49, 0x68, 0xa3, 0xc8, 0xaa, 0xdb, 0xc4, 0x41, - 0x89, 0x9a, 0x12, 0xa4, 0x1c, 0x87, 0x25, 0x5c, 0x97, 0x33, 0x92, 0xd8, - 0x5f, 0x83, 0x2d, 0x47, 0x71, 0x86, 0x91, 0xbc, 0x36, 0x95, 0xb2, 0x72, - 0x4a, 0x9c, 0x67, 0xad, 0x76, 0x26, 0xda, 0x0b, 0x68, 0x49, 0x04, 0x29, - 0x0a, 0x4a, 0xa4, 0x9a, 0x8f, 0xd9, 0xfb, 0x39, 0xdc, 0x38, 0xa1, 0xf4, - 0x00, 0x6f, 0x6f, 0x9e, 0x99, 0x03, 0x7c, 0x8c, 0xc5, 0x3f, 0xfc, 0x63, - 0x9a, 0x4e, 0xd8, 0x21, 0x05, 0xd2, 0x2d, 0x9e, 0x07, 0xdf, 0xf6, 0x20, - 0xb8, 0xe7, 0xc2, 0x40, 0x49, 0x69, 0x76, 0xf9, 0xff, 0xeb, 0xb8, 0x27, - 0x94, 0x72, 0x37, 0x63, 0x8d, 0x3a, 0x2d, 0x4f, 0x57, 0x11, 0x5f, 0x3c, - 0x62, 0xa5, 0x39, 0x4d, 0x01, 0x3f, 0x58, 0xbf, 0x59, 0xb3, 0xd9, 0xa2, - 0xd7, 0x3a, 0xdd, 0x2a, 0x65, 0x97, 0x9b, 0xa7, 0x6d, 0xc0, 0x6b, 0x4a, - 0x46, 0xfe, 0x55, 0x46, 0x27, 0x75, 0x2c, 0x0a, 0x8b, 0xc4, 0xf9, 0x1e, - 0x20, 0x5a, 0xbf, 0xf7, 0x88, 0x31, 0x00 -}; - -const size_t kOEMPublicCertSize_TEST = sizeof(kOEMPublicCert_TEST); +namespace wvoec_mock { // Refer to the following in main modules -const uint32_t kOEMSystemId = kOEMSystemId_TEST; +extern const uint32_t kOEMSystemId; -const uint8_t* kOEMPrivateKey = kOEMPrivateKey_TEST; -const uint8_t* kOEMPublicCert = kOEMPublicCert_TEST; +extern const uint8_t* kOEMPrivateKey; +extern const uint8_t* kOEMPublicCert; -const size_t kOEMPrivateKeySize = kOEMPrivateKeySize_TEST; -const size_t kOEMPublicCertSize = kOEMPublicCertSize_TEST; +extern const size_t kOEMPrivateKeySize; +extern const size_t kOEMPublicCertSize; -} // namespace +} // namespace wvoec_mock #endif // OEM_CERT_H_ diff --git a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_device_properties.cpp b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_device_properties.cpp index 6d975147..f3e9d336 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_device_properties.cpp +++ b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_device_properties.cpp @@ -2,6 +2,9 @@ // // Mock implementation of OEMCrypto APIs // + +#if !defined(PROVISIONING_30) + #include "oemcrypto_engine_mock.h" namespace wvoec_mock { @@ -11,3 +14,5 @@ CryptoEngine* CryptoEngine::MakeCryptoEngine(wvcdm::FileSystem* file_system) { } } // namespace wvoec_mock + +#endif // !defined(PROVISIONING_30) diff --git a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_device_properties_prov30.cpp b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_device_properties_prov30.cpp index 815ccb03..3ca5aba2 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_device_properties_prov30.cpp +++ b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_device_properties_prov30.cpp @@ -5,6 +5,9 @@ // 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. + +#if defined(PROVISIONING_30) + #include "oemcrypto_engine_mock.h" #include @@ -63,3 +66,5 @@ CryptoEngine* CryptoEngine::MakeCryptoEngine(wvcdm::FileSystem* file_system) { } } // namespace wvoec_mock + +#endif // defined(PROVISIONING_30) diff --git a/libwvdrmengine/oemcrypto/test/oec_session_util.cpp b/libwvdrmengine/oemcrypto/test/oec_session_util.cpp index a81071b9..41810900 100644 --- a/libwvdrmengine/oemcrypto/test/oec_session_util.cpp +++ b/libwvdrmengine/oemcrypto/test/oec_session_util.cpp @@ -754,7 +754,8 @@ bool Session::VerifyPSSSignature(EVP_PKEY* pkey, const uint8_t* message, goto err; } - if (EVP_PKEY_CTX_set_signature_md(pctx, EVP_sha1()) != 1) { + if (EVP_PKEY_CTX_set_signature_md(pctx, + const_cast(EVP_sha1())) != 1) { LOGE("EVP_PKEY_CTX_set_signature_md failed in VerifyPSSSignature"); goto err; }