Add missing mandoline build deps caught by the new GN version.
[chromium-blink-merge.git] / net / quic / crypto / null_decrypter.cc
blob19f9ad10102020b2e61777adf957fe289a27aff5
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include <stdint.h>
7 #include "net/quic/crypto/null_decrypter.h"
8 #include "net/quic/quic_utils.h"
9 #include "net/quic/quic_data_reader.h"
11 using base::StringPiece;
12 using std::string;
14 namespace net {
16 NullDecrypter::NullDecrypter() {}
18 bool NullDecrypter::SetKey(StringPiece key) { return key.empty(); }
20 bool NullDecrypter::SetNoncePrefix(StringPiece nonce_prefix) {
21 return nonce_prefix.empty();
24 bool NullDecrypter::DecryptPacket(QuicPacketSequenceNumber /*seq_number*/,
25 const StringPiece& associated_data,
26 const StringPiece& ciphertext,
27 char* output,
28 size_t* output_length,
29 size_t max_output_length) {
30 QuicDataReader reader(ciphertext.data(), ciphertext.length());
31 uint128 hash;
33 if (!ReadHash(&reader, &hash)) {
34 return false;
37 StringPiece plaintext = reader.ReadRemainingPayload();
38 if (plaintext.length() > max_output_length) {
39 LOG(DFATAL) << "Output buffer must be larger than the plaintext.";
40 return false;
42 if (hash != ComputeHash(associated_data, plaintext)) {
43 return false;
45 // Copy the plaintext to output.
46 memcpy(output, plaintext.data(), plaintext.length());
47 *output_length = plaintext.length();
48 return true;
51 StringPiece NullDecrypter::GetKey() const { return StringPiece(); }
53 StringPiece NullDecrypter::GetNoncePrefix() const { return StringPiece(); }
55 bool NullDecrypter::ReadHash(QuicDataReader* reader, uint128* hash) {
56 uint64 lo;
57 uint32 hi;
58 if (!reader->ReadUInt64(&lo) ||
59 !reader->ReadUInt32(&hi)) {
60 return false;
62 *hash = hi;
63 *hash <<= 64;
64 *hash += lo;
65 return true;
68 uint128 NullDecrypter::ComputeHash(const StringPiece& data1,
69 const StringPiece& data2) const {
70 uint128 correct_hash = QuicUtils::FNV1a_128_Hash_Two(
71 data1.data(), data1.length(), data2.data(), data2.length());
72 uint128 mask(UINT64_C(0x0), UINT64_C(0xffffffff));
73 mask <<= 96;
74 correct_hash &= ~mask;
75 return correct_hash;
78 } // namespace net