Merge cherrypicks of ['googleplex-android-review.googlesource.com/39203774'] into 26Q2-release.

Change-Id: If9079c631eb4e4e763cff1efbe08d3fc3bdb8375
diff --git a/trusty/secretkeeper/src/hal_main.rs b/trusty/secretkeeper/src/hal_main.rs
index d06e800..319b3ff 100644
--- a/trusty/secretkeeper/src/hal_main.rs
+++ b/trusty/secretkeeper/src/hal_main.rs
@@ -86,7 +86,9 @@
             channel.send(&req_frag).map_err(|e| binderr("send request", e))?;
 
             // Every request gets a response.
-            let mut rsp_frag = Vec::new();
+            // Allocate a buffer with the maximum logical message size, to avoid
+            // reallocation during recv() calls.
+            let mut rsp_frag = Vec::with_capacity(TIPC_MAX_SIZE);
             channel.recv(&mut rsp_frag).map_err(|e| binderr("receive response", e))?;
 
             if let Some(full_rsp) = pending_rsp.accumulate(&rsp_frag) {
@@ -95,7 +97,7 @@
         }
         // There may be additional response fragments to receive.
         loop {
-            let mut rsp_frag = Vec::new();
+            let mut rsp_frag = Vec::with_capacity(TIPC_MAX_SIZE);
             channel.recv(&mut rsp_frag).map_err(|e| binderr("receive response", e))?;
             if let Some(full_rsp) = pending_rsp.accumulate(&rsp_frag) {
                 return Ok(full_rsp.to_vec());