// 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_CRYPTAUTH_REMOTE_DEVICE_LOADER_H_ #define COMPONENTS_CRYPTAUTH_REMOTE_DEVICE_LOADER_H_ #include #include #include "base/callback.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "components/cryptauth/proto/cryptauth_api.pb.h" #include "components/cryptauth/remote_device.h" namespace cryptauth { class SecureMessageDelegate; // Loads a collection of RemoteDevice objects from the given ExternalDeviceInfo // protos that were synced from CryptAuth. We need to derive the PSK, which is // a symmetric key used to authenticate each remote device. class RemoteDeviceLoader { public: class Factory { public: static std::unique_ptr NewInstance( const std::vector& device_info_list, const std::string& user_id, const std::string& user_private_key, std::unique_ptr secure_message_delegate); static void SetInstanceForTesting(Factory* factory); protected: virtual std::unique_ptr BuildInstance( const std::vector& device_info_list, const std::string& user_id, const std::string& user_private_key, std::unique_ptr secure_message_delegate); private: static Factory* factory_instance_; }; // Creates the instance: // |device_info_list|: The ExternalDeviceInfo objects to convert to // RemoteDevices. // |user_private_key|: The private key of the user's local device. Used to // derive the PSK. // |secure_message_delegate|: Used to derive each persistent symmetric key. RemoteDeviceLoader( const std::vector& device_info_list, const std::string& user_id, const std::string& user_private_key, std::unique_ptr secure_message_delegate); virtual ~RemoteDeviceLoader(); // Loads the RemoteDevice objects. |callback| will be invoked upon completion. // For space considerations, BeaconSeeds will only be loaded if // |should_load_beacon_seeds| is true. typedef base::Callback RemoteDeviceCallback; virtual void Load(bool should_load_beacon_seeds, const RemoteDeviceCallback& callback); private: // Called when the PSK is derived for each device. If the PSKs for all devices // have been derived, then we can invoke |callback_|. void OnPSKDerived(const cryptauth::ExternalDeviceInfo& device, const std::string& psk); // True if the loader should include BeaconSeeds in the loaded RemoteDevices. bool should_load_beacon_seeds_; // The remaining devices whose PSK we're waiting on. std::vector remaining_devices_; // The id of the user who the remote devices belong to. const std::string user_id_; // The private key of the user's local device. const std::string user_private_key_; // Performs the PSK key derivation. std::unique_ptr secure_message_delegate_; // Invoked when the RemoteDevices are loaded. RemoteDeviceCallback callback_; // The collection of RemoteDevices to return. cryptauth::RemoteDeviceList remote_devices_; base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(RemoteDeviceLoader); }; } // namespace cryptauth #endif // COMPONENTS_CRYPTAUTH_REMOTE_DEVICE_LOADER_H_