null_encrypter.cc revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
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)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kHashSize = 16;  // size of uint128 serialized
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool NullEncrypter::SetKey(StringPiece key) { return key.empty(); }
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool NullEncrypter::SetNoncePrefix(StringPiece nonce_prefix) {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return nonce_prefix.empty();
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool NullEncrypter::Encrypt(
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece /*nonce*/,
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece associated_data,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece plaintext,
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned char* output) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string buffer = associated_data.as_string();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plaintext.AppendToString(&buffer);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint128 hash = QuicUtils::FNV1a_128_Hash(buffer.data(), buffer.length());
30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  QuicUtils::SerializeUint128(hash, output);
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  memcpy(output + sizeof(hash), plaintext.data(), plaintext.size());
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return true;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)QuicData* NullEncrypter::EncryptPacket(
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    QuicPacketSequenceNumber /*sequence_number*/,
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece associated_data,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    StringPiece plaintext) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const size_t len = plaintext.size() + sizeof(uint128);
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  uint8* buffer = new uint8[len];
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Encrypt(StringPiece(), associated_data, plaintext, buffer);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new QuicData(reinterpret_cast<char*>(buffer), len, true);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)size_t NullEncrypter::GetKeySize() const { return 0; }
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
47b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)size_t NullEncrypter::GetNoncePrefixSize() const { return 0; }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t NullEncrypter::GetMaxPlaintextSize(size_t ciphertext_size) const {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ciphertext_size - kHashSize;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t NullEncrypter::GetCiphertextSize(size_t plaintext_size) const {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return plaintext_size + kHashSize;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)StringPiece NullEncrypter::GetKey() const { return StringPiece(); }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)StringPiece NullEncrypter::GetNoncePrefix() const { return StringPiece(); }
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
62