OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "config.h" | 5 #include "config.h" |
6 #include "core/frame/csp/CSPSourceList.h" | 6 #include "core/frame/csp/CSPSourceList.h" |
7 | 7 |
8 #include "core/frame/csp/CSPSource.h" | 8 #include "core/frame/csp/CSPSource.h" |
9 #include "core/frame/csp/ContentSecurityPolicy.h" | 9 #include "core/frame/csp/ContentSecurityPolicy.h" |
10 #include "platform/ParsingUtilities.h" | 10 #include "platform/ParsingUtilities.h" |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
291 ContentSecurityPolicyHashAlgorithm algorithm; | 291 ContentSecurityPolicyHashAlgorithm algorithm; |
292 } kSupportedPrefixes[] = { | 292 } kSupportedPrefixes[] = { |
293 { "'sha1-", ContentSecurityPolicyHashAlgorithmSha1 }, | 293 { "'sha1-", ContentSecurityPolicyHashAlgorithmSha1 }, |
294 { "'sha256-", ContentSecurityPolicyHashAlgorithmSha256 }, | 294 { "'sha256-", ContentSecurityPolicyHashAlgorithmSha256 }, |
295 { "'sha384-", ContentSecurityPolicyHashAlgorithmSha384 }, | 295 { "'sha384-", ContentSecurityPolicyHashAlgorithmSha384 }, |
296 { "'sha512-", ContentSecurityPolicyHashAlgorithmSha512 } | 296 { "'sha512-", ContentSecurityPolicyHashAlgorithmSha512 } |
297 }; | 297 }; |
298 | 298 |
299 String prefix; | 299 String prefix; |
300 hashAlgorithm = ContentSecurityPolicyHashAlgorithmNone; | 300 hashAlgorithm = ContentSecurityPolicyHashAlgorithmNone; |
301 size_t hashLength = end - begin; | |
301 | 302 |
302 // Instead of this sizeof() calculation to get the length of this array, | 303 for (const auto& algorithm : kSupportedPrefixes) { |
jww
2014/11/03 21:16:55
nit: Calling this 'algorithm' is confusing given t
| |
303 // it would be preferable to use WTF_ARRAY_LENGTH for simplicity and to | 304 if (hashLength > strlen(algorithm.prefix) && equalIgnoringCase(algorithm .prefix, begin, strlen(algorithm.prefix))) { |
304 // guarantee a compile time calculation. Unfortunately, on some | 305 prefix = algorithm.prefix; |
305 // compliers, the call to WTF_ARRAY_LENGTH fails on arrays of anonymous | 306 hashAlgorithm = algorithm.algorithm; |
306 // stucts, so, for now, it is necessary to resort to this sizeof | |
307 // calculation. | |
308 for (size_t i = 0; i < (sizeof(kSupportedPrefixes) / sizeof(kSupportedPrefix es[0])); i++) { | |
309 if (equalIgnoringCase(kSupportedPrefixes[i].prefix, begin, strlen(kSuppo rtedPrefixes[i].prefix))) { | |
310 prefix = kSupportedPrefixes[i].prefix; | |
311 hashAlgorithm = kSupportedPrefixes[i].algorithm; | |
312 break; | 307 break; |
313 } | 308 } |
314 } | 309 } |
315 | 310 |
316 if (hashAlgorithm == ContentSecurityPolicyHashAlgorithmNone) | 311 if (hashAlgorithm == ContentSecurityPolicyHashAlgorithmNone) |
317 return true; | 312 return true; |
318 | 313 |
319 const UChar* position = begin + prefix.length(); | 314 const UChar* position = begin + prefix.length(); |
320 const UChar* hashBegin = position; | 315 const UChar* hashBegin = position; |
321 | 316 |
317 ASSERT(position < end); | |
322 skipWhile<UChar, isBase64EncodedCharacter>(position, end); | 318 skipWhile<UChar, isBase64EncodedCharacter>(position, end); |
323 ASSERT(hashBegin <= position); | 319 ASSERT(hashBegin <= position); |
324 | 320 |
325 // Base64 encodings may end with exactly one or two '=' characters | 321 // Base64 encodings may end with exactly one or two '=' characters |
326 skipExactly<UChar>(position, position + 1, '='); | 322 if (position < end) |
327 skipExactly<UChar>(position, position + 1, '='); | 323 skipExactly<UChar>(position, position + 1, '='); |
324 if (position < end) | |
325 skipExactly<UChar>(position, position + 1, '='); | |
328 | 326 |
329 if ((position + 1) != end || *position != '\'' || !(position - hashBegin)) | 327 if (position + 1 != end || *position != '\'' || position == hashBegin) |
330 return false; | 328 return false; |
331 | 329 |
332 Vector<char> hashVector; | 330 Vector<char> hashVector; |
333 base64Decode(hashBegin, position - hashBegin, hashVector); | 331 base64Decode(hashBegin, position - hashBegin, hashVector); |
334 if (hashVector.size() > kMaxDigestSize) | 332 if (hashVector.size() > kMaxDigestSize) |
335 return false; | 333 return false; |
336 hash.append(reinterpret_cast<uint8_t*>(hashVector.data()), hashVector.size() ); | 334 hash.append(reinterpret_cast<uint8_t*>(hashVector.data()), hashVector.size() ); |
337 return true; | 335 return true; |
338 } | 336 } |
339 | 337 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
480 } | 478 } |
481 | 479 |
482 void CSPSourceList::addSourceHash(const ContentSecurityPolicyHashAlgorithm& algo rithm, const DigestValue& hash) | 480 void CSPSourceList::addSourceHash(const ContentSecurityPolicyHashAlgorithm& algo rithm, const DigestValue& hash) |
483 { | 481 { |
484 m_hashes.add(CSPHashValue(algorithm, hash)); | 482 m_hashes.add(CSPHashValue(algorithm, hash)); |
485 m_hashAlgorithmsUsed |= algorithm; | 483 m_hashAlgorithmsUsed |= algorithm; |
486 } | 484 } |
487 | 485 |
488 | 486 |
489 } // namespace blink | 487 } // namespace blink |
OLD | NEW |