Merge pull request #175 from bradyjoestar/baidu_master
rust-poc complete!
diff --git a/samplecode/db-proxy/db-server/Cargo.toml b/samplecode/db-proxy/db-server/Cargo.toml
index 016505e..2009302 100644
--- a/samplecode/db-proxy/db-server/Cargo.toml
+++ b/samplecode/db-proxy/db-server/Cargo.toml
@@ -7,7 +7,7 @@
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
-merklebtree = "0.1.1"
+merklebtree = "0.1.5"
ring = "0.16.9"
hex = "0.4.0"
serde = { version = "1.0.60", features = ["derive"] }
diff --git a/samplecode/db-proxy/db-server/src/main.rs b/samplecode/db-proxy/db-server/src/main.rs
index 892485f..06a9e56 100644
--- a/samplecode/db-proxy/db-server/src/main.rs
+++ b/samplecode/db-proxy/db-server/src/main.rs
@@ -1,29 +1,26 @@
extern crate hex;
extern crate merklebtree;
+extern crate parking_lot;
extern crate ring;
+extern crate rocksdb;
extern crate serde;
extern crate serde_json;
-extern crate rocksdb;
-extern crate parking_lot;
-
mod client;
mod server;
mod verifytree;
-
-use std::fs;
-use std::io::{Read, Write};
-use std::path;
use parking_lot::RwLock;
use rocksdb::{DBVector, WriteBatch, DB};
use server::new_server;
+use std::fs;
+use std::io::{Read, Write};
+use std::path;
fn main() {
vertias_db();
}
-
pub fn vertias_db() {
// generate the key_value of hmac key
let mut key_value = Vec::new();
@@ -34,4 +31,3 @@
let mut server = new_server(key_value);
client::client_test(&mut server);
}
-
diff --git a/samplecode/db-proxy/db-server/src/server/mod.rs b/samplecode/db-proxy/db-server/src/server/mod.rs
index 52f2503..1b7a499 100644
--- a/samplecode/db-proxy/db-server/src/server/mod.rs
+++ b/samplecode/db-proxy/db-server/src/server/mod.rs
@@ -1,10 +1,13 @@
use crate::client::*;
use crate::verifytree::mbtree::*;
use hex;
-use ring::hmac::Key;
+use merklebtree::iterator::prev;
+use merklebtree::merklebtree::{MerkleBTree, Nodes};
use merklebtree::node::Node;
+use merklebtree::sgxdb;
use merklebtree::traits::CalculateHash;
use parking_lot::RwLock;
+use ring::hmac::Key;
use ring::{digest, hmac, rand};
use rocksdb::{DBVector, DB};
use serde::{Deserialize, Serialize};
@@ -17,6 +20,8 @@
hmac_key: Key,
present_mbtree: Merklebtree,
deleted_mbtree: Merklebtree,
+ sgx_present_root_node: Node<key_version>,
+ sgx_delete_root_node: Node<key_version>,
}
//hmacPayload is used to compute hmac
@@ -52,12 +57,12 @@
}
impl server {
- fn put(&mut self, key: String, value: String) {
+ fn db_put(&mut self, key: String, value: String) {
let db = self.db_handler.clone();
db.write().put(key.as_bytes(), value.as_bytes()).unwrap();
}
- fn get(&mut self, key: String) -> String {
+ fn db_get(&mut self, key: String) -> String {
let db = self.db_handler.clone();
let db_read = db.read();
let r = db.read().get(key.as_str());
@@ -70,10 +75,140 @@
}
}
- fn delete(&mut self, key: String) {
+ fn db_delete(&mut self, key: String) {
let db = self.db_handler.clone();
db.write().delete(key.as_bytes()).unwrap();
}
+
+ fn present_search(&mut self, key: String) -> search_result {
+ let (get_result, mut present_subnodes) = self.present_mbtree.search(key);
+ if get_result.existed {
+ present_subnodes.nodes_map.remove(&0).unwrap();
+ present_subnodes
+ .nodes_map
+ .insert(0, self.sgx_present_root_node.clone());
+ sgxdb::verify_subnodes_hash(&present_subnodes);
+ }
+ get_result
+ }
+
+ fn delete_search(&mut self, key: String) -> search_result {
+ let (get_result, mut delete_subnodes) = self.deleted_mbtree.search(key);
+ if get_result.existed {
+ delete_subnodes.nodes_map.remove(&0).unwrap();
+ delete_subnodes
+ .nodes_map
+ .insert(0, self.sgx_delete_root_node.clone());
+ sgxdb::verify_subnodes_hash(&delete_subnodes);
+ }
+ get_result
+ }
+
+ fn present_remove(&mut self, key: String) {
+ let mut present_subnodes = self.present_mbtree.delete(key.clone());
+ if present_subnodes.nodes_map.len() == 0 {
+ return;
+ }
+
+ present_subnodes.nodes_map.remove(&0).unwrap();
+ present_subnodes
+ .nodes_map
+ .insert(0, self.sgx_present_root_node.clone());
+
+ sgxdb::verify_subnodes_hash(&present_subnodes);
+
+ let kv = key_version {
+ key: key.clone(),
+ version: 0,
+ };
+
+ self.present_mbtree
+ .mbtree
+ .remove(kv.clone(), &mut present_subnodes);
+
+ let node_hash = self.present_mbtree.nodes.merkleroot();
+ let subnode_hash = present_subnodes.merkleroot();
+ assert_eq!(node_hash, subnode_hash);
+
+ self.sgx_present_root_node = present_subnodes.nodes_map.remove(&0).unwrap();
+ }
+
+ fn delete_remove(&mut self, key: String) {
+ let mut delete_subnodes = self.deleted_mbtree.delete(key.clone());
+ if delete_subnodes.nodes_map.len() == 0 {
+ return;
+ }
+
+ delete_subnodes.nodes_map.remove(&0).unwrap();
+ delete_subnodes
+ .nodes_map
+ .insert(0, self.sgx_delete_root_node.clone());
+
+ sgxdb::verify_subnodes_hash(&delete_subnodes);
+ let kv = key_version {
+ key: key.clone(),
+ version: 0,
+ };
+ self.deleted_mbtree
+ .mbtree
+ .remove(kv.clone(), &mut delete_subnodes);
+
+ let node_hash = self.deleted_mbtree.nodes.merkleroot();
+ let subnode_hash = delete_subnodes.merkleroot();
+ assert_eq!(node_hash, subnode_hash);
+
+ self.sgx_delete_root_node = delete_subnodes.nodes_map.remove(&0).unwrap();
+ }
+
+ fn present_build_with_kv(&mut self, kv: key_version) {
+ if self.sgx_present_root_node.content.len() == 0 {
+ self.sgx_present_root_node = Node::new_node(kv.clone(), 0);
+ self.sgx_present_root_node.root_flag = true;
+ self.present_mbtree.build_with_key_value(kv.clone());
+ return;
+ }
+ let mut present_subnodes = self.present_mbtree.build_with_key_value(kv.clone());
+ present_subnodes.nodes_map.remove(&0).unwrap();
+ present_subnodes
+ .nodes_map
+ .insert(0, self.sgx_present_root_node.clone());
+
+ sgxdb::verify_subnodes_hash(&present_subnodes);
+ self.present_mbtree
+ .mbtree
+ .put(kv.clone(), &mut present_subnodes);
+
+ let node_hash = self.present_mbtree.nodes.merkleroot();
+ let subnode_hash = present_subnodes.merkleroot();
+ assert_eq!(node_hash, subnode_hash);
+
+ self.sgx_present_root_node = present_subnodes.nodes_map.remove(&0).unwrap();
+ }
+
+ fn delete_build_with_kv(&mut self, kv: key_version) {
+ if self.sgx_delete_root_node.content.len() == 0 {
+ self.sgx_delete_root_node = Node::new_node(kv.clone(), 0);
+ self.sgx_delete_root_node.root_flag = true;
+ self.deleted_mbtree.build_with_key_value(kv.clone());
+ return;
+ }
+ let mut delete_subnodes = self.deleted_mbtree.build_with_key_value(kv.clone());
+ delete_subnodes.nodes_map.remove(&0).unwrap();
+ delete_subnodes
+ .nodes_map
+ .insert(0, self.sgx_present_root_node.clone());
+
+ sgxdb::verify_subnodes_hash(&delete_subnodes);
+ self.deleted_mbtree
+ .mbtree
+ .put(kv.clone(), &mut delete_subnodes);
+
+ let node_hash = self.deleted_mbtree.nodes.merkleroot();
+ let subnode_hash = delete_subnodes.merkleroot();
+ assert_eq!(node_hash, subnode_hash);
+
+ self.sgx_delete_root_node = delete_subnodes.nodes_map.remove(&0).unwrap();
+ }
}
pub fn new_server(key_value: Vec<u8>) -> server {
@@ -90,6 +225,8 @@
hmac_key: s_key,
present_mbtree: new_mbtree(),
deleted_mbtree: new_mbtree(),
+ sgx_present_root_node: Node::new_empty(0),
+ sgx_delete_root_node: Node::new_empty(0),
}
}
@@ -117,7 +254,7 @@
}
pub fn veritasdb_get(&mut self, req: request) -> String {
- let data = self.get(req.key.clone());
+ let data = self.db_get(req.key.clone());
if data == "".to_string() {
return String::new();
}
@@ -131,7 +268,7 @@
let hmac_string = serde_json::to_string(&hmac_data).unwrap();
let verify_result = self.verify_hmac(hmac_string, sp.tag.clone());
- let sr = self.present_mbtree.search(req.key.clone());
+ let sr = self.present_search(req.key.clone());
if verify_result && sp.ctr == sr.version {
return sp.value;
} else {
@@ -141,7 +278,7 @@
}
pub fn veritasdb_put(&mut self, req: request) {
- let get_result = self.present_mbtree.search(req.key.clone());
+ let get_result = self.present_search(req.key.clone());
if get_result.existed {
let hmac_data = hmac_payload {
key: req.key.clone(),
@@ -158,10 +295,10 @@
ctr: get_result.version + 1,
};
let store_string = serde_json::to_string(&store_data).unwrap();
- self.put(req.key.clone(), store_string.clone());
+ self.db_put(req.key.clone(), store_string.clone());
//update present if there is no error
- self.present_mbtree.build_with_key_value(key_version {
+ self.present_build_with_kv(key_version {
key: req.key,
version: get_result.version + 1,
});
@@ -172,13 +309,13 @@
}
pub fn veritasdb_insert(&mut self, req: request) {
- let sr = self.present_mbtree.search(req.key.clone());
+ let sr = self.present_search(req.key.clone());
if sr.existed {
println!("key existed in present when called insert");
return;
} else {
let mut ctr = 0;
- let delete_sr = self.deleted_mbtree.search(req.key.clone());
+ let delete_sr = self.delete_search(req.key.clone());
if delete_sr.existed {
ctr = delete_sr.version + 1;
} else {
@@ -198,26 +335,26 @@
tag: tag_string,
};
let store_string = serde_json::to_string(&store_data).unwrap();
- self.put(req.key.clone(), store_string);
- self.present_mbtree.build_with_key_value(key_version {
+ self.db_put(req.key.clone(), store_string);
+ self.present_build_with_kv(key_version {
key: req.key.clone(),
version: ctr,
});
- self.deleted_mbtree.delete(req.key.clone());
+ self.delete_remove(req.key.clone());
}
}
pub fn veritasdb_delete(&mut self, req: request) {
- let get_result = self.get(req.key.clone());
+ let get_result = self.db_get(req.key.clone());
if get_result == "".to_string() {
} else {
- self.delete(req.key.clone());
- let sr = self.present_mbtree.search(req.key.clone());
- self.deleted_mbtree.build_with_key_value(key_version {
+ self.db_delete(req.key.clone());
+ let sr = self.present_search(req.key.clone());
+ self.delete_build_with_kv(key_version {
key: req.key.clone(),
version: sr.version,
});
- self.present_mbtree.delete(req.key);
+ self.present_remove(req.key.clone());
}
}
diff --git a/samplecode/db-proxy/db-server/src/verifytree/mbtree.rs b/samplecode/db-proxy/db-server/src/verifytree/mbtree.rs
index b9f7965..7dbf2d1 100644
--- a/samplecode/db-proxy/db-server/src/verifytree/mbtree.rs
+++ b/samplecode/db-proxy/db-server/src/verifytree/mbtree.rs
@@ -1,4 +1,5 @@
use merklebtree::merklebtree::{MerkleBTree, Nodes};
+use merklebtree::node::Node;
use merklebtree::traits::CalculateHash;
use ring::digest;
use std::cmp::Ordering;
@@ -52,6 +53,7 @@
pub struct Merklebtree {
pub mbtree: MerkleBTree,
pub nodes: Nodes<key_version>,
+ pub root_node: Node<key_version>,
}
pub fn new_mbtree() -> Merklebtree {
@@ -71,12 +73,13 @@
Merklebtree {
mbtree: tree,
nodes,
+ root_node: Node::new_empty(0),
}
}
impl Merklebtree {
- pub fn search(&mut self, key: String) -> search_result {
- let (value, found) = self.mbtree.get(
+ pub fn search(&mut self, key: String) -> (search_result, Nodes<key_version>) {
+ let (value, found, subnodes) = self.mbtree.get_clone(
key_version {
key: key.clone(),
version: 0,
@@ -84,38 +87,46 @@
&mut self.nodes,
);
if found {
- return search_result {
- existed: true,
- key: key,
- version: value.version,
- };
+ return (
+ search_result {
+ existed: true,
+ key: key,
+ version: value.version,
+ },
+ subnodes,
+ );
} else {
- return search_result {
- existed: false,
- key: key,
- version: -1,
- };
+ return (
+ search_result {
+ existed: false,
+ key: key,
+ version: -1,
+ },
+ subnodes,
+ );
}
}
- pub fn delete(&mut self, key: String) {
- self.mbtree.remove(
+ pub fn delete(&mut self, key: String) -> Nodes<key_version> {
+ let subnodes = self.mbtree.remove_clone(
key_version {
key: key,
version: 0,
},
&mut self.nodes,
);
+ subnodes
}
- pub fn build_with_key_value(&mut self, kv: key_version) {
+ pub fn build_with_key_value(&mut self, kv: key_version) -> Nodes<key_version> {
println!("kv:{:?}", kv);
- self.mbtree.put(
+ let subnodes = self.mbtree.put_clone(
key_version {
key: kv.key,
version: kv.version,
},
&mut self.nodes,
);
+ subnodes
}
}