tests.rs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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. #[test]
  7. fn test_open_invite() {
  8. // Create a BridegDb
  9. let bdb = BridgeDb::new(20);
  10. // Create a BridgeAuth
  11. let mut ba = BridgeAuth::new(bdb.pubkey);
  12. // Make 20 buckets with one random bridge each
  13. for _ in 0..20 {
  14. let bucket: [BridgeLine; 3] =
  15. [BridgeLine::random(), Default::default(), Default::default()];
  16. ba.bridge_table.new_bucket(bucket);
  17. }
  18. // And 20 more with three random bridges each
  19. for _ in 0..20 {
  20. let bucket: [BridgeLine; 3] = [
  21. BridgeLine::random(),
  22. BridgeLine::random(),
  23. BridgeLine::random(),
  24. ];
  25. ba.bridge_table.new_bucket(bucket);
  26. }
  27. // Create the encrypted bridge table
  28. ba.enc_bridge_table();
  29. // Issue an open invitation
  30. let inv = bdb.invite();
  31. // Use it to get a Lox credential
  32. let (req, state) = open_invite::request(&inv);
  33. let resp = ba.handle_open_invite(req).unwrap();
  34. let cred = open_invite::handle_response(state, resp, &ba.lox_pub).unwrap();
  35. // Check that we can use the credential to read a bucket
  36. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  37. let encbuckets = ba.enc_bridge_table();
  38. let bucket =
  39. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  40. println!("cred = {:?}", cred);
  41. println!("bucket = {:?}", bucket);
  42. assert!(bucket.1.is_none());
  43. assert!(ba.verify_lox(&cred));
  44. }
  45. fn setup() -> (BridgeDb, BridgeAuth) {
  46. // Create a BridegDb
  47. let bdb = BridgeDb::new(15);
  48. // Create a BridgeAuth
  49. let mut ba = BridgeAuth::new(bdb.pubkey);
  50. // Make 15 buckets with one random bridge each
  51. for _ in 0..15 {
  52. let bucket: [BridgeLine; 3] =
  53. [BridgeLine::random(), Default::default(), Default::default()];
  54. ba.bridge_table.new_bucket(bucket);
  55. }
  56. // Make 5 more buckets, each containing 3 of the previously
  57. // created bridges
  58. for i in 0u32..5 {
  59. let iusize = i as usize;
  60. let bucket: [BridgeLine; 3] = [
  61. ba.bridge_table.buckets[3 * iusize][0],
  62. ba.bridge_table.buckets[3 * iusize + 1][0],
  63. ba.bridge_table.buckets[3 * iusize + 2][0],
  64. ];
  65. ba.bridge_table.new_bucket(bucket);
  66. // Add the allowed migrations to the migration table
  67. ba.migration_table.table.insert(3 * i, 15 + i);
  68. ba.migration_table.table.insert(3 * i + 1, 15 + i);
  69. ba.migration_table.table.insert(3 * i + 2, 15 + i);
  70. }
  71. // Create the encrypted bridge table
  72. ba.enc_bridge_table();
  73. (bdb, ba)
  74. }
  75. fn trust_promotion(bdb: &BridgeDb, ba: &mut BridgeAuth) -> (cred::Lox, cred::Migration) {
  76. // Issue an open invitation
  77. let inv = bdb.invite();
  78. // Use it to get a Lox credential
  79. let (req, state) = open_invite::request(&inv);
  80. let resp = ba.handle_open_invite(req).unwrap();
  81. let cred = open_invite::handle_response(state, resp, &ba.lox_pub).unwrap();
  82. assert!(ba.verify_lox(&cred));
  83. // Time passes
  84. ba.advance_days(47);
  85. let (promreq, promstate) = trust_promotion::request(&cred, &ba.lox_pub, ba.today()).unwrap();
  86. let promresp = ba.handle_trust_promotion(promreq).unwrap();
  87. let migcred = trust_promotion::handle_response(promstate, promresp).unwrap();
  88. (cred, migcred)
  89. }
  90. #[test]
  91. fn test_trust_promotion() {
  92. let (bdb, mut ba) = setup();
  93. let (_loxcred, migcred) = trust_promotion(&bdb, &mut ba);
  94. assert!(ba.verify_migration(&migcred));
  95. // Check that we can use the to_bucket in the Migration credenital
  96. // to read a bucket
  97. let (id, key) = bridge_table::from_scalar(migcred.to_bucket).unwrap();
  98. let encbuckets = ba.enc_bridge_table();
  99. let bucket =
  100. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  101. println!("bucket = {:?}", bucket);
  102. assert!(ba.verify_reachability(&bucket.1.unwrap()));
  103. }
  104. fn level0_migration(bdb: &BridgeDb, ba: &mut BridgeAuth) -> cred::Lox {
  105. let (loxcred, migcred) = trust_promotion(bdb, ba);
  106. let (migreq, migstate) =
  107. migration::request(&loxcred, &migcred, &ba.lox_pub, &ba.migration_pub).unwrap();
  108. let migresp = ba.handle_migration(migreq).unwrap();
  109. let newloxcred = migration::handle_response(migstate, migresp, &ba.lox_pub).unwrap();
  110. newloxcred
  111. }
  112. #[test]
  113. fn test_level0_migration() {
  114. let (bdb, mut ba) = setup();
  115. let newloxcred = level0_migration(&bdb, &mut ba);
  116. assert!(ba.verify_lox(&newloxcred));
  117. println!("newloxcred = {:?}", newloxcred);
  118. // Check that we can use the credenital to read a bucket
  119. let (id, key) = bridge_table::from_scalar(newloxcred.bucket).unwrap();
  120. let encbuckets = ba.enc_bridge_table();
  121. let bucket =
  122. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  123. println!("bucket = {:?}", bucket);
  124. assert!(ba.verify_reachability(&bucket.1.unwrap()));
  125. }
  126. fn level_up(ba: &mut BridgeAuth, cred: &cred::Lox) -> cred::Lox {
  127. // Read the bucket in the credential to get today's Bucket
  128. // Reachability credential
  129. let (id, key) = bridge_table::from_scalar(cred.bucket).unwrap();
  130. let encbuckets = ba.enc_bridge_table();
  131. let bucket =
  132. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  133. let reachcred = bucket.1.unwrap();
  134. // Use the Bucket Reachability credential to advance to the next
  135. // level
  136. let (req, state) = level_up::request(
  137. &cred,
  138. &reachcred,
  139. &ba.lox_pub,
  140. &ba.reachability_pub,
  141. ba.today(),
  142. )
  143. .unwrap();
  144. let resp = ba.handle_level_up(req).unwrap();
  145. let cred = level_up::handle_response(state, resp, &ba.lox_pub).unwrap();
  146. cred
  147. }
  148. #[test]
  149. fn test_level_up() {
  150. let (bdb, mut ba) = setup();
  151. let cred1 = level0_migration(&bdb, &mut ba);
  152. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  153. // Time passes
  154. ba.advance_days(20);
  155. let cred2 = level_up(&mut ba, &cred1);
  156. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  157. println!("cred2 = {:?}", cred2);
  158. assert!(ba.verify_lox(&cred2));
  159. // Time passes
  160. ba.advance_days(30);
  161. let cred3 = level_up(&mut ba, &cred2);
  162. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  163. println!("cred3 = {:?}", cred3);
  164. assert!(ba.verify_lox(&cred3));
  165. // Time passes
  166. ba.advance_days(60);
  167. let cred4 = level_up(&mut ba, &cred3);
  168. assert!(scalar_u32(&cred3.trust_level).unwrap() == 3);
  169. println!("cred4 = {:?}", cred4);
  170. assert!(ba.verify_lox(&cred4));
  171. }
  172. #[test]
  173. fn test_issue_inv() {
  174. let (bdb, mut ba) = setup();
  175. let cred1 = level0_migration(&bdb, &mut ba);
  176. assert!(scalar_u32(&cred1.trust_level).unwrap() == 1);
  177. // Time passes
  178. ba.advance_days(20);
  179. let cred2 = level_up(&mut ba, &cred1);
  180. assert!(scalar_u32(&cred2.trust_level).unwrap() == 2);
  181. println!("cred2 = {:?}", cred2);
  182. assert!(ba.verify_lox(&cred2));
  183. // Read the bucket in the credential to get today's Bucket
  184. // Reachability credential
  185. let (id, key) = bridge_table::from_scalar(cred2.bucket).unwrap();
  186. let encbuckets = ba.enc_bridge_table();
  187. let bucket =
  188. bridge_table::BridgeTable::decrypt_bucket(id, &key, &encbuckets[id as usize]).unwrap();
  189. let reachcred = bucket.1.unwrap();
  190. let (req, state) = issue_invite::request(
  191. &cred2,
  192. &reachcred,
  193. &ba.lox_pub,
  194. &ba.reachability_pub,
  195. ba.today(),
  196. )
  197. .unwrap();
  198. }