Index: components/gcm_driver/crypto/encryption_header_parsers.cc |
diff --git a/components/gcm_driver/crypto/encryption_header_parsers.cc b/components/gcm_driver/crypto/encryption_header_parsers.cc |
index 4f199bd9f96939b7c65487fc9903f507f20fc70d..6fad64440a65cbf47f61129eebe1cb786af357f4 100644 |
--- a/components/gcm_driver/crypto/encryption_header_parsers.cc |
+++ b/components/gcm_driver/crypto/encryption_header_parsers.cc |
@@ -75,6 +75,10 @@ bool EncryptionHeaderIterator::GetNext() { |
net::HttpUtil::NameValuePairsIterator::Values::REQUIRED, |
net::HttpUtil::NameValuePairsIterator::Quotes::NOT_STRICT); |
+ bool found_keyid = false; |
+ bool found_salt = false; |
+ bool found_rs = false; |
+ |
while (name_value_pairs.GetNext()) { |
const base::StringPiece name(name_value_pairs.name_begin(), |
name_value_pairs.name_end()); |
@@ -82,13 +86,18 @@ bool EncryptionHeaderIterator::GetNext() { |
name_value_pairs.value_end()); |
if (base::LowerCaseEqualsASCII(name, "keyid")) { |
+ if (found_keyid) |
+ return false; |
value.CopyToString(&keyid_); |
+ found_keyid = true; |
} else if (base::LowerCaseEqualsASCII(name, "salt")) { |
- if (!ValueToDecodedString(value, &salt_)) |
+ if (found_salt || !ValueToDecodedString(value, &salt_)) |
return false; |
+ found_salt = true; |
} else if (base::LowerCaseEqualsASCII(name, "rs")) { |
- if (!RecordSizeToInt(value, &rs_)) |
+ if (found_rs || !RecordSizeToInt(value, &rs_)) |
return false; |
+ found_rs = true; |
} else { |
// Silently ignore unknown directives for forward compatibility. |
} |
@@ -117,6 +126,10 @@ bool CryptoKeyHeaderIterator::GetNext() { |
net::HttpUtil::NameValuePairsIterator::Values::REQUIRED, |
net::HttpUtil::NameValuePairsIterator::Quotes::NOT_STRICT); |
+ bool found_keyid = false; |
+ bool found_aesgcm128 = false; |
+ bool found_dh = false; |
+ |
while (name_value_pairs.GetNext()) { |
const base::StringPiece name(name_value_pairs.name_begin(), |
name_value_pairs.name_end()); |
@@ -124,13 +137,18 @@ bool CryptoKeyHeaderIterator::GetNext() { |
name_value_pairs.value_end()); |
if (base::LowerCaseEqualsASCII(name, "keyid")) { |
+ if (found_keyid) |
+ return false; |
value.CopyToString(&keyid_); |
+ found_keyid = true; |
} else if (base::LowerCaseEqualsASCII(name, "aesgcm128")) { |
- if (!ValueToDecodedString(value, &aesgcm128_)) |
+ if (found_aesgcm128 || !ValueToDecodedString(value, &aesgcm128_)) |
return false; |
+ found_aesgcm128 = true; |
} else if (base::LowerCaseEqualsASCII(name, "dh")) { |
- if (!ValueToDecodedString(value, &dh_)) |
+ if (found_dh || !ValueToDecodedString(value, &dh_)) |
return false; |
+ found_dh = true; |
} else { |
// Silently ignore unknown directives for forward compatibility. |
} |