Index: media/cdm/json_web_key_unittest.cc |
diff --git a/media/cdm/json_web_key_unittest.cc b/media/cdm/json_web_key_unittest.cc |
index 49ea32bd4568a47f9a216e5fe95515c74d3e5579..2c558b2784a8e4716a5f336aa792602671b8827b 100644 |
--- a/media/cdm/json_web_key_unittest.cc |
+++ b/media/cdm/json_web_key_unittest.cc |
@@ -71,30 +71,45 @@ TEST_F(JSONWebKeyTest, GenerateJWKSet) { |
const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; |
- EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", |
- GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); |
EXPECT_EQ( |
- "{\"keys\":[{\"k\":\"AQIDBA\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}]}", |
+ "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":" |
+ "\"oct\"}]}", |
+ GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); |
+ EXPECT_EQ( |
+ "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQIDBA\",\"kid\":\"AQIDBA\"," |
+ "\"kty\":\"oct\"}]}", |
GenerateJWKSet(data2, arraysize(data2), data2, arraysize(data2))); |
- EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}]}", |
- GenerateJWKSet(data1, arraysize(data1), data2, arraysize(data2))); |
- EXPECT_EQ("{\"keys\":[{\"k\":\"AQIDBA\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", |
- GenerateJWKSet(data2, arraysize(data2), data1, arraysize(data1))); |
EXPECT_EQ( |
- "{\"keys\":[{\"k\":\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kid\":" |
+ "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQIDBA\",\"kty\":" |
+ "\"oct\"}]}", |
+ GenerateJWKSet(data1, arraysize(data1), data2, arraysize(data2))); |
+ EXPECT_EQ( |
+ "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQIDBA\",\"kid\":\"AQI\",\"kty\":" |
+ "\"oct\"}]}", |
+ GenerateJWKSet(data2, arraysize(data2), data1, arraysize(data1))); |
+ EXPECT_EQ( |
+ "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kid\":" |
"\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kty\":\"oct\"}]}", |
GenerateJWKSet(data3, arraysize(data3), data3, arraysize(data3))); |
} |
-TEST_F(JSONWebKeyTest, ExtractJWKKeys) { |
- // Try a simple JWK key (i.e. not in a set) |
- const std::string kJwkSimple = |
+TEST_F(JSONWebKeyTest, ExtractValidJWKKeys) { |
+ // Try an empty 'keys' dictionary. |
+ ExtractJWKKeysAndExpect("{ \"keys\": [] }", true, 0); |
+ |
+ // Try a key list with one entry. |
+ const std::string kJwksOneEntry = |
"{" |
- " \"kty\": \"oct\"," |
- " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
- " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
+ " \"keys\": [" |
+ " {" |
+ " \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
+ " }" |
+ " ]" |
"}"; |
- ExtractJWKKeysAndExpect(kJwkSimple, false, 0); |
+ ExtractJWKKeysAndExpect(kJwksOneEntry, true, 1); |
// Try a key list with multiple entries. |
const std::string kJwksMultipleEntries = |
@@ -102,11 +117,13 @@ TEST_F(JSONWebKeyTest, ExtractJWKKeys) { |
" \"keys\": [" |
" {" |
" \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
" \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
" \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
" }," |
" {" |
" \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
" \"kid\": \"JCUmJygpKissLS4vMA\"," |
" \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" |
" }" |
@@ -121,6 +138,38 @@ TEST_F(JSONWebKeyTest, ExtractJWKKeys) { |
"\",\"foo\":\"bar\"}]}\n\n"; |
ExtractJWKKeysAndExpect(kJwksNoSpaces, true, 1); |
+ // Try a list with multiple keys with the same kid. |
+ const std::string kJwksDuplicateKids = |
+ "{" |
+ " \"keys\": [" |
+ " {" |
+ " \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"JCUmJygpKissLS4vMA\"," |
+ " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
+ " }," |
+ " {" |
+ " \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"JCUmJygpKissLS4vMA\"," |
+ " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" |
+ " }" |
+ " ]" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); |
+} |
+ |
+TEST_F(JSONWebKeyTest, ExtractInvalidJWKKeys) { |
+ // Try a simple JWK key (i.e. not in a set) |
+ const std::string kJwkSimple = |
+ "{" |
+ " \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwkSimple, false, 0); |
+ |
// Try some non-ASCII characters. |
ExtractJWKKeysAndExpect( |
"This is not ASCII due to \xff\xfe\xfd in it.", false, 0); |
@@ -143,9 +192,6 @@ TEST_F(JSONWebKeyTest, ExtractJWKKeys) { |
// Try an empty dictionary. |
ExtractJWKKeysAndExpect("{ }", false, 0); |
- // Try an empty 'keys' dictionary. |
- ExtractJWKKeysAndExpect("{ \"keys\": [] }", true, 0); |
jrummell
2014/12/23 00:41:20
Why did you remove this test?
xhwang
2014/12/23 00:54:33
It's move to the "valid test" (l.98 in new code).
|
- |
// Try with 'keys' not a dictionary. |
ExtractJWKKeysAndExpect("{ \"keys\":\"1\" }", false, 0); |
@@ -158,6 +204,7 @@ TEST_F(JSONWebKeyTest, ExtractJWKKeys) { |
" \"keys\": [" |
" {" |
" \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
" \"kid\": \"AAECAw\"," |
" \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\"" |
" }" |
@@ -171,6 +218,7 @@ TEST_F(JSONWebKeyTest, ExtractJWKKeys) { |
" \"keys\": [" |
" {" |
" \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
" \"kid\": \"AAECAw==\"," |
" \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
" }" |
@@ -184,6 +232,7 @@ TEST_F(JSONWebKeyTest, ExtractJWKKeys) { |
" \"keys\": [" |
" {" |
" \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
" \"kid\": \"!@#$%^&*()\"," |
" \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
" }" |
@@ -197,56 +246,155 @@ TEST_F(JSONWebKeyTest, ExtractJWKKeys) { |
" \"keys\": [" |
" {" |
" \"kty\": \"oct\"," |
+ " \"alg\": \"A128KW\"," |
" \"kid\": \"\"," |
" \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
" }" |
" ]" |
"}"; |
ExtractJWKKeysAndExpect(kJwksWithEmptyKeyId, false, 0); |
+} |
- // Try a list with multiple keys with the same kid. |
- const std::string kJwksDuplicateKids = |
+TEST_F(JSONWebKeyTest, KeyType) { |
+ // Valid key type. |
+ const std::string kJwksWithValidKeyType = |
"{" |
" \"keys\": [" |
" {" |
" \"kty\": \"oct\"," |
- " \"kid\": \"JCUmJygpKissLS4vMA\"," |
- " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
- " }," |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
+ " }" |
+ " ]" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwksWithValidKeyType, true, 1); |
+ |
+ // Empty key type. |
+ const std::string kJwksWithEmptyKeyType = |
+ "{" |
+ " \"keys\": [" |
+ " {" |
+ " \"kty\": \"\"," |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
+ " }" |
+ " ]" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwksWithEmptyKeyType, false, 0); |
+ |
+ // Key type is case sensitive. |
+ const std::string kJwksWithUppercaseKeyType = |
+ "{" |
+ " \"keys\": [" |
+ " {" |
+ " \"kty\": \"OCT\"," |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
+ " }" |
+ " ]" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwksWithUppercaseKeyType, false, 0); |
+ |
+ // Wrong key type. |
+ const std::string kJwksWithWrongKeyType = |
+ "{" |
+ " \"keys\": [" |
+ " {" |
+ " \"kty\": \"RSA\"," |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
+ " }" |
+ " ]" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwksWithWrongKeyType, false, 0); |
+} |
+ |
+TEST_F(JSONWebKeyTest, Alg) { |
+ // Valid alg. |
+ const std::string kJwksWithValidAlg = |
+ "{" |
+ " \"keys\": [" |
" {" |
" \"kty\": \"oct\"," |
- " \"kid\": \"JCUmJygpKissLS4vMA\"," |
- " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" |
+ " \"alg\": \"A128KW\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
" }" |
" ]" |
"}"; |
- ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); |
+ ExtractJWKKeysAndExpect(kJwksWithValidAlg, true, 1); |
+ |
+ // Empty alg. |
+ const std::string kJwksWithEmptyAlg = |
+ "{" |
+ " \"keys\": [" |
+ " {" |
+ " \"kty\": \"oct\"," |
+ " \"alg\": \"\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
+ " }" |
+ " ]" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwksWithEmptyAlg, false, 0); |
+ |
+ // Alg is case sensitive. |
+ const std::string kJwksWithLowercaseAlg = |
+ "{" |
+ " \"keys\": [" |
+ " {" |
+ " \"kty\": \"oct\"," |
+ " \"alg\": \"a128kw\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
+ " }" |
+ " ]" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwksWithLowercaseAlg, false, 0); |
+ |
+ // Wrong alg. |
+ const std::string kJwksWithWrongAlg = |
+ "{" |
+ " \"keys\": [" |
+ " {" |
+ " \"kty\": \"oct\"," |
+ " \"alg\": \"RS256\"," |
+ " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
+ " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
+ " }" |
+ " ]" |
+ "}"; |
+ ExtractJWKKeysAndExpect(kJwksWithWrongAlg, false, 0); |
} |
TEST_F(JSONWebKeyTest, SessionType) { |
ExtractSessionTypeAndExpect( |
- "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", |
- true, |
- MediaKeys::TEMPORARY_SESSION); |
+ "{\"keys\":[{\"alg\": " |
+ "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", |
+ true, MediaKeys::TEMPORARY_SESSION); |
ExtractSessionTypeAndExpect( |
- "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
+ "{\"keys\":[{\"alg\": " |
+ "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
"\"temporary\"}", |
- true, |
- MediaKeys::TEMPORARY_SESSION); |
+ true, MediaKeys::TEMPORARY_SESSION); |
ExtractSessionTypeAndExpect( |
- "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
+ "{\"keys\":[{\"alg\": " |
+ "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
"\"persistent\"}", |
- true, |
- MediaKeys::PERSISTENT_SESSION); |
+ true, MediaKeys::PERSISTENT_SESSION); |
ExtractSessionTypeAndExpect( |
- "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
+ "{\"keys\":[{\"alg\": " |
+ "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" |
"\"unknown\"}", |
- false, |
- MediaKeys::TEMPORARY_SESSION); |
+ false, MediaKeys::TEMPORARY_SESSION); |
ExtractSessionTypeAndExpect( |
- "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":3}", |
- false, |
- MediaKeys::TEMPORARY_SESSION); |
+ "{\"keys\":[{\"alg\": " |
+ "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":3}", |
+ false, MediaKeys::TEMPORARY_SESSION); |
} |
TEST_F(JSONWebKeyTest, CreateLicense) { |