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