keystore2: Use libbinder_rs Strong references for Binder objects
Update keystore2 to use libbinder_rs Strong<> and Weak<> references for
Binder objects rather than just Box<dyn Interface>.
Bug: 175584883
Test: atest keystore2_test
Change-Id: Ic234ce5ed007a265769a72043d77eb817a21b8ea
diff --git a/keystore2/src/apc.rs b/keystore2/src/apc.rs
index bdfec4e..767014e 100644
--- a/keystore2/src/apc.rs
+++ b/keystore2/src/apc.rs
@@ -28,7 +28,7 @@
ResponseCode::ResponseCode,
};
use android_security_apc::binder::{
- ExceptionCode, Interface, Result as BinderResult, SpIBinder, Status as BinderStatus,
+ ExceptionCode, Interface, Result as BinderResult, SpIBinder, Status as BinderStatus, Strong,
};
use anyhow::{Context, Result};
use binder::{IBinder, ThreadState};
@@ -202,7 +202,7 @@
/// Create a new instance of the Android Protected Confirmation service.
pub fn new_native_binder(
confirmation_token_sender: Sender<Vec<u8>>,
- ) -> Result<impl IProtectedConfirmation> {
+ ) -> Result<Strong<dyn IProtectedConfirmation>> {
let result = BnProtectedConfirmation::new_binder(Self {
state: Arc::new(Mutex::new(ApcState::new(confirmation_token_sender))),
});
diff --git a/keystore2/src/authorization.rs b/keystore2/src/authorization.rs
index ba27df8..e446e78 100644
--- a/keystore2/src/authorization.rs
+++ b/keystore2/src/authorization.rs
@@ -25,8 +25,8 @@
use android_hardware_security_secureclock::aidl::android::hardware::security::secureclock::{
Timestamp::Timestamp,
};
-use android_security_authorization::binder::{Interface, Result as BinderResult};
-use android_security_authorization:: aidl::android::security::authorization::IKeystoreAuthorization::{
+use android_security_authorization::binder::{Interface, Result as BinderResult, Strong};
+use android_security_authorization::aidl::android::security::authorization::IKeystoreAuthorization::{
BnKeystoreAuthorization, IKeystoreAuthorization,
};
use android_security_authorization:: aidl::android::security::authorization::LockScreenEvent::LockScreenEvent;
@@ -40,7 +40,7 @@
impl AuthorizationManager {
/// Create a new instance of Keystore Authorization service.
- pub fn new_native_binder() -> Result<impl IKeystoreAuthorization> {
+ pub fn new_native_binder() -> Result<Strong<dyn IKeystoreAuthorization>> {
let result = BnKeystoreAuthorization::new_binder(Self);
result.as_binder().set_requesting_sid(true);
Ok(result)
diff --git a/keystore2/src/enforcements.rs b/keystore2/src/enforcements.rs
index bee0e4b..13068c5 100644
--- a/keystore2/src/enforcements.rs
+++ b/keystore2/src/enforcements.rs
@@ -30,6 +30,7 @@
ISecureClock::ISecureClock, TimeStampToken::TimeStampToken,
};
use android_system_keystore2::aidl::android::system::keystore2::OperationChallenge::OperationChallenge;
+use android_system_keystore2::binder::Strong;
use anyhow::{Context, Result};
use std::sync::{
mpsc::{channel, Receiver, Sender},
@@ -202,7 +203,7 @@
}
fn get_timestamp_token(challenge: i64) -> Result<TimeStampToken, Error> {
- let dev: Box<dyn ISecureClock> = get_timestamp_service()
+ let dev: Strong<dyn ISecureClock> = get_timestamp_service()
.expect(concat!(
"Secure Clock service must be present ",
"if TimeStampTokens are required."
diff --git a/keystore2/src/gc.rs b/keystore2/src/gc.rs
index 692cb7e..fbb1cf6 100644
--- a/keystore2/src/gc.rs
+++ b/keystore2/src/gc.rs
@@ -21,6 +21,7 @@
use crate::globals::{get_keymint_dev_by_uuid, DB};
use crate::{error::map_km_error, globals::ASYNC_TASK};
use android_hardware_security_keymint::aidl::android::hardware::security::keymint::IKeyMintDevice::IKeyMintDevice;
+use android_hardware_security_keymint::binder::Strong;
use anyhow::Result;
#[derive(Clone, Copy)]
@@ -41,7 +42,7 @@
let mut db = db.borrow_mut();
if let Some((key_id, mut key_entry)) = db.get_unreferenced_key()? {
if let Some(blob) = key_entry.take_km_blob() {
- let km_dev: Box<dyn IKeyMintDevice> =
+ let km_dev: Strong<dyn IKeyMintDevice> =
get_keymint_dev_by_uuid(key_entry.km_uuid())
.map(|(dev, _)| dev)?
.get_interface()?;
diff --git a/keystore2/src/globals.rs b/keystore2/src/globals.rs
index cfaa28c..2afabbe 100644
--- a/keystore2/src/globals.rs
+++ b/keystore2/src/globals.rs
@@ -30,7 +30,7 @@
use android_hardware_security_keymint::aidl::android::hardware::security::keymint::{
KeyMintHardwareInfo::KeyMintHardwareInfo, SecurityLevel::SecurityLevel,
};
-use android_hardware_security_keymint::binder::StatusCode;
+use android_hardware_security_keymint::binder::{StatusCode, Strong};
use android_security_compat::aidl::android::security::compat::IKeystoreCompatService::IKeystoreCompatService;
use anyhow::{Context, Result};
use lazy_static::lazy_static;
@@ -152,7 +152,7 @@
// This is a no-op if it was called before.
keystore2_km_compat::add_keymint_device_service();
- let keystore_compat_service: Box<dyn IKeystoreCompatService> =
+ let keystore_compat_service: Strong<dyn IKeystoreCompatService> =
map_binder_status_code(binder::get_interface("android.security.compat"))
.context("In connect_keymint: Trying to connect to compat service.")?;
map_binder_status(keystore_compat_service.getKeyMintDevice(*security_level))
@@ -218,7 +218,7 @@
// This is a no-op if it was called before.
keystore2_km_compat::add_keymint_device_service();
- let keystore_compat_service: Box<dyn IKeystoreCompatService> =
+ let keystore_compat_service: Strong<dyn IKeystoreCompatService> =
map_binder_status_code(binder::get_interface("android.security.compat"))
.context(
"In connect_secureclock: Trying to connect to compat service.",
diff --git a/keystore2/src/keystore2_main.rs b/keystore2/src/keystore2_main.rs
index 0fd515c..75475e1 100644
--- a/keystore2/src/keystore2_main.rs
+++ b/keystore2/src/keystore2_main.rs
@@ -14,7 +14,6 @@
//! This crate implements the Keystore 2.0 service entry point.
-use binder::Interface;
use keystore2::apc::ApcManager;
use keystore2::authorization::AuthorizationManager;
use keystore2::globals::ENFORCEMENTS;
diff --git a/keystore2/src/km_compat/lib.rs b/keystore2/src/km_compat/lib.rs
index 097e6d4..eca0a85 100644
--- a/keystore2/src/km_compat/lib.rs
+++ b/keystore2/src/km_compat/lib.rs
@@ -34,14 +34,14 @@
KeyParameterArray::KeyParameterArray, KeyParameterValue::KeyParameterValue,
KeyPurpose::KeyPurpose, PaddingMode::PaddingMode, SecurityLevel::SecurityLevel, Tag::Tag,
};
- use android_hardware_security_keymint::binder;
+ use android_hardware_security_keymint::binder::{self, Strong};
use android_security_compat::aidl::android::security::compat::IKeystoreCompatService::IKeystoreCompatService;
static COMPAT_NAME: &str = "android.security.compat";
- fn get_device() -> Option<Box<dyn IKeyMintDevice>> {
+ fn get_device() -> Option<Strong<dyn IKeyMintDevice>> {
add_keymint_device_service();
- let compat_service: Box<dyn IKeystoreCompatService> =
+ let compat_service: Strong<dyn IKeystoreCompatService> =
binder::get_interface(COMPAT_NAME).ok()?;
compat_service.getKeyMintDevice(SecurityLevel::TRUSTED_ENVIRONMENT).ok()
}
@@ -321,7 +321,7 @@
#[test]
fn test_secure_clock() {
add_keymint_device_service();
- let compat_service: Box<dyn IKeystoreCompatService> =
+ let compat_service: binder::Strong<dyn IKeystoreCompatService> =
binder::get_interface(COMPAT_NAME).unwrap();
let secure_clock = compat_service.getSecureClock().unwrap();
@@ -336,7 +336,7 @@
#[test]
fn test_shared_secret() {
add_keymint_device_service();
- let compat_service: Box<dyn IKeystoreCompatService> =
+ let compat_service: binder::Strong<dyn IKeystoreCompatService> =
binder::get_interface(COMPAT_NAME).unwrap();
let shared_secret =
compat_service.getSharedSecret(SecurityLevel::TRUSTED_ENVIRONMENT).unwrap();
diff --git a/keystore2/src/operation.rs b/keystore2/src/operation.rs
index 18ea19f..c98a76b 100644
--- a/keystore2/src/operation.rs
+++ b/keystore2/src/operation.rs
@@ -137,7 +137,7 @@
IKeystoreOperation::BnKeystoreOperation, IKeystoreOperation::IKeystoreOperation,
};
use anyhow::{anyhow, Context, Result};
-use binder::{IBinder, Interface};
+use binder::IBinder;
use std::{
collections::HashMap,
sync::{Arc, Mutex, MutexGuard, Weak},
@@ -184,7 +184,7 @@
/// Constructor
pub fn new(
index: usize,
- km_op: Box<dyn IKeyMintOperation>,
+ km_op: binder::Strong<dyn IKeyMintOperation>,
owner: u32,
auth_info: AuthInfo,
) -> Self {
@@ -247,13 +247,14 @@
}
*locked_outcome = Outcome::Pruned;
- let km_op: Box<dyn IKeyMintOperation> = match self.km_op.get_interface() {
- Ok(km_op) => km_op,
- Err(e) => {
- log::error!("In prune: Failed to get KeyMintOperation interface.\n {:?}", e);
- return Err(Error::sys());
- }
- };
+ let km_op: binder::public_api::Strong<dyn IKeyMintOperation> =
+ match self.km_op.get_interface() {
+ Ok(km_op) => km_op,
+ Err(e) => {
+ log::error!("In prune: Failed to get KeyMintOperation interface.\n {:?}", e);
+ return Err(Error::sys());
+ }
+ };
// We abort the operation. If there was an error we log it but ignore it.
if let Err(e) = map_km_error(km_op.abort()) {
@@ -334,7 +335,7 @@
let mut out_params: Option<KeyParameterArray> = None;
let mut output: Option<ByteArray> = None;
- let km_op: Box<dyn IKeyMintOperation> =
+ let km_op: binder::public_api::Strong<dyn IKeyMintOperation> =
self.km_op.get_interface().context("In update: Failed to get KeyMintOperation.")?;
let (hat, tst) = self
@@ -369,7 +370,7 @@
let mut out_params: Option<KeyParameterArray> = None;
- let km_op: Box<dyn IKeyMintOperation> =
+ let km_op: binder::public_api::Strong<dyn IKeyMintOperation> =
self.km_op.get_interface().context("In update: Failed to get KeyMintOperation.")?;
let (hat, tst) = self
@@ -426,7 +427,7 @@
let mut out_params: Option<KeyParameterArray> = None;
- let km_op: Box<dyn IKeyMintOperation> =
+ let km_op: binder::public_api::Strong<dyn IKeyMintOperation> =
self.km_op.get_interface().context("In finish: Failed to get KeyMintOperation.")?;
let (hat, tst, confirmation_token) = self
@@ -475,7 +476,7 @@
fn abort(&self, outcome: Outcome) -> Result<()> {
let mut locked_outcome = self.check_active().context("In abort")?;
*locked_outcome = outcome;
- let km_op: Box<dyn IKeyMintOperation> =
+ let km_op: binder::public_api::Strong<dyn IKeyMintOperation> =
self.km_op.get_interface().context("In abort: Failed to get KeyMintOperation.")?;
map_km_error(km_op.abort()).context("In abort: KeyMint::abort failed.")
@@ -514,7 +515,7 @@
/// owner uid and returns a new Operation wrapped in a `std::sync::Arc`.
pub fn create_operation(
&self,
- km_op: Box<dyn IKeyMintOperation>,
+ km_op: binder::public_api::Strong<dyn IKeyMintOperation>,
owner: u32,
auth_info: AuthInfo,
) -> Arc<Operation> {
@@ -770,7 +771,9 @@
/// BnKeystoreOperation proxy object. It also
/// calls `IBinder::set_requesting_sid` on the new interface, because
/// we need it for checking Keystore permissions.
- pub fn new_native_binder(operation: Arc<Operation>) -> impl IKeystoreOperation + Send {
+ pub fn new_native_binder(
+ operation: Arc<Operation>,
+ ) -> binder::public_api::Strong<dyn IKeystoreOperation> {
let result =
BnKeystoreOperation::new_binder(Self { operation: Mutex::new(Some(operation)) });
result.as_binder().set_requesting_sid(true);
diff --git a/keystore2/src/remote_provisioning.rs b/keystore2/src/remote_provisioning.rs
index eb21671..fe38504 100644
--- a/keystore2/src/remote_provisioning.rs
+++ b/keystore2/src/remote_provisioning.rs
@@ -25,6 +25,7 @@
AttestationPoolStatus::AttestationPoolStatus, IRemoteProvisioning::BnRemoteProvisioning,
IRemoteProvisioning::IRemoteProvisioning,
};
+use android_security_remoteprovisioning::binder::Strong;
use anyhow::Result;
use crate::error::map_or_log_err;
@@ -37,7 +38,7 @@
impl RemoteProvisioningService {
/// Creates a new instance of the remote provisioning service
- pub fn new_native_binder() -> Result<impl IRemoteProvisioning> {
+ pub fn new_native_binder() -> Result<Strong<dyn IRemoteProvisioning>> {
let result = BnRemoteProvisioning::new_binder(Self {});
Ok(result)
}
diff --git a/keystore2/src/security_level.rs b/keystore2/src/security_level.rs
index 6f542bc..417e3c5 100644
--- a/keystore2/src/security_level.rs
+++ b/keystore2/src/security_level.rs
@@ -53,7 +53,7 @@
utils::key_characteristics_to_internal,
};
use anyhow::{anyhow, Context, Result};
-use binder::{IBinder, Interface, ThreadState};
+use binder::{IBinder, Strong, ThreadState};
/// Implementation of the IKeystoreSecurityLevel Interface.
pub struct KeystoreSecurityLevel {
@@ -79,7 +79,7 @@
/// we need it for checking keystore permissions.
pub fn new_native_binder(
security_level: SecurityLevel,
- ) -> Result<(impl IKeystoreSecurityLevel + Send, Uuid)> {
+ ) -> Result<(Strong<dyn IKeystoreSecurityLevel>, Uuid)> {
let (dev, hw_info, km_uuid) = get_keymint_device(&security_level)
.context("In KeystoreSecurityLevel::new_native_binder.")?;
let result = BnKeystoreSecurityLevel::new_binder(Self {
@@ -256,7 +256,7 @@
let immediate_hat = immediate_hat.unwrap_or_default();
- let km_dev: Box<dyn IKeyMintDevice> = self
+ let km_dev: Strong<dyn IKeyMintDevice> = self
.keymint
.get_interface()
.context("In create_operation: Failed to get KeyMint device")?;
@@ -293,7 +293,7 @@
None => return Err(Error::sys()).context("In create_operation: Begin operation returned successfully, but did not return a valid operation."),
};
- let op_binder: Box<dyn IKeystoreOperation> =
+ let op_binder: binder::public_api::Strong<dyn IKeystoreOperation> =
KeystoreOperation::new_native_binder(operation)
.as_binder()
.into_interface()
@@ -386,7 +386,7 @@
let params = Self::add_certificate_parameters(caller_uid, params, &key)
.context("In generate_key: Trying to get aaid.")?;
- let km_dev: Box<dyn IKeyMintDevice> = self.keymint.get_interface()?;
+ let km_dev: Strong<dyn IKeyMintDevice> = self.keymint.get_interface()?;
map_km_error(km_dev.addRngEntropy(entropy))
.context("In generate_key: Trying to add entropy.")?;
let creation_result = map_km_error(km_dev.generateKey(¶ms))
@@ -442,7 +442,7 @@
})
.context("In import_key.")?;
- let km_dev: Box<dyn IKeyMintDevice> =
+ let km_dev: Strong<dyn IKeyMintDevice> =
self.keymint.get_interface().context("In import_key: Trying to get the KM device")?;
let creation_result = map_km_error(km_dev.importKey(¶ms, format, key_data))
.context("In import_key: Trying to call importKey")?;
@@ -544,7 +544,7 @@
let masking_key = masking_key.unwrap_or(ZERO_BLOB_32);
- let km_dev: Box<dyn IKeyMintDevice> = self.keymint.get_interface()?;
+ let km_dev: Strong<dyn IKeyMintDevice> = self.keymint.get_interface()?;
let (creation_result, _) = self
.upgrade_keyblob_if_required_with(
&*km_dev,
diff --git a/keystore2/src/service.rs b/keystore2/src/service.rs
index ab6d621..6aa7ed5 100644
--- a/keystore2/src/service.rs
+++ b/keystore2/src/service.rs
@@ -43,7 +43,7 @@
KeyDescriptor::KeyDescriptor, KeyEntryResponse::KeyEntryResponse, KeyMetadata::KeyMetadata,
};
use anyhow::{Context, Result};
-use binder::{IBinder, Interface, ThreadState};
+use binder::{IBinder, Strong, ThreadState};
use error::Error;
use keystore2_selinux as selinux;
@@ -56,7 +56,7 @@
impl KeystoreService {
/// Create a new instance of the Keystore 2.0 service.
- pub fn new_native_binder() -> Result<impl IKeystoreService> {
+ pub fn new_native_binder() -> Result<Strong<dyn IKeystoreService>> {
let mut result: Self = Default::default();
let (dev, uuid) =
KeystoreSecurityLevel::new_native_binder(SecurityLevel::TRUSTED_ENVIRONMENT)
@@ -89,7 +89,7 @@
.unwrap_or(SecurityLevel::SOFTWARE)
}
- fn get_i_sec_level_by_uuid(&self, uuid: &Uuid) -> Result<Box<dyn IKeystoreSecurityLevel>> {
+ fn get_i_sec_level_by_uuid(&self, uuid: &Uuid) -> Result<Strong<dyn IKeystoreSecurityLevel>> {
if let Some(dev) = self.i_sec_level_by_uuid.get(uuid) {
dev.get_interface().context("In get_i_sec_level_by_uuid.")
} else {
@@ -101,7 +101,7 @@
fn get_security_level(
&self,
sec_level: SecurityLevel,
- ) -> Result<Box<dyn IKeystoreSecurityLevel>> {
+ ) -> Result<Strong<dyn IKeystoreSecurityLevel>> {
if let Some(dev) = self
.uuid_by_sec_level
.get(&sec_level)
@@ -318,7 +318,7 @@
fn getSecurityLevel(
&self,
security_level: SecurityLevel,
- ) -> binder::public_api::Result<Box<dyn IKeystoreSecurityLevel>> {
+ ) -> binder::public_api::Result<Strong<dyn IKeystoreSecurityLevel>> {
map_or_log_err(self.get_security_level(security_level), Ok)
}
fn getKeyEntry(&self, key: &KeyDescriptor) -> binder::public_api::Result<KeyEntryResponse> {
diff --git a/keystore2/src/utils.rs b/keystore2/src/utils.rs
index bada2c9..8e161b7 100644
--- a/keystore2/src/utils.rs
+++ b/keystore2/src/utils.rs
@@ -103,7 +103,7 @@
}
/// Clones the owned SpIBinder and attempts to convert it into the requested interface.
- pub fn get_interface<T: FromIBinder + ?Sized>(&self) -> anyhow::Result<Box<T>> {
+ pub fn get_interface<T: FromIBinder + ?Sized>(&self) -> anyhow::Result<binder::Strong<T>> {
// We can use unwrap here because we never panic when locked, so the mutex
// can never be poisoned.
let lock = self.0.lock().unwrap();