sim: add randomly generated image encryption keys

Removes the hard-coded image encryption keys, and updates with keys
generated randomly before use. This tests the correct behavior of
how ephemeral keys should be used when generating new images.

Signed-off-by: Fabio Utzig <utzig@apache.org>
diff --git a/sim/src/tlv.rs b/sim/src/tlv.rs
index a3c1d27..073620d 100644
--- a/sim/src/tlv.rs
+++ b/sim/src/tlv.rs
@@ -14,7 +14,9 @@
 use crate::image::ImageVersion;
 use pem;
 use base64;
+use log::info;
 use ring::{digest, rand, agreement, hkdf, hmac};
+use ring::rand::SecureRandom;
 use ring::signature::{
     RsaKeyPair,
     RSA_PSS_SHA256,
@@ -81,8 +83,8 @@
     /// Construct the manifest for this payload.
     fn make_tlv(self: Box<Self>) -> Vec<u8>;
 
-    /// TODO: Generate a new encryption random key
-    fn generate_enc_key(&mut self) -> bool;
+    /// Generate a new encryption random key
+    fn generate_enc_key(&mut self);
 
     /// Return the current encryption key
     fn get_enc_key(&self) -> Vec<u8>;
@@ -107,7 +109,7 @@
     version: ImageVersion,
 }
 
-pub const AES_SEC_KEY: &[u8; 16] = b"0123456789ABCDEF";
+const AES_KEY_LEN: usize = 16;
 
 impl TlvGen {
     /// Construct a new tlv generator that will only contain a hash of the data.
@@ -429,7 +431,9 @@
                                        .as_ref()).unwrap();
             assert_eq!(key_bytes.tag, "PUBLIC KEY");
 
-            let encbuf = match c::rsa_oaep_encrypt(&key_bytes.contents, AES_SEC_KEY) {
+            let cipherkey = self.get_enc_key();
+            let cipherkey = cipherkey.as_slice();
+            let encbuf = match c::rsa_oaep_encrypt(&key_bytes.contents, cipherkey) {
                 Ok(v) => v,
                 Err(_) => panic!("Failed to encrypt secret key"),
             };
@@ -446,7 +450,9 @@
             let key_bytes = base64::decode(
                 include_str!("../../enc-aes128kw.b64").trim()).unwrap();
 
-            let encbuf = match c::kw_encrypt(&key_bytes, AES_SEC_KEY) {
+            let cipherkey = self.get_enc_key();
+            let cipherkey = cipherkey.as_slice();
+            let encbuf = match c::kw_encrypt(&key_bytes, cipherkey) {
                 Ok(v) => v,
                 Err(_) => panic!("Failed to encrypt secret key"),
             };
@@ -529,13 +535,22 @@
         result
     }
 
-    fn generate_enc_key(&mut self) -> bool {
-        self.enc_key = AES_SEC_KEY.to_vec();
-        true
+    fn generate_enc_key(&mut self) {
+        let rng = rand::SystemRandom::new();
+        let mut buf = vec![0u8; AES_KEY_LEN];
+        match rng.fill(&mut buf) {
+            Err(_) => panic!("Error generating encrypted key"),
+            Ok(_) => (),
+        }
+        info!("New encryption key: {:02x?}", buf);
+        self.enc_key = buf;
     }
 
     fn get_enc_key(&self) -> Vec<u8> {
-        return self.enc_key.clone();
+        if self.enc_key.len() != AES_KEY_LEN {
+            panic!("No random key was generated");
+        }
+        self.enc_key.clone()
     }
 }