tests.rs 26 KB

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