Adding plumbing for supported EC curve on impl am: d2ce46b5f1

Original change: https://android-review.googlesource.com/c/platform/system/security/+/1757014

Change-Id: I8dcbc9478716fd66ab02640dd2712b5564c50b1e
This commit is contained in:
Max Bires 2021-07-16 14:26:25 +00:00 committed by Automerger Merge Worker
commit 8f9fb3b334
3 changed files with 65 additions and 9 deletions

View file

@ -20,6 +20,7 @@ import android.hardware.security.keymint.DeviceInfo;
import android.hardware.security.keymint.ProtectedData;
import android.hardware.security.keymint.SecurityLevel;
import android.security.remoteprovisioning.AttestationPoolStatus;
import android.security.remoteprovisioning.ImplInfo;
/**
* `IRemoteProvisioning` is the interface provided to use the remote provisioning functionality
@ -127,13 +128,14 @@ interface IRemoteProvisioning {
void generateKeyPair(in boolean is_test_mode, in SecurityLevel secLevel);
/**
* This method returns the SecurityLevels of whichever instances of
* This method returns implementation information for whichever instances of
* IRemotelyProvisionedComponent are running on the device. The RemoteProvisioner app needs to
* know which KM instances it should be generating and managing attestation keys for.
* know which KM instances it should be generating and managing attestation keys for, and which
* EC curves are supported in those instances.
*
* @return The array of security levels.
* @return The array of ImplInfo parcelables.
*/
SecurityLevel[] getSecurityLevels();
ImplInfo[] getImplementationInfo();
/**
* This method deletes all remotely provisioned attestation keys in the database, regardless

View file

@ -0,0 +1,37 @@
/*
* Copyright 2021, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.security.remoteprovisioning;
import android.hardware.security.keymint.SecurityLevel;
/**
* This parcelable provides information about the underlying IRemotelyProvisionedComponent
* implementation.
* @hide
*/
parcelable ImplInfo {
/**
* The security level of the underlying implementation: TEE or StrongBox.
*/
SecurityLevel secLevel;
/**
* An integer denoting which EC curve is supported in the underlying implementation. The current
* options are either P256 or 25519, with values defined in
* hardware/interfaces/security/keymint/aidl/.../RpcHardwareInfo.aidl
*/
int supportedCurve;
}

View file

@ -30,7 +30,7 @@ use android_hardware_security_keymint::aidl::android::hardware::security::keymin
};
use android_security_remoteprovisioning::aidl::android::security::remoteprovisioning::{
AttestationPoolStatus::AttestationPoolStatus, IRemoteProvisioning::BnRemoteProvisioning,
IRemoteProvisioning::IRemoteProvisioning,
IRemoteProvisioning::IRemoteProvisioning, ImplInfo::ImplInfo,
};
use android_security_remoteprovisioning::binder::{BinderFeatures, Strong};
use android_system_keystore2::aidl::android::system::keystore2::{
@ -205,6 +205,7 @@ impl RemProvState {
#[derive(Default)]
pub struct RemoteProvisioningService {
device_by_sec_level: HashMap<SecurityLevel, Strong<dyn IRemotelyProvisionedComponent>>,
curve_by_sec_level: HashMap<SecurityLevel, i32>,
}
impl RemoteProvisioningService {
@ -227,8 +228,20 @@ impl RemoteProvisioningService {
let mut result: Self = Default::default();
let dev = get_remotely_provisioned_component(&SecurityLevel::TRUSTED_ENVIRONMENT)
.context("In new_native_binder: Failed to get TEE Remote Provisioner instance.")?;
result.curve_by_sec_level.insert(
SecurityLevel::TRUSTED_ENVIRONMENT,
dev.getHardwareInfo()
.context("In new_native_binder: Failed to get hardware info for the TEE.")?
.supportedEekCurve,
);
result.device_by_sec_level.insert(SecurityLevel::TRUSTED_ENVIRONMENT, dev);
if let Ok(dev) = get_remotely_provisioned_component(&SecurityLevel::STRONGBOX) {
result.curve_by_sec_level.insert(
SecurityLevel::STRONGBOX,
dev.getHardwareInfo()
.context("In new_native_binder: Failed to get hardware info for StrongBox.")?
.supportedEekCurve,
);
result.device_by_sec_level.insert(SecurityLevel::STRONGBOX, dev);
}
Ok(BnRemoteProvisioning::new_binder(result, BinderFeatures::default()))
@ -355,8 +368,12 @@ impl RemoteProvisioningService {
/// Checks the security level of each available IRemotelyProvisionedComponent hal and returns
/// all levels in an array to the caller.
pub fn get_security_levels(&self) -> Result<Vec<SecurityLevel>> {
Ok(self.device_by_sec_level.keys().cloned().collect())
pub fn get_implementation_info(&self) -> Result<Vec<ImplInfo>> {
Ok(self
.curve_by_sec_level
.iter()
.map(|(sec_level, curve)| ImplInfo { secLevel: *sec_level, supportedCurve: *curve })
.collect())
}
/// Deletes all attestation keys generated by the IRemotelyProvisionedComponent from the device,
@ -448,9 +465,9 @@ impl IRemoteProvisioning for RemoteProvisioningService {
map_or_log_err(self.generate_key_pair(is_test_mode, sec_level), Ok)
}
fn getSecurityLevels(&self) -> binder::public_api::Result<Vec<SecurityLevel>> {
fn getImplementationInfo(&self) -> binder::public_api::Result<Vec<ImplInfo>> {
let _wp = wd::watch_millis("IRemoteProvisioning::getSecurityLevels", 500);
map_or_log_err(self.get_security_levels(), Ok)
map_or_log_err(self.get_implementation_info(), Ok)
}
fn deleteAllKeys(&self) -> binder::public_api::Result<i64> {