tests.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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.bridge_table.encrypt_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, &ba.migration_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 bucket = ba.bridge_table.decrypt_bucket_id(id, &key).unwrap();
  38. println!("cred = {:?}", cred);
  39. println!("bucket = {:?}", bucket);
  40. assert!(ba.verify_lox(&cred));
  41. }
  42. fn setup() -> (BridgeDb, BridgeAuth) {
  43. // Create a BridegDb
  44. let bdb = BridgeDb::new(15);
  45. // Create a BridgeAuth
  46. let mut ba = BridgeAuth::new(bdb.pubkey);
  47. // Make 15 buckets with one random bridge each
  48. for _ in 0..15 {
  49. let bucket: [BridgeLine; 3] =
  50. [BridgeLine::random(), Default::default(), Default::default()];
  51. ba.bridge_table.new_bucket(bucket);
  52. }
  53. // Make 5 more buckets, each containing 3 of the previously
  54. // created bridges
  55. for i in 0u32..5 {
  56. let iusize = i as usize;
  57. let bucket: [BridgeLine; 3] = [
  58. ba.bridge_table.buckets[3 * iusize][0],
  59. ba.bridge_table.buckets[3 * iusize + 1][0],
  60. ba.bridge_table.buckets[3 * iusize + 2][0],
  61. ];
  62. ba.bridge_table.new_bucket(bucket);
  63. // Add the allowed migrations to the migration table
  64. ba.migration_table.table.insert(3 * i, 15 + i);
  65. ba.migration_table.table.insert(3 * i + 1, 15 + i);
  66. ba.migration_table.table.insert(3 * i + 2, 15 + i);
  67. }
  68. // Create the encrypted bridge table
  69. ba.bridge_table.encrypt_table();
  70. (bdb, ba)
  71. }
  72. fn trust_promotion(bdb: &BridgeDb, ba: &mut BridgeAuth) -> (cred::Lox, cred::Migration) {
  73. // Issue an open invitation
  74. let inv = bdb.invite();
  75. // Use it to get a Lox credential
  76. let (req, state) = open_invite::request(&inv);
  77. let resp = ba.handle_open_invite(req).unwrap();
  78. let cred = open_invite::handle_response(state, resp, &ba.lox_pub, &ba.migration_pub).unwrap();
  79. assert!(ba.verify_lox(&cred));
  80. // Time passes
  81. ba.advance_days(47);
  82. let (promreq, promstate) = trust_promotion::request(&cred, &ba.lox_pub, ba.today()).unwrap();
  83. let promresp = ba.handle_trust_promotion(promreq).unwrap();
  84. let migcred = trust_promotion::handle_response(promstate, promresp).unwrap();
  85. (cred, migcred)
  86. }
  87. #[test]
  88. fn test_trust_promotion() {
  89. let (bdb, mut ba) = setup();
  90. let (_loxcred, migcred) = trust_promotion(&bdb, &mut ba);
  91. assert!(ba.verify_migration(&migcred));
  92. // Check that we can use the to_bucket in the Migration credenital
  93. // to read a bucket
  94. let (id, key) = bridge_table::from_scalar(migcred.to_bucket).unwrap();
  95. let bucket = ba.bridge_table.decrypt_bucket_id(id, &key).unwrap();
  96. println!("bucket = {:?}", bucket);
  97. }
  98. #[test]
  99. fn test_level0_migration() {
  100. let (bdb, mut ba) = setup();
  101. let (loxcred, migcred) = trust_promotion(&bdb, &mut ba);
  102. let (migreq, migstate) =
  103. migration::request(&loxcred, &migcred, &ba.lox_pub, &ba.migration_pub).unwrap();
  104. let migresp = ba.handle_migration(migreq).unwrap();
  105. let newloxcred =
  106. migration::handle_response(migstate, migresp, &ba.lox_pub, &ba.migration_pub).unwrap();
  107. assert!(ba.verify_lox(&newloxcred));
  108. println!("newloxcred = {:?}", newloxcred);
  109. // Check that we can use the credenital to read a bucket
  110. let (id, key) = bridge_table::from_scalar(newloxcred.bucket).unwrap();
  111. let bucket = ba.bridge_table.decrypt_bucket_id(id, &key).unwrap();
  112. println!("bucket = {:?}", bucket);
  113. }