Chromium Code Reviews| Index: components/gcm_driver/crypto/message_payload_parser.cc |
| diff --git a/components/gcm_driver/crypto/message_payload_parser.cc b/components/gcm_driver/crypto/message_payload_parser.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c9854fbccfd160fd36912abb89b8c1a346e57035 |
| --- /dev/null |
| +++ b/components/gcm_driver/crypto/message_payload_parser.cc |
| @@ -0,0 +1,62 @@ |
| +// 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 "components/gcm_driver/crypto/message_payload_parser.h" |
| + |
| +#include "base/big_endian.h" |
| + |
| +namespace gcm { |
| + |
| +namespace { |
| + |
| +// Size, in bytes, of the salt included in the message header. |
| +constexpr size_t kSaltSize = 16; |
| + |
| +// Size, in bytes, of the uncompressed point included in the message header. |
| +constexpr size_t kUncompressedPointSize = 65; |
|
johnme
2017/05/22 16:18:39
Nit: perhaps stick to "keyid" for consistency with
Peter Beverloo
2017/05/22 17:25:12
I've updated the header instead.
|
| + |
| +// Size, in bytes, of the smallest allowable record_size value. |
| +constexpr size_t kMinimumRecordSize = 18; |
| + |
| +// Size, in bytes, of an empty message with the minimum amount of padding. |
| +constexpr size_t kMinimumMessageSize = |
| + kSaltSize + sizeof(uint32_t) + sizeof(uint8_t) + kUncompressedPointSize + |
|
johnme
2017/05/22 16:18:39
Nit: perhaps use sizeof(record_size_) instead of s
Peter Beverloo
2017/05/22 17:25:12
That's a private class member, so it'd be a bit aw
|
| + kMinimumRecordSize; |
| + |
| +} // namespace |
| + |
| +MessagePayloadParser::MessagePayloadParser(base::StringPiece message) { |
| + if (message.size() < kMinimumMessageSize) |
| + return; |
| + |
| + salt_ = message.substr(0, kSaltSize); |
| + message.remove_prefix(kSaltSize); |
| + |
| + base::ReadBigEndian(message.data(), &record_size_); |
|
johnme
2017/05/22 16:18:39
Do we need to worry about the "This would cause SI
Peter Beverloo
2017/05/22 17:25:12
Looking at code search, it doesn't look like we su
|
| + message.remove_prefix(sizeof(record_size_)); |
| + |
| + if (record_size_ < kMinimumRecordSize) |
| + return; |
| + |
| + uint8_t public_key_length; |
| + base::ReadBigEndian(message.data(), &public_key_length); |
| + message.remove_prefix(sizeof(public_key_length)); |
| + |
| + if (public_key_length != kUncompressedPointSize) |
| + return; |
| + |
| + public_key_ = message.substr(0, kUncompressedPointSize); |
|
johnme
2017/05/22 16:18:39
It's a little surprising that you mention in the c
Peter Beverloo
2017/05/22 17:25:12
Done.
|
| + message.remove_prefix(kUncompressedPointSize); |
| + |
| + ciphertext_ = message; |
| + |
| + if (ciphertext_.size() < kMinimumRecordSize) |
|
johnme
2017/05/22 16:18:39
Shouldn't this be `(ciphertext_.size() != record_s
Peter Beverloo
2017/05/22 17:25:12
No, because record_size_ can be larger too. (We de
|
| + return; |
| + |
| + is_valid_ = true; |
| +} |
| + |
| +MessagePayloadParser::~MessagePayloadParser() = default; |
| + |
| +} // namespace gcm |