Get CompOS talking to diced

Create a module in compsvc to handle using DICE for signing. Initially
we just expose a method for returning our key's attestation
chain.

Add a method to composd, accessed via compos_cmd, to exercise this
functionality for testing purposes.

Bug: 214233409
Test: composd_cmd dice
Change-Id: I65ef19d0126862b800b6539ae1798b1a433085b8
diff --git a/compos/composd_cmd/composd_cmd.rs b/compos/composd_cmd/composd_cmd.rs
index 546c4af..9b41104 100644
--- a/compos/composd_cmd/composd_cmd.rs
+++ b/compos/composd_cmd/composd_cmd.rs
@@ -29,6 +29,8 @@
 };
 use anyhow::{bail, Context, Result};
 use compos_common::timeouts::timeouts;
+use std::fs::File;
+use std::io::Write;
 use std::sync::{Arc, Condvar, Mutex};
 use std::time::Duration;
 
@@ -38,7 +40,7 @@
             .index(1)
             .takes_value(true)
             .required(true)
-            .possible_values(&["staged-apex-compile", "test-compile"]),
+            .possible_values(&["staged-apex-compile", "test-compile", "dice"]),
     );
     let args = app.get_matches();
     let command = args.value_of("command").unwrap();
@@ -48,6 +50,7 @@
     match command {
         "staged-apex-compile" => run_staged_apex_compile()?,
         "test-compile" => run_test_compile()?,
+        "dice" => write_dice()?,
         _ => panic!("Unexpected command {}", command),
     }
 
@@ -112,6 +115,16 @@
     run_async_compilation(|service, callback| service.startTestCompile(callback))
 }
 
+fn write_dice() -> Result<()> {
+    let service = wait_for_interface::<dyn IIsolatedCompilationService>("android.system.composd")
+        .context("Failed to connect to composd service")?;
+
+    let bcc = service.getBcc()?;
+    let mut file =
+        File::create("/data/misc/apexdata/com.android.compos/bcc").context("Creating bcc file")?;
+    file.write_all(&bcc).context("Writing bcc")
+}
+
 fn run_async_compilation<F>(start_compile_fn: F) -> Result<()>
 where
     F: FnOnce(