//////////////////////////////////////////////////////////////////////////////// // Copyright 2016 Google LLC. // // This software is licensed under the terms defined in the Widevine Master // License Agreement. For a copy of this agreement, please contact // widevine-licensing@google.com. //////////////////////////////////////////////////////////////////////////////// #include "common/client_id_util.h" #include "glog/logging.h" #include "common/aes_cbc_util.h" #include "common/drm_service_certificate.h" #include "common/error_space.h" #include "protos/public/errors.pb.h" namespace widevine { void AddClientInfo(ClientIdentification* client_id, absl::string_view name, absl::string_view value) { ClientIdentification_NameValue* nv = client_id->add_client_info(); nv->set_name(std::string(name)); nv->set_value(std::string(value)); } bool SetClientInfo(ClientIdentification* client_id, absl::string_view name, absl::string_view value) { int n = client_id->client_info_size(); for (int i = 0; i < n; i++) { if (client_id->client_info(i).name() == name) { client_id->mutable_client_info(i)->set_value(std::string(value)); return true; } } AddClientInfo(client_id, name, value); return false; } std::string GetClientInfo(const ClientIdentification& client_id, absl::string_view name) { return GetClientInfo(client_id, name, std::string()); } std::string GetClientInfo(const ClientIdentification& client_id, absl::string_view name, const std::string& default_value) { for (const auto& nv : client_id.client_info()) { if (nv.name() == name) { return nv.value(); } } return default_value; } util::Status DecryptEncryptedClientIdentification( const EncryptedClientIdentification& encrypted_client_id, ClientIdentification* client_id) { return DrmServiceCertificate::DecryptClientIdentification(encrypted_client_id, client_id); } util::Status DecryptEncryptedClientIdentification( const EncryptedClientIdentification& encrypted_client_id, const std::string& privacy_key, ClientIdentification* client_id) { DCHECK(client_id); if (!encrypted_client_id.has_encrypted_client_id() || encrypted_client_id.encrypted_client_id().empty()) { return util::Status(error_space, INVALID_ENCRYPTED_CLIENT_IDENTIFICATION, "missing-encrypted-client-id"); } if (!encrypted_client_id.has_encrypted_client_id_iv() || encrypted_client_id.encrypted_client_id_iv().empty()) { return util::Status(error_space, INVALID_ENCRYPTED_CLIENT_IDENTIFICATION, "missing-encrypted-client-id-iv"); } std::string serialized_client_id(crypto_util::DecryptAesCbc( privacy_key, encrypted_client_id.encrypted_client_id_iv(), encrypted_client_id.encrypted_client_id())); if (serialized_client_id.empty()) { return util::Status(error_space, INVALID_ENCRYPTED_CLIENT_IDENTIFICATION, "client-id-decryption-failed"); } if (!client_id->ParseFromString(serialized_client_id)) { return util::Status(error_space, INVALID_ENCRYPTED_CLIENT_IDENTIFICATION, "client-id-parse-failed"); } return util::OkStatus(); } } // namespace widevine