blob: 7e7dcd77a607a800360e020e1f97399ca5d53f73 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2013 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/third_party/quiche/src/quic/core/crypto/p256_key_exchange.h"
6
7#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -07008#include <string>
bnc463f2352019-10-10 04:49:34 -07009#include <utility>
QUICHE teama6ef0a62019-03-07 20:34:33 -050010
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
dmcardle904ef182019-12-13 08:34:33 -080012#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050013
14namespace quic {
15namespace test {
16
17class P256KeyExchangeTest : public QuicTest {
18 public:
19 // Holds the result of a key exchange callback.
20 class TestCallbackResult {
21 public:
22 void set_ok(bool ok) { ok_ = ok; }
23 bool ok() { return ok_; }
24
25 private:
26 bool ok_ = false;
27 };
28
29 // Key exchange callback which sets the result into the specified
30 // TestCallbackResult.
QUICHE teamfe1aca62019-03-14 13:39:01 -070031 class TestCallback : public AsynchronousKeyExchange::Callback {
QUICHE teama6ef0a62019-03-07 20:34:33 -050032 public:
33 TestCallback(TestCallbackResult* result) : result_(result) {}
34 virtual ~TestCallback() = default;
35
36 void Run(bool ok) { result_->set_ok(ok); }
37
38 private:
39 TestCallbackResult* result_;
40 };
41};
42
QUICHE teamfe1aca62019-03-14 13:39:01 -070043// SharedKeyAsync just tests that the basic asynchronous key exchange identity
QUICHE teama6ef0a62019-03-07 20:34:33 -050044// holds: that both parties end up with the same key.
45TEST_F(P256KeyExchangeTest, SharedKey) {
46 for (int i = 0; i < 5; i++) {
vasilvvc48c8712019-03-11 13:38:16 -070047 std::string alice_private(P256KeyExchange::NewPrivateKey());
48 std::string bob_private(P256KeyExchange::NewPrivateKey());
QUICHE teama6ef0a62019-03-07 20:34:33 -050049
50 ASSERT_FALSE(alice_private.empty());
51 ASSERT_FALSE(bob_private.empty());
52 ASSERT_NE(alice_private, bob_private);
53
54 std::unique_ptr<P256KeyExchange> alice(P256KeyExchange::New(alice_private));
55 std::unique_ptr<P256KeyExchange> bob(P256KeyExchange::New(bob_private));
56
57 ASSERT_TRUE(alice != nullptr);
58 ASSERT_TRUE(bob != nullptr);
59
dmcardle904ef182019-12-13 08:34:33 -080060 const quiche::QuicheStringPiece alice_public(alice->public_value());
61 const quiche::QuicheStringPiece bob_public(bob->public_value());
QUICHE teama6ef0a62019-03-07 20:34:33 -050062
vasilvvc48c8712019-03-11 13:38:16 -070063 std::string alice_shared, bob_shared;
QUICHE teamfe1aca62019-03-14 13:39:01 -070064 ASSERT_TRUE(alice->CalculateSharedKeySync(bob_public, &alice_shared));
65 ASSERT_TRUE(bob->CalculateSharedKeySync(alice_public, &bob_shared));
QUICHE teama6ef0a62019-03-07 20:34:33 -050066 ASSERT_EQ(alice_shared, bob_shared);
67 }
68}
69
70// SharedKey just tests that the basic key exchange identity holds: that both
71// parties end up with the same key.
72TEST_F(P256KeyExchangeTest, AsyncSharedKey) {
73 for (int i = 0; i < 5; i++) {
vasilvvc48c8712019-03-11 13:38:16 -070074 std::string alice_private(P256KeyExchange::NewPrivateKey());
75 std::string bob_private(P256KeyExchange::NewPrivateKey());
QUICHE teama6ef0a62019-03-07 20:34:33 -050076
77 ASSERT_FALSE(alice_private.empty());
78 ASSERT_FALSE(bob_private.empty());
79 ASSERT_NE(alice_private, bob_private);
80
81 std::unique_ptr<P256KeyExchange> alice(P256KeyExchange::New(alice_private));
82 std::unique_ptr<P256KeyExchange> bob(P256KeyExchange::New(bob_private));
83
84 ASSERT_TRUE(alice != nullptr);
85 ASSERT_TRUE(bob != nullptr);
86
dmcardle904ef182019-12-13 08:34:33 -080087 const quiche::QuicheStringPiece alice_public(alice->public_value());
88 const quiche::QuicheStringPiece bob_public(bob->public_value());
QUICHE teama6ef0a62019-03-07 20:34:33 -050089
vasilvvc48c8712019-03-11 13:38:16 -070090 std::string alice_shared, bob_shared;
QUICHE teama6ef0a62019-03-07 20:34:33 -050091 TestCallbackResult alice_result;
92 ASSERT_FALSE(alice_result.ok());
vasilvv0fc587f2019-09-06 13:33:08 -070093 alice->CalculateSharedKeyAsync(
94 bob_public, &alice_shared,
95 std::make_unique<TestCallback>(&alice_result));
QUICHE teama6ef0a62019-03-07 20:34:33 -050096 ASSERT_TRUE(alice_result.ok());
97 TestCallbackResult bob_result;
98 ASSERT_FALSE(bob_result.ok());
QUICHE teamfe1aca62019-03-14 13:39:01 -070099 bob->CalculateSharedKeyAsync(alice_public, &bob_shared,
vasilvv0fc587f2019-09-06 13:33:08 -0700100 std::make_unique<TestCallback>(&bob_result));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500101 ASSERT_TRUE(bob_result.ok());
102 ASSERT_EQ(alice_shared, bob_shared);
103 ASSERT_NE(0u, alice_shared.length());
104 ASSERT_NE(0u, bob_shared.length());
105 }
106}
107
108} // namespace test
109} // namespace quic