Chromium Code Reviews| 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) { |