| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "quic/core/quic_crypto_handshaker.h" |
| |
| #include "quic/core/quic_session.h" |
| |
| namespace quic { |
| |
| #define ENDPOINT \ |
| (session()->perspective() == Perspective::IS_SERVER ? "Server: " : "Client: ") |
| |
| QuicCryptoHandshaker::QuicCryptoHandshaker(QuicCryptoStream* stream, |
| QuicSession* session) |
| : stream_(stream), session_(session), last_sent_handshake_message_tag_(0) { |
| crypto_framer_.set_visitor(this); |
| } |
| |
| QuicCryptoHandshaker::~QuicCryptoHandshaker() {} |
| |
| void QuicCryptoHandshaker::SendHandshakeMessage( |
| const CryptoHandshakeMessage& message, |
| EncryptionLevel level) { |
| QUIC_DVLOG(1) << ENDPOINT << "Sending " << message.DebugString(); |
| session()->NeuterUnencryptedData(); |
| session()->OnCryptoHandshakeMessageSent(message); |
| last_sent_handshake_message_tag_ = message.tag(); |
| const QuicData& data = message.GetSerialized(); |
| stream_->WriteCryptoData(session_->use_write_or_buffer_data_at_level() |
| ? level |
| : session_->connection()->encryption_level(), |
| data.AsStringPiece()); |
| } |
| |
| void QuicCryptoHandshaker::OnError(CryptoFramer* framer) { |
| QUIC_DLOG(WARNING) << "Error processing crypto data: " |
| << QuicErrorCodeToString(framer->error()); |
| } |
| |
| void QuicCryptoHandshaker::OnHandshakeMessage( |
| const CryptoHandshakeMessage& message) { |
| QUIC_DVLOG(1) << ENDPOINT << "Received " << message.DebugString(); |
| session()->OnCryptoHandshakeMessageReceived(message); |
| } |
| |
| CryptoMessageParser* QuicCryptoHandshaker::crypto_message_parser() { |
| return &crypto_framer_; |
| } |
| |
| size_t QuicCryptoHandshaker::BufferSizeLimitForLevel(EncryptionLevel) const { |
| return GetQuicFlag(FLAGS_quic_max_buffered_crypto_bytes); |
| } |
| |
| #undef ENDPOINT // undef for jumbo builds |
| } // namespace quic |