Process large messages from TA
This CL adds the capability to the HAL to process reponses from the TA that are larger than the capacity of the channel from HAL to TA. Bug: 253501976 Test: with Trusty KM which has a smaller limit than some responses Change-Id: I2fe056143f18718eb10bdd2d0559f3d171b14c96
This commit is contained in:
parent
1a72f42e52
commit
3606cec3c0
1 changed files with 25 additions and 16 deletions
|
@ -14,7 +14,9 @@
|
|||
// limitations under the License.
|
||||
|
||||
//! This module implements the HAL service for Keymint (Rust) in Trusty.
|
||||
use kmr_hal::{keymint, rpc, secureclock, send_hal_info, sharedsecret, SerializedChannel};
|
||||
use kmr_hal::{
|
||||
extract_rsp, keymint, rpc, secureclock, send_hal_info, sharedsecret, SerializedChannel,
|
||||
};
|
||||
use log::{error, info};
|
||||
use std::{
|
||||
ffi::CString,
|
||||
|
@ -41,6 +43,7 @@ struct HalServiceError(String);
|
|||
struct TipcChannel(trusty::TipcChannel);
|
||||
|
||||
impl SerializedChannel for TipcChannel {
|
||||
const MAX_SIZE: usize = 4000;
|
||||
fn execute(&mut self, serialized_req: &[u8]) -> binder::Result<Vec<u8>> {
|
||||
self.0.send(serialized_req).map_err(|e| {
|
||||
binder::Status::new_exception(
|
||||
|
@ -54,21 +57,27 @@ impl SerializedChannel for TipcChannel {
|
|||
),
|
||||
)
|
||||
})?;
|
||||
let mut recv_buf = Vec::new();
|
||||
// TODO(b/253501976): cope with fragmentation of responses
|
||||
self.0.recv(&mut recv_buf).map_err(|e| {
|
||||
binder::Status::new_exception(
|
||||
binder::ExceptionCode::TRANSACTION_FAILED,
|
||||
Some(
|
||||
&CString::new(format!(
|
||||
"Failed to receive the response via tipc channel because of {:?}",
|
||||
e
|
||||
))
|
||||
.unwrap(),
|
||||
),
|
||||
)
|
||||
})?;
|
||||
Ok(recv_buf)
|
||||
let mut expect_more_msgs = true;
|
||||
let mut full_rsp = Vec::new();
|
||||
while expect_more_msgs {
|
||||
let mut recv_buf = Vec::new();
|
||||
self.0.recv(&mut recv_buf).map_err(|e| {
|
||||
binder::Status::new_exception(
|
||||
binder::ExceptionCode::TRANSACTION_FAILED,
|
||||
Some(
|
||||
&CString::new(format!(
|
||||
"Failed to receive the response via tipc channel because of {:?}",
|
||||
e
|
||||
))
|
||||
.unwrap(),
|
||||
),
|
||||
)
|
||||
})?;
|
||||
let current_rsp_content;
|
||||
(expect_more_msgs, current_rsp_content) = extract_rsp(&recv_buf)?;
|
||||
full_rsp.extend_from_slice(current_rsp_content);
|
||||
}
|
||||
Ok(full_rsp)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue