| 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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 // hash-source = "'" hash-algorithm "-" hash-value "'" | 281 // hash-source = "'" hash-algorithm "-" hash-value "'" |
| 282 // hash-algorithm = "sha1" / "sha256" / "sha384" / "sha512" | 282 // hash-algorithm = "sha1" / "sha256" / "sha384" / "sha512" |
| 283 // hash-value = 1*( ALPHA / DIGIT / "+" / "/" / "=" ) | 283 // hash-value = 1*( ALPHA / DIGIT / "+" / "/" / "=" ) |
| 284 // | 284 // |
| 285 bool CSPSourceList::parseHash(const UChar* begin, const UChar* end, DigestValue&
hash, ContentSecurityPolicyHashAlgorithm& hashAlgorithm) | 285 bool CSPSourceList::parseHash(const UChar* begin, const UChar* end, DigestValue&
hash, ContentSecurityPolicyHashAlgorithm& hashAlgorithm) |
| 286 { | 286 { |
| 287 // Any additions or subtractions from this struct should also modify the | 287 // Any additions or subtractions from this struct should also modify the |
| 288 // respective entries in the kAlgorithmMap array in checkDigest(). | 288 // respective entries in the kAlgorithmMap array in checkDigest(). |
| 289 static const struct { | 289 static const struct { |
| 290 const char* prefix; | 290 const char* prefix; |
| 291 ContentSecurityPolicyHashAlgorithm algorithm; | 291 ContentSecurityPolicyHashAlgorithm type; |
| 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) { |
| 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.type; |
| 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 |