Index: media/cdm/json_web_key.cc |
diff --git a/media/cdm/json_web_key.cc b/media/cdm/json_web_key.cc |
index f60c6f5b10267e2d775f8a9c65e1bf3a8b942476..0576f369009caa59fc6ab40c41982ad68f54d81c 100644 |
--- a/media/cdm/json_web_key.cc |
+++ b/media/cdm/json_web_key.cc |
@@ -102,21 +102,59 @@ static std::string ShortenTo64Characters(const std::string& input) { |
return escaped_str.substr(0, 61).append("..."); |
} |
+static scoped_ptr<base::DictionaryValue> CreateJSONDictionary( |
+ const uint8* key, |
+ int key_length, |
+ const uint8* key_id, |
+ int key_id_length) { |
+ scoped_ptr<base::DictionaryValue> jwk(new base::DictionaryValue()); |
+ jwk->SetString(kKeyTypeTag, kKeyTypeOct); |
+ jwk->SetString(kKeyTag, EncodeBase64Url(key, key_length)); |
+ jwk->SetString(kKeyIdTag, EncodeBase64Url(key_id, key_id_length)); |
+ return jwk.Pass(); |
+} |
+ |
std::string GenerateJWKSet(const uint8* key, int key_length, |
const uint8* key_id, int key_id_length) { |
- // Both |key| and |key_id| need to be base64 encoded strings in the JWK. |
- std::string key_base64 = EncodeBase64Url(key, key_length); |
- std::string key_id_base64 = EncodeBase64Url(key_id, key_id_length); |
- |
// Create the JWK, and wrap it into a JWK Set. |
- scoped_ptr<base::DictionaryValue> jwk(new base::DictionaryValue()); |
- jwk->SetString(kKeyTypeTag, kKeyTypeOct); |
- jwk->SetString(kKeyTag, key_base64); |
- jwk->SetString(kKeyIdTag, key_id_base64); |
scoped_ptr<base::ListValue> list(new base::ListValue()); |
- list->Append(jwk.release()); |
+ list->Append( |
+ CreateJSONDictionary(key, key_length, key_id, key_id_length).release()); |
+ base::DictionaryValue jwk_set; |
+ jwk_set.Set(kKeysTag, list.release()); |
+ |
+ // Finally serialize |jwk_set| into a string and return it. |
+ std::string serialized_jwk; |
+ JSONStringValueSerializer serializer(&serialized_jwk); |
+ serializer.Serialize(jwk_set); |
+ return serialized_jwk; |
+} |
+ |
+std::string GenerateJWKSet(const KeyIdAndKeyPairs& keys, |
+ MediaKeys::SessionType session_type) { |
+ scoped_ptr<base::ListValue> list(new base::ListValue()); |
+ for (const auto& key_pair : keys) { |
+ list->Append(CreateJSONDictionary( |
+ reinterpret_cast<const uint8*>(key_pair.second.data()), |
+ key_pair.second.length(), |
+ reinterpret_cast<const uint8*>(key_pair.first.data()), |
+ key_pair.first.length()) |
+ .release()); |
+ } |
+ |
base::DictionaryValue jwk_set; |
jwk_set.Set(kKeysTag, list.release()); |
+ switch (session_type) { |
+ case MediaKeys::TEMPORARY_SESSION: |
+ jwk_set.SetString(kTypeTag, kTemporarySession); |
+ break; |
+ case MediaKeys::PERSISTENT_LICENSE_SESSION: |
+ jwk_set.SetString(kTypeTag, kPersistentLicenseSession); |
+ break; |
+ case MediaKeys::PERSISTENT_RELEASE_MESSAGE_SESSION: |
+ jwk_set.SetString(kTypeTag, kPersistentReleaseMessageSession); |
+ break; |
+ } |
// Finally serialize |jwk_set| into a string and return it. |
std::string serialized_jwk; |