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 "net/quic/crypto/null_decrypter.h"
6 #include "net/quic/quic_utils.h"
7 #include "net/quic/quic_data_reader.h"
9 using base::StringPiece
;
14 NullDecrypter::NullDecrypter() {}
16 bool NullDecrypter::SetKey(StringPiece key
) { return key
.empty(); }
18 bool NullDecrypter::SetNoncePrefix(StringPiece nonce_prefix
) {
19 return nonce_prefix
.empty();
22 bool NullDecrypter::DecryptPacket(QuicPacketSequenceNumber
/*seq_number*/,
23 const StringPiece
& associated_data
,
24 const StringPiece
& ciphertext
,
26 size_t* output_length
,
27 size_t max_output_length
) {
28 QuicDataReader
reader(ciphertext
.data(), ciphertext
.length());
31 if (!ReadHash(&reader
, &hash
)) {
35 StringPiece plaintext
= reader
.ReadRemainingPayload();
36 if (plaintext
.length() > max_output_length
) {
37 LOG(DFATAL
) << "Output buffer must be larger than the plaintext.";
40 if (hash
!= ComputeHash(associated_data
, plaintext
)) {
43 // Copy the plaintext to output.
44 memcpy(output
, plaintext
.data(), plaintext
.length());
45 *output_length
= plaintext
.length();
49 StringPiece
NullDecrypter::GetKey() const { return StringPiece(); }
51 StringPiece
NullDecrypter::GetNoncePrefix() const { return StringPiece(); }
53 bool NullDecrypter::ReadHash(QuicDataReader
* reader
, uint128
* hash
) {
56 if (!reader
->ReadUInt64(&lo
) ||
57 !reader
->ReadUInt32(&hi
)) {
66 uint128
NullDecrypter::ComputeHash(const StringPiece
& data1
,
67 const StringPiece
& data2
) const {
68 uint128 correct_hash
= QuicUtils::FNV1a_128_Hash_Two(
69 data1
.data(), data1
.length(), data2
.data(), data2
.length());
70 uint128
mask(GG_UINT64_C(0x0), GG_UINT64_C(0xffffffff));
72 correct_hash
&= ~mask
;