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/quic_crypto_stream.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/crypto/crypto_handshake.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/crypto/crypto_protocol.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/quic/test_tools/crypto_test_utils.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::string; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using std::vector; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockQuicCryptoStream : public QuicCryptoStream { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MockQuicCryptoStream(QuicSession* session) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : QuicCryptoStream(session) { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnHandshakeMessage( 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CryptoHandshakeMessage& message) OVERRIDE { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) messages_.push_back(message); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vector<CryptoHandshakeMessage>* messages() { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &messages_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vector<CryptoHandshakeMessage> messages_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockQuicCryptoStream); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuicCryptoStreamTest : public ::testing::Test { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicCryptoStreamTest() 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : addr_(IPAddressNumber(), 1), 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) connection_(new MockConnection(1, addr_, false)), 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) session_(connection_, true), 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream_(&session_) { 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_.set_tag(kSHLO); 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_.SetStringPiece(1, "abc"); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_.SetStringPiece(2, "def"); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstructHandshakeMessage(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ConstructHandshakeMessage() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CryptoFramer framer; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_data_.reset(framer.ConstructHandshakeMessage(message_)); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPEndPoint addr_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockConnection* connection_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSession session_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockQuicCryptoStream stream_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CryptoHandshakeMessage message_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<QuicData> message_data_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(QuicCryptoStreamTest); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicCryptoStreamTest, NotInitiallyConected) { 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(stream_.encryption_established()); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(stream_.handshake_confirmed()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicCryptoStreamTest, OnErrorClosesConnection) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CryptoFramer framer; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(session_, ConnectionClose(QUIC_NO_ERROR, false)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream_.OnError(&framer); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicCryptoStreamTest, ProcessData) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(message_data_->length(), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stream_.ProcessData(message_data_->data(), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_data_->length())); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, stream_.messages()->size()); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CryptoHandshakeMessage& message = (*stream_.messages())[0]; 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(kSHLO, message.tag()); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(2u, message.tag_value_map().size()); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("abc", CryptoTestUtils::GetValueForTag(message, 1)); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("def", CryptoTestUtils::GetValueForTag(message, 2)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(QuicCryptoStreamTest, ProcessBadData) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string bad(message_data_->data(), message_data_->length()); 101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const int kFirstTagIndex = sizeof(uint32) + // message tag 102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) sizeof(uint16) + // number of tag-value pairs 103b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) sizeof(uint16); // padding 104b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(1, bad[kFirstTagIndex]); 105b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bad[kFirstTagIndex] = 0x7F; // out of order tag 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*connection_, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendConnectionClose(QUIC_CRYPTO_TAGS_OUT_OF_ORDER)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, stream_.ProcessData(bad.data(), bad.length())); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 115