| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_PROXIMITY_AUTH_CRYPTAUTH_ENROLLER_IMPL_H |
| #define COMPONENTS_PROXIMITY_AUTH_CRYPTAUTH_ENROLLER_IMPL_H |
| |
| #include <memory> |
| |
| #include "base/callback.h" |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| #include "components/cryptauth/cryptauth_enroller.h" |
| #include "components/cryptauth/proto/cryptauth_api.pb.h" |
| |
| namespace cryptauth { |
| |
| class CryptAuthClient; |
| class CryptAuthClientFactory; |
| class SecureMessageDelegate; |
| |
| // Implementation of CryptAuthEnroller to perform enrollment in two steps: |
| // 1. SetupEnrollment: |
| // Obtain a session public key from CryptAuth used to encrypt enrollment |
| // data. Generate an ephemeral public key and derive a session symmetric |
| // key. |
| // 2. FinishEnrollment: |
| // Encrypt the enrollment data with the session symmetric key, and send the |
| // payload and device's public key to CryptAuth. |
| class CryptAuthEnrollerImpl : public CryptAuthEnroller { |
| public: |
| // |client_factory| creates CryptAuthClient instances for making API calls. |
| // |crypto_delegate| is responsible for SecureMessage operations. |
| CryptAuthEnrollerImpl( |
| std::unique_ptr<CryptAuthClientFactory> client_factory, |
| std::unique_ptr<SecureMessageDelegate> secure_message_delegate); |
| ~CryptAuthEnrollerImpl() override; |
| |
| // CryptAuthEnroller: |
| void Enroll(const std::string& user_public_key, |
| const std::string& user_private_key, |
| const cryptauth::GcmDeviceInfo& device_info, |
| cryptauth::InvocationReason invocation_reason, |
| const EnrollmentFinishedCallback& callback) override; |
| |
| private: |
| // Callbacks for SetupEnrollment. |
| void OnSetupEnrollmentSuccess( |
| const cryptauth::SetupEnrollmentResponse& response); |
| void OnSetupEnrollmentFailure(const std::string& error); |
| |
| // Callbacks for FinishEnrollment. |
| void OnFinishEnrollmentSuccess( |
| const cryptauth::FinishEnrollmentResponse& response); |
| void OnFinishEnrollmentFailure(const std::string& error); |
| |
| // Callbacks for SecureMessageDelegate operations. |
| void OnKeyPairGenerated(const std::string& public_key, |
| const std::string& private_key); |
| void OnKeyDerived(const std::string& symmetric_key); |
| void OnInnerSecureMessageCreated(const std::string& inner_message); |
| void OnOuterSecureMessageCreated(const std::string& outer_message); |
| |
| // Creates the CryptAuthClient instances to make API requests. |
| std::unique_ptr<CryptAuthClientFactory> client_factory_; |
| |
| // Handles SecureMessage operations. |
| std::unique_ptr<SecureMessageDelegate> secure_message_delegate_; |
| |
| // The CryptAuthClient for the latest request. |
| std::unique_ptr<CryptAuthClient> cryptauth_client_; |
| |
| // The ephemeral key-pair generated for a single enrollment. |
| std::string session_public_key_; |
| std::string session_private_key_; |
| |
| // The user's persistent key-pair identifying the local device. |
| std::string user_public_key_; |
| std::string user_private_key_; |
| |
| // Contains information of the device to enroll. |
| cryptauth::GcmDeviceInfo device_info_; |
| |
| // The reason telling the server why the enrollment happened. |
| cryptauth::InvocationReason invocation_reason_; |
| |
| // The setup information returned from the SetupEnrollment API call. |
| cryptauth::SetupEnrollmentInfo setup_info_; |
| |
| // Callback invoked when the enrollment is done. |
| EnrollmentFinishedCallback callback_; |
| |
| // The derived ephemeral symmetric key. |
| std::string symmetric_key_; |
| |
| base::WeakPtrFactory<CryptAuthEnrollerImpl> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CryptAuthEnrollerImpl); |
| }; |
| |
| } // namespace cryptauth |
| |
| #endif // COMPONENTS_PROXIMITY_AUTH_CRYPTAUTH_ENROLLER_IMPL_H |