Chromium Code Reviews| Index: Source/core/frame/SubresourceIntegrityTest.cpp |
| diff --git a/Source/core/frame/SubresourceIntegrityTest.cpp b/Source/core/frame/SubresourceIntegrityTest.cpp |
| index 399183632de3854a3ce229b6603c3a0a9787659e..241f2c6951112601579729ab44974d0c19b88fcf 100644 |
| --- a/Source/core/frame/SubresourceIntegrityTest.cpp |
| +++ b/Source/core/frame/SubresourceIntegrityTest.cpp |
| @@ -24,6 +24,7 @@ namespace blink { |
| static const char kBasicScript[] = "alert('test');"; |
| static const char kSha256Integrity[] = "sha256-GAF48QOoxRvu0gZAmQivUdJPyBacqznBAXwnkfpmQX4="; |
| static const char kSha256IntegrityLenientSyntax[] = "sha256-GAF48QOoxRvu0gZAmQivUdJPyBacqznBAXwnkfpmQX4="; |
| +static const char kSha256IntegrityWithUnknownOptions[] = "sha256-GAF48QOoxRvu0gZAmQivUdJPyBacqznBAXwnkfpmQX4=?foo=bar?baz=foz"; |
|
Mike West
2015/05/11 03:25:28
Nit: Add a test for a single unknown option as wel
|
| static const char kSha384Integrity[] = "sha384-nep3XpvhUxpCMOVXIFPecThAqdY_uVeiD4kXSqXpx0YJUWU4fTTaFgciTuZk7fmE"; |
| static const char kSha512Integrity[] = "sha512-TXkJw18PqlVlEUXXjeXbGetop1TKB3wYQIp1_ihxCOFGUfG9TYOaA1MlkpTAqSV6yaevLO8Tj5pgH1JmZ--ItA=="; |
| static const char kSha384IntegrityLabeledAs256[] = "sha256-nep3XpvhUxpCMOVXIFPecThAqdY_uVeiD4kXSqXpx0YJUWU4fTTaFgciTuZk7fmE"; |
| @@ -100,30 +101,41 @@ protected: |
| EXPECT_TRUE(digest.isEmpty()); |
| } |
| - void expectMimeType(const String& text, const char* expectedType) |
| + void expectValidMimeType(const String& text) |
| + { |
| + EXPECT_TRUE(SubresourceIntegrity::isValidMimeTypeValue(text)); |
| + } |
| + |
| + void expectInvalidMimeType(const String& text) |
| + { |
| + EXPECT_FALSE(SubresourceIntegrity::isValidMimeTypeValue(text)); |
| + } |
| + |
| + void expectOption(const String& text, const char* expectedKey, const char* expectedValue) |
| { |
| Vector<UChar> characters; |
| text.appendTo(characters); |
| const UChar* position = characters.data(); |
| const UChar* end = characters.end(); |
| - String type; |
| + String key, value; |
| - EXPECT_TRUE(SubresourceIntegrity::parseMimeType(position, end, type)); |
| - EXPECT_EQ(expectedType, type); |
| + EXPECT_TRUE(SubresourceIntegrity::parseOption(position, end, key, value)); |
| + EXPECT_EQ(expectedKey, key); |
| + EXPECT_EQ(expectedValue, value); |
| } |
| - void expectMimeTypeFailure(const String& text) |
| + void expectOptionFailure(const String& text) |
| { |
| Vector<UChar> characters; |
| text.appendTo(characters); |
| const UChar* position = characters.data(); |
| const UChar* end = characters.end(); |
| - String type; |
| + String key, value; |
| - EXPECT_FALSE(SubresourceIntegrity::parseMimeType(position, end, type)); |
| - EXPECT_TRUE(type.isEmpty()); |
| + EXPECT_FALSE(SubresourceIntegrity::parseOption(position, end, key, value)); |
|
Mike West
2015/05/11 03:25:28
Please also EXPECT that `key` and `value` are the
|
| } |
| + |
| void expectParse(const char* integrityAttribute, const char* expectedDigest, HashAlgorithm expectedAlgorithm, const char* expectedType) |
| { |
| Vector<SubresourceIntegrity::IntegrityMetadata> metadataList; |
| @@ -137,10 +149,10 @@ protected: |
| } |
| } |
| - void expectParseMultipleHashes(const char* integrityAttribute, const SubresourceIntegrity::IntegrityMetadata expectedMetadatArray[], size_t expectedMetadataArraySize) |
| + void expectParseMultipleHashes(const char* integrityAttribute, const SubresourceIntegrity::IntegrityMetadata expectedMetadataArray[], size_t expectedMetadataArraySize) |
| { |
| Vector<SubresourceIntegrity::IntegrityMetadata> expectedMetadataList; |
| - expectedMetadataList.append(expectedMetadatArray, expectedMetadataArraySize); |
| + expectedMetadataList.append(expectedMetadataArray, expectedMetadataArraySize); |
| Vector<SubresourceIntegrity::IntegrityMetadata> metadataList; |
| EXPECT_EQ(SubresourceIntegrity::IntegrityParseValidResult, SubresourceIntegrity::parseIntegrityAttribute(integrityAttribute, metadataList, *document)); |
| EXPECT_EQ(expectedMetadataList.size(), metadataList.size()); |
| @@ -239,20 +251,34 @@ TEST_F(SubresourceIntegrityTest, ParseDigest) |
| expectDigestFailure("\x01\x02\x03\x04"); |
| } |
| -TEST_F(SubresourceIntegrityTest, ParseMimeType) |
| +TEST_F(SubresourceIntegrityTest, ValidMimeType) |
| +{ |
| + expectValidMimeType("application/javascript"); |
| + expectValidMimeType("application/xhtml+xml"); |
| + expectValidMimeType("text/vnd.abc"); |
| + expectValidMimeType("video/x-ms-wmv"); |
| + |
| + expectInvalidMimeType("1application/javascript"); |
| + expectInvalidMimeType("app-lication/javascript"); |
| + expectInvalidMimeType("video%2Fx-ms-wmv"); |
| +} |
| + |
| +TEST_F(SubresourceIntegrityTest, ParseOption) |
| { |
| - expectMimeType("?ct=application/javascript", "application/javascript"); |
| - expectMimeType("?ct=application/xhtml+xml", "application/xhtml+xml"); |
| - expectMimeType("?ct=text/vnd.abc", "text/vnd.abc"); |
| - expectMimeType("?ct=video/x-ms-wmv", "video/x-ms-wmv"); |
| - |
| - expectMimeTypeFailure("application/javascript"); |
| - expectMimeTypeFailure("?application/javascript"); |
| - expectMimeTypeFailure("?not-ct=application/javascript"); |
| - expectMimeTypeFailure("?ct==application/javascript"); |
| - expectMimeTypeFailure("?yay=boo&ct=application/javascript"); |
| - expectMimeTypeFailure("?ct=application/javascript&yay=boo"); |
| - expectMimeTypeFailure("?ct=video%2Fx-ms-wmv"); |
| + expectOption("?ct=application/javascript", "ct", "application/javascript"); |
| + expectOption("?ct=application/xhtml+xml", "ct", "application/xhtml+xml"); |
| + expectOption("?ct=text/vnd.abc", "ct", "text/vnd.abc"); |
| + expectOption("?ct=video/x-ms-wmv", "ct", "video/x-ms-wmv"); |
| + expectOption("?foo=bar", "foo", "bar"); |
| + expectOption("?foo=bar?baz", "foo", "bar"); |
| + expectOption("?foo=bar?baz=boo", "foo", "bar"); |
| + |
| + expectOptionFailure("application/javascript"); |
| + expectOptionFailure("?application/javascript"); |
| + expectOptionFailure("?ct==application/javascript"); |
| + expectOptionFailure("?yay=boo&ct=application/javascript"); |
| + expectOptionFailure("?ct=application/javascript&yay=boo"); |
| + expectOptionFailure("?foo=baz bar"); |
| } |
| // |
| @@ -275,43 +301,43 @@ TEST_F(SubresourceIntegrityTest, Parsing) |
| "sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", |
| "BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", |
| HashAlgorithmSha256, |
| - ""); |
| + 0); |
| expectParse( |
| "sha-256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", |
| "BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", |
| HashAlgorithmSha256, |
| - ""); |
| + 0); |
| expectParse( |
| " sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE= ", |
| "BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", |
| HashAlgorithmSha256, |
| - ""); |
| + 0); |
| expectParse( |
| "sha384-XVVXBGoYw6AJOh9J-Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup_tA1v5GPr", |
| "XVVXBGoYw6AJOh9J+Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup/tA1v5GPr", |
| HashAlgorithmSha384, |
| - ""); |
| + 0); |
| expectParse( |
| "sha-384-XVVXBGoYw6AJOh9J_Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup_tA1v5GPr", |
| "XVVXBGoYw6AJOh9J/Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup/tA1v5GPr", |
| HashAlgorithmSha384, |
| - ""); |
| + 0); |
| expectParse( |
| "sha512-tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ-07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| "tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| HashAlgorithmSha512, |
| - ""); |
| + 0); |
| expectParse( |
| "sha-512-tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ-07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| "tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| HashAlgorithmSha512, |
| - ""); |
| + 0); |
| expectParse( |
| "sha-512-tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ-07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==?ct=application/javascript", |
| @@ -319,12 +345,36 @@ TEST_F(SubresourceIntegrityTest, Parsing) |
| HashAlgorithmSha512, |
| "application/javascript"); |
| + expectParse( |
| + "sha-512-tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ-07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==?ct=application/xhtml+xml", |
| + "tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| + HashAlgorithmSha512, |
| + "application/xhtml+xml"); |
| + |
| + expectParse( |
| + "sha-512-tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ-07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==?foo=bar?ct=application/xhtml+xml", |
| + "tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| + HashAlgorithmSha512, |
| + "application/xhtml+xml"); |
| + |
| + expectParse( |
| + "sha-512-tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ-07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==?ct=application/xhtml+xml?foo=bar", |
| + "tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| + HashAlgorithmSha512, |
| + "application/xhtml+xml"); |
| + |
| + expectParse( |
| + "sha-512-tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ-07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==?baz=foz?ct=application/xhtml+xml?foo=bar", |
| + "tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| + HashAlgorithmSha512, |
| + "application/xhtml+xml"); |
| + |
| expectParseMultipleHashes("", 0, 0); |
| expectParseMultipleHashes(" ", 0, 0); |
| const SubresourceIntegrity::IntegrityMetadata kValidSha384AndSha512[] = { |
| - {"XVVXBGoYw6AJOh9J+Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup/tA1v5GPr", HashAlgorithmSha384, ""}, |
| - {"tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", HashAlgorithmSha512, ""} |
| + {"XVVXBGoYw6AJOh9J+Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup/tA1v5GPr", HashAlgorithmSha384, WTF::String()}, |
| + {"tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", HashAlgorithmSha512, WTF::String()} |
| }; |
| expectParseMultipleHashes( |
| "sha384-XVVXBGoYw6AJOh9J+Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup/tA1v5GPr sha512-tbUPioKbVBplr0b1ucnWB57SJWt4x9dOE0Vy2mzCXvH3FepqDZ+07yMK81ytlg0MPaIrPAjcHqba5csorDWtKg==", |
| @@ -332,8 +382,8 @@ TEST_F(SubresourceIntegrityTest, Parsing) |
| ARRAY_SIZE(kValidSha384AndSha512)); |
| const SubresourceIntegrity::IntegrityMetadata kValidSha256AndSha256[] = { |
| - {"BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", HashAlgorithmSha256, ""}, |
| - {"deadbeef", HashAlgorithmSha256, ""} |
| + {"BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", HashAlgorithmSha256, WTF::String()}, |
| + {"deadbeef", HashAlgorithmSha256, WTF::String()} |
| }; |
| expectParseMultipleHashes( |
| "sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE= sha256-deadbeef", |
| @@ -341,7 +391,7 @@ TEST_F(SubresourceIntegrityTest, Parsing) |
| ARRAY_SIZE(kValidSha256AndSha256)); |
| const SubresourceIntegrity::IntegrityMetadata kValidSha256AndInvalidSha256[] = { |
| - {"BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", HashAlgorithmSha256, ""} |
| + {"BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", HashAlgorithmSha256, WTF::String()} |
| }; |
| expectParseMultipleHashes( |
| "sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE= sha256-!!!!", |
| @@ -349,12 +399,27 @@ TEST_F(SubresourceIntegrityTest, Parsing) |
| ARRAY_SIZE(kValidSha256AndInvalidSha256)); |
| const SubresourceIntegrity::IntegrityMetadata kInvalidSha256AndValidSha256[] = { |
| - {"BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", HashAlgorithmSha256, ""} |
| + {"BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", HashAlgorithmSha256, WTF::String()} |
| }; |
| expectParseMultipleHashes( |
| "sha256-!!! sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", |
| kInvalidSha256AndValidSha256, |
| ARRAY_SIZE(kInvalidSha256AndValidSha256)); |
| + |
| + expectParse( |
| + "sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=?foo=bar", |
| + "BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", |
| + HashAlgorithmSha256, |
| + 0); |
| + |
| + expectParse( |
| + "sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=?foo=bar?baz=foz", |
| + "BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=", |
| + HashAlgorithmSha256, |
| + 0); |
| + |
| + expectParseFailure("sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=?foo=bar?"); |
| + expectParseFailure("sha256-BpfBw7ivV8q2jLiT13fxDYAe2tJllusRSZ273h2nFSE=?foo:bar"); |
| } |
| TEST_F(SubresourceIntegrityTest, ParsingBase64) |
| @@ -363,7 +428,7 @@ TEST_F(SubresourceIntegrityTest, ParsingBase64) |
| "sha384-XVVXBGoYw6AJOh9J+Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup/tA1v5GPr", |
| "XVVXBGoYw6AJOh9J+Z8pBDMVVPfkBpngexkA7JqZu8d5GENND6TEIup/tA1v5GPr", |
| HashAlgorithmSha384, |
| - ""); |
| + 0); |
| } |
| // |
| @@ -397,6 +462,9 @@ TEST_F(SubresourceIntegrityTest, CheckSubresourceIntegrityInSecureOrigin) |
| // All parameters are fine, and because this is not cross origin, CORS is |
| // not needed. |
| expectIntegrity(kSha256Integrity, kBasicScript, secureURL, secureURL, String(), NoCors); |
| + |
| + // Unknown options should be ignored |
| + expectIntegrity(kSha256IntegrityWithUnknownOptions, kBasicScript, secureURL, secureURL, String(), NoCors); |
| } |
| TEST_F(SubresourceIntegrityTest, CheckSubresourceIntegrityInInsecureOrigin) |