blob: cab042ad41ced4a28b5c6c69327247ca01940b54 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka7ce499f2015-06-09 08:04:11 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Vitaly Buka912b6982015-07-06 11:13:03 -07005#ifndef LIBWEAVE_SRC_PRIVET_SECURITY_MANAGER_H_
6#define LIBWEAVE_SRC_PRIVET_SECURITY_MANAGER_H_
Vitaly Buka7ce499f2015-06-09 08:04:11 -07007
8#include <map>
9#include <memory>
10#include <set>
11#include <string>
12#include <vector>
13
14#include <base/callback.h>
Vitaly Buka0d501072015-08-18 18:09:46 -070015#include <base/gtest_prod_util.h>
Vitaly Buka7ce499f2015-06-09 08:04:11 -070016#include <base/memory/weak_ptr.h>
Vitaly Buka0801a1f2015-08-14 10:03:46 -070017#include <weave/error.h>
Vitaly Buka7ce499f2015-06-09 08:04:11 -070018
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020019#include "src/privet/security_delegate.h"
Vitaly Buka7ce499f2015-06-09 08:04:11 -070020
21namespace crypto {
22class P224EncryptedKeyExchange;
23} // namespace crypto
24
Vitaly Bukab6f015a2015-07-09 14:59:23 -070025namespace weave {
Vitaly Buka823fdda2015-08-13 00:33:00 -070026
Vitaly Buka1e363672015-09-25 14:01:16 -070027namespace provider {
Vitaly Buka823fdda2015-08-13 00:33:00 -070028class TaskRunner;
Vitaly Buka1e363672015-09-25 14:01:16 -070029}
Vitaly Buka823fdda2015-08-13 00:33:00 -070030
Vitaly Bukab6f015a2015-07-09 14:59:23 -070031namespace privet {
Vitaly Buka7ce499f2015-06-09 08:04:11 -070032
Vitaly Bukaf08caeb2015-12-02 13:47:48 -080033class AuthManager;
34
Vitaly Buka7ce499f2015-06-09 08:04:11 -070035class SecurityManager : public SecurityDelegate {
36 public:
37 using PairingStartListener =
38 base::Callback<void(const std::string& session_id,
39 PairingType pairing_type,
40 const std::vector<uint8_t>& code)>;
41 using PairingEndListener =
42 base::Callback<void(const std::string& session_id)>;
43
44 class KeyExchanger {
45 public:
Vitaly Buka3bfb13d2015-11-24 14:46:13 -080046 virtual ~KeyExchanger() {}
Vitaly Buka7ce499f2015-06-09 08:04:11 -070047
48 virtual const std::string& GetMessage() = 0;
49 virtual bool ProcessMessage(const std::string& message,
Vitaly Buka0801a1f2015-08-14 10:03:46 -070050 ErrorPtr* error) = 0;
Vitaly Buka7ce499f2015-06-09 08:04:11 -070051 virtual const std::string& GetKey() const = 0;
52 };
53
Vitaly Bukaf08caeb2015-12-02 13:47:48 -080054 SecurityManager(AuthManager* auth_manager,
Vitaly Buka8589b052015-09-29 00:46:14 -070055 const std::set<PairingType>& pairing_modes,
Vitaly Buka8cb91d72015-08-16 00:40:51 -070056 const std::string& embedded_code,
57 bool disable_security,
Vitaly Buka8589b052015-09-29 00:46:14 -070058 // TODO(vitalybuka): Remove task_runner.
Vitaly Buka1e363672015-09-25 14:01:16 -070059 provider::TaskRunner* task_runner);
Vitaly Buka7ce499f2015-06-09 08:04:11 -070060 ~SecurityManager() override;
61
62 // SecurityDelegate methods
63 std::string CreateAccessToken(const UserInfo& user_info,
64 const base::Time& time) override;
65 UserInfo ParseAccessToken(const std::string& token,
66 base::Time* time) const override;
67 std::set<PairingType> GetPairingTypes() const override;
68 std::set<CryptoType> GetCryptoTypes() const override;
69 bool IsValidPairingCode(const std::string& auth_code) const override;
70
71 bool StartPairing(PairingType mode,
72 CryptoType crypto,
73 std::string* session_id,
74 std::string* device_commitment,
Vitaly Buka0801a1f2015-08-14 10:03:46 -070075 ErrorPtr* error) override;
Vitaly Buka7ce499f2015-06-09 08:04:11 -070076
77 bool ConfirmPairing(const std::string& session_id,
78 const std::string& client_commitment,
79 std::string* fingerprint,
80 std::string* signature,
Vitaly Buka0801a1f2015-08-14 10:03:46 -070081 ErrorPtr* error) override;
82 bool CancelPairing(const std::string& session_id, ErrorPtr* error) override;
Vitaly Buka7ce499f2015-06-09 08:04:11 -070083
84 void RegisterPairingListeners(const PairingStartListener& on_start,
85 const PairingEndListener& on_end);
86
Vitaly Buka3d851b42015-12-08 16:17:01 -080087 const AuthManager* GetAuthManager() const { return auth_manager_; }
88
Vitaly Buka7ce499f2015-06-09 08:04:11 -070089 private:
90 FRIEND_TEST_ALL_PREFIXES(SecurityManagerTest, ThrottlePairing);
91 // Allows limited number of new sessions without successful authorization.
Vitaly Buka0801a1f2015-08-14 10:03:46 -070092 bool CheckIfPairingAllowed(ErrorPtr* error);
Vitaly Buka7ce499f2015-06-09 08:04:11 -070093 bool ClosePendingSession(const std::string& session_id);
94 bool CloseConfirmedSession(const std::string& session_id);
95
Vitaly Bukaf08caeb2015-12-02 13:47:48 -080096 AuthManager* auth_manager_{nullptr};
97
Vitaly Buka7ce499f2015-06-09 08:04:11 -070098 // If true allows unencrypted pairing and accepts any access code.
99 bool is_security_disabled_{false};
100 std::set<PairingType> pairing_modes_;
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700101 std::string embedded_code_;
Vitaly Bukaf9630fb2015-08-12 21:15:40 -0700102 // TODO(vitalybuka): Session cleanup can be done without posting tasks.
Vitaly Buka1e363672015-09-25 14:01:16 -0700103 provider::TaskRunner* task_runner_{nullptr};
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700104 std::map<std::string, std::unique_ptr<KeyExchanger>> pending_sessions_;
105 std::map<std::string, std::unique_ptr<KeyExchanger>> confirmed_sessions_;
106 mutable int pairing_attemts_{0};
107 mutable base::Time block_pairing_until_;
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700108 PairingStartListener on_start_;
109 PairingEndListener on_end_;
110
111 base::WeakPtrFactory<SecurityManager> weak_ptr_factory_{this};
112
113 DISALLOW_COPY_AND_ASSIGN(SecurityManager);
114};
115
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700116} // namespace privet
117} // namespace weave
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700118
Vitaly Buka912b6982015-07-06 11:13:03 -0700119#endif // LIBWEAVE_SRC_PRIVET_SECURITY_MANAGER_H_