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.
4
5#include "net/quic/crypto/null_encrypter.h"
6#include "net/quic/quic_data_writer.h"
7#include "net/quic/quic_utils.h"
8
9using base::StringPiece;
10using std::string;
11
12namespace net {
13
14const size_t kHashSizeShort = 12;  // size of uint128 serialized short
15
16NullEncrypter::NullEncrypter() {}
17
18bool NullEncrypter::SetKey(StringPiece key) { return key.empty(); }
19
20bool NullEncrypter::SetNoncePrefix(StringPiece nonce_prefix) {
21  return nonce_prefix.empty();
22}
23
24bool NullEncrypter::Encrypt(
25    StringPiece /*nonce*/,
26    StringPiece associated_data,
27    StringPiece plaintext,
28    unsigned char* output) {
29  string buffer = associated_data.as_string();
30  plaintext.AppendToString(&buffer);
31  uint128 hash = QuicUtils::FNV1a_128_Hash(buffer.data(), buffer.length());
32  QuicUtils::SerializeUint128Short(hash, output);
33  memcpy(output + GetHashLength(), plaintext.data(), plaintext.size());
34  return true;
35}
36
37QuicData* NullEncrypter::EncryptPacket(
38    QuicPacketSequenceNumber /*sequence_number*/,
39    StringPiece associated_data,
40    StringPiece plaintext) {
41  const size_t len = plaintext.size() + GetHashLength();
42  uint8* buffer = new uint8[len];
43  Encrypt(StringPiece(), associated_data, plaintext, buffer);
44  return new QuicData(reinterpret_cast<char*>(buffer), len, true);
45}
46
47size_t NullEncrypter::GetKeySize() const { return 0; }
48
49size_t NullEncrypter::GetNoncePrefixSize() const { return 0; }
50
51size_t NullEncrypter::GetMaxPlaintextSize(size_t ciphertext_size) const {
52  return ciphertext_size - GetHashLength();
53}
54
55size_t NullEncrypter::GetCiphertextSize(size_t plaintext_size) const {
56  return plaintext_size + GetHashLength();
57}
58
59StringPiece NullEncrypter::GetKey() const { return StringPiece(); }
60
61StringPiece NullEncrypter::GetNoncePrefix() const { return StringPiece(); }
62
63size_t NullEncrypter::GetHashLength() const {
64  return kHashSizeShort;
65}
66
67}  // namespace net
68