OLD | NEW |
| (Empty) |
1 // 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 #ifndef NET_QUIC_TEST_TOOLS_CRYPTO_TEST_UTILS_H_ | |
6 #define NET_QUIC_TEST_TOOLS_CRYPTO_TEST_UTILS_H_ | |
7 | |
8 #include <stdarg.h> | |
9 | |
10 #include <utility> | |
11 #include <vector> | |
12 | |
13 #include "base/basictypes.h" | |
14 #include "base/logging.h" | |
15 #include "base/strings/string_piece.h" | |
16 #include "net/quic/crypto/crypto_framer.h" | |
17 #include "net/quic/quic_framer.h" | |
18 #include "net/quic/quic_protocol.h" | |
19 | |
20 namespace net { | |
21 | |
22 class ChannelIDSource; | |
23 class CommonCertSets; | |
24 class ProofSource; | |
25 class ProofVerifier; | |
26 class ProofVerifyContext; | |
27 class QuicClock; | |
28 class QuicConfig; | |
29 class QuicCryptoClientStream; | |
30 class QuicCryptoServerConfig; | |
31 class QuicCryptoServerStream; | |
32 class QuicCryptoStream; | |
33 class QuicRandom; | |
34 | |
35 namespace test { | |
36 | |
37 class PacketSavingConnection; | |
38 | |
39 class CryptoTestUtils { | |
40 public: | |
41 // An interface for a source of callbacks. This is used for invoking | |
42 // callbacks asynchronously. | |
43 // | |
44 // Call the RunPendingCallbacks method regularly to run the callbacks from | |
45 // this source. | |
46 class CallbackSource { | |
47 public: | |
48 virtual ~CallbackSource() {} | |
49 | |
50 // Runs pending callbacks from this source. If there is no pending | |
51 // callback, does nothing. | |
52 virtual void RunPendingCallbacks() = 0; | |
53 }; | |
54 | |
55 // FakeClientOptions bundles together a number of options for configuring | |
56 // HandshakeWithFakeClient. | |
57 struct FakeClientOptions { | |
58 FakeClientOptions(); | |
59 | |
60 // If dont_verify_certs is true then no ProofVerifier is set on the client. | |
61 // Thus no certificates will be requested or checked. | |
62 bool dont_verify_certs; | |
63 | |
64 // If channel_id_enabled is true then the client will attempt to send a | |
65 // ChannelID. | |
66 bool channel_id_enabled; | |
67 | |
68 // If channel_id_source_async is true then the client will use an async | |
69 // ChannelIDSource for testing. Ignored if channel_id_enabled is false. | |
70 bool channel_id_source_async; | |
71 }; | |
72 | |
73 // returns: the number of client hellos that the client sent. | |
74 static int HandshakeWithFakeServer(PacketSavingConnection* client_conn, | |
75 QuicCryptoClientStream* client); | |
76 | |
77 // returns: the number of client hellos that the client sent. | |
78 static int HandshakeWithFakeClient(PacketSavingConnection* server_conn, | |
79 QuicCryptoServerStream* server, | |
80 const FakeClientOptions& options); | |
81 | |
82 // SetupCryptoServerConfigForTest configures |config| and |crypto_config| | |
83 // with sensible defaults for testing. | |
84 static void SetupCryptoServerConfigForTest( | |
85 const QuicClock* clock, | |
86 QuicRandom* rand, | |
87 QuicConfig* config, | |
88 QuicCryptoServerConfig* crypto_config); | |
89 | |
90 // CommunicateHandshakeMessages moves messages from |a| to |b| and back until | |
91 // |a|'s handshake has completed. | |
92 static void CommunicateHandshakeMessages(PacketSavingConnection* a_conn, | |
93 QuicCryptoStream* a, | |
94 PacketSavingConnection* b_conn, | |
95 QuicCryptoStream* b); | |
96 | |
97 // CommunicateHandshakeMessagesAndRunCallbacks moves messages from |a| to |b| | |
98 // and back until |a|'s handshake has completed. If |callback_source| is not | |
99 // nullptr, CommunicateHandshakeMessagesAndRunCallbacks also runs callbacks | |
100 // from | |
101 // |callback_source| between processing messages. | |
102 static void CommunicateHandshakeMessagesAndRunCallbacks( | |
103 PacketSavingConnection* a_conn, | |
104 QuicCryptoStream* a, | |
105 PacketSavingConnection* b_conn, | |
106 QuicCryptoStream* b, | |
107 CallbackSource* callback_source); | |
108 | |
109 // AdvanceHandshake attempts to moves messages from |a| to |b| and |b| to |a|. | |
110 // Returns the number of messages moved. | |
111 static std::pair<size_t, size_t> AdvanceHandshake( | |
112 PacketSavingConnection* a_conn, | |
113 QuicCryptoStream* a, | |
114 size_t a_i, | |
115 PacketSavingConnection* b_conn, | |
116 QuicCryptoStream* b, | |
117 size_t b_i); | |
118 | |
119 // Returns the value for the tag |tag| in the tag value map of |message|. | |
120 static std::string GetValueForTag(const CryptoHandshakeMessage& message, | |
121 QuicTag tag); | |
122 | |
123 // Returns a |ProofSource| that serves up test certificates. | |
124 static ProofSource* ProofSourceForTesting(); | |
125 | |
126 // Returns a |ProofVerifier| that uses the QUIC testing root CA. | |
127 static ProofVerifier* ProofVerifierForTesting(); | |
128 | |
129 // Returns a |ProofVerifyContext| that must be used with the verifier | |
130 // returned by |ProofVerifierForTesting|. | |
131 static ProofVerifyContext* ProofVerifyContextForTesting(); | |
132 | |
133 // These functions return a fake |ProofSource|, |ProofVerifier|, or | |
134 // |ProofVerifyContext| that works with each other. These are suitable for | |
135 // unit tests that aren't concerned with |ProofSource| and |ProofVerifier|. | |
136 // TODO(wtc): delete these when Chromium has a working | |
137 // ProofSourceForTesting(). | |
138 static ProofSource* FakeProofSourceForTesting(); | |
139 static ProofVerifier* FakeProofVerifierForTesting(); | |
140 static ProofVerifyContext* FakeProofVerifyContextForTesting(); | |
141 | |
142 // MockCommonCertSets returns a CommonCertSets that contains a single set with | |
143 // hash |hash|, consisting of the certificate |cert| at index |index|. | |
144 static CommonCertSets* MockCommonCertSets(base::StringPiece cert, | |
145 uint64 hash, | |
146 uint32 index); | |
147 | |
148 // ParseTag returns a QuicTag from parsing |tagstr|. |tagstr| may either be | |
149 // in the format "EXMP" (i.e. ASCII format), or "#11223344" (an explicit hex | |
150 // format). It CHECK fails if there's a parse error. | |
151 static QuicTag ParseTag(const char* tagstr); | |
152 | |
153 // Message constructs a handshake message from a variable number of | |
154 // arguments. |message_tag| is passed to |ParseTag| and used as the tag of | |
155 // the resulting message. The arguments are taken in pairs and nullptr | |
156 // terminated. The first of each pair is the tag of a tag/value and is given | |
157 // as an argument to |ParseTag|. The second is the value of the tag/value | |
158 // pair and is either a hex dump, preceeded by a '#', or a raw value. | |
159 // | |
160 // Message( | |
161 // "CHLO", | |
162 // "NOCE", "#11223344", | |
163 // "SNI", "www.example.com", | |
164 // nullptr); | |
165 static CryptoHandshakeMessage Message(const char* message_tag, ...); | |
166 | |
167 // BuildMessage is the same as |Message|, but takes the variable arguments | |
168 // explicitly. TODO(rtenneti): Investigate whether it'd be better for | |
169 // Message() and BuildMessage() to return a CryptoHandshakeMessage* pointer | |
170 // instead, to avoid copying the return value. | |
171 static CryptoHandshakeMessage BuildMessage(const char* message_tag, | |
172 va_list ap); | |
173 | |
174 // ChannelIDSourceForTesting returns a ChannelIDSource that generates keys | |
175 // deterministically based on the hostname given in the GetChannelIDKey call. | |
176 // This ChannelIDSource works in synchronous mode, i.e., its GetChannelIDKey | |
177 // method never returns QUIC_PENDING. | |
178 static ChannelIDSource* ChannelIDSourceForTesting(); | |
179 | |
180 private: | |
181 static void CompareClientAndServerKeys(QuicCryptoClientStream* client, | |
182 QuicCryptoServerStream* server); | |
183 | |
184 DISALLOW_COPY_AND_ASSIGN(CryptoTestUtils); | |
185 }; | |
186 | |
187 } // namespace test | |
188 | |
189 } // namespace net | |
190 | |
191 #endif // NET_QUIC_TEST_TOOLS_CRYPTO_TEST_UTILS_H_ | |
OLD | NEW |