OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/proximity_auth/cryptauth/cryptauth_enroller_impl.h" | 5 #include "components/cryptauth/cryptauth_enroller_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/macros.h" | 8 #include "base/macros.h" |
9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
10 #include "components/proximity_auth/cryptauth/cryptauth_enrollment_utils.h" | 10 #include "components/cryptauth/cryptauth_enrollment_utils.h" |
11 #include "components/proximity_auth/cryptauth/fake_secure_message_delegate.h" | 11 #include "components/cryptauth/fake_secure_message_delegate.h" |
12 #include "components/proximity_auth/cryptauth/mock_cryptauth_client.h" | 12 #include "components/cryptauth/mock_cryptauth_client.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
14 | 14 |
15 using ::testing::_; | 15 using ::testing::_; |
16 using ::testing::Return; | 16 using ::testing::Return; |
17 | 17 |
18 namespace proximity_auth { | 18 namespace cryptauth { |
19 | 19 |
20 namespace { | 20 namespace { |
21 | 21 |
22 const char kAccessTokenUsed[] = "access token used by CryptAuthClient"; | 22 const char kAccessTokenUsed[] = "access token used by CryptAuthClient"; |
23 | 23 |
24 const char kClientSessionPublicKey[] = "throw away after one use"; | 24 const char kClientSessionPublicKey[] = "throw away after one use"; |
25 const char kServerSessionPublicKey[] = "disposables are not eco-friendly"; | 25 const char kServerSessionPublicKey[] = "disposables are not eco-friendly"; |
26 | 26 |
27 cryptauth::InvocationReason kInvocationReason = | 27 cryptauth::InvocationReason kInvocationReason = |
28 cryptauth::INVOCATION_REASON_MANUAL; | 28 cryptauth::INVOCATION_REASON_MANUAL; |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 bool verified, | 91 bool verified, |
92 const std::string& payload, | 92 const std::string& payload, |
93 const securemessage::Header& header) { | 93 const securemessage::Header& header) { |
94 *verified_out = verified; | 94 *verified_out = verified; |
95 *payload_out = payload; | 95 *payload_out = payload; |
96 *header_out = header; | 96 *header_out = header; |
97 } | 97 } |
98 | 98 |
99 } // namespace | 99 } // namespace |
100 | 100 |
101 class ProximityAuthCryptAuthEnrollerTest | 101 class CryptAuthEnrollerTest |
102 : public testing::Test, | 102 : public testing::Test, |
103 public MockCryptAuthClientFactory::Observer { | 103 public MockCryptAuthClientFactory::Observer { |
104 public: | 104 public: |
105 ProximityAuthCryptAuthEnrollerTest() | 105 CryptAuthEnrollerTest() |
106 : client_factory_(new MockCryptAuthClientFactory( | 106 : client_factory_(new MockCryptAuthClientFactory( |
107 MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS)), | 107 MockCryptAuthClientFactory::MockType::MAKE_NICE_MOCKS)), |
108 secure_message_delegate_(new FakeSecureMessageDelegate()), | 108 secure_message_delegate_(new FakeSecureMessageDelegate()), |
109 enroller_(base::WrapUnique(client_factory_), | 109 enroller_(base::WrapUnique(client_factory_), |
110 base::WrapUnique(secure_message_delegate_)) { | 110 base::WrapUnique(secure_message_delegate_)) { |
111 client_factory_->AddObserver(this); | 111 client_factory_->AddObserver(this); |
112 | 112 |
113 // This call is actually synchronous. | 113 // This call is actually synchronous. |
114 secure_message_delegate_->GenerateKeyPair( | 114 secure_message_delegate_->GenerateKeyPair( |
115 base::Bind(&ProximityAuthCryptAuthEnrollerTest::OnKeyPairGenerated, | 115 base::Bind(&CryptAuthEnrollerTest::OnKeyPairGenerated, |
116 base::Unretained(this))); | 116 base::Unretained(this))); |
117 } | 117 } |
118 | 118 |
119 // Starts the enroller. | 119 // Starts the enroller. |
120 void StartEnroller(const cryptauth::GcmDeviceInfo& device_info) { | 120 void StartEnroller(const cryptauth::GcmDeviceInfo& device_info) { |
121 secure_message_delegate_->set_next_public_key(kClientSessionPublicKey); | 121 secure_message_delegate_->set_next_public_key(kClientSessionPublicKey); |
122 enroller_result_.reset(); | 122 enroller_result_.reset(); |
123 enroller_.Enroll( | 123 enroller_.Enroll( |
124 user_public_key_, user_private_key_, device_info, kInvocationReason, | 124 user_public_key_, user_private_key_, device_info, kInvocationReason, |
125 base::Bind(&ProximityAuthCryptAuthEnrollerTest::OnEnrollerCompleted, | 125 base::Bind(&CryptAuthEnrollerTest::OnEnrollerCompleted, |
126 base::Unretained(this))); | 126 base::Unretained(this))); |
127 } | 127 } |
128 | 128 |
129 // Verifies that |serialized_message| is a valid SecureMessage sent with the | 129 // Verifies that |serialized_message| is a valid SecureMessage sent with the |
130 // FinishEnrollment API call. | 130 // FinishEnrollment API call. |
131 void ValidateEnrollmentMessage(const std::string& serialized_message) { | 131 void ValidateEnrollmentMessage(const std::string& serialized_message) { |
132 // Derive the session symmetric key. | 132 // Derive the session symmetric key. |
133 std::string server_session_private_key = | 133 std::string server_session_private_key = |
134 secure_message_delegate_->GetPrivateKeyForPublicKey( | 134 secure_message_delegate_->GetPrivateKeyForPublicKey( |
135 kServerSessionPublicKey); | 135 kServerSessionPublicKey); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 EXPECT_EQ(user_public_key_, device_info.user_public_key()); | 181 EXPECT_EQ(user_public_key_, device_info.user_public_key()); |
182 EXPECT_EQ(user_public_key_, device_info.key_handle()); | 182 EXPECT_EQ(user_public_key_, device_info.key_handle()); |
183 EXPECT_EQ(kEnrollmentSessionId, device_info.enrollment_session_id()); | 183 EXPECT_EQ(kEnrollmentSessionId, device_info.enrollment_session_id()); |
184 } | 184 } |
185 | 185 |
186 protected: | 186 protected: |
187 // MockCryptAuthClientFactory::Observer: | 187 // MockCryptAuthClientFactory::Observer: |
188 void OnCryptAuthClientCreated(MockCryptAuthClient* client) override { | 188 void OnCryptAuthClientCreated(MockCryptAuthClient* client) override { |
189 ON_CALL(*client, SetupEnrollment(_, _, _)) | 189 ON_CALL(*client, SetupEnrollment(_, _, _)) |
190 .WillByDefault(Invoke( | 190 .WillByDefault(Invoke( |
191 this, &ProximityAuthCryptAuthEnrollerTest::OnSetupEnrollment)); | 191 this, &CryptAuthEnrollerTest::OnSetupEnrollment)); |
192 | 192 |
193 ON_CALL(*client, FinishEnrollment(_, _, _)) | 193 ON_CALL(*client, FinishEnrollment(_, _, _)) |
194 .WillByDefault(Invoke( | 194 .WillByDefault(Invoke( |
195 this, &ProximityAuthCryptAuthEnrollerTest::OnFinishEnrollment)); | 195 this, &CryptAuthEnrollerTest::OnFinishEnrollment)); |
196 | 196 |
197 ON_CALL(*client, GetAccessTokenUsed()) | 197 ON_CALL(*client, GetAccessTokenUsed()) |
198 .WillByDefault(Return(kAccessTokenUsed)); | 198 .WillByDefault(Return(kAccessTokenUsed)); |
199 } | 199 } |
200 | 200 |
201 void OnKeyPairGenerated(const std::string& public_key, | 201 void OnKeyPairGenerated(const std::string& public_key, |
202 const std::string& private_key) { | 202 const std::string& private_key) { |
203 user_public_key_ = public_key; | 203 user_public_key_ = public_key; |
204 user_private_key_ = private_key; | 204 user_private_key_ = private_key; |
205 } | 205 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 // Stores the result of running |enroller_|. | 252 // Stores the result of running |enroller_|. |
253 std::unique_ptr<bool> enroller_result_; | 253 std::unique_ptr<bool> enroller_result_; |
254 | 254 |
255 // Stored callbacks and requests for SetupEnrollment and FinishEnrollment. | 255 // Stored callbacks and requests for SetupEnrollment and FinishEnrollment. |
256 std::unique_ptr<cryptauth::SetupEnrollmentRequest> setup_request_; | 256 std::unique_ptr<cryptauth::SetupEnrollmentRequest> setup_request_; |
257 std::unique_ptr<cryptauth::FinishEnrollmentRequest> finish_request_; | 257 std::unique_ptr<cryptauth::FinishEnrollmentRequest> finish_request_; |
258 CryptAuthClient::SetupEnrollmentCallback setup_callback_; | 258 CryptAuthClient::SetupEnrollmentCallback setup_callback_; |
259 CryptAuthClient::FinishEnrollmentCallback finish_callback_; | 259 CryptAuthClient::FinishEnrollmentCallback finish_callback_; |
260 CryptAuthClient::ErrorCallback error_callback_; | 260 CryptAuthClient::ErrorCallback error_callback_; |
261 | 261 |
262 DISALLOW_COPY_AND_ASSIGN(ProximityAuthCryptAuthEnrollerTest); | 262 DISALLOW_COPY_AND_ASSIGN(CryptAuthEnrollerTest); |
263 }; | 263 }; |
264 | 264 |
265 TEST_F(ProximityAuthCryptAuthEnrollerTest, EnrollmentSucceeds) { | 265 TEST_F(CryptAuthEnrollerTest, EnrollmentSucceeds) { |
266 StartEnroller(GetDeviceInfo()); | 266 StartEnroller(GetDeviceInfo()); |
267 | 267 |
268 // Handle SetupEnrollment request. | 268 // Handle SetupEnrollment request. |
269 EXPECT_TRUE(setup_request_.get()); | 269 EXPECT_TRUE(setup_request_.get()); |
270 EXPECT_EQ(kInvocationReason, setup_request_->invocation_reason()); | 270 EXPECT_EQ(kInvocationReason, setup_request_->invocation_reason()); |
271 ASSERT_EQ(1, setup_request_->types_size()); | 271 ASSERT_EQ(1, setup_request_->types_size()); |
272 EXPECT_EQ(kSupportedEnrollmentTypeGcmV1, setup_request_->types(0)); | 272 EXPECT_EQ(kSupportedEnrollmentTypeGcmV1, setup_request_->types(0)); |
273 ASSERT_FALSE(setup_callback_.is_null()); | 273 ASSERT_FALSE(setup_callback_.is_null()); |
274 setup_callback_.Run(GetSetupEnrollmentResponse(true)); | 274 setup_callback_.Run(GetSetupEnrollmentResponse(true)); |
275 | 275 |
276 // Handle FinishEnrollment request. | 276 // Handle FinishEnrollment request. |
277 EXPECT_TRUE(finish_request_.get()); | 277 EXPECT_TRUE(finish_request_.get()); |
278 EXPECT_EQ(kEnrollmentSessionId, finish_request_->enrollment_session_id()); | 278 EXPECT_EQ(kEnrollmentSessionId, finish_request_->enrollment_session_id()); |
279 EXPECT_EQ(kClientSessionPublicKey, finish_request_->device_ephemeral_key()); | 279 EXPECT_EQ(kClientSessionPublicKey, finish_request_->device_ephemeral_key()); |
280 ValidateEnrollmentMessage(finish_request_->enrollment_message()); | 280 ValidateEnrollmentMessage(finish_request_->enrollment_message()); |
281 EXPECT_EQ(kInvocationReason, finish_request_->invocation_reason()); | 281 EXPECT_EQ(kInvocationReason, finish_request_->invocation_reason()); |
282 | 282 |
283 ASSERT_FALSE(finish_callback_.is_null()); | 283 ASSERT_FALSE(finish_callback_.is_null()); |
284 finish_callback_.Run(GetFinishEnrollmentResponse(true)); | 284 finish_callback_.Run(GetFinishEnrollmentResponse(true)); |
285 | 285 |
286 ASSERT_TRUE(enroller_result_.get()); | 286 ASSERT_TRUE(enroller_result_.get()); |
287 EXPECT_TRUE(*enroller_result_); | 287 EXPECT_TRUE(*enroller_result_); |
288 } | 288 } |
289 | 289 |
290 TEST_F(ProximityAuthCryptAuthEnrollerTest, SetupEnrollmentApiCallError) { | 290 TEST_F(CryptAuthEnrollerTest, SetupEnrollmentApiCallError) { |
291 StartEnroller(GetDeviceInfo()); | 291 StartEnroller(GetDeviceInfo()); |
292 | 292 |
293 EXPECT_TRUE(setup_request_.get()); | 293 EXPECT_TRUE(setup_request_.get()); |
294 ASSERT_FALSE(error_callback_.is_null()); | 294 ASSERT_FALSE(error_callback_.is_null()); |
295 error_callback_.Run("Setup enrollment failed network"); | 295 error_callback_.Run("Setup enrollment failed network"); |
296 | 296 |
297 EXPECT_TRUE(finish_callback_.is_null()); | 297 EXPECT_TRUE(finish_callback_.is_null()); |
298 ASSERT_TRUE(enroller_result_.get()); | 298 ASSERT_TRUE(enroller_result_.get()); |
299 EXPECT_FALSE(*enroller_result_); | 299 EXPECT_FALSE(*enroller_result_); |
300 } | 300 } |
301 | 301 |
302 TEST_F(ProximityAuthCryptAuthEnrollerTest, SetupEnrollmentBadStatus) { | 302 TEST_F(CryptAuthEnrollerTest, SetupEnrollmentBadStatus) { |
303 StartEnroller(GetDeviceInfo()); | 303 StartEnroller(GetDeviceInfo()); |
304 | 304 |
305 EXPECT_TRUE(setup_request_.get()); | 305 EXPECT_TRUE(setup_request_.get()); |
306 setup_callback_.Run(GetSetupEnrollmentResponse(false)); | 306 setup_callback_.Run(GetSetupEnrollmentResponse(false)); |
307 | 307 |
308 EXPECT_TRUE(finish_callback_.is_null()); | 308 EXPECT_TRUE(finish_callback_.is_null()); |
309 ASSERT_TRUE(enroller_result_.get()); | 309 ASSERT_TRUE(enroller_result_.get()); |
310 EXPECT_FALSE(*enroller_result_); | 310 EXPECT_FALSE(*enroller_result_); |
311 } | 311 } |
312 | 312 |
313 TEST_F(ProximityAuthCryptAuthEnrollerTest, SetupEnrollmentNoInfosReturned) { | 313 TEST_F(CryptAuthEnrollerTest, SetupEnrollmentNoInfosReturned) { |
314 StartEnroller(GetDeviceInfo()); | 314 StartEnroller(GetDeviceInfo()); |
315 EXPECT_TRUE(setup_request_.get()); | 315 EXPECT_TRUE(setup_request_.get()); |
316 cryptauth::SetupEnrollmentResponse response; | 316 cryptauth::SetupEnrollmentResponse response; |
317 response.set_status(kResponseStatusOk); | 317 response.set_status(kResponseStatusOk); |
318 setup_callback_.Run(response); | 318 setup_callback_.Run(response); |
319 | 319 |
320 EXPECT_TRUE(finish_callback_.is_null()); | 320 EXPECT_TRUE(finish_callback_.is_null()); |
321 ASSERT_TRUE(enroller_result_.get()); | 321 ASSERT_TRUE(enroller_result_.get()); |
322 EXPECT_FALSE(*enroller_result_); | 322 EXPECT_FALSE(*enroller_result_); |
323 } | 323 } |
324 | 324 |
325 TEST_F(ProximityAuthCryptAuthEnrollerTest, FinishEnrollmentApiCallError) { | 325 TEST_F(CryptAuthEnrollerTest, FinishEnrollmentApiCallError) { |
326 StartEnroller(GetDeviceInfo()); | 326 StartEnroller(GetDeviceInfo()); |
327 setup_callback_.Run(GetSetupEnrollmentResponse(true)); | 327 setup_callback_.Run(GetSetupEnrollmentResponse(true)); |
328 ASSERT_FALSE(error_callback_.is_null()); | 328 ASSERT_FALSE(error_callback_.is_null()); |
329 error_callback_.Run("finish enrollment oauth error"); | 329 error_callback_.Run("finish enrollment oauth error"); |
330 ASSERT_TRUE(enroller_result_.get()); | 330 ASSERT_TRUE(enroller_result_.get()); |
331 EXPECT_FALSE(*enroller_result_); | 331 EXPECT_FALSE(*enroller_result_); |
332 } | 332 } |
333 | 333 |
334 TEST_F(ProximityAuthCryptAuthEnrollerTest, FinishEnrollmentBadStatus) { | 334 TEST_F(CryptAuthEnrollerTest, FinishEnrollmentBadStatus) { |
335 StartEnroller(GetDeviceInfo()); | 335 StartEnroller(GetDeviceInfo()); |
336 setup_callback_.Run(GetSetupEnrollmentResponse(true)); | 336 setup_callback_.Run(GetSetupEnrollmentResponse(true)); |
337 ASSERT_FALSE(finish_callback_.is_null()); | 337 ASSERT_FALSE(finish_callback_.is_null()); |
338 finish_callback_.Run(GetFinishEnrollmentResponse(false)); | 338 finish_callback_.Run(GetFinishEnrollmentResponse(false)); |
339 ASSERT_TRUE(enroller_result_.get()); | 339 ASSERT_TRUE(enroller_result_.get()); |
340 EXPECT_FALSE(*enroller_result_); | 340 EXPECT_FALSE(*enroller_result_); |
341 } | 341 } |
342 | 342 |
343 TEST_F(ProximityAuthCryptAuthEnrollerTest, ReuseEnroller) { | 343 TEST_F(CryptAuthEnrollerTest, ReuseEnroller) { |
344 StartEnroller(GetDeviceInfo()); | 344 StartEnroller(GetDeviceInfo()); |
345 setup_callback_.Run(GetSetupEnrollmentResponse(true)); | 345 setup_callback_.Run(GetSetupEnrollmentResponse(true)); |
346 finish_callback_.Run(GetFinishEnrollmentResponse(true)); | 346 finish_callback_.Run(GetFinishEnrollmentResponse(true)); |
347 EXPECT_TRUE(*enroller_result_); | 347 EXPECT_TRUE(*enroller_result_); |
348 | 348 |
349 StartEnroller(GetDeviceInfo()); | 349 StartEnroller(GetDeviceInfo()); |
350 EXPECT_FALSE(*enroller_result_); | 350 EXPECT_FALSE(*enroller_result_); |
351 } | 351 } |
352 | 352 |
353 TEST_F(ProximityAuthCryptAuthEnrollerTest, IncompleteDeviceInfo) { | 353 TEST_F(CryptAuthEnrollerTest, IncompleteDeviceInfo) { |
354 StartEnroller(cryptauth::GcmDeviceInfo()); | 354 StartEnroller(cryptauth::GcmDeviceInfo()); |
355 ASSERT_TRUE(enroller_result_.get()); | 355 ASSERT_TRUE(enroller_result_.get()); |
356 EXPECT_FALSE(*enroller_result_); | 356 EXPECT_FALSE(*enroller_result_); |
357 } | 357 } |
358 | 358 |
359 } // namespace proximity_auth | 359 } // namespace cryptauth |
OLD | NEW |