| Index: rlz/lib/net_response_check.cc
|
| diff --git a/rlz/lib/net_response_check.cc b/rlz/lib/net_response_check.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e018176d00a55a88f02f1bf5d95c47195cb6150c
|
| --- /dev/null
|
| +++ b/rlz/lib/net_response_check.cc
|
| @@ -0,0 +1,67 @@
|
| +// 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
|
|
|