blob: fcb04ab9204f6882f78ceee47fde371ff75735fb [file] [log] [blame]
[email protected]ed3fc15d2013-03-08 18:37:441// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/quic/test_tools/crypto_test_utils.h"
[email protected]72818ea2013-03-13 03:23:576
[email protected]14e8106c2013-03-14 16:25:337#include "base/string_piece.h"
8#include "net/quic/crypto/quic_decrypter.h"
9#include "net/quic/crypto/quic_encrypter.h"
[email protected]ed3fc15d2013-03-08 18:37:4410#include "net/quic/quic_crypto_client_stream.h"
11#include "net/quic/quic_crypto_server_stream.h"
12#include "net/quic/quic_crypto_stream.h"
13#include "net/quic/test_tools/quic_test_utils.h"
14#include "net/quic/test_tools/simple_quic_framer.h"
[email protected]ed3fc15d2013-03-08 18:37:4415
[email protected]14e8106c2013-03-14 16:25:3316using base::StringPiece;
[email protected]ccc66e8a2013-03-26 08:26:1417using std::string;
[email protected]14e8106c2013-03-14 16:25:3318
[email protected]ed3fc15d2013-03-08 18:37:4419namespace net {
20namespace test {
21
22namespace {
23
24class TestSession : public QuicSession {
25 public:
26 TestSession(QuicConnection* connection, bool is_server)
27 : QuicSession(connection, is_server) {
28 }
29
30 MOCK_METHOD1(CreateIncomingReliableStream,
31 ReliableQuicStream*(QuicStreamId id));
32 MOCK_METHOD0(GetCryptoStream, QuicCryptoStream*());
33 MOCK_METHOD0(CreateOutgoingReliableStream, ReliableQuicStream*());
34};
35
36// CommunicateHandshakeMessages moves messages from |a| to |b| and back until
37// |a|'s handshake has completed.
38void CommunicateHandshakeMessages(
39 PacketSavingConnection* a_conn,
40 QuicCryptoStream* a,
41 PacketSavingConnection* b_conn,
42 QuicCryptoStream* b) {
43 scoped_ptr<SimpleQuicFramer> framer;
44
45 for (size_t i = 0; !a->handshake_complete(); i++) {
46 framer.reset(new SimpleQuicFramer);
47
48 ASSERT_LT(i, a_conn->packets_.size());
49 ASSERT_TRUE(framer->ProcessPacket(*a_conn->packets_[i]));
50 ASSERT_EQ(1u, framer->stream_frames().size());
51
52 scoped_ptr<CryptoHandshakeMessage> a_msg(framer->HandshakeMessage(0));
53 b->OnHandshakeMessage(*(a_msg.get()));
54
55 framer.reset(new SimpleQuicFramer);
56 ASSERT_LT(i, b_conn->packets_.size());
57 ASSERT_TRUE(framer->ProcessPacket(*b_conn->packets_[i]));
58 ASSERT_EQ(1u, framer->stream_frames().size());
59
60 scoped_ptr<CryptoHandshakeMessage> b_msg(framer->HandshakeMessage(0));
61 a->OnHandshakeMessage(*(b_msg.get()));
62 }
63}
64
65} // anonymous namespace
66
67// static
68void CryptoTestUtils::HandshakeWithFakeServer(
69 PacketSavingConnection* client_conn,
[email protected]14e8106c2013-03-14 16:25:3370 QuicCryptoClientStream* client) {
[email protected]ed3fc15d2013-03-08 18:37:4471 QuicGuid guid(1);
[email protected]72818ea2013-03-13 03:23:5772 IPAddressNumber ip;
73 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
74 IPEndPoint addr = IPEndPoint(ip, 1);
[email protected]ed3fc15d2013-03-08 18:37:4475 PacketSavingConnection* server_conn =
[email protected]14e8106c2013-03-14 16:25:3376 new PacketSavingConnection(guid, addr, true);
[email protected]ed3fc15d2013-03-08 18:37:4477 TestSession server_session(server_conn, true);
78 QuicCryptoServerStream server(&server_session);
79
80 // The client's handshake must have been started already.
81 CHECK_NE(0u, client_conn->packets_.size());
82
83 CommunicateHandshakeMessages(client_conn, client, server_conn, &server);
[email protected]14e8106c2013-03-14 16:25:3384
85 CompareClientAndServerKeys(client, &server);
[email protected]ed3fc15d2013-03-08 18:37:4486}
87
88// static
89void CryptoTestUtils::HandshakeWithFakeClient(
90 PacketSavingConnection* server_conn,
[email protected]14e8106c2013-03-14 16:25:3391 QuicCryptoServerStream* server) {
[email protected]ed3fc15d2013-03-08 18:37:4492 QuicGuid guid(1);
[email protected]72818ea2013-03-13 03:23:5793 IPAddressNumber ip;
94 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
95 IPEndPoint addr = IPEndPoint(ip, 1);
[email protected]ed3fc15d2013-03-08 18:37:4496 PacketSavingConnection* client_conn =
[email protected]14e8106c2013-03-14 16:25:3397 new PacketSavingConnection(guid, addr, false);
[email protected]ed3fc15d2013-03-08 18:37:4498 TestSession client_session(client_conn, true);
99 QuicCryptoClientStream client(&client_session, "test.example.com");
100
101 CHECK(client.CryptoConnect());
102 CHECK_EQ(1u, client_conn->packets_.size());
103
104 CommunicateHandshakeMessages(client_conn, &client, server_conn, server);
[email protected]14e8106c2013-03-14 16:25:33105
106 CompareClientAndServerKeys(&client, server);
107}
108
109// static
[email protected]ccc66e8a2013-03-26 08:26:14110string CryptoTestUtils::GetValueForTag(const CryptoHandshakeMessage& message,
111 CryptoTag tag) {
112 CryptoTagValueMap::const_iterator it = message.tag_value_map().find(tag);
113 if (it == message.tag_value_map().end()) {
114 return string();
115 }
116 return it->second;
117}
118
[email protected]14e8106c2013-03-14 16:25:33119void CryptoTestUtils::CompareClientAndServerKeys(
120 QuicCryptoClientStream* client,
121 QuicCryptoServerStream* server) {
122 StringPiece client_encrypter_key =
123 client->crypto_negotiated_params_.encrypter->GetKey();
124 StringPiece client_encrypter_iv =
125 client->crypto_negotiated_params_.encrypter->GetNoncePrefix();
126 StringPiece client_decrypter_key =
127 client->crypto_negotiated_params_.decrypter->GetKey();
128 StringPiece client_decrypter_iv =
129 client->crypto_negotiated_params_.decrypter->GetNoncePrefix();
130 StringPiece server_encrypter_key =
131 server->crypto_negotiated_params_.encrypter->GetKey();
132 StringPiece server_encrypter_iv =
133 server->crypto_negotiated_params_.encrypter->GetNoncePrefix();
134 StringPiece server_decrypter_key =
135 server->crypto_negotiated_params_.decrypter->GetKey();
136 StringPiece server_decrypter_iv =
137 server->crypto_negotiated_params_.decrypter->GetNoncePrefix();
138 CompareCharArraysWithHexError("client write key",
139 client_encrypter_key.data(),
140 client_encrypter_key.length(),
141 server_decrypter_key.data(),
142 server_decrypter_key.length());
143 CompareCharArraysWithHexError("client write IV",
144 client_encrypter_iv.data(),
145 client_encrypter_iv.length(),
146 server_decrypter_iv.data(),
147 server_decrypter_iv.length());
148 CompareCharArraysWithHexError("server write key",
149 server_encrypter_key.data(),
150 server_encrypter_key.length(),
151 client_decrypter_key.data(),
152 client_decrypter_key.length());
153 CompareCharArraysWithHexError("server write IV",
154 server_encrypter_iv.data(),
155 server_encrypter_iv.length(),
156 client_decrypter_iv.data(),
157 client_decrypter_iv.length());
[email protected]ed3fc15d2013-03-08 18:37:44158}
159} // namespace test
160} // namespace net