Changing traits to support opaque keys for kek and kak

Modifying traits to support non-explicit keys for key encryption and
key agreement keys.

Bug: 253948020
Test: build.py, run rust unittests
Change-Id: I1a266cdcdada1a5e187465c402dac6b92decde75
diff --git a/keys.rs b/keys.rs
index 54dd14c..6e16e06 100644
--- a/keys.rs
+++ b/keys.rs
@@ -226,7 +226,7 @@
 //       if the IP block never releases the key. KeyMaterial type fixes that issue by including
 //       Opaque keys, but RawKeys are not included in KeyMaterial.
 impl kmr_ta::device::RetrieveKeyMaterial for TrustyKeys {
-    fn root_kek(&self, context: &[u8]) -> Result<crypto::RawKeyMaterial, Error> {
+    fn root_kek(&self, context: &[u8]) -> Result<crypto::OpaqueOr<crypto::hmac::Key>, Error> {
         let context = TrustyKekContext::from_raw(context)?;
         let hwkey_session = Hwkey::open().map_err(|e| {
             km_err!(SecureHwCommunicationFailed, "failed to connect to hwkey: {:?}", e)
@@ -257,7 +257,7 @@
                     })?;
             }
         }
-        Ok(crypto::RawKeyMaterial(key_buffer.to_vec()))
+        Ok(crypto::hmac::Key::new(key_buffer.to_vec()).into())
     }
 
     fn kek_context(&self) -> Result<Vec<u8>, Error> {
@@ -265,7 +265,7 @@
             .to_raw()
     }
 
-    fn kak(&self) -> Result<crypto::aes::Key, Error> {
+    fn kak(&self) -> Result<crypto::OpaqueOr<crypto::aes::Key>, Error> {
         let hwkey_session = Hwkey::open().map_err(|e| {
             km_err!(SecureHwCommunicationFailed, "failed to connect to HwKey: {:?}", e)
         })?;
@@ -276,7 +276,7 @@
             .get_keyslot_data(keyslot, &mut key_buffer)
             .map_err(|e| km_err!(SecureHwCommunicationFailed, "failed to retrieve kak: {:?}", e))?;
         // TODO: check whether `key_buffer` needs truncating to size of `_kak`.
-        Ok(crypto::aes::Key::Aes256(key_buffer))
+        Ok(crypto::aes::Key::Aes256(key_buffer).into())
     }
 
     fn timestamp_token_mac_input(&self, token: &TimeStampToken) -> Result<Vec<u8>, Error> {
@@ -305,6 +305,7 @@
     fn kak_call_returns_key() {
         let trusty_keys = TrustyKeys;
         let kak = trusty_keys.kak().expect("Couldn't retrieve kak");
+        let kak = kmr_common::explicit!(kak).expect("kak should be an explicit key");
 
         expect!(matches!(kak, crypto::aes::Key::Aes256(_)), "Should have received an AES 256 key");
 
@@ -321,11 +322,13 @@
     fn kak_two_calls_returns_same_key() {
         let trusty_keys = TrustyKeys;
 
-        let kak1 = match trusty_keys.kak().expect("Couldn't retrieve kak") {
+        let kak = trusty_keys.kak().expect("Couldn't retrieve kak");
+        let kak1 = match kmr_common::explicit!(kak).expect("kak should be an explicit key") {
             crypto::aes::Key::Aes256(key) => key,
             _ => panic!("Wrong type of key received"),
         };
-        let kak2 = match trusty_keys.kak().expect("Couldn't retrieve kak") {
+        let kak = trusty_keys.kak().expect("Couldn't retrieve kak");
+        let kak2 = match kmr_common::explicit!(kak).expect("kak should be an explicit key") {
             crypto::aes::Key::Aes256(key) => key,
             _ => panic!("Wrong type of key received"),
         };
@@ -338,6 +341,7 @@
         let kek = trusty_keys
             .root_kek(&trusty_keys.kek_context().expect("Couldn't get kek context"))
             .expect("Couldn't get kek");
+        let kek = kmr_common::explicit!(kek).expect("kek should be an explicit key");
 
         // Getting an all 0 key encryption key by chance is not likely if we got a connection to
         // HWKey
@@ -351,12 +355,14 @@
     #[test]
     fn kek_two_calls_returns_same_key() {
         let trusty_keys = TrustyKeys;
-        let kek1 = trusty_keys
+        let kek1 = kmr_common::explicit!(trusty_keys
             .root_kek(&trusty_keys.kek_context().expect("Couldn't get kek context"))
-            .expect("Couldn't get kek");
-        let kek2 = trusty_keys
+            .expect("Couldn't get kek"))
+        .expect("kek should be an explicit key");
+        let kek2 = kmr_common::explicit!(trusty_keys
             .root_kek(&trusty_keys.kek_context().expect("Couldn't get kek context"))
-            .expect("Couldn't get kek");
+            .expect("Couldn't get kek"))
+        .expect("kek should be an explicit key");
 
         expect_eq!(kek1.0, kek2.0, "Calls to root_kek should return the same key");
     }
@@ -384,12 +390,14 @@
         )
         .unwrap();
         let trusty_keys = TrustyKeys;
-        let kek1 = trusty_keys
+        let kek1 = kmr_common::explicit!(trusty_keys
             .root_kek(&context1.to_raw().expect("Couldn't serialize kek1 context"))
-            .expect("Couldn't get kek");
-        let kek2 = trusty_keys
+            .expect("Couldn't get kek"))
+        .expect("kek should be an explicit key");
+        let kek2 = kmr_common::explicit!(trusty_keys
             .root_kek(&context2.to_raw().expect("Couldn't serialize kek2 context"))
-            .expect("Couldn't get kek");
+            .expect("Couldn't get kek"))
+        .expect("kek should be an explicit key");
 
         expect_ne!(kek1.0, kek2.0, "kek keys should be different");
     }
@@ -401,12 +409,14 @@
                 .unwrap();
         let context2 = TrustyKekContext::new(false, None, None).unwrap();
         let trusty_keys = TrustyKeys;
-        let kek1 = trusty_keys
+        let kek1 = kmr_common::explicit!(trusty_keys
             .root_kek(&context1.to_raw().expect("Couldn't serialize kek1 context"))
-            .expect("Couldn't get kek");
-        let kek2 = trusty_keys
+            .expect("Couldn't get kek"))
+        .expect("kek should be an explicit key");
+        let kek2 = kmr_common::explicit!(trusty_keys
             .root_kek(&context2.to_raw().expect("Couldn't serialize kek2 context"))
-            .expect("Couldn't get kek");
+            .expect("Couldn't get kek"))
+        .expect("kek should be an explicit key");
 
         expect_ne!(kek1.0, kek2.0, "kek keys should be different");
     }