12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // Copyright 2017 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- //
- #include "rlz/lib/net_response_check.h"
- #include "base/strings/string_util.h"
- #include "rlz/lib/assert.h"
- #include "rlz/lib/crc32.h"
- #include "rlz/lib/string_utils.h"
- // Checksum validation convenience call for RLZ responses.
- namespace rlz_lib {
- bool IsPingResponseValid(const char* response, int* checksum_idx) {
- if (!response || !response[0])
- return false;
- if (checksum_idx)
- *checksum_idx = -1;
- if (strlen(response) > kMaxPingResponseLength) {
- ASSERT_STRING("IsPingResponseValid: response is too long to parse.");
- return false;
- }
- // Find the checksum line.
- std::string response_string(response);
- std::string checksum_param("\ncrc32: ");
- int calculated_crc;
- int checksum_index = response_string.find(checksum_param);
- if (checksum_index >= 0) {
- // Calculate checksum of message preceeding checksum line.
- // (+ 1 to include the \n)
- std::string message(response_string.substr(0, checksum_index + 1));
- if (!Crc32(message.c_str(), &calculated_crc))
- return false;
- } else {
- checksum_param = "crc32: "; // Empty response case.
- if (!base::StartsWith(response_string, checksum_param,
- base::CompareCase::SENSITIVE))
- return false;
- checksum_index = 0;
- if (!Crc32("", &calculated_crc))
- return false;
- }
- // Find the checksum value on the response.
- int checksum_end = response_string.find("\n", checksum_index + 1);
- if (checksum_end < 0)
- checksum_end = response_string.size();
- int checksum_begin = checksum_index + checksum_param.size();
- std::string checksum =
- response_string.substr(checksum_begin, checksum_end - checksum_begin + 1);
- base::TrimWhitespaceASCII(checksum, base::TRIM_ALL, &checksum);
- if (checksum_idx)
- *checksum_idx = checksum_index;
- return calculated_crc == HexStringToInteger(checksum.c_str());
- }
- } // namespace rlz_lib
|