blob: 7391f37f8414f090109baae12afeb7497be7736e [file] [log] [blame]
Janis Danisevskis1af91262020-08-10 14:58:08 -07001// Copyright 2020, The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Janis Danisevskise242b032020-11-17 15:57:51 -080015//! This crate implements the Keystore 2.0 service entry point.
Janis Danisevskis1af91262020-08-10 14:58:08 -070016
17use binder::Interface;
Janis Danisevskis7a1cf382020-11-20 11:22:14 -080018use keystore2::apc::ApcManager;
Janis Danisevskis1af91262020-08-10 14:58:08 -070019use keystore2::service::KeystoreService;
20use log::{error, info};
21use std::panic;
22
23static KS2_SERVICE_NAME: &str = "android.system.keystore2";
Janis Danisevskis7a1cf382020-11-20 11:22:14 -080024static APC_SERVICE_NAME: &str = "android.security.apc";
Janis Danisevskis1af91262020-08-10 14:58:08 -070025
26/// Keystore 2.0 takes one argument which is a path indicating its designated working directory.
27fn main() {
28 // Initialize android logging.
29 android_logger::init_once(
30 android_logger::Config::default().with_tag("keystore2").with_min_level(log::Level::Debug),
31 );
32 // Redirect panic messages to logcat.
33 panic::set_hook(Box::new(|panic_info| {
34 error!("{}", panic_info);
35 }));
36
37 // Saying hi.
38 info!("Keystore2 is starting.");
39
40 let mut args = std::env::args();
41 args.next().expect("That's odd. How is there not even a first argument?");
Janis Danisevskisbf15d732020-12-08 10:35:26 -080042
43 // Keystore changes to the database directory on startup (typically /data/misc/keystore).
44 // For the ground truth check the service startup rule for init (typically in keystore2.rc).
Janis Danisevskis1af91262020-08-10 14:58:08 -070045 if let Some(dir) = args.next() {
46 if std::env::set_current_dir(dir.clone()).is_err() {
47 panic!("Failed to set working directory {}.", dir)
48 }
49 } else {
50 panic!("Must specify a working directory.");
51 }
52
Janis Danisevskis8c6378e2021-01-01 09:30:37 -080053 info!("Starting thread pool now.");
54 binder::ProcessState::start_thread_pool();
55
Janis Danisevskis1af91262020-08-10 14:58:08 -070056 let ks_service = KeystoreService::new_native_binder().unwrap_or_else(|e| {
57 panic!("Failed to create service {} because of {:?}.", KS2_SERVICE_NAME, e);
58 });
59 binder::add_service(KS2_SERVICE_NAME, ks_service.as_binder()).unwrap_or_else(|e| {
60 panic!("Failed to register service {} because of {:?}.", KS2_SERVICE_NAME, e);
61 });
62
Janis Danisevskis7a1cf382020-11-20 11:22:14 -080063 let apc_service = ApcManager::new_native_binder().unwrap_or_else(|e| {
64 panic!("Failed to create service {} because of {:?}.", APC_SERVICE_NAME, e);
65 });
66 binder::add_service(APC_SERVICE_NAME, apc_service.as_binder()).unwrap_or_else(|e| {
67 panic!("Failed to register service {} because of {:?}.", APC_SERVICE_NAME, e);
68 });
69
Janis Danisevskis1af91262020-08-10 14:58:08 -070070 info!("Successfully registered Keystore 2.0 service.");
Janis Danisevskis1af91262020-08-10 14:58:08 -070071
Janis Danisevskise242b032020-11-17 15:57:51 -080072 info!("Joining thread pool now.");
Janis Danisevskis1af91262020-08-10 14:58:08 -070073 binder::ProcessState::join_thread_pool();
74}