tests.rs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. /*! Unit tests that require access to the testing-only function
  2. BridgeLine::random() or private fields */
  3. use super::bridge_table::BridgeLine;
  4. use super::proto::*;
  5. use super::*;
  6. use statistical::{mean, standard_deviation};
  7. use std::time::{Duration, Instant};
  8. struct PerfStat {
  9. // Report performance metrics for each test
  10. req_len: usize,
  11. resp_len: usize,
  12. req_t: Duration,
  13. resp_t: Duration,
  14. resp_handle_t: Duration,
  15. }
  16. struct TestHarness {
  17. bdb: BridgeDb,
  18. pub ba: BridgeAuth,
  19. }
  20. impl TestHarness {
  21. fn new() -> Self {
  22. TestHarness::new_buckets(5, 5)
  23. }
  24. fn new_buckets(num_buckets: u8, hot_spare: u8) -> Self {
  25. // Create a BridegDb
  26. let mut bdb = BridgeDb::new();
  27. // Create a BridgeAuth
  28. let mut ba = BridgeAuth::new(bdb.pubkey);
  29. // Make 3 x num_buckets open invitation bridges, in sets of 3
  30. for _ in 0..num_buckets {
  31. let bucket = [
  32. BridgeLine::random(),
  33. BridgeLine::random(),
  34. BridgeLine::random(),
  35. ];
  36. ba.add_openinv_bridges(bucket, &mut bdb);
  37. }
  38. // Add hot_spare more hot spare buckets
  39. for _ in 0..hot_spare {
  40. let bucket = [
  41. BridgeLine::random(),
  42. BridgeLine::random(),
  43. BridgeLine::random(),
  44. ];
  45. ba.add_spare_bucket(bucket);
  46. }
  47. // Create the encrypted bridge table
  48. ba.enc_bridge_table();
  49. Self { bdb, ba }
  50. }
  51. fn advance_days(&mut self, days: u16) {
  52. self.ba.advance_days(days);
  53. }
  54. fn open_invite(&mut self) -> (PerfStat, (cred::Lox, bridge_table::BridgeLine)) {
  55. // Issue an open invitation
  56. let inv = self.bdb.invite();
  57. let req_start = Instant::now();
  58. // Use it to get a Lox credential
  59. let (req, state) = open_invite::request(&inv);
  60. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  61. let req_t = req_start.elapsed();
  62. let req_len = encoded.len();
  63. let resp_start = Instant::now();
  64. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  65. let resp = self.ba.handle_open_invite(decoded).unwrap();
  66. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  67. let resp_t = resp_start.elapsed();
  68. let resp_len = encoded_resp.len();
  69. let resp_handle_start = Instant::now();
  70. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  71. let (cred, bridgeline) =
  72. open_invite::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  73. let resp_handle_t = resp_handle_start.elapsed();
  74. return (
  75. PerfStat {
  76. req_len,
  77. resp_len,
  78. req_t,
  79. resp_t,
  80. resp_handle_t,
  81. },
  82. (cred, bridgeline),
  83. );
  84. }
  85. fn trust_promotion(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Migration) {
  86. let req_start = Instant::now();
  87. let (promreq, promstate) =
  88. trust_promotion::request(&cred, &self.ba.lox_pub, self.ba.today()).unwrap();
  89. let encoded: Vec<u8> = bincode::serialize(&promreq).unwrap();
  90. let req_t = req_start.elapsed();
  91. let req_len = encoded.len();
  92. let resp_start = Instant::now();
  93. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  94. let promresp = self.ba.handle_trust_promotion(decoded).unwrap();
  95. let encoded_resp: Vec<u8> = bincode::serialize(&promresp).unwrap();
  96. let resp_t = resp_start.elapsed();
  97. let resp_len = encoded_resp.len();
  98. let resp_handle_start = Instant::now();
  99. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  100. let migcred = trust_promotion::handle_response(promstate, decode_resp).unwrap();
  101. let resp_handle_t = resp_handle_start.elapsed();
  102. return (
  103. PerfStat {
  104. req_len,
  105. resp_len,
  106. req_t,
  107. resp_t,
  108. resp_handle_t,
  109. },
  110. migcred,
  111. );
  112. }
  113. fn level0_migration(
  114. &mut self,
  115. loxcred: &cred::Lox,
  116. migcred: &cred::Migration,
  117. ) -> (PerfStat, cred::Lox) {
  118. let req_start = Instant::now();
  119. let (migreq, migstate) =
  120. migration::request(loxcred, migcred, &self.ba.lox_pub, &self.ba.migration_pub).unwrap();
  121. let encoded: Vec<u8> = bincode::serialize(&migreq).unwrap();
  122. let req_t = req_start.elapsed();
  123. let req_len = encoded.len();
  124. let resp_start = Instant::now();
  125. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  126. let migresp = self.ba.handle_migration(decoded).unwrap();
  127. let encoded_resp: Vec<u8> = bincode::serialize(&migresp).unwrap();
  128. let resp_t = resp_start.elapsed();
  129. let resp_len = encoded_resp.len();
  130. let resp_handle_start = Instant::now();
  131. let decode_resp: migration::Response = bincode::deserialize(&encoded_resp[..]).unwrap();
  132. let cred = migration::handle_response(migstate, decode_resp, &self.ba.lox_pub).unwrap();
  133. let resp_handle_t = resp_handle_start.elapsed();
  134. return (
  135. PerfStat {
  136. req_len,
  137. resp_len,
  138. req_t,
  139. resp_t,
  140. resp_handle_t,
  141. },
  142. cred,
  143. );
  144. }
  145. fn level_up(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Lox) {
  146. // Read the bucket in the credential to get today's Bucket
  147. // Reachability credential
  148. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  149. let encbuckets = self.ba.enc_bridge_table();
  150. let bucket =
  151. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  152. let reachcred = bucket.1.unwrap();
  153. // Use the Bucket Reachability credential to advance to the next
  154. // level
  155. let req_start = Instant::now();
  156. let (req, state) = level_up::request(
  157. &cred,
  158. &reachcred,
  159. &self.ba.lox_pub,
  160. &self.ba.reachability_pub,
  161. self.ba.today(),
  162. )
  163. .unwrap();
  164. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  165. let req_t = req_start.elapsed();
  166. let req_len = encoded.len();
  167. let resp_start = Instant::now();
  168. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  169. let resp = self.ba.handle_level_up(decoded).unwrap();
  170. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  171. let resp_t = resp_start.elapsed();
  172. let resp_len = encoded_resp.len();
  173. let resp_handle_start = Instant::now();
  174. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  175. let cred = level_up::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  176. let resp_handle_t = resp_handle_start.elapsed();
  177. return (
  178. PerfStat {
  179. req_len,
  180. resp_len,
  181. req_t,
  182. resp_t,
  183. resp_handle_t,
  184. },
  185. cred,
  186. );
  187. }
  188. fn issue_invite(&mut self, cred: &cred::Lox) -> (PerfStat, (cred::Lox, cred::Invitation)) {
  189. // Read the bucket in the credential to get today's Bucket
  190. // Reachability credential
  191. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  192. let encbuckets = self.ba.enc_bridge_table();
  193. let bucket =
  194. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  195. let reachcred = bucket.1.unwrap();
  196. let req_start = Instant::now();
  197. let (req, state) = issue_invite::request(
  198. &cred,
  199. &reachcred,
  200. &self.ba.lox_pub,
  201. &self.ba.reachability_pub,
  202. self.ba.today(),
  203. )
  204. .unwrap();
  205. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  206. let req_t = req_start.elapsed();
  207. let req_len = encoded.len();
  208. let resp_start = Instant::now();
  209. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  210. let resp = self.ba.handle_issue_invite(decoded).unwrap();
  211. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  212. let resp_t = resp_start.elapsed();
  213. let resp_len = encoded_resp.len();
  214. let resp_handle_start = Instant::now();
  215. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  216. let (cred, invite) = issue_invite::handle_response(
  217. state,
  218. decode_resp,
  219. &self.ba.lox_pub,
  220. &self.ba.invitation_pub,
  221. )
  222. .unwrap();
  223. let resp_handle_t = resp_handle_start.elapsed();
  224. return (
  225. PerfStat {
  226. req_len,
  227. resp_len,
  228. req_t,
  229. resp_t,
  230. resp_handle_t,
  231. },
  232. (cred, invite),
  233. );
  234. }
  235. fn redeem_invite(&mut self, inv: &cred::Invitation) -> (PerfStat, cred::Lox) {
  236. let req_start = Instant::now();
  237. let (req, state) =
  238. redeem_invite::request(&inv, &self.ba.invitation_pub, self.ba.today()).unwrap();
  239. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  240. let req_t = req_start.elapsed();
  241. let req_len = encoded.len();
  242. let resp_start = Instant::now();
  243. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  244. let resp = self.ba.handle_redeem_invite(decoded).unwrap();
  245. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  246. let resp_t = resp_start.elapsed();
  247. let resp_len = encoded_resp.len();
  248. let resp_handle_start = Instant::now();
  249. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  250. let cred = redeem_invite::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  251. let resp_handle_t = resp_handle_start.elapsed();
  252. return (
  253. PerfStat {
  254. req_len,
  255. resp_len,
  256. req_t,
  257. resp_t,
  258. resp_handle_t,
  259. },
  260. cred,
  261. );
  262. }
  263. fn check_blockage(&mut self, cred: &cred::Lox) -> (PerfStat, cred::Migration) {
  264. let req_start = Instant::now();
  265. let (req, state) = check_blockage::request(&cred, &self.ba.lox_pub).unwrap();
  266. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  267. let req_t = req_start.elapsed();
  268. let req_len = encoded.len();
  269. let resp_start = Instant::now();
  270. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  271. let resp = self.ba.handle_check_blockage(decoded).unwrap();
  272. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  273. let resp_t = resp_start.elapsed();
  274. let resp_len = encoded_resp.len();
  275. let resp_handle_start = Instant::now();
  276. let decode_resp = bincode::deserialize(&encoded_resp[..]).unwrap();
  277. let migcred = check_blockage::handle_response(state, decode_resp).unwrap();
  278. let resp_handle_t = resp_handle_start.elapsed();
  279. return (
  280. PerfStat {
  281. req_len,
  282. resp_len,
  283. req_t,
  284. resp_t,
  285. resp_handle_t,
  286. },
  287. migcred,
  288. );
  289. }
  290. fn blockage_migration(
  291. &mut self,
  292. cred: &cred::Lox,
  293. mig: &cred::Migration,
  294. ) -> (PerfStat, cred::Lox) {
  295. let req_start = Instant::now();
  296. let (req, state) =
  297. blockage_migration::request(&cred, &mig, &self.ba.lox_pub, &self.ba.migration_pub)
  298. .unwrap();
  299. let encoded: Vec<u8> = bincode::serialize(&req).unwrap();
  300. let req_t = req_start.elapsed();
  301. let req_len = encoded.len();
  302. let resp_start = Instant::now();
  303. let decoded = bincode::deserialize(&encoded[..]).unwrap();
  304. let resp = self.ba.handle_blockage_migration(decoded).unwrap();
  305. let encoded_resp: Vec<u8> = bincode::serialize(&resp).unwrap();
  306. let resp_t = resp_start.elapsed();
  307. let resp_len = encoded_resp.len();
  308. let resp_handle_start = Instant::now();
  309. let decode_resp: blockage_migration::Response =
  310. bincode::deserialize(&encoded_resp[..]).unwrap();
  311. let cred =
  312. blockage_migration::handle_response(state, decode_resp, &self.ba.lox_pub).unwrap();
  313. let resp_handle_t = resp_handle_start.elapsed();
  314. return (
  315. PerfStat {
  316. req_len,
  317. resp_len,
  318. req_t,
  319. resp_t,
  320. resp_handle_t,
  321. },
  322. cred,
  323. );
  324. }
  325. }
  326. #[test]
  327. fn test_open_invite() {
  328. let mut th = TestHarness::new();
  329. // Join an untrusted user
  330. let (perf_stat, (cred, bridgeline)) = th.open_invite();
  331. // Check that we can use the credential to read a bucket
  332. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  333. let encbuckets = th.ba.enc_bridge_table();
  334. let bucket =
  335. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  336. println!("Request size = {:?}", perf_stat.req_len);
  337. println!("Request time = {:?}", perf_stat.req_t);
  338. println!("Response size = {:?}", perf_stat.resp_len);
  339. println!("Response time = {:?}", perf_stat.resp_t);
  340. println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  341. println!("cred = {:?}", cred);
  342. println!("bucket = {:?}", bucket);
  343. println!("bridgeline = {:?}", bridgeline);
  344. assert!(bucket.1.is_none());
  345. assert!(th.ba.verify_lox(&cred));
  346. assert!(bridgeline == bucket.0[0]);
  347. }
  348. #[test]
  349. fn test_trust_promotion() {
  350. let mut th = TestHarness::new();
  351. let cred = th.open_invite().1 .0;
  352. assert!(th.ba.verify_lox(&cred));
  353. // Time passes
  354. th.advance_days(47);
  355. let (perf_stat, migcred) = th.trust_promotion(&cred);
  356. assert!(th.ba.verify_migration(&migcred));
  357. // Check that we can use the to_bucket in the Migration credenital
  358. // to read a bucket
  359. let (id, key) = bridge_table::from_scalar(migcred.to_bucket).unwrap();
  360. let encbuckets = th.ba.enc_bridge_table();
  361. let bucket =
  362. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  363. println!("Request size = {:?}", perf_stat.req_len);
  364. println!("Request time = {:?}", perf_stat.req_t);
  365. println!("Response size = {:?}", perf_stat.resp_len);
  366. println!("Response time = {:?}", perf_stat.resp_t);
  367. println!("Response handle time = {:?}", perf_stat.resp_handle_t);
  368. println!("bucket = {:?}", bucket);
  369. assert!(th.ba.verify_reachability(&bucket.1.unwrap()));
  370. }
  371. #[test]
  372. fn test_level0_migration() {
  373. let mut th = TestHarness::new();
  374. let cred = th.open_invite().1 .0;
  375. assert!(th.ba.verify_lox(&cred));
  376. // Time passes
  377. th.advance_days(47);
  378. let (perf_stat, migcred) = th.trust_promotion(&cred);
  379. assert!(th.ba.verify_migration(&migcred));
  380. println!(
  381. "Trust Promotion to 1 Request size = {:?}",
  382. perf_stat.req_len
  383. );
  384. println!("Trust Promotion to 1 Request time = {:?}", perf_stat.req_t);
  385. println!(
  386. "Trust Promotion to 1 Response size = {:?}",
  387. perf_stat.resp_len
  388. );
  389. println!(
  390. "Trust Promotion to 1 Response time = {:?}",
  391. perf_stat.resp_t
  392. );
  393. println!(
  394. "Trust Promotion to 1 Response handle time = {:?}",
  395. perf_stat.resp_handle_t
  396. );
  397. let (mperf_stat, newloxcred) = th.level0_migration(&cred, &migcred);
  398. println!("Level 0 migration Request size = {:?}", mperf_stat.req_len);
  399. println!("Level 0 migration Request time = {:?}", mperf_stat.req_t);
  400. println!(
  401. "Level 0 migration Response size = {:?}",
  402. mperf_stat.resp_len
  403. );
  404. println!("Level 0 migration Response time = {:?}", mperf_stat.resp_t);
  405. println!(
  406. "Level 0 migration Response handle time = {:?}",
  407. perf_stat.resp_handle_t
  408. );
  409. assert!(th.ba.verify_lox(&newloxcred));
  410. println!("newloxcred = {:?}", newloxcred);
  411. // Check that we can use the credenital to read a bucket
  412. let (id, key) = bridge_table::from_scalar(newloxcred.bucket).unwrap();
  413. let encbuckets = th.ba.enc_bridge_table();
  414. let bucket =
  415. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  416. println!("bucket = {:?}", bucket);
  417. assert!(th.ba.verify_reachability(&bucket.1.unwrap()));
  418. }
  419. #[test]
  420. fn test_level_up() {
  421. let mut th = TestHarness::new();
  422. // Join an untrusted user
  423. let cred = th.open_invite().1 .0;
  424. // Time passes
  425. th.advance_days(47);
  426. // Go up to level 1
  427. let (perf_stat, migcred) = th.trust_promotion(&cred);
  428. println!(
  429. "Trust Promotion to 1 Request size = {:?}",
  430. perf_stat.req_len
  431. );
  432. println!("Trust Promotion to 1 Request time = {:?}", perf_stat.req_t);
  433. println!(
  434. "Trust Promotion to 1 Response size = {:?}",
  435. perf_stat.resp_len
  436. );
  437. println!(
  438. "Trust Promotion to 1 Response time = {:?}",
  439. perf_stat.resp_t
  440. );
  441. println!(
  442. "Trust Promotion to 1 Response handle time = {:?}",
  443. perf_stat.resp_handle_t
  444. );
  445. let (mperf_stat, cred1) = th.level0_migration(&cred, &migcred);
  446. println!(
  447. "New Level 1 credential Request size = {:?}",
  448. mperf_stat.req_len
  449. );
  450. println!(
  451. "New Level 1 credential Request time = {:?}",
  452. mperf_stat.req_t
  453. );
  454. println!(
  455. "New Level 1 credential Response size = {:?}",
  456. mperf_stat.resp_len
  457. );
  458. println!(
  459. "New Level 1 credential Response time = {:?}",
  460. mperf_stat.resp_t
  461. );
  462. println!(
  463. "New Level 1 credential Response handle time = {:?}",
  464. perf_stat.resp_handle_t
  465. );
  466. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  467. // Time passes
  468. th.advance_days(20);
  469. let (two_perf_stat, cred2) = th.level_up(&cred1);
  470. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  471. println!("cred2 = {:?}", cred2);
  472. println!(
  473. "Trust Promotion to 2 Request size = {:?}",
  474. two_perf_stat.req_len
  475. );
  476. println!(
  477. "Trust Promotion to 2 Request time = {:?}",
  478. two_perf_stat.req_t
  479. );
  480. println!(
  481. "Trust Promotion to 2 Response size = {:?}",
  482. two_perf_stat.resp_len
  483. );
  484. println!(
  485. "Trust Promotion to 2 Response time = {:?}",
  486. two_perf_stat.resp_t
  487. );
  488. println!(
  489. "Trust Promotion to 2 Response handle time = {:?}",
  490. two_perf_stat.resp_handle_t
  491. );
  492. assert!(th.ba.verify_lox(&cred2));
  493. // Time passes
  494. th.advance_days(30);
  495. let (three_perf_stat, cred3) = th.level_up(&cred2);
  496. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  497. println!("cred3 = {:?}", cred3);
  498. println!(
  499. "Trust Promotion to 3 Request size = {:?}",
  500. three_perf_stat.req_len
  501. );
  502. println!(
  503. "Trust Promotion to 3 Request time = {:?}",
  504. three_perf_stat.req_t
  505. );
  506. println!(
  507. "Trust Promotion to 3 Response size = {:?}",
  508. three_perf_stat.resp_len
  509. );
  510. println!(
  511. "Trust Promotion to 3 Response time = {:?}",
  512. three_perf_stat.resp_t
  513. );
  514. println!(
  515. "Trust Promotion to 3 Response handle time = {:?}",
  516. three_perf_stat.resp_handle_t
  517. );
  518. assert!(th.ba.verify_lox(&cred3));
  519. // Time passes
  520. th.advance_days(60);
  521. let (four_perf_stat, cred4) = th.level_up(&cred3);
  522. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  523. println!("cred4 = {:?}", cred4);
  524. println!(
  525. "Trust Promotion to 4 Request size = {:?}",
  526. four_perf_stat.req_len
  527. );
  528. println!(
  529. "Trust Promotion to 4 Request time = {:?}",
  530. four_perf_stat.req_t
  531. );
  532. println!(
  533. "Trust Promotion to 4 Response size = {:?}",
  534. four_perf_stat.resp_len
  535. );
  536. println!(
  537. "Trust Promotion to 4 Response time = {:?}",
  538. four_perf_stat.resp_t
  539. );
  540. println!(
  541. "Trust Promotion to 4 Response handle time = {:?}",
  542. four_perf_stat.resp_handle_t
  543. );
  544. assert!(th.ba.verify_lox(&cred4));
  545. }
  546. #[test]
  547. fn test_issue_invite() {
  548. let mut th = TestHarness::new();
  549. // Join an untrusted user
  550. let cred = th.open_invite().1 .0;
  551. // Time passes
  552. th.advance_days(47);
  553. // Go up to level 1
  554. let (_perf_stat, migcred) = th.trust_promotion(&cred);
  555. let (_mperf_stat, cred1) = th.level0_migration(&cred, &migcred);
  556. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  557. // Time passes
  558. th.advance_days(20);
  559. // Go up to level 2
  560. let (_two_perf_stat, cred2) = th.level_up(&cred1);
  561. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  562. println!("cred2 = {:?}", cred2);
  563. assert!(th.ba.verify_lox(&cred2));
  564. // Issue an invitation
  565. let (_invite_perf_stat, (cred2a, invite)) = th.issue_invite(&cred2);
  566. assert!(th.ba.verify_lox(&cred2a));
  567. assert!(th.ba.verify_invitation(&invite));
  568. println!("cred2a = {:?}", cred2a);
  569. println!("invite = {:?}", invite);
  570. }
  571. #[test]
  572. fn test_redeem_invite() {
  573. let mut th = TestHarness::new();
  574. // Join an untrusted user
  575. let cred = th.open_invite().1 .0;
  576. // Time passes
  577. th.advance_days(47);
  578. // Go up to level 1
  579. let (_perf_stat, migcred) = th.trust_promotion(&cred);
  580. let (_one_perf_stat, cred1) = th.level0_migration(&cred, &migcred);
  581. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  582. // Time passes
  583. th.advance_days(20);
  584. // Go up to level 2
  585. let (_two_perf_stat, cred2) = th.level_up(&cred1);
  586. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  587. println!("cred2 = {:?}", cred2);
  588. assert!(th.ba.verify_lox(&cred2));
  589. // Issue an invitation to Bob
  590. let (_invite_perf_stat, (cred2a, bob_invite)) = th.issue_invite(&cred2);
  591. assert!(th.ba.verify_lox(&cred2a));
  592. assert!(th.ba.verify_invitation(&bob_invite));
  593. println!("cred2a = {:?}", cred2a);
  594. println!("bob_invite = {:?}", bob_invite);
  595. // Time passes
  596. th.advance_days(12);
  597. // Bob joins the system
  598. let (_bob_perf_stat, bob_cred) = th.redeem_invite(&bob_invite);
  599. assert!(th.ba.verify_lox(&bob_cred));
  600. println!("bob_cred = {:?}", bob_cred);
  601. }
  602. #[test]
  603. fn test_mark_unreachable() {
  604. let mut th = TestHarness::new();
  605. println!("spares = {:?}", th.ba.bridge_table.spares);
  606. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  607. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  608. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  609. // Mark a bridge in an untrusted bucket as unreachable
  610. let b6 = th.ba.bridge_table.buckets[6][0];
  611. th.ba.bridge_unreachable(&b6, &mut th.bdb);
  612. println!("spares = {:?}", th.ba.bridge_table.spares);
  613. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  614. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  615. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  616. // Mark another bridge grouped to the same trusted bucket as
  617. // unreachable
  618. let b7 = th.ba.bridge_table.buckets[7][0];
  619. th.ba.bridge_unreachable(&b7, &mut th.bdb);
  620. println!("spares = {:?}", th.ba.bridge_table.spares);
  621. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  622. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  623. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  624. // That will have introduced a blockage migration. Get the target
  625. let target: u32 = *th
  626. .ba
  627. .blockage_migration_table
  628. .table
  629. .iter()
  630. .next()
  631. .unwrap()
  632. .1;
  633. // Block two of the bridges in that target bucket
  634. let bt1 = th.ba.bridge_table.buckets[target as usize][1];
  635. let bt2 = th.ba.bridge_table.buckets[target as usize][2];
  636. th.ba.bridge_unreachable(&bt1, &mut th.bdb);
  637. th.ba.bridge_unreachable(&bt2, &mut th.bdb);
  638. println!("spares = {:?}", th.ba.bridge_table.spares);
  639. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  640. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  641. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  642. }
  643. #[test]
  644. fn test_blockage_migration() {
  645. let mut th = TestHarness::new();
  646. // Join an untrusted user
  647. let cred = th.open_invite().1 .0;
  648. // Time passes
  649. th.advance_days(47);
  650. // Go up to level 1
  651. let (_mperf_stat, migcred) = th.trust_promotion(&cred);
  652. let (_perf_stat, cred1) = th.level0_migration(&cred, &migcred);
  653. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  654. // Time passes
  655. th.advance_days(20);
  656. // Go up to level 2
  657. let (_two_perf_stat, cred2) = th.level_up(&cred1);
  658. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  659. println!("cred2 = {:?}", cred2);
  660. assert!(th.ba.verify_lox(&cred2));
  661. // Time passes
  662. th.advance_days(29);
  663. // Go up to level 3
  664. let (_three_perf_stat, cred3) = th.level_up(&cred2);
  665. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  666. println!("cred3 = {:?}", cred3);
  667. assert!(th.ba.verify_lox(&cred3));
  668. // Get our bridges
  669. let (id, key) = bridge_table::from_scalar(cred3.bucket).unwrap();
  670. let encbuckets = th.ba.enc_bridge_table();
  671. let bucket =
  672. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  673. // We should have a Bridge Reachability credential
  674. assert!(bucket.1.is_some());
  675. // Oh, no! Two of our bridges are blocked!
  676. th.ba.bridge_unreachable(&bucket.0[0], &mut th.bdb);
  677. th.ba.bridge_unreachable(&bucket.0[2], &mut th.bdb);
  678. println!("spares = {:?}", th.ba.bridge_table.spares);
  679. println!("tmig = {:?}", th.ba.trustup_migration_table.table);
  680. println!("bmig = {:?}", th.ba.blockage_migration_table.table);
  681. println!("openinv = {:?}\n", th.bdb.openinv_buckets);
  682. // Time passes
  683. th.advance_days(1);
  684. let encbuckets2 = th.ba.enc_bridge_table();
  685. let bucket2 =
  686. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets2[id as usize]).unwrap();
  687. // We should no longer have a Bridge Reachability credential
  688. assert!(bucket2.1.is_none());
  689. // See about getting a Migration credential for the blockage
  690. let (_block_perf_stat, migration) = th.check_blockage(&cred3);
  691. println!("migration = {:?}", migration);
  692. // Migrate
  693. let (_four_perf_stat, cred4) = th.blockage_migration(&cred3, &migration);
  694. println!("cred4 = {:?}", cred4);
  695. assert!(th.ba.verify_lox(&cred4));
  696. }
  697. #[test]
  698. fn protocol_tests() {
  699. let mut th = TestHarness::new_buckets(10, 10);
  700. let mut req_size: Vec<f64> = Vec::new();
  701. let mut resp_size: Vec<f64> = Vec::new();
  702. let mut req_t_size: Vec<f64> = Vec::new();
  703. let mut resp_t_size: Vec<f64> = Vec::new();
  704. let mut resp_handle_t_size: Vec<f64> = Vec::new();
  705. for _ in 0..1000 {
  706. let (perf_stat, _) = th.open_invite();
  707. req_size.push(perf_stat.req_len as f64);
  708. req_t_size.push(perf_stat.req_t.as_secs_f64());
  709. resp_size.push(perf_stat.resp_len as f64);
  710. resp_t_size.push(perf_stat.resp_t.as_secs_f64());
  711. resp_handle_t_size.push(perf_stat.resp_handle_t.as_secs_f64());
  712. }
  713. let mean_req_size = mean(&req_size);
  714. let req_std_dev = standard_deviation(&req_size, Some(mean_req_size));
  715. let mean_req_t_size = mean(&req_t_size);
  716. let req_t_std_dev = standard_deviation(&req_t_size, Some(mean_req_t_size));
  717. let mean_resp_size = mean(&resp_size);
  718. let resp_std_dev = standard_deviation(&resp_size, Some(mean_resp_size));
  719. let mean_resp_t_size = mean(&resp_t_size);
  720. let resp_t_std_dev = standard_deviation(&resp_t_size, Some(mean_resp_t_size));
  721. let mean_resp_handle_t_size = mean(&resp_t_size);
  722. let resp_handle_t_std_dev =
  723. standard_deviation(&resp_handle_t_size, Some(mean_resp_handle_t_size));
  724. println!("Average Request Size = {}", mean_req_size);
  725. println!("Request Standard Deviation = {}", req_std_dev);
  726. println!(
  727. "Average Request Time = {:?}",
  728. Duration::from_secs_f64(mean_req_t_size)
  729. );
  730. println!(
  731. "Request time Standard Deviation = {:?}",
  732. Duration::from_secs_f64(req_t_std_dev)
  733. );
  734. println!("Average Response Size = {}", mean_resp_size);
  735. println!("Response Standard Deviation = {}", resp_std_dev);
  736. println!(
  737. "Average Response Time = {:?}",
  738. Duration::from_secs_f64(mean_resp_t_size)
  739. );
  740. println!(
  741. "Response Time Standard Deviation = {:?}",
  742. Duration::from_secs_f64(resp_t_std_dev)
  743. );
  744. println!(
  745. "Average Response Handling Time = {:?}",
  746. Duration::from_secs_f64(mean_resp_handle_t_size)
  747. );
  748. println!(
  749. "Response Handling Time Standard Deviation = {:?}",
  750. Duration::from_secs_f64(resp_handle_t_std_dev)
  751. );
  752. println!("\n---------------Block Bridges-------------------\n");
  753. // Mark 5 bridges in untrusted buckets as unreachable
  754. let b0 = th.ba.bridge_table.buckets[0][0];
  755. th.ba.bridge_unreachable(&b0, &mut th.bdb);
  756. let b3 = th.ba.bridge_table.buckets[3][0];
  757. th.ba.bridge_unreachable(&b3, &mut th.bdb);
  758. let b6 = th.ba.bridge_table.buckets[6][0];
  759. th.ba.bridge_unreachable(&b6, &mut th.bdb);
  760. let b9 = th.ba.bridge_table.buckets[9][0];
  761. th.ba.bridge_unreachable(&b9, &mut th.bdb);
  762. let b12 = th.ba.bridge_table.buckets[12][0];
  763. th.ba.bridge_unreachable(&b12, &mut th.bdb);
  764. let mut req_size2: Vec<f64> = Vec::new();
  765. let mut resp_size2: Vec<f64> = Vec::new();
  766. let mut req_t_size2: Vec<f64> = Vec::new();
  767. let mut resp_t_size2: Vec<f64> = Vec::new();
  768. let mut resp_handle_t_size2: Vec<f64> = Vec::new();
  769. for _ in 0..1000 {
  770. let (perf_stat2, _) = th.open_invite();
  771. req_size2.push(perf_stat2.req_len as f64);
  772. req_t_size2.push(perf_stat2.req_t.as_secs_f64());
  773. resp_size2.push(perf_stat2.resp_len as f64);
  774. resp_t_size2.push(perf_stat2.resp_t.as_secs_f64());
  775. resp_handle_t_size2.push(perf_stat2.resp_handle_t.as_secs_f64());
  776. }
  777. let mean_req_size2 = mean(&req_size2);
  778. let req_std_dev2 = standard_deviation(&req_size2, Some(mean_req_size2));
  779. let mean_req_t_size2 = mean(&req_t_size2);
  780. let req_t_std_dev2 = standard_deviation(&req_t_size2, Some(mean_req_t_size2));
  781. let mean_resp_size2 = mean(&resp_size2);
  782. let resp_std_dev2 = standard_deviation(&resp_size2, Some(mean_resp_size2));
  783. let mean_resp_t_size2 = mean(&resp_t_size2);
  784. let resp_t_std_dev2 = standard_deviation(&resp_t_size2, Some(mean_resp_t_size2));
  785. let mean_resp_handle_t_size2 = mean(&resp_t_size2);
  786. let resp_handle_t_std_dev2 =
  787. standard_deviation(&resp_handle_t_size2, Some(mean_resp_handle_t_size2));
  788. println!("Average Request size = {}", mean_req_size2);
  789. println!("Request Standard Deviation = {}", req_std_dev2);
  790. println!(
  791. "Average Request Time = {:?}",
  792. Duration::from_secs_f64(mean_req_t_size)
  793. );
  794. println!(
  795. "Request time Standard Deviation = {:?}",
  796. Duration::from_secs_f64(req_t_std_dev2)
  797. );
  798. println!("Average Response size = {}", mean_resp_size2);
  799. println!("Response Standard Deviation = {}", resp_std_dev2);
  800. println!(
  801. "Average Response Time = {:?}",
  802. Duration::from_secs_f64(mean_resp_t_size2)
  803. );
  804. println!(
  805. "Response Time Standard Deviation = {:?}",
  806. Duration::from_secs_f64(resp_t_std_dev2)
  807. );
  808. println!(
  809. "Average Response Handling Time = {:?}",
  810. Duration::from_secs_f64(mean_resp_handle_t_size2)
  811. );
  812. println!(
  813. "Response Handling Time Standard Deviation = {:?}",
  814. Duration::from_secs_f64(resp_handle_t_std_dev2)
  815. );
  816. }