15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/crypto/null_encrypter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_data_writer.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_utils.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::StringPiece;
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::string;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const size_t kHashSizeShort = 12;  // size of uint128 serialized short
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)NullEncrypter::NullEncrypter() {}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool NullEncrypter::SetKey(StringPiece key) { return key.empty(); }
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NullEncrypter::SetNoncePrefix(StringPiece nonce_prefix) {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return nonce_prefix.empty();
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool NullEncrypter::Encrypt(
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece /*nonce*/,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece associated_data,
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece plaintext,
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned char* output) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string buffer = associated_data.as_string();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plaintext.AppendToString(&buffer);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint128 hash = QuicUtils::FNV1a_128_Hash(buffer.data(), buffer.length());
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  QuicUtils::SerializeUint128Short(hash, output);
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  memcpy(output + GetHashLength(), plaintext.data(), plaintext.size());
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicData* NullEncrypter::EncryptPacket(
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuicPacketSequenceNumber /*sequence_number*/,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece associated_data,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece plaintext) {
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const size_t len = plaintext.size() + GetHashLength();
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint8* buffer = new uint8[len];
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Encrypt(StringPiece(), associated_data, plaintext, buffer);
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new QuicData(reinterpret_cast<char*>(buffer), len, true);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)size_t NullEncrypter::GetKeySize() const { return 0; }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
49b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)size_t NullEncrypter::GetNoncePrefixSize() const { return 0; }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t NullEncrypter::GetMaxPlaintextSize(size_t ciphertext_size) const {
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return ciphertext_size - GetHashLength();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t NullEncrypter::GetCiphertextSize(size_t plaintext_size) const {
564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return plaintext_size + GetHashLength();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)StringPiece NullEncrypter::GetKey() const { return StringPiece(); }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)StringPiece NullEncrypter::GetNoncePrefix() const { return StringPiece(); }
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)size_t NullEncrypter::GetHashLength() const {
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return kHashSizeShort;
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
68