blob: a3e0fa54f386352ff38106f709cb394c6baed2aa [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 Danisevskis1af91262020-08-10 14:58:08 -070015//! This crate implement the core Keystore 2.0 service API as defined by the Keystore 2.0
16//! AIDL spec.
17
Max Bires8e93d2b2021-01-14 13:17:59 -080018use std::collections::HashMap;
19
Pavel Grafov94243c22021-04-21 18:03:11 +010020use crate::audit_log::log_key_deleted;
Shaquille Johnson9da2e1c2022-09-19 12:39:01 +000021use crate::ks_err;
Janis Danisevskise92a5e62020-12-02 12:57:41 -080022use crate::permission::{KeyPerm, KeystorePerm};
Janis Danisevskis1af91262020-08-10 14:58:08 -070023use crate::security_level::KeystoreSecurityLevel;
Janis Danisevskis04b02832020-10-26 09:21:40 -070024use crate::utils::{
Janis Danisevskise92a5e62020-12-02 12:57:41 -080025 check_grant_permission, check_key_permission, check_keystore_permission,
Janis Danisevskisf84d0b02022-01-26 14:11:14 -080026 key_parameters_to_authorizations, list_key_entries, uid_to_android_user, watchdog as wd,
Janis Danisevskis04b02832020-10-26 09:21:40 -070027};
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +000028use crate::{
29 database::Uuid,
Janis Danisevskisf84d0b02022-01-26 14:11:14 -080030 globals::{create_thread_local_db, DB, LEGACY_BLOB_LOADER, LEGACY_IMPORTER, SUPER_KEY},
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +000031};
Max Bires8e93d2b2021-01-14 13:17:59 -080032use crate::{database::KEYSTORE_UUID, permission};
Janis Danisevskisb42fc182020-12-15 08:41:27 -080033use crate::{
34 database::{KeyEntryLoadBits, KeyType, SubComponentType},
35 error::ResponseCode,
36};
Janis Danisevskis5cb52dc2021-04-07 16:31:18 -070037use crate::{
38 error::{self, map_or_log_err, ErrorCode},
39 id_rotation::IdRotationState,
40};
Shawn Willden708744a2020-12-11 13:05:27 +000041use android_hardware_security_keymint::aidl::android::hardware::security::keymint::SecurityLevel::SecurityLevel;
Andrew Walbrande45c8b2021-04-13 14:42:38 +000042use android_hardware_security_keymint::binder::{BinderFeatures, Strong, ThreadState};
Janis Danisevskis1af91262020-08-10 14:58:08 -070043use android_system_keystore2::aidl::android::system::keystore2::{
Janis Danisevskis2c7f9622020-09-30 16:30:31 -070044 Domain::Domain, IKeystoreSecurityLevel::IKeystoreSecurityLevel,
45 IKeystoreService::BnKeystoreService, IKeystoreService::IKeystoreService,
46 KeyDescriptor::KeyDescriptor, KeyEntryResponse::KeyEntryResponse, KeyMetadata::KeyMetadata,
Janis Danisevskis1af91262020-08-10 14:58:08 -070047};
Max Bires8e93d2b2021-01-14 13:17:59 -080048use anyhow::{Context, Result};
Janis Danisevskise92a5e62020-12-02 12:57:41 -080049use error::Error;
50use keystore2_selinux as selinux;
Janis Danisevskis1af91262020-08-10 14:58:08 -070051
52/// Implementation of the IKeystoreService.
Max Bires8e93d2b2021-01-14 13:17:59 -080053#[derive(Default)]
Janis Danisevskis1af91262020-08-10 14:58:08 -070054pub struct KeystoreService {
Janis Danisevskis5f3a0572021-06-18 11:26:42 -070055 i_sec_level_by_uuid: HashMap<Uuid, Strong<dyn IKeystoreSecurityLevel>>,
Max Bires8e93d2b2021-01-14 13:17:59 -080056 uuid_by_sec_level: HashMap<SecurityLevel, Uuid>,
Janis Danisevskis1af91262020-08-10 14:58:08 -070057}
58
59impl KeystoreService {
60 /// Create a new instance of the Keystore 2.0 service.
Janis Danisevskis5cb52dc2021-04-07 16:31:18 -070061 pub fn new_native_binder(
62 id_rotation_state: IdRotationState,
63 ) -> Result<Strong<dyn IKeystoreService>> {
Max Bires8e93d2b2021-01-14 13:17:59 -080064 let mut result: Self = Default::default();
Janis Danisevskis5cb52dc2021-04-07 16:31:18 -070065 let (dev, uuid) = KeystoreSecurityLevel::new_native_binder(
66 SecurityLevel::TRUSTED_ENVIRONMENT,
67 id_rotation_state.clone(),
68 )
69 .context(concat!(
70 "In KeystoreService::new_native_binder: ",
71 "Trying to construct mandatory security level TEE."
Janis Danisevskis5f3a0572021-06-18 11:26:42 -070072 ))?;
Max Bires8e93d2b2021-01-14 13:17:59 -080073 result.i_sec_level_by_uuid.insert(uuid, dev);
74 result.uuid_by_sec_level.insert(SecurityLevel::TRUSTED_ENVIRONMENT, uuid);
Janis Danisevskisba998992020-12-29 16:08:40 -080075
Max Bires8e93d2b2021-01-14 13:17:59 -080076 // Strongbox is optional, so we ignore errors and turn the result into an Option.
Janis Danisevskis5cb52dc2021-04-07 16:31:18 -070077 if let Ok((dev, uuid)) =
78 KeystoreSecurityLevel::new_native_binder(SecurityLevel::STRONGBOX, id_rotation_state)
Max Bires8e93d2b2021-01-14 13:17:59 -080079 {
80 result.i_sec_level_by_uuid.insert(uuid, dev);
81 result.uuid_by_sec_level.insert(SecurityLevel::STRONGBOX, uuid);
82 }
83
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +000084 let uuid_by_sec_level = result.uuid_by_sec_level.clone();
Janis Danisevskis0ffb8a82022-02-06 22:37:21 -080085 LEGACY_IMPORTER
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +000086 .set_init(move || {
87 (create_thread_local_db(), uuid_by_sec_level, LEGACY_BLOB_LOADER.clone())
88 })
89 .context(
90 "In KeystoreService::new_native_binder: Trying to initialize the legacy migrator.",
91 )?;
92
Andrew Walbrande45c8b2021-04-13 14:42:38 +000093 Ok(BnKeystoreService::new_binder(
94 result,
95 BinderFeatures { set_requesting_sid: true, ..BinderFeatures::default() },
96 ))
Janis Danisevskis1af91262020-08-10 14:58:08 -070097 }
98
Max Bires8e93d2b2021-01-14 13:17:59 -080099 fn uuid_to_sec_level(&self, uuid: &Uuid) -> SecurityLevel {
100 self.uuid_by_sec_level
101 .iter()
102 .find(|(_, v)| **v == *uuid)
103 .map(|(s, _)| *s)
104 .unwrap_or(SecurityLevel::SOFTWARE)
105 }
106
Stephen Crane221bbb52020-12-16 15:52:10 -0800107 fn get_i_sec_level_by_uuid(&self, uuid: &Uuid) -> Result<Strong<dyn IKeystoreSecurityLevel>> {
Max Bires8e93d2b2021-01-14 13:17:59 -0800108 if let Some(dev) = self.i_sec_level_by_uuid.get(uuid) {
Janis Danisevskis5f3a0572021-06-18 11:26:42 -0700109 Ok(dev.clone())
Max Bires8e93d2b2021-01-14 13:17:59 -0800110 } else {
111 Err(error::Error::sys())
112 .context("In get_i_sec_level_by_uuid: KeyMint instance for key not found.")
113 }
Janis Danisevskisba998992020-12-29 16:08:40 -0800114 }
115
Janis Danisevskis1af91262020-08-10 14:58:08 -0700116 fn get_security_level(
117 &self,
Max Bires8e93d2b2021-01-14 13:17:59 -0800118 sec_level: SecurityLevel,
Stephen Crane221bbb52020-12-16 15:52:10 -0800119 ) -> Result<Strong<dyn IKeystoreSecurityLevel>> {
Max Bires8e93d2b2021-01-14 13:17:59 -0800120 if let Some(dev) = self
121 .uuid_by_sec_level
122 .get(&sec_level)
123 .and_then(|uuid| self.i_sec_level_by_uuid.get(uuid))
124 {
Janis Danisevskis5f3a0572021-06-18 11:26:42 -0700125 Ok(dev.clone())
Max Bires8e93d2b2021-01-14 13:17:59 -0800126 } else {
127 Err(error::Error::Km(ErrorCode::HARDWARE_TYPE_UNAVAILABLE))
128 .context("In get_security_level: No such security level.")
129 }
Janis Danisevskis1af91262020-08-10 14:58:08 -0700130 }
131
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700132 fn get_key_entry(&self, key: &KeyDescriptor) -> Result<KeyEntryResponse> {
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000133 let caller_uid = ThreadState::get_calling_uid();
Janis Danisevskisf84d0b02022-01-26 14:11:14 -0800134
135 let super_key =
136 SUPER_KEY.read().unwrap().get_per_boot_key_by_user_id(uid_to_android_user(caller_uid));
137
Janis Danisevskisaec14592020-11-12 09:41:49 -0800138 let (key_id_guard, mut key_entry) = DB
Janis Danisevskis1af91262020-08-10 14:58:08 -0700139 .with(|db| {
Janis Danisevskisf84d0b02022-01-26 14:11:14 -0800140 LEGACY_IMPORTER.with_try_import(key, caller_uid, super_key, || {
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000141 db.borrow_mut().load_key_entry(
Chris Wailesd5aaaef2021-07-27 16:04:33 -0700142 key,
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000143 KeyType::Client,
144 KeyEntryLoadBits::PUBLIC,
145 caller_uid,
Janis Danisevskis39d57e72021-10-19 16:56:20 -0700146 |k, av| check_key_permission(KeyPerm::GetInfo, k, &av),
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000147 )
148 })
Janis Danisevskis1af91262020-08-10 14:58:08 -0700149 })
150 .context("In get_key_entry, while trying to load key info.")?;
151
Janis Danisevskis377d1002021-01-27 19:07:48 -0800152 let i_sec_level = if !key_entry.pure_cert() {
153 Some(
Max Bires8e93d2b2021-01-14 13:17:59 -0800154 self.get_i_sec_level_by_uuid(key_entry.km_uuid())
155 .context("In get_key_entry: Trying to get security level proxy.")?,
Janis Danisevskis377d1002021-01-27 19:07:48 -0800156 )
157 } else {
158 None
159 };
Janis Danisevskis1af91262020-08-10 14:58:08 -0700160
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700161 Ok(KeyEntryResponse {
Janis Danisevskis377d1002021-01-27 19:07:48 -0800162 iSecurityLevel: i_sec_level,
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700163 metadata: KeyMetadata {
Janis Danisevskis1af91262020-08-10 14:58:08 -0700164 key: KeyDescriptor {
165 domain: Domain::KEY_ID,
Janis Danisevskisaec14592020-11-12 09:41:49 -0800166 nspace: key_id_guard.id(),
Janis Danisevskis1af91262020-08-10 14:58:08 -0700167 ..Default::default()
168 },
Max Bires8e93d2b2021-01-14 13:17:59 -0800169 keySecurityLevel: self.uuid_to_sec_level(key_entry.km_uuid()),
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700170 certificate: key_entry.take_cert(),
171 certificateChain: key_entry.take_cert_chain(),
Janis Danisevskisb42fc182020-12-15 08:41:27 -0800172 modificationTimeMs: key_entry
173 .metadata()
174 .creation_date()
175 .map(|d| d.to_millis_epoch())
176 .ok_or(Error::Rc(ResponseCode::VALUE_CORRUPTED))
177 .context("In get_key_entry: Trying to get creation date.")?,
Janis Danisevskis04b02832020-10-26 09:21:40 -0700178 authorizations: key_parameters_to_authorizations(key_entry.into_key_parameters()),
Janis Danisevskis1af91262020-08-10 14:58:08 -0700179 },
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700180 })
Janis Danisevskis1af91262020-08-10 14:58:08 -0700181 }
182
183 fn update_subcomponent(
184 &self,
185 key: &KeyDescriptor,
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700186 public_cert: Option<&[u8]>,
187 certificate_chain: Option<&[u8]>,
Janis Danisevskis1af91262020-08-10 14:58:08 -0700188 ) -> Result<()> {
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000189 let caller_uid = ThreadState::get_calling_uid();
Janis Danisevskisf84d0b02022-01-26 14:11:14 -0800190 let super_key =
191 SUPER_KEY.read().unwrap().get_per_boot_key_by_user_id(uid_to_android_user(caller_uid));
192
Janis Danisevskis1af91262020-08-10 14:58:08 -0700193 DB.with::<_, Result<()>>(|db| {
Janis Danisevskisf84d0b02022-01-26 14:11:14 -0800194 let entry = match LEGACY_IMPORTER.with_try_import(key, caller_uid, super_key, || {
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000195 db.borrow_mut().load_key_entry(
Chris Wailesd5aaaef2021-07-27 16:04:33 -0700196 key,
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000197 KeyType::Client,
198 KeyEntryLoadBits::NONE,
199 caller_uid,
200 |k, av| {
Janis Danisevskis39d57e72021-10-19 16:56:20 -0700201 check_key_permission(KeyPerm::Update, k, &av)
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000202 .context("In update_subcomponent.")
203 },
204 )
205 }) {
Janis Danisevskis377d1002021-01-27 19:07:48 -0800206 Err(e) => match e.root_cause().downcast_ref::<Error>() {
207 Some(Error::Rc(ResponseCode::KEY_NOT_FOUND)) => Ok(None),
208 _ => Err(e),
209 },
210 Ok(v) => Ok(Some(v)),
211 }
212 .context("Failed to load key entry.")?;
Janis Danisevskis1af91262020-08-10 14:58:08 -0700213
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000214 let mut db = db.borrow_mut();
Paul Crowleyd5653e52021-03-25 09:46:31 -0700215 if let Some((key_id_guard, _key_entry)) = entry {
Janis Danisevskis7e8b4622021-02-13 10:01:59 -0800216 db.set_blob(&key_id_guard, SubComponentType::CERT, public_cert, None)
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700217 .context("Failed to update cert subcomponent.")?;
Janis Danisevskis377d1002021-01-27 19:07:48 -0800218
Janis Danisevskis7e8b4622021-02-13 10:01:59 -0800219 db.set_blob(&key_id_guard, SubComponentType::CERT_CHAIN, certificate_chain, None)
Janis Danisevskis377d1002021-01-27 19:07:48 -0800220 .context("Failed to update cert chain subcomponent.")?;
221 return Ok(());
Janis Danisevskis1af91262020-08-10 14:58:08 -0700222 }
223
Janis Danisevskis377d1002021-01-27 19:07:48 -0800224 // If we reach this point we have to check the special condition where a certificate
225 // entry may be made.
226 if !(public_cert.is_none() && certificate_chain.is_some()) {
227 return Err(Error::Rc(ResponseCode::KEY_NOT_FOUND)).context("No key to update.");
Janis Danisevskis1af91262020-08-10 14:58:08 -0700228 }
Janis Danisevskis377d1002021-01-27 19:07:48 -0800229
230 // So we know that we have a certificate chain and no public cert.
231 // Now check that we have everything we need to make a new certificate entry.
232 let key = match (key.domain, &key.alias) {
233 (Domain::APP, Some(ref alias)) => KeyDescriptor {
234 domain: Domain::APP,
235 nspace: ThreadState::get_calling_uid() as i64,
236 alias: Some(alias.clone()),
237 blob: None,
238 },
239 (Domain::SELINUX, Some(_)) => key.clone(),
240 _ => {
241 return Err(Error::Rc(ResponseCode::INVALID_ARGUMENT))
242 .context("Domain must be APP or SELINUX to insert a certificate.")
243 }
244 };
245
246 // Security critical: This must return on failure. Do not remove the `?`;
Janis Danisevskis39d57e72021-10-19 16:56:20 -0700247 check_key_permission(KeyPerm::Rebind, &key, &None)
Janis Danisevskis377d1002021-01-27 19:07:48 -0800248 .context("Caller does not have permission to insert this certificate.")?;
249
Janis Danisevskis0cabd712021-05-25 11:07:10 -0700250 db.store_new_certificate(
251 &key,
252 KeyType::Client,
253 certificate_chain.unwrap(),
254 &KEYSTORE_UUID,
255 )
256 .context("Failed to insert new certificate.")?;
Janis Danisevskis1af91262020-08-10 14:58:08 -0700257 Ok(())
258 })
259 .context("In update_subcomponent.")
260 }
261
262 fn list_entries(&self, domain: Domain, namespace: i64) -> Result<Vec<KeyDescriptor>> {
Janis Danisevskise92a5e62020-12-02 12:57:41 -0800263 let mut k = match domain {
264 Domain::APP => KeyDescriptor {
265 domain,
266 nspace: ThreadState::get_calling_uid() as u64 as i64,
267 ..Default::default()
268 },
Shaquille Johnson9da2e1c2022-09-19 12:39:01 +0000269 Domain::SELINUX => KeyDescriptor { domain, nspace: namespace, ..Default::default() },
270 _ => {
271 return Err(Error::Rc(ResponseCode::INVALID_ARGUMENT)).context(ks_err!(
272 "List entries is only supported for Domain::APP and Domain::SELINUX."
273 ))
274 }
Janis Danisevskise92a5e62020-12-02 12:57:41 -0800275 };
276
277 // First we check if the caller has the info permission for the selected domain/namespace.
278 // By default we use the calling uid as namespace if domain is Domain::APP.
279 // If the first check fails we check if the caller has the list permission allowing to list
280 // any namespace. In that case we also adjust the queried namespace if a specific uid was
281 // selected.
Chris Wailes20f50df2022-04-19 17:23:52 -0700282 if let Err(e) = check_key_permission(KeyPerm::GetInfo, &k, &None) {
283 if let Some(selinux::Error::PermissionDenied) =
Rajesh Nyamagoud16198a32022-07-26 18:45:55 +0000284 e.root_cause().downcast_ref::<selinux::Error>()
285 {
Chris Wailes20f50df2022-04-19 17:23:52 -0700286 check_keystore_permission(KeystorePerm::List)
Shaquille Johnson9da2e1c2022-09-19 12:39:01 +0000287 .context(ks_err!("While checking keystore permission."))?;
Chris Wailes20f50df2022-04-19 17:23:52 -0700288 if namespace != -1 {
289 k.nspace = namespace;
Janis Danisevskise92a5e62020-12-02 12:57:41 -0800290 }
Chris Wailes20f50df2022-04-19 17:23:52 -0700291 } else {
Shaquille Johnson9da2e1c2022-09-19 12:39:01 +0000292 return Err(e).context(ks_err!("While checking key permission."))?;
Janis Danisevskise92a5e62020-12-02 12:57:41 -0800293 }
Chris Wailes20f50df2022-04-19 17:23:52 -0700294 }
Janis Danisevskise92a5e62020-12-02 12:57:41 -0800295
John Wu16db29e2022-01-13 15:21:43 -0800296 DB.with(|db| list_key_entries(&mut db.borrow_mut(), k.domain, k.nspace))
Janis Danisevskis1af91262020-08-10 14:58:08 -0700297 }
298
299 fn delete_key(&self, key: &KeyDescriptor) -> Result<()> {
Janis Danisevskis93927dd2020-12-23 12:23:08 -0800300 let caller_uid = ThreadState::get_calling_uid();
Janis Danisevskisf84d0b02022-01-26 14:11:14 -0800301 let super_key =
302 SUPER_KEY.read().unwrap().get_per_boot_key_by_user_id(uid_to_android_user(caller_uid));
303
Janis Danisevskis7e8b4622021-02-13 10:01:59 -0800304 DB.with(|db| {
Janis Danisevskisf84d0b02022-01-26 14:11:14 -0800305 LEGACY_IMPORTER.with_try_import(key, caller_uid, super_key, || {
Chris Wailesd5aaaef2021-07-27 16:04:33 -0700306 db.borrow_mut().unbind_key(key, KeyType::Client, caller_uid, |k, av| {
Janis Danisevskis39d57e72021-10-19 16:56:20 -0700307 check_key_permission(KeyPerm::Delete, k, &av).context("During delete_key.")
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000308 })
Janis Danisevskis93927dd2020-12-23 12:23:08 -0800309 })
Janis Danisevskis7e8b4622021-02-13 10:01:59 -0800310 })
Shaquille Johnson9da2e1c2022-09-19 12:39:01 +0000311 .context(ks_err!("Trying to unbind the key."))?;
Janis Danisevskisa51ccbc2020-11-25 21:04:24 -0800312 Ok(())
Janis Danisevskis1af91262020-08-10 14:58:08 -0700313 }
314
315 fn grant(
316 &self,
317 key: &KeyDescriptor,
318 grantee_uid: i32,
319 access_vector: permission::KeyPermSet,
320 ) -> Result<KeyDescriptor> {
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000321 let caller_uid = ThreadState::get_calling_uid();
Janis Danisevskisf84d0b02022-01-26 14:11:14 -0800322 let super_key =
323 SUPER_KEY.read().unwrap().get_per_boot_key_by_user_id(uid_to_android_user(caller_uid));
324
Janis Danisevskis1af91262020-08-10 14:58:08 -0700325 DB.with(|db| {
Janis Danisevskisf84d0b02022-01-26 14:11:14 -0800326 LEGACY_IMPORTER.with_try_import(key, caller_uid, super_key, || {
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000327 db.borrow_mut().grant(
Chris Wailesd5aaaef2021-07-27 16:04:33 -0700328 key,
Hasini Gunasinghe3ed5da72021-02-04 15:18:54 +0000329 caller_uid,
330 grantee_uid as u32,
331 access_vector,
332 |k, av| check_grant_permission(*av, k).context("During grant."),
333 )
334 })
Janis Danisevskis1af91262020-08-10 14:58:08 -0700335 })
Shaquille Johnson9da2e1c2022-09-19 12:39:01 +0000336 .context(ks_err!("KeystoreService::grant."))
Janis Danisevskis1af91262020-08-10 14:58:08 -0700337 }
338
339 fn ungrant(&self, key: &KeyDescriptor, grantee_uid: i32) -> Result<()> {
340 DB.with(|db| {
Chris Wailesd5aaaef2021-07-27 16:04:33 -0700341 db.borrow_mut().ungrant(key, ThreadState::get_calling_uid(), grantee_uid as u32, |k| {
Janis Danisevskis39d57e72021-10-19 16:56:20 -0700342 check_key_permission(KeyPerm::Grant, k, &None)
Janis Danisevskis66784c42021-01-27 08:40:25 -0800343 })
Janis Danisevskis1af91262020-08-10 14:58:08 -0700344 })
Shaquille Johnson9da2e1c2022-09-19 12:39:01 +0000345 .context(ks_err!("KeystoreService::ungrant."))
Janis Danisevskis1af91262020-08-10 14:58:08 -0700346 }
347}
348
349impl binder::Interface for KeystoreService {}
350
351// Implementation of IKeystoreService. See AIDL spec at
352// system/security/keystore2/binder/android/security/keystore2/IKeystoreService.aidl
353impl IKeystoreService for KeystoreService {
354 fn getSecurityLevel(
355 &self,
Janis Danisevskisa53c9cf2020-10-26 11:52:33 -0700356 security_level: SecurityLevel,
Stephen Crane23cf7242022-01-19 17:49:46 +0000357 ) -> binder::Result<Strong<dyn IKeystoreSecurityLevel>> {
Hasini Gunasinghe5a893e82021-05-05 14:32:32 +0000358 let _wp = wd::watch_millis_with("IKeystoreService::getSecurityLevel", 500, move || {
359 format!("security_level: {}", security_level.0)
360 });
Max Bires8e93d2b2021-01-14 13:17:59 -0800361 map_or_log_err(self.get_security_level(security_level), Ok)
Janis Danisevskis1af91262020-08-10 14:58:08 -0700362 }
Stephen Crane23cf7242022-01-19 17:49:46 +0000363 fn getKeyEntry(&self, key: &KeyDescriptor) -> binder::Result<KeyEntryResponse> {
Hasini Gunasinghe5a893e82021-05-05 14:32:32 +0000364 let _wp = wd::watch_millis("IKeystoreService::get_key_entry", 500);
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700365 map_or_log_err(self.get_key_entry(key), Ok)
Janis Danisevskis1af91262020-08-10 14:58:08 -0700366 }
367 fn updateSubcomponent(
368 &self,
369 key: &KeyDescriptor,
Janis Danisevskis2c7f9622020-09-30 16:30:31 -0700370 public_cert: Option<&[u8]>,
371 certificate_chain: Option<&[u8]>,
Stephen Crane23cf7242022-01-19 17:49:46 +0000372 ) -> binder::Result<()> {
Hasini Gunasinghe5a893e82021-05-05 14:32:32 +0000373 let _wp = wd::watch_millis("IKeystoreService::updateSubcomponent", 500);
Janis Danisevskis1af91262020-08-10 14:58:08 -0700374 map_or_log_err(self.update_subcomponent(key, public_cert, certificate_chain), Ok)
375 }
Stephen Crane23cf7242022-01-19 17:49:46 +0000376 fn listEntries(&self, domain: Domain, namespace: i64) -> binder::Result<Vec<KeyDescriptor>> {
Hasini Gunasinghe5a893e82021-05-05 14:32:32 +0000377 let _wp = wd::watch_millis("IKeystoreService::listEntries", 500);
Janis Danisevskis1af91262020-08-10 14:58:08 -0700378 map_or_log_err(self.list_entries(domain, namespace), Ok)
379 }
Stephen Crane23cf7242022-01-19 17:49:46 +0000380 fn deleteKey(&self, key: &KeyDescriptor) -> binder::Result<()> {
Hasini Gunasinghe5a893e82021-05-05 14:32:32 +0000381 let _wp = wd::watch_millis("IKeystoreService::deleteKey", 500);
Pavel Grafov94243c22021-04-21 18:03:11 +0100382 let result = self.delete_key(key);
383 log_key_deleted(key, ThreadState::get_calling_uid(), result.is_ok());
384 map_or_log_err(result, Ok)
Janis Danisevskis1af91262020-08-10 14:58:08 -0700385 }
386 fn grant(
387 &self,
388 key: &KeyDescriptor,
389 grantee_uid: i32,
390 access_vector: i32,
Stephen Crane23cf7242022-01-19 17:49:46 +0000391 ) -> binder::Result<KeyDescriptor> {
Hasini Gunasinghe5a893e82021-05-05 14:32:32 +0000392 let _wp = wd::watch_millis("IKeystoreService::grant", 500);
Janis Danisevskis1af91262020-08-10 14:58:08 -0700393 map_or_log_err(self.grant(key, grantee_uid, access_vector.into()), Ok)
394 }
Stephen Crane23cf7242022-01-19 17:49:46 +0000395 fn ungrant(&self, key: &KeyDescriptor, grantee_uid: i32) -> binder::Result<()> {
Hasini Gunasinghe5a893e82021-05-05 14:32:32 +0000396 let _wp = wd::watch_millis("IKeystoreService::ungrant", 500);
Janis Danisevskis1af91262020-08-10 14:58:08 -0700397 map_or_log_err(self.ungrant(key, grantee_uid), Ok)
398 }
399}