| 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 |