Skip to content

Commit f86aabc

Browse files
committed
examples, projects: migrate to typed parameter API
Update all TA examples and dependent host applications to use the new typed parameter API: - Replace `&mut Parameters` with `ParametersAny<'_>` or `ParametersNone` - Use `ParameterAny::as_value_input()` / `as_memref_output()` helper methods instead of unsafe `as_value()` / `as_memref()` + raw buffer access - Consolidate imports via `use optee_utee::prelude::*`
1 parent 671302a commit f86aabc

41 files changed

Lines changed: 545 additions & 914 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

crates/optee-utee/src/crypto_op.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,7 +1283,7 @@ impl Asymmetric {
12831283
/// AlgorithmId::RsaesPkcs1V15,
12841284
/// OperationMode::Encrypt,
12851285
/// 256) {
1286-
/// Ok(operation) => {
1286+
/// Ok(mut operation) => {
12871287
/// operation.set_key(&key)?;
12881288
/// match operation.encrypt(&[], &clear) {
12891289
/// Ok(ciph_text) => {
@@ -1497,7 +1497,7 @@ impl Asymmetric {
14971497
}
14981498

14991499
/// Function usage is similar to [Cipher::set_key](Cipher::set_key).
1500-
pub fn set_key<T: GenericObject>(&self, object: &T) -> Result<()> {
1500+
pub fn set_key<T: GenericObject>(&mut self, object: &T) -> Result<()> {
15011501
self.0.set_key(object)
15021502
}
15031503

@@ -1556,7 +1556,7 @@ impl DeriveKey {
15561556
/// Ok(key_pair_2) => {
15571557
/// key_pair_2.generate_key(256, &[attr_prime.into(), attr_base.into()])?;
15581558
/// match DeriveKey::allocate(AlgorithmId::DhDeriveSharedSecret, 256) {
1559-
/// Ok(operation) => {
1559+
/// Ok(mut operation) => {
15601560
/// operation.set_key(&key_pair_2)?;
15611561
/// match TransientObject::allocate(TransientObjectType::GenericSecret, 256) {
15621562
/// // Derived key is saved as an transient object
@@ -1622,7 +1622,7 @@ impl DeriveKey {
16221622
}
16231623

16241624
/// Function usage is similar to [Cipher::set_key](Cipher::set_key).
1625-
pub fn set_key<T: GenericObject>(&self, object: &T) -> Result<()> {
1625+
pub fn set_key<T: GenericObject>(&mut self, object: &T) -> Result<()> {
16261626
self.0.set_key(object)
16271627
}
16281628

crates/optee-utee/src/error.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ use std::error;
2828
/// # Examples
2929
///
3030
/// ``` rust,no_run
31-
/// # use optee_utee::Parameters;
31+
/// # use optee_utee::prelude::*;
3232
/// use optee_utee::Result;
33-
/// fn open_session(params: &mut Parameters) -> Result<()> {
33+
/// fn open_session(params: &mut ParametersAny) -> Result<()> {
3434
/// Ok(())
3535
/// }
3636
/// ````

crates/optee-utee/src/object/object_handle.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ impl ObjectHandle {
3838
/// ``` rust,no_run
3939
/// # use optee_utee::ObjectHandle;
4040
/// # use optee_utee_sys as raw;
41-
/// # let external_handle: raw::TEE_ObjectHandle = core::ptr::null_mut();
4241
/// # fn main() -> optee_utee::Result<()> {
4342
/// # let external_handle = core::ptr::null_mut();
4443
/// // `external_handle` is a handle that is constructed and controlled

examples/acipher-rs/ta/src/main.rs

Lines changed: 28 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,9 @@
2020

2121
extern crate alloc;
2222

23-
use alloc::boxed::Box;
24-
use optee_utee::{
25-
ta_close_session, ta_create, ta_destroy, ta_invoke_command, ta_open_session, trace_println,
26-
};
23+
use optee_utee::prelude::*;
2724
use optee_utee::{AlgorithmId, Asymmetric, OperationMode};
28-
use optee_utee::{ErrorKind, Parameters, Result};
25+
use optee_utee::{ErrorKind, Result};
2926
use optee_utee::{GenericObject, TransientObject, TransientObjectType};
3027
use proto::Command;
3128

@@ -48,7 +45,7 @@ fn create() -> Result<()> {
4845
}
4946

5047
#[ta_open_session]
51-
fn open_session(_params: &mut Parameters, _sess_ctx: &mut RsaCipher) -> Result<()> {
48+
fn open_session(_params: &mut ParametersNone, _sess_ctx: &mut RsaCipher) -> Result<()> {
5249
trace_println!("[+] TA open session");
5350
Ok(())
5451
}
@@ -63,79 +60,53 @@ fn destroy() {
6360
trace_println!("[+] TA destroy");
6461
}
6562

66-
fn gen_key(rsa: &mut RsaCipher, params: &mut Parameters) -> Result<()> {
67-
let key_size = unsafe { params.0.as_value()?.a() };
63+
fn gen_key(rsa: &mut RsaCipher, (p0, _, _, _): &mut ParametersAny<'_>) -> Result<()> {
64+
let key_size = p0.as_value_input()?.get_a();
6865
rsa.key = TransientObject::allocate(TransientObjectType::RsaKeypair, key_size as usize)?;
6966
rsa.key.generate_key(key_size as usize, &[])?;
7067
Ok(())
7168
}
7269

73-
fn get_size(rsa: &mut RsaCipher, params: &mut Parameters) -> Result<()> {
70+
fn get_size(rsa: &mut RsaCipher, (p0, _, _, _): &mut ParametersAny<'_>) -> Result<()> {
7471
let key_info = rsa.key.info()?;
75-
unsafe {
76-
params
77-
.0
78-
.as_value()?
79-
.set_a((key_info.object_size() / 8) as u32)
80-
};
72+
p0.as_value_output()?
73+
.set_a((key_info.object_size() / 8) as u32);
8174
Ok(())
8275
}
8376

84-
fn encrypt(rsa: &mut RsaCipher, params: &mut Parameters) -> Result<()> {
77+
fn encrypt(rsa: &mut RsaCipher, (p0, p1, _, _): &mut ParametersAny<'_>) -> Result<()> {
8578
let key_info = rsa.key.info()?;
86-
let mut p0 = unsafe { params.0.as_memref()? };
87-
let plain_text = p0.buffer();
88-
let mut p1 = unsafe { params.1.as_memref()? };
89-
match Asymmetric::allocate(
79+
let (p0, p1) = (p0.as_memref_input()?, p1.as_memref_output()?);
80+
let mut cipher = Asymmetric::allocate(
9081
AlgorithmId::RsaesPkcs1V15,
9182
OperationMode::Encrypt,
9283
key_info.object_size(),
93-
) {
94-
Err(e) => Err(e),
95-
Ok(cipher) => {
96-
cipher.set_key(&rsa.key)?;
97-
match cipher.encrypt(&[], plain_text) {
98-
Err(e) => Err(e),
99-
Ok(cipher_text) => {
100-
if cipher_text.len() > p1.buffer().len() {
101-
p1.set_updated_size(cipher_text.len());
102-
Err(ErrorKind::ShortBuffer.into())
103-
} else {
104-
p1.buffer().clone_from_slice(&cipher_text);
105-
Ok(())
106-
}
107-
}
108-
}
109-
}
110-
}
84+
)?;
85+
cipher.set_key(&rsa.key)?;
86+
let cipher_text = cipher.encrypt(&[], p0.as_slice())?;
87+
p1.set_output(cipher_text)?;
88+
Ok(())
11189
}
11290

113-
fn decrypt(rsa: &mut RsaCipher, params: &mut Parameters) -> Result<()> {
91+
fn decrypt(rsa: &mut RsaCipher, (p0, p1, _, _): &mut ParametersAny<'_>) -> Result<()> {
11492
let key_info = rsa.key.info()?;
115-
let mut p0 = unsafe { params.0.as_memref()? };
116-
let cipher_text = p0.buffer();
117-
let mut p1 = unsafe { params.1.as_memref()? };
118-
match Asymmetric::allocate(
93+
let (p0, p1) = (p0.as_memref_input()?, p1.as_memref_output()?);
94+
let mut cipher = Asymmetric::allocate(
11995
AlgorithmId::RsaesPkcs1V15,
12096
OperationMode::Decrypt,
12197
key_info.object_size(),
122-
) {
123-
Err(e) => Err(e),
124-
Ok(cipher) => {
125-
cipher.set_key(&rsa.key)?;
126-
match cipher.decrypt(&[], cipher_text) {
127-
Err(e) => Err(e),
128-
Ok(plain_text) => {
129-
p1.buffer().clone_from_slice(&plain_text);
130-
Ok(())
131-
}
132-
}
133-
}
134-
}
98+
)?;
99+
cipher.set_key(&rsa.key)?;
100+
let plain_text = cipher.decrypt(&[], p0.as_slice())?;
101+
p1.set_output(plain_text)
135102
}
136103

137104
#[ta_invoke_command]
138-
fn invoke_command(sess_ctx: &mut RsaCipher, cmd_id: u32, params: &mut Parameters) -> Result<()> {
105+
fn invoke_command(
106+
sess_ctx: &mut RsaCipher,
107+
cmd_id: u32,
108+
params: &mut ParametersAny<'_>,
109+
) -> Result<()> {
139110
trace_println!("[+] TA invoke command");
140111
match Command::from(cmd_id) {
141112
Command::GenKey => gen_key(sess_ctx, params),

examples/aes-rs/ta/src/main.rs

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,12 @@
2020

2121
extern crate alloc;
2222

23-
use alloc::boxed::Box;
2423
use alloc::vec;
2524
use optee_utee::is_algorithm_supported;
26-
use optee_utee::{
27-
ta_close_session, ta_create, ta_destroy, ta_invoke_command, ta_open_session, trace_println,
28-
};
25+
use optee_utee::prelude::*;
2926
use optee_utee::{AlgorithmId, Cipher, ElementId, OperationMode};
3027
use optee_utee::{AttributeId, AttributeMemref, TransientObject, TransientObjectType};
31-
use optee_utee::{ErrorKind, Parameters, Result};
28+
use optee_utee::{ErrorKind, Result};
3229
use proto::{Algo, Command, KeySize, Mode};
3330

3431
pub struct AesCipher {
@@ -54,7 +51,7 @@ fn create() -> Result<()> {
5451
}
5552

5653
#[ta_open_session]
57-
fn open_session(_params: &mut Parameters, _sess_ctx: &mut AesCipher) -> Result<()> {
54+
fn open_session(_params: &mut ParametersNone, _sess_ctx: &mut AesCipher) -> Result<()> {
5855
trace_println!("[+] TA open session");
5956
Ok(())
6057
}
@@ -70,7 +67,11 @@ fn destroy() {
7067
}
7168

7269
#[ta_invoke_command]
73-
fn invoke_command(sess_ctx: &mut AesCipher, cmd_id: u32, params: &mut Parameters) -> Result<()> {
70+
fn invoke_command(
71+
sess_ctx: &mut AesCipher,
72+
cmd_id: u32,
73+
params: &mut ParametersAny<'_>,
74+
) -> Result<()> {
7475
trace_println!("[+] TA invoke command");
7576
match Command::from(cmd_id) {
7677
Command::Prepare => alloc_resources(sess_ctx, params),
@@ -105,10 +106,12 @@ pub fn ta2tee_mode_id(mode: u32) -> Result<OperationMode> {
105106
}
106107
}
107108

108-
pub fn alloc_resources(aes: &mut AesCipher, params: &mut Parameters) -> Result<()> {
109-
let algo_value = unsafe { params.0.as_value()?.a() };
110-
let key_size_value = unsafe { params.1.as_value()?.a() };
111-
let mode_id_value = unsafe { params.2.as_value()?.a() };
109+
pub fn alloc_resources(aes: &mut AesCipher, (p0, p1, p2, _): &mut ParametersAny<'_>) -> Result<()> {
110+
let (algo_value, key_size_value, mode_id_value) = (
111+
p0.as_value_input()?.get_a(),
112+
p1.as_value_input()?.get_a(),
113+
p2.as_value_input()?.get_a(),
114+
);
112115

113116
aes.key_size = ta2tee_key_size(key_size_value)?;
114117

@@ -131,9 +134,8 @@ pub fn alloc_resources(aes: &mut AesCipher, params: &mut Parameters) -> Result<(
131134
Ok(())
132135
}
133136

134-
pub fn set_aes_key(aes: &mut AesCipher, params: &mut Parameters) -> Result<()> {
135-
let mut param0 = unsafe { params.0.as_memref()? };
136-
let key = param0.buffer();
137+
pub fn set_aes_key(aes: &mut AesCipher, (p0, _, _, _): &mut ParametersAny<'_>) -> Result<()> {
138+
let key = p0.as_memref_input()?.as_slice();
137139

138140
if key.len() != aes.key_size {
139141
trace_println!("[+] Get wrong key size !\n");
@@ -149,31 +151,28 @@ pub fn set_aes_key(aes: &mut AesCipher, params: &mut Parameters) -> Result<()> {
149151
Ok(())
150152
}
151153

152-
pub fn reset_aes_iv(aes: &mut AesCipher, params: &mut Parameters) -> Result<()> {
153-
let mut param0 = unsafe { params.0.as_memref()? };
154-
let iv = param0.buffer();
154+
pub fn reset_aes_iv(aes: &mut AesCipher, (p0, _, _, _): &mut ParametersAny<'_>) -> Result<()> {
155+
let iv = p0.as_memref_input()?.as_slice();
155156

156157
aes.cipher.init(iv);
157158

158159
trace_println!("[+] TA initial vectore reset done!");
159160
Ok(())
160161
}
161162

162-
pub fn cipher_buffer(aes: &mut AesCipher, params: &mut Parameters) -> Result<()> {
163-
let mut param0 = unsafe { params.0.as_memref()? };
164-
let mut param1 = unsafe { params.1.as_memref()? };
163+
pub fn cipher_buffer(aes: &mut AesCipher, (p0, p1, _, _): &mut ParametersAny<'_>) -> Result<()> {
164+
let (input, output) = (p0.as_memref_input()?, p1.as_memref_output()?);
165165

166-
let input = param0.buffer();
167-
let output = param1.buffer();
168-
169-
if output.len() < input.len() {
166+
if output.get_capacity() < input.as_slice().len() {
170167
return Err(ErrorKind::BadParameters.into());
171168
}
172169

173170
trace_println!("[+] TA tries to update ciphers!");
174171

175-
let tmp_size = aes.cipher.update(input, output)?;
176-
param1.set_updated_size(tmp_size);
172+
let tmp_size = aes
173+
.cipher
174+
.update(input.as_slice(), unsafe { output.as_mut_slice() })?;
175+
output.set_updated_size(tmp_size)?;
177176
Ok(())
178177
}
179178

0 commit comments

Comments
 (0)