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