Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(407)

Side by Side Diff: crypto/p224_spake_unittest.cc

Issue 8499032: net: add low-entropy, shared secret authentication protocol. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ... Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « crypto/p224_spake.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 <crypto/p224_spake.h>
6
7 #include "base/logging.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 using namespace crypto;
11
12 bool RunExchange(P224EncryptedKeyExchange* client,
13 P224EncryptedKeyExchange* server) {
14
15 for (;;) {
16 std::string client_message, server_message;
17 client_message = client->GetMessage();
18 server_message = server->GetMessage();
19
20 P224EncryptedKeyExchange::Result client_result, server_result;
21 client_result = client->ProcessMessage(server_message);
22 server_result = server->ProcessMessage(client_message);
23
24 // Check that we never hit the case where only one succeeds.
25 if ((client_result == P224EncryptedKeyExchange::kResultSuccess) ^
26 (server_result == P224EncryptedKeyExchange::kResultSuccess)) {
27 CHECK(false) << "Parties differ on whether authentication was successful";
28 }
29
30 if (client_result == P224EncryptedKeyExchange::kResultFailed ||
31 server_result == P224EncryptedKeyExchange::kResultFailed) {
32 return false;
33 }
34
35 if (client_result == P224EncryptedKeyExchange::kResultSuccess &&
36 server_result == P224EncryptedKeyExchange::kResultSuccess) {
37 return true;
38 }
39
40 CHECK_EQ(P224EncryptedKeyExchange::kResultPending, client_result);
41 CHECK_EQ(P224EncryptedKeyExchange::kResultPending, server_result);
42 }
43 }
44
45 static const char kPassword[] = "foo";
46 static const char kSession[] = "bar";
47
48 TEST(MutualAuth, CorrectAuth) {
49 P224EncryptedKeyExchange client(
50 P224EncryptedKeyExchange::kPeerTypeClient,
51 kPassword, kSession);
52 P224EncryptedKeyExchange server(
53 P224EncryptedKeyExchange::kPeerTypeServer,
54 kPassword, kSession);
55
56 EXPECT_TRUE(RunExchange(&client, &server));
57 }
58
59 TEST(MutualAuth, IncorrectPassword) {
60 P224EncryptedKeyExchange client(
61 P224EncryptedKeyExchange::kPeerTypeClient,
62 kPassword, kSession);
63 P224EncryptedKeyExchange server(
64 P224EncryptedKeyExchange::kPeerTypeServer,
65 "wrongpassword", kSession);
66
67 EXPECT_FALSE(RunExchange(&client, &server));
68 }
69
70 TEST(MutualAuth, IncorrectSession) {
71 P224EncryptedKeyExchange client(
72 P224EncryptedKeyExchange::kPeerTypeClient,
73 kPassword, kSession);
74 P224EncryptedKeyExchange server(
75 P224EncryptedKeyExchange::kPeerTypeServer,
76 kPassword, "wrongsession");
77
78 EXPECT_FALSE(RunExchange(&client, &server));
79 }
80
81 TEST(MutualAuth, Fuzz) {
82 static const unsigned kIterations = 40;
83
84 for (unsigned i = 0; i < kIterations; i++) {
85 P224EncryptedKeyExchange client(
86 P224EncryptedKeyExchange::kPeerTypeClient,
87 kPassword, kSession);
88 P224EncryptedKeyExchange server(
89 P224EncryptedKeyExchange::kPeerTypeServer,
90 kPassword, kSession);
91
92 // We'll only be testing small values of i, but we don't want that to bias
93 // the test coverage. So we disperse the value of i by multiplying by the
94 // FNV, 32-bit prime, producing a poor-man's PRNG.
95 const uint32 rand = i * 16777619;
96
97 for (unsigned round = 0;; round++) {
98 std::string client_message, server_message;
99 client_message = client.GetMessage();
100 server_message = server.GetMessage();
101
102 if ((rand & 1) == round) {
103 const bool server_or_client = rand & 2;
104 std::string* m = server_or_client ? &server_message : &client_message;
105 if (rand & 4) {
106 // Truncate
107 *m = m->substr(0, (i >> 3) % m->size());
108 } else {
109 // Corrupt
110 const size_t bits = m->size() * 8;
111 const size_t bit_to_corrupt = (rand >> 3) % bits;
112 const_cast<char*>(m->data())[bit_to_corrupt / 8] ^=
113 1 << (bit_to_corrupt % 8);
114 }
115 }
116
117 P224EncryptedKeyExchange::Result client_result, server_result;
118 client_result = client.ProcessMessage(server_message);
119 server_result = server.ProcessMessage(client_message);
120
121 // If we have corrupted anything, we expect the authentication to fail,
122 // although one side can succeed if we happen to corrupt the second round
123 // message to the other.
124 ASSERT_FALSE(
125 client_result == P224EncryptedKeyExchange::kResultSuccess &&
126 server_result == P224EncryptedKeyExchange::kResultSuccess);
127
128 if (client_result == P224EncryptedKeyExchange::kResultFailed ||
129 server_result == P224EncryptedKeyExchange::kResultFailed) {
130 break;
131 }
132
133 ASSERT_EQ(P224EncryptedKeyExchange::kResultPending,
134 client_result);
135 ASSERT_EQ(P224EncryptedKeyExchange::kResultPending,
136 server_result);
137 }
138 }
139 }
OLDNEW
« no previous file with comments | « crypto/p224_spake.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698