From 3321c4720dcebfd1dc3e4beaa3fbc5f9f80c1e02 Mon Sep 17 00:00:00 2001 From: Hatter Jiang Date: Sat, 7 Nov 2020 19:37:36 +0800 Subject: [PATCH] feat: add examples --- __enclave/virt_enclave/.gitignore | 1 + .../examples/create_signing_key.rs | 9 +++++ __enclave/virt_enclave/examples/sign_file.rs | 34 +++++++++++++++++++ __enclave/virt_enclave/src/lib.rs | 3 ++ __enclave/virt_enclave/src/main.rs | 4 +-- __enclave/virt_enclave/src/qjs.rs | 8 +++++ __enclave/virt_enclave/src/rpc.rs | 17 ++++++++++ 7 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 __enclave/virt_enclave/.gitignore create mode 100644 __enclave/virt_enclave/examples/create_signing_key.rs create mode 100644 __enclave/virt_enclave/examples/sign_file.rs create mode 100644 __enclave/virt_enclave/src/lib.rs create mode 100644 __enclave/virt_enclave/src/rpc.rs diff --git a/__enclave/virt_enclave/.gitignore b/__enclave/virt_enclave/.gitignore new file mode 100644 index 0000000..2febfd1 --- /dev/null +++ b/__enclave/virt_enclave/.gitignore @@ -0,0 +1 @@ +platform_signing_key.json diff --git a/__enclave/virt_enclave/examples/create_signing_key.rs b/__enclave/virt_enclave/examples/create_signing_key.rs new file mode 100644 index 0000000..3864aff --- /dev/null +++ b/__enclave/virt_enclave/examples/create_signing_key.rs @@ -0,0 +1,9 @@ +use virt_enclave::sig::SigningKeyPair; + +fn main() { + let signing_key_pair = SigningKeyPair::new(); + match signing_key_pair.write_to_file("platform_signing_key.json") { + Err(_) => println!("Write platform signing key failed!"), + Ok(_) => println!("Write platform signing key successed!"), + } +} \ No newline at end of file diff --git a/__enclave/virt_enclave/examples/sign_file.rs b/__enclave/virt_enclave/examples/sign_file.rs new file mode 100644 index 0000000..0dc4fa2 --- /dev/null +++ b/__enclave/virt_enclave/examples/sign_file.rs @@ -0,0 +1,34 @@ +use std::io::Read; +use std::fs::File; +use ring::digest; +use virt_enclave::sig::*; + +fn main() { + let mut args = std::env::args(); + args.next(); + let signing_key_pair = match SigningKeyPair::read_from_file("platform_signing_key.json") { + Err(_) => { println!("Read file failed!"); return; }, + Ok(k) => k, + }; + let f = match args.next() { + None => { println!("File not assigned!"); return; }, + Some(f) => f, + }; + let mut file = match File::open(&f) { + Err(_) => { println!("Open file failed: {}", f); return; } + Ok(f) => f, + }; + let mut buf = vec![]; + let _len = match file.read_to_end(&mut buf) { + Err(_) => { println!("Read file failed: {}", f); return; } + Ok(c) => c, + }; + let d = digest::digest(&digest::SHA256, &buf); + let digest_hex = hex::encode(&d); + let mut signed_message = SignedMessage::new(d.as_ref().to_vec(), None); + signed_message.sign(&signing_key_pair); + + println!("File : {}", f); + println!("Hex : {}", digest_hex); + println!("Signed: {}", serde_json::to_string(&signed_message).unwrap()); +} \ No newline at end of file diff --git a/__enclave/virt_enclave/src/lib.rs b/__enclave/virt_enclave/src/lib.rs new file mode 100644 index 0000000..0ddc4ca --- /dev/null +++ b/__enclave/virt_enclave/src/lib.rs @@ -0,0 +1,3 @@ +pub mod qjs; +pub mod sig; +pub mod rpc; diff --git a/__enclave/virt_enclave/src/main.rs b/__enclave/virt_enclave/src/main.rs index 0e9b97d..0ffcd56 100644 --- a/__enclave/virt_enclave/src/main.rs +++ b/__enclave/virt_enclave/src/main.rs @@ -1,8 +1,8 @@ -mod qjs; -mod sig; +include!("lib.rs"); pub use qjs::*; pub use sig::*; // TODO +pub use rpc::*; fn main() { let context = QuickJSContext::new().unwrap(); diff --git a/__enclave/virt_enclave/src/qjs.rs b/__enclave/virt_enclave/src/qjs.rs index defe52f..acbd181 100644 --- a/__enclave/virt_enclave/src/qjs.rs +++ b/__enclave/virt_enclave/src/qjs.rs @@ -4,6 +4,14 @@ use quick_js::console::Level; use quick_js::console::ConsoleBackend; use serde::{ Serialize, Deserialize }; use rust_util::XResult; +use crate::sig::*; + +#[derive(Serialize, Deserialize)] +pub struct QuickJSPack { + hash: String, // hash in hex == HEX(SHA256(self.script)) + script: String, + sig: SignedMessage, // sig.msg = SHA256(self.script) +} pub struct QuickJSContext { context: Context, diff --git a/__enclave/virt_enclave/src/rpc.rs b/__enclave/virt_enclave/src/rpc.rs new file mode 100644 index 0000000..3525b60 --- /dev/null +++ b/__enclave/virt_enclave/src/rpc.rs @@ -0,0 +1,17 @@ +use serde::{ Serialize, Deserialize }; + +#[derive(Serialize, Deserialize)] +pub struct InvokeRequest { + hash: String, + method: String, + params: String, // JSON, empty: [] +} + +#[derive(Serialize, Deserialize)] +pub struct InvokeResponse { + request_id: String, + hash: String, + method: String, + result: String, +} +