xref: /aosp_15_r20/external/openscreen/cast/test/device_auth_test.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #include <stdio.h>
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include "cast/common/certificate/cast_trust_store.h"
8*3f982cf4SFabien Sanglard #include "cast/common/certificate/testing/test_helpers.h"
9*3f982cf4SFabien Sanglard #include "cast/common/channel/proto/cast_channel.pb.h"
10*3f982cf4SFabien Sanglard #include "cast/common/channel/testing/fake_cast_socket.h"
11*3f982cf4SFabien Sanglard #include "cast/common/channel/testing/mock_socket_error_handler.h"
12*3f982cf4SFabien Sanglard #include "cast/common/channel/virtual_connection_router.h"
13*3f982cf4SFabien Sanglard #include "cast/common/public/cast_socket.h"
14*3f982cf4SFabien Sanglard #include "cast/receiver/channel/device_auth_namespace_handler.h"
15*3f982cf4SFabien Sanglard #include "cast/receiver/channel/static_credentials.h"
16*3f982cf4SFabien Sanglard #include "cast/receiver/channel/testing/device_auth_test_helpers.h"
17*3f982cf4SFabien Sanglard #include "cast/sender/channel/cast_auth_util.h"
18*3f982cf4SFabien Sanglard #include "cast/sender/channel/message_util.h"
19*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
20*3f982cf4SFabien Sanglard #include "platform/test/paths.h"
21*3f982cf4SFabien Sanglard #include "testing/util/read_file.h"
22*3f982cf4SFabien Sanglard 
23*3f982cf4SFabien Sanglard namespace openscreen {
24*3f982cf4SFabien Sanglard namespace cast {
25*3f982cf4SFabien Sanglard namespace {
26*3f982cf4SFabien Sanglard 
27*3f982cf4SFabien Sanglard using ::cast::channel::CastMessage;
28*3f982cf4SFabien Sanglard using ::cast::channel::DeviceAuthMessage;
29*3f982cf4SFabien Sanglard 
30*3f982cf4SFabien Sanglard using ::testing::_;
31*3f982cf4SFabien Sanglard using ::testing::Invoke;
32*3f982cf4SFabien Sanglard 
GetSpecificTestDataPath()33*3f982cf4SFabien Sanglard const std::string& GetSpecificTestDataPath() {
34*3f982cf4SFabien Sanglard   static std::string data_path = GetTestDataPath() + "cast/receiver/channel/";
35*3f982cf4SFabien Sanglard   return data_path;
36*3f982cf4SFabien Sanglard }
37*3f982cf4SFabien Sanglard 
38*3f982cf4SFabien Sanglard class DeviceAuthTest : public ::testing::Test {
39*3f982cf4SFabien Sanglard  public:
SetUp()40*3f982cf4SFabien Sanglard   void SetUp() override {
41*3f982cf4SFabien Sanglard     socket_ = fake_cast_socket_pair_.socket.get();
42*3f982cf4SFabien Sanglard     router_.TakeSocket(&mock_error_handler_,
43*3f982cf4SFabien Sanglard                        std::move(fake_cast_socket_pair_.socket));
44*3f982cf4SFabien Sanglard     router_.AddHandlerForLocalId(kPlatformReceiverId, &auth_handler_);
45*3f982cf4SFabien Sanglard   }
46*3f982cf4SFabien Sanglard 
47*3f982cf4SFabien Sanglard  protected:
RunAuthTest(std::string serialized_crl,TrustStore * fake_crl_trust_store,bool should_succeed=true,bool record_this_test=false)48*3f982cf4SFabien Sanglard   void RunAuthTest(std::string serialized_crl,
49*3f982cf4SFabien Sanglard                    TrustStore* fake_crl_trust_store,
50*3f982cf4SFabien Sanglard                    bool should_succeed = true,
51*3f982cf4SFabien Sanglard                    bool record_this_test = false) {
52*3f982cf4SFabien Sanglard     bssl::UniquePtr<X509> parsed_cert;
53*3f982cf4SFabien Sanglard     TrustStore fake_trust_store;
54*3f982cf4SFabien Sanglard     InitStaticCredentialsFromFiles(
55*3f982cf4SFabien Sanglard         &creds_, &parsed_cert, &fake_trust_store, data_path_ + "device_key.pem",
56*3f982cf4SFabien Sanglard         data_path_ + "device_chain.pem", data_path_ + "device_tls.pem");
57*3f982cf4SFabien Sanglard     creds_.device_creds.serialized_crl = std::move(serialized_crl);
58*3f982cf4SFabien Sanglard 
59*3f982cf4SFabien Sanglard     // Send an auth challenge.  |auth_handler_| will automatically respond
60*3f982cf4SFabien Sanglard     // via |router_| and we will catch the result in |challenge_reply|.
61*3f982cf4SFabien Sanglard     AuthContext auth_context = AuthContext::Create();
62*3f982cf4SFabien Sanglard     CastMessage auth_challenge = CreateAuthChallengeMessage(auth_context);
63*3f982cf4SFabien Sanglard     if (record_this_test) {
64*3f982cf4SFabien Sanglard       std::string output;
65*3f982cf4SFabien Sanglard       DeviceAuthMessage auth_message;
66*3f982cf4SFabien Sanglard       ASSERT_EQ(auth_challenge.payload_type(),
67*3f982cf4SFabien Sanglard                 ::cast::channel::CastMessage_PayloadType_BINARY);
68*3f982cf4SFabien Sanglard       ASSERT_TRUE(
69*3f982cf4SFabien Sanglard           auth_message.ParseFromString(auth_challenge.payload_binary()));
70*3f982cf4SFabien Sanglard       ASSERT_TRUE(auth_message.has_challenge());
71*3f982cf4SFabien Sanglard       ASSERT_FALSE(auth_message.has_response());
72*3f982cf4SFabien Sanglard       ASSERT_FALSE(auth_message.has_error());
73*3f982cf4SFabien Sanglard       ASSERT_TRUE(auth_challenge.SerializeToString(&output));
74*3f982cf4SFabien Sanglard 
75*3f982cf4SFabien Sanglard       const std::string pb_path = data_path_ + "auth_challenge.pb";
76*3f982cf4SFabien Sanglard       FILE* fd = fopen(pb_path.c_str(), "wb");
77*3f982cf4SFabien Sanglard       ASSERT_TRUE(fd);
78*3f982cf4SFabien Sanglard       ASSERT_EQ(fwrite(output.data(), 1, output.size(), fd), output.size());
79*3f982cf4SFabien Sanglard       fclose(fd);
80*3f982cf4SFabien Sanglard     }
81*3f982cf4SFabien Sanglard     CastMessage challenge_reply;
82*3f982cf4SFabien Sanglard     EXPECT_CALL(fake_cast_socket_pair_.mock_peer_client, OnMessage(_, _))
83*3f982cf4SFabien Sanglard         .WillOnce(
84*3f982cf4SFabien Sanglard             Invoke([&challenge_reply](CastSocket* socket, CastMessage message) {
85*3f982cf4SFabien Sanglard               challenge_reply = std::move(message);
86*3f982cf4SFabien Sanglard             }));
87*3f982cf4SFabien Sanglard     ASSERT_TRUE(
88*3f982cf4SFabien Sanglard         fake_cast_socket_pair_.peer_socket->Send(std::move(auth_challenge))
89*3f982cf4SFabien Sanglard             .ok());
90*3f982cf4SFabien Sanglard 
91*3f982cf4SFabien Sanglard     if (record_this_test) {
92*3f982cf4SFabien Sanglard       std::string output;
93*3f982cf4SFabien Sanglard       DeviceAuthMessage auth_message;
94*3f982cf4SFabien Sanglard       ASSERT_EQ(challenge_reply.payload_type(),
95*3f982cf4SFabien Sanglard                 ::cast::channel::CastMessage_PayloadType_BINARY);
96*3f982cf4SFabien Sanglard       ASSERT_TRUE(
97*3f982cf4SFabien Sanglard           auth_message.ParseFromString(challenge_reply.payload_binary()));
98*3f982cf4SFabien Sanglard       ASSERT_TRUE(auth_message.has_response());
99*3f982cf4SFabien Sanglard       ASSERT_FALSE(auth_message.has_challenge());
100*3f982cf4SFabien Sanglard       ASSERT_FALSE(auth_message.has_error());
101*3f982cf4SFabien Sanglard       ASSERT_TRUE(auth_message.response().SerializeToString(&output));
102*3f982cf4SFabien Sanglard 
103*3f982cf4SFabien Sanglard       const std::string pb_path = data_path_ + "auth_response.pb";
104*3f982cf4SFabien Sanglard       FILE* fd = fopen(pb_path.c_str(), "wb");
105*3f982cf4SFabien Sanglard       ASSERT_TRUE(fd);
106*3f982cf4SFabien Sanglard       ASSERT_EQ(fwrite(output.data(), 1, output.size(), fd), output.size());
107*3f982cf4SFabien Sanglard       fclose(fd);
108*3f982cf4SFabien Sanglard     }
109*3f982cf4SFabien Sanglard 
110*3f982cf4SFabien Sanglard     DateTime December2019 = {};
111*3f982cf4SFabien Sanglard     December2019.year = 2019;
112*3f982cf4SFabien Sanglard     December2019.month = 12;
113*3f982cf4SFabien Sanglard     December2019.day = 17;
114*3f982cf4SFabien Sanglard     const ErrorOr<CastDeviceCertPolicy> error_or_policy =
115*3f982cf4SFabien Sanglard         AuthenticateChallengeReplyForTest(
116*3f982cf4SFabien Sanglard             challenge_reply, parsed_cert.get(), auth_context,
117*3f982cf4SFabien Sanglard             fake_crl_trust_store ? CRLPolicy::kCrlRequired
118*3f982cf4SFabien Sanglard                                  : CRLPolicy::kCrlOptional,
119*3f982cf4SFabien Sanglard             &fake_trust_store, fake_crl_trust_store, December2019);
120*3f982cf4SFabien Sanglard     EXPECT_EQ(error_or_policy.is_value(), should_succeed);
121*3f982cf4SFabien Sanglard   }
122*3f982cf4SFabien Sanglard 
123*3f982cf4SFabien Sanglard   const std::string& data_path_{GetSpecificTestDataPath()};
124*3f982cf4SFabien Sanglard   FakeCastSocketPair fake_cast_socket_pair_;
125*3f982cf4SFabien Sanglard   MockSocketErrorHandler mock_error_handler_;
126*3f982cf4SFabien Sanglard   CastSocket* socket_;
127*3f982cf4SFabien Sanglard 
128*3f982cf4SFabien Sanglard   StaticCredentialsProvider creds_;
129*3f982cf4SFabien Sanglard   VirtualConnectionRouter router_;
130*3f982cf4SFabien Sanglard   DeviceAuthNamespaceHandler auth_handler_{&creds_};
131*3f982cf4SFabien Sanglard };
132*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,MANUAL_SerializeTestData)133*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, MANUAL_SerializeTestData) {
134*3f982cf4SFabien Sanglard   if (::testing::GTEST_FLAG(filter) ==
135*3f982cf4SFabien Sanglard       "DeviceAuthTest.MANUAL_SerializeTestData") {
136*3f982cf4SFabien Sanglard     RunAuthTest(std::string(), nullptr, true, true);
137*3f982cf4SFabien Sanglard   }
138*3f982cf4SFabien Sanglard }
139*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,AuthIntegration)140*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, AuthIntegration) {
141*3f982cf4SFabien Sanglard   RunAuthTest(std::string(), nullptr);
142*3f982cf4SFabien Sanglard }
143*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,GoodCrl)144*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, GoodCrl) {
145*3f982cf4SFabien Sanglard   auto fake_crl_trust_store =
146*3f982cf4SFabien Sanglard       TrustStore::CreateInstanceFromPemFile(data_path_ + "crl_root.pem");
147*3f982cf4SFabien Sanglard   RunAuthTest(ReadEntireFileToString(data_path_ + "good_crl.pb"),
148*3f982cf4SFabien Sanglard               &fake_crl_trust_store);
149*3f982cf4SFabien Sanglard }
150*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,InvalidCrlTime)151*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, InvalidCrlTime) {
152*3f982cf4SFabien Sanglard   auto fake_crl_trust_store =
153*3f982cf4SFabien Sanglard       TrustStore::CreateInstanceFromPemFile(data_path_ + "crl_root.pem");
154*3f982cf4SFabien Sanglard   RunAuthTest(ReadEntireFileToString(data_path_ + "invalid_time_crl.pb"),
155*3f982cf4SFabien Sanglard               &fake_crl_trust_store, false);
156*3f982cf4SFabien Sanglard }
157*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,IssuerRevoked)158*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, IssuerRevoked) {
159*3f982cf4SFabien Sanglard   auto fake_crl_trust_store =
160*3f982cf4SFabien Sanglard       TrustStore::CreateInstanceFromPemFile(data_path_ + "crl_root.pem");
161*3f982cf4SFabien Sanglard   RunAuthTest(ReadEntireFileToString(data_path_ + "issuer_revoked_crl.pb"),
162*3f982cf4SFabien Sanglard               &fake_crl_trust_store, false);
163*3f982cf4SFabien Sanglard }
164*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,DeviceRevoked)165*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, DeviceRevoked) {
166*3f982cf4SFabien Sanglard   auto fake_crl_trust_store =
167*3f982cf4SFabien Sanglard       TrustStore::CreateInstanceFromPemFile(data_path_ + "crl_root.pem");
168*3f982cf4SFabien Sanglard   RunAuthTest(ReadEntireFileToString(data_path_ + "device_revoked_crl.pb"),
169*3f982cf4SFabien Sanglard               &fake_crl_trust_store, false);
170*3f982cf4SFabien Sanglard }
171*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,IssuerSerialRevoked)172*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, IssuerSerialRevoked) {
173*3f982cf4SFabien Sanglard   auto fake_crl_trust_store =
174*3f982cf4SFabien Sanglard       TrustStore::CreateInstanceFromPemFile(data_path_ + "crl_root.pem");
175*3f982cf4SFabien Sanglard   RunAuthTest(
176*3f982cf4SFabien Sanglard       ReadEntireFileToString(data_path_ + "issuer_serial_revoked_crl.pb"),
177*3f982cf4SFabien Sanglard       &fake_crl_trust_store, false);
178*3f982cf4SFabien Sanglard }
179*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,DeviceSerialRevoked)180*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, DeviceSerialRevoked) {
181*3f982cf4SFabien Sanglard   auto fake_crl_trust_store =
182*3f982cf4SFabien Sanglard       TrustStore::CreateInstanceFromPemFile(data_path_ + "crl_root.pem");
183*3f982cf4SFabien Sanglard   RunAuthTest(
184*3f982cf4SFabien Sanglard       ReadEntireFileToString(data_path_ + "device_serial_revoked_crl.pb"),
185*3f982cf4SFabien Sanglard       &fake_crl_trust_store, false);
186*3f982cf4SFabien Sanglard }
187*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,BadCrlSignerCert)188*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, BadCrlSignerCert) {
189*3f982cf4SFabien Sanglard   auto fake_crl_trust_store =
190*3f982cf4SFabien Sanglard       TrustStore::CreateInstanceFromPemFile(data_path_ + "crl_root.pem");
191*3f982cf4SFabien Sanglard   RunAuthTest(ReadEntireFileToString(data_path_ + "bad_signer_cert_crl.pb"),
192*3f982cf4SFabien Sanglard               &fake_crl_trust_store, false);
193*3f982cf4SFabien Sanglard }
194*3f982cf4SFabien Sanglard 
TEST_F(DeviceAuthTest,BadCrlSignature)195*3f982cf4SFabien Sanglard TEST_F(DeviceAuthTest, BadCrlSignature) {
196*3f982cf4SFabien Sanglard   auto fake_crl_trust_store =
197*3f982cf4SFabien Sanglard       TrustStore::CreateInstanceFromPemFile(data_path_ + "crl_root.pem");
198*3f982cf4SFabien Sanglard   RunAuthTest(ReadEntireFileToString(data_path_ + "bad_signature_crl.pb"),
199*3f982cf4SFabien Sanglard               &fake_crl_trust_store, false);
200*3f982cf4SFabien Sanglard }
201*3f982cf4SFabien Sanglard 
202*3f982cf4SFabien Sanglard }  // namespace
203*3f982cf4SFabien Sanglard }  // namespace cast
204*3f982cf4SFabien Sanglard }  // namespace openscreen
205