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) |