| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright 2019 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
| Martin Brabham | 605d6f1 | 2019-03-29 12:02:30 -0700 | [diff] [blame] | 17 | #define LOG_TAG "security" | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 18 |  | 
|  | 19 | #include <memory> | 
|  | 20 | #include "module.h" | 
|  | 21 | #include "os/handler.h" | 
|  | 22 | #include "os/log.h" | 
|  | 23 |  | 
| Martin Brabham | 605d6f1 | 2019-03-29 12:02:30 -0700 | [diff] [blame] | 24 | #include "hci/hci_layer.h" | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 25 | #include "l2cap/le/l2cap_le_module.h" | 
| Martin Brabham | 605d6f1 | 2019-03-29 12:02:30 -0700 | [diff] [blame] | 26 | #include "security/channel/security_manager_channel.h" | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 27 | #include "security/internal/security_manager_impl.h" | 
|  | 28 | #include "security/security_module.h" | 
|  | 29 |  | 
|  | 30 | namespace bluetooth { | 
|  | 31 | namespace security { | 
|  | 32 |  | 
|  | 33 | const ModuleFactory SecurityModule::Factory = ModuleFactory([]() { return new SecurityModule(); }); | 
|  | 34 |  | 
|  | 35 | struct SecurityModule::impl { | 
|  | 36 | impl(os::Handler* security_handler, l2cap::le::L2capLeModule* l2cap_le_module, | 
| Martin Brabham | 605d6f1 | 2019-03-29 12:02:30 -0700 | [diff] [blame] | 37 | l2cap::classic::L2capClassicModule* l2cap_classic_module, hci::HciLayer* hci_layer) | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 38 | : security_handler_(security_handler), l2cap_le_module_(l2cap_le_module), | 
| Martin Brabham | 605d6f1 | 2019-03-29 12:02:30 -0700 | [diff] [blame] | 39 | l2cap_classic_module_(l2cap_classic_module), | 
|  | 40 | security_manager_channel_(new channel::SecurityManagerChannel(security_handler_, hci_layer)) {} | 
|  | 41 |  | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 42 | os::Handler* security_handler_; | 
|  | 43 | l2cap::le::L2capLeModule* l2cap_le_module_; | 
|  | 44 | l2cap::classic::L2capClassicModule* l2cap_classic_module_; | 
| Martin Brabham | 605d6f1 | 2019-03-29 12:02:30 -0700 | [diff] [blame] | 45 | channel::SecurityManagerChannel* security_manager_channel_; | 
|  | 46 | internal::SecurityManagerImpl security_manager_impl{security_handler_, l2cap_le_module_, l2cap_classic_module_, | 
|  | 47 | security_manager_channel_}; | 
| Martin Brabham | 80854c2 | 2019-11-12 14:52:42 -0800 | [diff] [blame] | 48 | ~impl() { | 
|  | 49 | delete security_manager_channel_; | 
|  | 50 | } | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 51 | }; | 
|  | 52 |  | 
|  | 53 | void SecurityModule::ListDependencies(ModuleList* list) { | 
|  | 54 | list->add<l2cap::le::L2capLeModule>(); | 
|  | 55 | list->add<l2cap::classic::L2capClassicModule>(); | 
| Martin Brabham | 605d6f1 | 2019-03-29 12:02:30 -0700 | [diff] [blame] | 56 | list->add<hci::HciLayer>(); | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 57 | } | 
|  | 58 |  | 
|  | 59 | void SecurityModule::Start() { | 
|  | 60 | pimpl_ = std::make_unique<impl>(GetHandler(), GetDependency<l2cap::le::L2capLeModule>(), | 
| Martin Brabham | 605d6f1 | 2019-03-29 12:02:30 -0700 | [diff] [blame] | 61 | GetDependency<l2cap::classic::L2capClassicModule>(), GetDependency<hci::HciLayer>()); | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 62 | } | 
|  | 63 |  | 
|  | 64 | void SecurityModule::Stop() { | 
|  | 65 | pimpl_.reset(); | 
|  | 66 | } | 
|  | 67 |  | 
| Zongheng Wang | 6fd349a | 2019-11-12 16:14:01 -0800 | [diff] [blame] | 68 | std::string SecurityModule::ToString() const { | 
|  | 69 | return "Security Module"; | 
|  | 70 | } | 
|  | 71 |  | 
| Jakub Pawlowski | fa057bd | 2019-10-10 14:36:29 +0200 | [diff] [blame] | 72 | std::unique_ptr<SecurityManager> SecurityModule::GetSecurityManager() { | 
|  | 73 | return std::unique_ptr<SecurityManager>( | 
|  | 74 | new SecurityManager(pimpl_->security_handler_, &pimpl_->security_manager_impl)); | 
|  | 75 | } | 
|  | 76 |  | 
|  | 77 | }  // namespace security | 
|  | 78 | }  // namespace bluetooth |