Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/cdm/json_web_key.h" | 5 #include "media/cdm/json_web_key.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 namespace media { | 10 namespace media { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 } | 64 } |
| 65 } | 65 } |
| 66 }; | 66 }; |
| 67 | 67 |
| 68 TEST_F(JSONWebKeyTest, GenerateJWKSet) { | 68 TEST_F(JSONWebKeyTest, GenerateJWKSet) { |
| 69 const uint8 data1[] = { 0x01, 0x02 }; | 69 const uint8 data1[] = { 0x01, 0x02 }; |
| 70 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; | 70 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; |
| 71 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, | 71 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
| 72 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; | 72 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; |
| 73 | 73 |
| 74 EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", | |
| 75 GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); | |
| 76 EXPECT_EQ( | 74 EXPECT_EQ( |
| 77 "{\"keys\":[{\"k\":\"AQIDBA\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}]}", | 75 "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":" |
| 76 "\"oct\"}]}", | |
| 77 GenerateJWKSet(data1, arraysize(data1), data1, arraysize(data1))); | |
| 78 EXPECT_EQ( | |
| 79 "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQIDBA\",\"kid\":\"AQIDBA\"," | |
| 80 "\"kty\":\"oct\"}]}", | |
| 78 GenerateJWKSet(data2, arraysize(data2), data2, arraysize(data2))); | 81 GenerateJWKSet(data2, arraysize(data2), data2, arraysize(data2))); |
| 79 EXPECT_EQ("{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQIDBA\",\"kty\":\"oct\"}]}", | |
| 80 GenerateJWKSet(data1, arraysize(data1), data2, arraysize(data2))); | |
| 81 EXPECT_EQ("{\"keys\":[{\"k\":\"AQIDBA\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", | |
| 82 GenerateJWKSet(data2, arraysize(data2), data1, arraysize(data1))); | |
| 83 EXPECT_EQ( | 82 EXPECT_EQ( |
| 84 "{\"keys\":[{\"k\":\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kid\":" | 83 "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQIDBA\",\"kty\":" |
| 84 "\"oct\"}]}", | |
| 85 GenerateJWKSet(data1, arraysize(data1), data2, arraysize(data2))); | |
| 86 EXPECT_EQ( | |
| 87 "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQIDBA\",\"kid\":\"AQI\",\"kty\":" | |
| 88 "\"oct\"}]}", | |
| 89 GenerateJWKSet(data2, arraysize(data2), data1, arraysize(data1))); | |
| 90 EXPECT_EQ( | |
| 91 "{\"keys\":[{\"alg\":\"A128KW\",\"k\":\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kid\":" | |
| 85 "\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kty\":\"oct\"}]}", | 92 "\"AQIDBAUGBwgJCgsMDQ4PEA\",\"kty\":\"oct\"}]}", |
| 86 GenerateJWKSet(data3, arraysize(data3), data3, arraysize(data3))); | 93 GenerateJWKSet(data3, arraysize(data3), data3, arraysize(data3))); |
| 87 } | 94 } |
| 88 | 95 |
| 89 TEST_F(JSONWebKeyTest, ExtractJWKKeys) { | 96 TEST_F(JSONWebKeyTest, ExtractValidJWKKeys) { |
| 90 // Try a simple JWK key (i.e. not in a set) | 97 // Try an empty 'keys' dictionary. |
| 91 const std::string kJwkSimple = | 98 ExtractJWKKeysAndExpect("{ \"keys\": [] }", true, 0); |
| 99 | |
| 100 // Try a key list with one entry. | |
| 101 const std::string kJwksOneEntry = | |
| 92 "{" | 102 "{" |
| 93 " \"kty\": \"oct\"," | 103 " \"keys\": [" |
| 94 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | 104 " {" |
| 95 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" | 105 " \"kty\": \"oct\"," |
| 106 " \"alg\": \"A128KW\"," | |
| 107 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 108 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" | |
| 109 " }" | |
| 110 " ]" | |
| 96 "}"; | 111 "}"; |
| 97 ExtractJWKKeysAndExpect(kJwkSimple, false, 0); | 112 ExtractJWKKeysAndExpect(kJwksOneEntry, true, 1); |
| 98 | 113 |
| 99 // Try a key list with multiple entries. | 114 // Try a key list with multiple entries. |
| 100 const std::string kJwksMultipleEntries = | 115 const std::string kJwksMultipleEntries = |
| 101 "{" | 116 "{" |
| 102 " \"keys\": [" | 117 " \"keys\": [" |
| 103 " {" | 118 " {" |
| 104 " \"kty\": \"oct\"," | 119 " \"kty\": \"oct\"," |
| 120 " \"alg\": \"A128KW\"," | |
| 105 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | 121 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
| 106 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" | 122 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" |
| 107 " }," | 123 " }," |
| 108 " {" | 124 " {" |
| 109 " \"kty\": \"oct\"," | 125 " \"kty\": \"oct\"," |
| 126 " \"alg\": \"A128KW\"," | |
| 110 " \"kid\": \"JCUmJygpKissLS4vMA\"," | 127 " \"kid\": \"JCUmJygpKissLS4vMA\"," |
| 111 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" | 128 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" |
| 112 " }" | 129 " }" |
| 113 " ]" | 130 " ]" |
| 114 "}"; | 131 "}"; |
| 115 ExtractJWKKeysAndExpect(kJwksMultipleEntries, true, 2); | 132 ExtractJWKKeysAndExpect(kJwksMultipleEntries, true, 2); |
| 116 | 133 |
| 117 // Try a key with no spaces and some \n plus additional fields. | 134 // Try a key with no spaces and some \n plus additional fields. |
| 118 const std::string kJwksNoSpaces = | 135 const std::string kJwksNoSpaces = |
| 119 "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," | 136 "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," |
| 120 "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg" | 137 "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"GawgguFyGrWKav7AX4VKUg" |
| 121 "\",\"foo\":\"bar\"}]}\n\n"; | 138 "\",\"foo\":\"bar\"}]}\n\n"; |
| 122 ExtractJWKKeysAndExpect(kJwksNoSpaces, true, 1); | 139 ExtractJWKKeysAndExpect(kJwksNoSpaces, true, 1); |
| 123 | 140 |
| 141 // Try a list with multiple keys with the same kid. | |
| 142 const std::string kJwksDuplicateKids = | |
| 143 "{" | |
| 144 " \"keys\": [" | |
| 145 " {" | |
| 146 " \"kty\": \"oct\"," | |
| 147 " \"alg\": \"A128KW\"," | |
| 148 " \"kid\": \"JCUmJygpKissLS4vMA\"," | |
| 149 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" | |
| 150 " }," | |
| 151 " {" | |
| 152 " \"kty\": \"oct\"," | |
| 153 " \"alg\": \"A128KW\"," | |
| 154 " \"kid\": \"JCUmJygpKissLS4vMA\"," | |
| 155 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" | |
| 156 " }" | |
| 157 " ]" | |
| 158 "}"; | |
| 159 ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); | |
| 160 } | |
| 161 | |
| 162 TEST_F(JSONWebKeyTest, ExtractInvalidJWKKeys) { | |
| 163 // Try a simple JWK key (i.e. not in a set) | |
| 164 const std::string kJwkSimple = | |
| 165 "{" | |
| 166 " \"kty\": \"oct\"," | |
| 167 " \"alg\": \"A128KW\"," | |
| 168 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 169 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" | |
| 170 "}"; | |
| 171 ExtractJWKKeysAndExpect(kJwkSimple, false, 0); | |
| 172 | |
| 124 // Try some non-ASCII characters. | 173 // Try some non-ASCII characters. |
| 125 ExtractJWKKeysAndExpect( | 174 ExtractJWKKeysAndExpect( |
| 126 "This is not ASCII due to \xff\xfe\xfd in it.", false, 0); | 175 "This is not ASCII due to \xff\xfe\xfd in it.", false, 0); |
| 127 | 176 |
| 128 // Try some non-ASCII characters in an otherwise valid JWK. | 177 // Try some non-ASCII characters in an otherwise valid JWK. |
| 129 const std::string kJwksInvalidCharacters = | 178 const std::string kJwksInvalidCharacters = |
| 130 "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," | 179 "\n\n{\"something\":1,\"keys\":[{\n\n\"kty\":\"oct\",\"alg\":\"A128KW\"," |
| 131 "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"\xff\xfe\xfd" | 180 "\"kid\":\"AAECAwQFBgcICQoLDA0ODxAREhM\",\"k\":\"\xff\xfe\xfd" |
| 132 "\",\"foo\":\"bar\"}]}\n\n"; | 181 "\",\"foo\":\"bar\"}]}\n\n"; |
| 133 ExtractJWKKeysAndExpect(kJwksInvalidCharacters, false, 0); | 182 ExtractJWKKeysAndExpect(kJwksInvalidCharacters, false, 0); |
| 134 | 183 |
| 135 // Try a badly formatted key. Assume that the JSON parser is fully tested, | 184 // Try a badly formatted key. Assume that the JSON parser is fully tested, |
| 136 // so we won't try a lot of combinations. However, need a test to ensure | 185 // so we won't try a lot of combinations. However, need a test to ensure |
| 137 // that the code doesn't crash if invalid JSON received. | 186 // that the code doesn't crash if invalid JSON received. |
| 138 ExtractJWKKeysAndExpect("This is not a JSON key.", false, 0); | 187 ExtractJWKKeysAndExpect("This is not a JSON key.", false, 0); |
| 139 | 188 |
| 140 // Try passing some valid JSON that is not a dictionary at the top level. | 189 // Try passing some valid JSON that is not a dictionary at the top level. |
| 141 ExtractJWKKeysAndExpect("40", false, 0); | 190 ExtractJWKKeysAndExpect("40", false, 0); |
| 142 | 191 |
| 143 // Try an empty dictionary. | 192 // Try an empty dictionary. |
| 144 ExtractJWKKeysAndExpect("{ }", false, 0); | 193 ExtractJWKKeysAndExpect("{ }", false, 0); |
| 145 | 194 |
| 146 // Try an empty 'keys' dictionary. | |
| 147 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).
| |
| 148 | |
| 149 // Try with 'keys' not a dictionary. | 195 // Try with 'keys' not a dictionary. |
| 150 ExtractJWKKeysAndExpect("{ \"keys\":\"1\" }", false, 0); | 196 ExtractJWKKeysAndExpect("{ \"keys\":\"1\" }", false, 0); |
| 151 | 197 |
| 152 // Try with 'keys' a list of integers. | 198 // Try with 'keys' a list of integers. |
| 153 ExtractJWKKeysAndExpect("{ \"keys\": [ 1, 2, 3 ] }", false, 0); | 199 ExtractJWKKeysAndExpect("{ \"keys\": [ 1, 2, 3 ] }", false, 0); |
| 154 | 200 |
| 155 // Try padding(=) at end of 'k' base64 string. | 201 // Try padding(=) at end of 'k' base64 string. |
| 156 const std::string kJwksWithPaddedKey = | 202 const std::string kJwksWithPaddedKey = |
| 157 "{" | 203 "{" |
| 158 " \"keys\": [" | 204 " \"keys\": [" |
| 159 " {" | 205 " {" |
| 160 " \"kty\": \"oct\"," | 206 " \"kty\": \"oct\"," |
| 207 " \"alg\": \"A128KW\"," | |
| 161 " \"kid\": \"AAECAw\"," | 208 " \"kid\": \"AAECAw\"," |
| 162 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\"" | 209 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw==\"" |
| 163 " }" | 210 " }" |
| 164 " ]" | 211 " ]" |
| 165 "}"; | 212 "}"; |
| 166 ExtractJWKKeysAndExpect(kJwksWithPaddedKey, false, 0); | 213 ExtractJWKKeysAndExpect(kJwksWithPaddedKey, false, 0); |
| 167 | 214 |
| 168 // Try padding(=) at end of 'kid' base64 string. | 215 // Try padding(=) at end of 'kid' base64 string. |
| 169 const std::string kJwksWithPaddedKeyId = | 216 const std::string kJwksWithPaddedKeyId = |
| 170 "{" | 217 "{" |
| 171 " \"keys\": [" | 218 " \"keys\": [" |
| 172 " {" | 219 " {" |
| 173 " \"kty\": \"oct\"," | 220 " \"kty\": \"oct\"," |
| 221 " \"alg\": \"A128KW\"," | |
| 174 " \"kid\": \"AAECAw==\"," | 222 " \"kid\": \"AAECAw==\"," |
| 175 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 223 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
| 176 " }" | 224 " }" |
| 177 " ]" | 225 " ]" |
| 178 "}"; | 226 "}"; |
| 179 ExtractJWKKeysAndExpect(kJwksWithPaddedKeyId, false, 0); | 227 ExtractJWKKeysAndExpect(kJwksWithPaddedKeyId, false, 0); |
| 180 | 228 |
| 181 // Try a key with invalid base64 encoding. | 229 // Try a key with invalid base64 encoding. |
| 182 const std::string kJwksWithInvalidBase64 = | 230 const std::string kJwksWithInvalidBase64 = |
| 183 "{" | 231 "{" |
| 184 " \"keys\": [" | 232 " \"keys\": [" |
| 185 " {" | 233 " {" |
| 186 " \"kty\": \"oct\"," | 234 " \"kty\": \"oct\"," |
| 235 " \"alg\": \"A128KW\"," | |
| 187 " \"kid\": \"!@#$%^&*()\"," | 236 " \"kid\": \"!@#$%^&*()\"," |
| 188 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 237 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
| 189 " }" | 238 " }" |
| 190 " ]" | 239 " ]" |
| 191 "}"; | 240 "}"; |
| 192 ExtractJWKKeysAndExpect(kJwksWithInvalidBase64, false, 0); | 241 ExtractJWKKeysAndExpect(kJwksWithInvalidBase64, false, 0); |
| 193 | 242 |
| 194 // Empty key id. | 243 // Empty key id. |
| 195 const std::string kJwksWithEmptyKeyId = | 244 const std::string kJwksWithEmptyKeyId = |
| 196 "{" | 245 "{" |
| 197 " \"keys\": [" | 246 " \"keys\": [" |
| 198 " {" | 247 " {" |
| 199 " \"kty\": \"oct\"," | 248 " \"kty\": \"oct\"," |
| 249 " \"alg\": \"A128KW\"," | |
| 200 " \"kid\": \"\"," | 250 " \"kid\": \"\"," |
| 201 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | 251 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
| 202 " }" | 252 " }" |
| 203 " ]" | 253 " ]" |
| 204 "}"; | 254 "}"; |
| 205 ExtractJWKKeysAndExpect(kJwksWithEmptyKeyId, false, 0); | 255 ExtractJWKKeysAndExpect(kJwksWithEmptyKeyId, false, 0); |
| 256 } | |
| 206 | 257 |
| 207 // Try a list with multiple keys with the same kid. | 258 TEST_F(JSONWebKeyTest, KeyType) { |
| 208 const std::string kJwksDuplicateKids = | 259 // Valid key type. |
| 260 const std::string kJwksWithValidKeyType = | |
| 209 "{" | 261 "{" |
| 210 " \"keys\": [" | 262 " \"keys\": [" |
| 211 " {" | 263 " {" |
| 212 " \"kty\": \"oct\"," | 264 " \"kty\": \"oct\"," |
| 213 " \"kid\": \"JCUmJygpKissLS4vMA\"," | 265 " \"alg\": \"A128KW\"," |
| 214 " \"k\": \"FBUWFxgZGhscHR4fICEiIw\"" | 266 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," |
| 215 " }," | 267 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" |
| 216 " {" | |
| 217 " \"kty\": \"oct\"," | |
| 218 " \"kid\": \"JCUmJygpKissLS4vMA\"," | |
| 219 " \"k\":\"MTIzNDU2Nzg5Ojs8PT4/QA\"" | |
| 220 " }" | 268 " }" |
| 221 " ]" | 269 " ]" |
| 222 "}"; | 270 "}"; |
| 223 ExtractJWKKeysAndExpect(kJwksDuplicateKids, true, 2); | 271 ExtractJWKKeysAndExpect(kJwksWithValidKeyType, true, 1); |
| 272 | |
| 273 // Empty key type. | |
| 274 const std::string kJwksWithEmptyKeyType = | |
| 275 "{" | |
| 276 " \"keys\": [" | |
| 277 " {" | |
| 278 " \"kty\": \"\"," | |
| 279 " \"alg\": \"A128KW\"," | |
| 280 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 281 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | |
| 282 " }" | |
| 283 " ]" | |
| 284 "}"; | |
| 285 ExtractJWKKeysAndExpect(kJwksWithEmptyKeyType, false, 0); | |
| 286 | |
| 287 // Key type is case sensitive. | |
| 288 const std::string kJwksWithUppercaseKeyType = | |
| 289 "{" | |
| 290 " \"keys\": [" | |
| 291 " {" | |
| 292 " \"kty\": \"OCT\"," | |
| 293 " \"alg\": \"A128KW\"," | |
| 294 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 295 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | |
| 296 " }" | |
| 297 " ]" | |
| 298 "}"; | |
| 299 ExtractJWKKeysAndExpect(kJwksWithUppercaseKeyType, false, 0); | |
| 300 | |
| 301 // Wrong key type. | |
| 302 const std::string kJwksWithWrongKeyType = | |
| 303 "{" | |
| 304 " \"keys\": [" | |
| 305 " {" | |
| 306 " \"kty\": \"RSA\"," | |
| 307 " \"alg\": \"A128KW\"," | |
| 308 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 309 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | |
| 310 " }" | |
| 311 " ]" | |
| 312 "}"; | |
| 313 ExtractJWKKeysAndExpect(kJwksWithWrongKeyType, false, 0); | |
| 314 } | |
| 315 | |
| 316 TEST_F(JSONWebKeyTest, Alg) { | |
| 317 // Valid alg. | |
| 318 const std::string kJwksWithValidAlg = | |
| 319 "{" | |
| 320 " \"keys\": [" | |
| 321 " {" | |
| 322 " \"kty\": \"oct\"," | |
| 323 " \"alg\": \"A128KW\"," | |
| 324 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 325 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | |
| 326 " }" | |
| 327 " ]" | |
| 328 "}"; | |
| 329 ExtractJWKKeysAndExpect(kJwksWithValidAlg, true, 1); | |
| 330 | |
| 331 // Empty alg. | |
| 332 const std::string kJwksWithEmptyAlg = | |
| 333 "{" | |
| 334 " \"keys\": [" | |
| 335 " {" | |
| 336 " \"kty\": \"oct\"," | |
| 337 " \"alg\": \"\"," | |
| 338 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 339 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | |
| 340 " }" | |
| 341 " ]" | |
| 342 "}"; | |
| 343 ExtractJWKKeysAndExpect(kJwksWithEmptyAlg, false, 0); | |
| 344 | |
| 345 // Alg is case sensitive. | |
| 346 const std::string kJwksWithLowercaseAlg = | |
| 347 "{" | |
| 348 " \"keys\": [" | |
| 349 " {" | |
| 350 " \"kty\": \"oct\"," | |
| 351 " \"alg\": \"a128kw\"," | |
| 352 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 353 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | |
| 354 " }" | |
| 355 " ]" | |
| 356 "}"; | |
| 357 ExtractJWKKeysAndExpect(kJwksWithLowercaseAlg, false, 0); | |
| 358 | |
| 359 // Wrong alg. | |
| 360 const std::string kJwksWithWrongAlg = | |
| 361 "{" | |
| 362 " \"keys\": [" | |
| 363 " {" | |
| 364 " \"kty\": \"oct\"," | |
| 365 " \"alg\": \"RS256\"," | |
| 366 " \"kid\": \"AAECAwQFBgcICQoLDA0ODxAREhM\"," | |
| 367 " \"k\": \"BAUGBwgJCgsMDQ4PEBESEw\"" | |
| 368 " }" | |
| 369 " ]" | |
| 370 "}"; | |
| 371 ExtractJWKKeysAndExpect(kJwksWithWrongAlg, false, 0); | |
| 224 } | 372 } |
| 225 | 373 |
| 226 TEST_F(JSONWebKeyTest, SessionType) { | 374 TEST_F(JSONWebKeyTest, SessionType) { |
| 227 ExtractSessionTypeAndExpect( | 375 ExtractSessionTypeAndExpect( |
| 228 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", | 376 "{\"keys\":[{\"alg\": " |
| 229 true, | 377 "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}]}", |
| 230 MediaKeys::TEMPORARY_SESSION); | 378 true, MediaKeys::TEMPORARY_SESSION); |
| 231 ExtractSessionTypeAndExpect( | 379 ExtractSessionTypeAndExpect( |
| 232 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | 380 "{\"keys\":[{\"alg\": " |
| 381 "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | |
| 233 "\"temporary\"}", | 382 "\"temporary\"}", |
| 234 true, | 383 true, MediaKeys::TEMPORARY_SESSION); |
| 235 MediaKeys::TEMPORARY_SESSION); | |
| 236 ExtractSessionTypeAndExpect( | 384 ExtractSessionTypeAndExpect( |
| 237 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | 385 "{\"keys\":[{\"alg\": " |
| 386 "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | |
| 238 "\"persistent\"}", | 387 "\"persistent\"}", |
| 239 true, | 388 true, MediaKeys::PERSISTENT_SESSION); |
| 240 MediaKeys::PERSISTENT_SESSION); | |
| 241 ExtractSessionTypeAndExpect( | 389 ExtractSessionTypeAndExpect( |
| 242 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | 390 "{\"keys\":[{\"alg\": " |
| 391 "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":" | |
| 243 "\"unknown\"}", | 392 "\"unknown\"}", |
| 244 false, | 393 false, MediaKeys::TEMPORARY_SESSION); |
| 245 MediaKeys::TEMPORARY_SESSION); | |
| 246 ExtractSessionTypeAndExpect( | 394 ExtractSessionTypeAndExpect( |
| 247 "{\"keys\":[{\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":3}", | 395 "{\"keys\":[{\"alg\": " |
| 248 false, | 396 "\"A128KW\",\"k\":\"AQI\",\"kid\":\"AQI\",\"kty\":\"oct\"}],\"type\":3}", |
| 249 MediaKeys::TEMPORARY_SESSION); | 397 false, MediaKeys::TEMPORARY_SESSION); |
| 250 } | 398 } |
| 251 | 399 |
| 252 TEST_F(JSONWebKeyTest, CreateLicense) { | 400 TEST_F(JSONWebKeyTest, CreateLicense) { |
| 253 const uint8 data1[] = { 0x01, 0x02 }; | 401 const uint8 data1[] = { 0x01, 0x02 }; |
| 254 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; | 402 const uint8 data2[] = { 0x01, 0x02, 0x03, 0x04 }; |
| 255 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, | 403 const uint8 data3[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
| 256 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; | 404 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 }; |
| 257 | 405 |
| 258 CreateLicenseAndExpect(data1, | 406 CreateLicenseAndExpect(data1, |
| 259 arraysize(data1), | 407 arraysize(data1), |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 312 | 460 |
| 313 // Correct tag, but list doesn't contain a string. | 461 // Correct tag, but list doesn't contain a string. |
| 314 ExtractKeyFromLicenseAndExpect("{\"kids\":[[\"AQI\"]]}", false, NULL, 0); | 462 ExtractKeyFromLicenseAndExpect("{\"kids\":[[\"AQI\"]]}", false, NULL, 0); |
| 315 | 463 |
| 316 // Correct tag, but invalid base64 encoding. | 464 // Correct tag, but invalid base64 encoding. |
| 317 ExtractKeyFromLicenseAndExpect("{\"kids\":[\"!@#$%^&*()\"]}", false, NULL, 0); | 465 ExtractKeyFromLicenseAndExpect("{\"kids\":[\"!@#$%^&*()\"]}", false, NULL, 0); |
| 318 } | 466 } |
| 319 | 467 |
| 320 } // namespace media | 468 } // namespace media |
| 321 | 469 |
| OLD | NEW |