Kaynağa Gözat

Consolidate bridge pending booleans into single attribute

Vecna 2 ay önce
ebeveyn
işleme
6df0ef713c

+ 1 - 3
crates/lox-extensions/src/lib.rs

@@ -1075,9 +1075,7 @@ impl BridgeAuth {
         let mut R = Resolve::using_privkey(&self.resolve_priv);
         R.pending = Some(Scalar::ZERO);
         R.new_false_reports = Some(Scalar::ZERO);
-        R.bridge_0_pending = Some(Scalar::ZERO);
-        R.bridge_1_pending = Some(Scalar::ZERO);
-        R.bridge_2_pending = Some(Scalar::ZERO);
+        R.bridges_pending = Some(Scalar::ZERO);
         let _ = R.create_MAC(rng, &self.resolve_priv);
         R
     }

+ 1 - 3
crates/lox-extensions/src/lox_creds.rs

@@ -106,7 +106,5 @@ CMZ! { Invitation:
 CMZ! { Resolve:
     pending,
     new_false_reports,
-    bridge_0_pending,
-    bridge_1_pending,
-    bridge_2_pending
+    bridges_pending
 }

+ 5 - 12
crates/lox-extensions/src/proto/report_resolve.rs

@@ -28,9 +28,7 @@ The user presents their current Lox credential:
 and a Resolve credential:
 - pending: revealed to be the same as in the Lox credential above
 - new_false_report: revealed
-- bridge_0_pending: revealed
-- bridge_1_pending: revealed
-- bridge_2_pending: revealed
+- bridges_pending: revealed
 
 and a new Lox credential to be issued:
 
@@ -71,7 +69,8 @@ const SESSION_ID: &[u8] = b"report_resolve";
 // information, associated with the pending value, so that wouldn't be
 // useful.
 muCMZProtocol! { report_resolve,
-    [ L: Lox { id: R, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: R }, R: Resolve { pending: R, new_false_reports: R, bridge_0_pending: R, bridge_1_pending: R, bridge_2_pending: R } ],
+    [ L: Lox { id: R, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: R },
+    R: Resolve { pending: R, new_false_reports: R, bridges_pending: R } ],
     N: Lox { id: J, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: I },
     R.pending = L.pending,
     N.bucket = L.bucket,
@@ -106,10 +105,7 @@ pub fn request(
     N.invites_remaining = L.invites_remaining;
     N.blockages = L.blockages;
     N.false_reports = Some(L.false_reports.unwrap() + R.new_false_reports.unwrap());
-    N.pending = if R.bridge_0_pending == Some(Scalar::ZERO)
-        && R.bridge_1_pending == Some(Scalar::ZERO)
-        && R.bridge_2_pending == Some(Scalar::ZERO)
-    {
+    N.pending = if R.bridges_pending == Some(Scalar::ZERO) {
         Some(Scalar::ZERO)
     } else {
         L.pending
@@ -140,10 +136,7 @@ impl BridgeAuth {
                 R.set_privkey(&self.resolve_priv);
                 N.set_privkey(&self.lox_priv);
 
-                N.pending = if R.bridge_0_pending == Some(Scalar::ZERO)
-                    && R.bridge_1_pending == Some(Scalar::ZERO)
-                    && R.bridge_2_pending == Some(Scalar::ZERO)
-                {
+                N.pending = if R.bridges_pending == Some(Scalar::ZERO) {
                     Some(Scalar::ZERO)
                 } else {
                     L.pending

+ 10 - 22
crates/lox-extensions/src/proto/report_status.rs

@@ -43,12 +43,7 @@ and a new Resolve credential to be issued:
   credential (that is, one more than the pending value in the presented
   Lox credential)
 - new_false_reports: revealed
-- bucket_0_pending: revealed to be 0 if there is not a pending report
-  for bucket 0, or 1 if there is
-- bucket_1_pending: revealed to be 0 if there is not a pending report
-  for bucket 1, or 1 if there is
-- bucket_2_pending: revealed to be 0 if there is not a pending report
-  for bucket 2, or 1 if there is
+- bridges_pending: revealed
 
 */
 #[cfg(feature = "bridgeauth")]
@@ -72,7 +67,7 @@ const SESSION_ID: &[u8] = b"report_status";
 muCMZProtocol! { report_status,
     L: Lox { id: R, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: R },
     [ N: Lox { id: J, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: I },
-    R: Resolve { pending: I, new_false_reports: S, bridge_0_pending: S, bridge_1_pending: S, bridge_2_pending: S } ],
+    R: Resolve { pending: I, new_false_reports: S, bridges_pending: S } ],
     N.bucket = L.bucket,
     N.trust_level = L.trust_level,
     N.level_since = L.level_since,
@@ -202,21 +197,14 @@ impl BridgeAuth {
                 // Set R fields accordingly
                 R.pending = Some(L.pending.unwrap() + Scalar::ONE);
                 R.new_false_reports = Some(Scalar::from(new_false_reports));
-                R.bridge_0_pending = if reports_pending[0] {
-                    Some(Scalar::ONE)
-                } else {
-                    Some(Scalar::ZERO)
-                };
-                R.bridge_1_pending = if reports_pending[1] {
-                    Some(Scalar::ONE)
-                } else {
-                    Some(Scalar::ZERO)
-                };
-                R.bridge_2_pending = if reports_pending[2] {
-                    Some(Scalar::ONE)
-                } else {
-                    Some(Scalar::ZERO)
-                };
+
+                let mut bridges_pending = [0u8; 32];
+                for i in 0..MAX_BRIDGES_PER_BUCKET {
+                    if reports_pending[i] {
+                        bridges_pending[0] |= 1 << i;
+                    }
+                }
+                R.bridges_pending = Some(Scalar::from_bytes_mod_order(bridges_pending));
 
                 N.pending = Some(L.pending.unwrap() + Scalar::ONE);
                 Ok(())

+ 27 - 29
crates/lox-extensions/src/proto/report_submit.rs

@@ -28,9 +28,7 @@ The user presents their current Lox credential:
 and a Resolve credential (which may have all fields 0):
 - pending: revealed to be the same as in the above Lox credential
 - new_false_reports: revealed
-- bridge_0_pending: revealed
-- bridge_1_pending: revealed
-- bridge_2_pending: revealed
+- bridges_pending: revealed
 
 and a new Lox credential to be issued:
 
@@ -73,7 +71,7 @@ const SESSION_ID: &[u8] = b"report_submit";
 
 muCMZProtocol! { report_submit<max_false_reports, bucket>,
     [ L: Lox { id: R, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: R },
-    R: Resolve { pending: R, new_false_reports: R, bridge_0_pending: R, bridge_1_pending: R, bridge_2_pending: R } ],
+    R: Resolve { pending: R, new_false_reports: R, bridges_pending: R } ],
     N: Lox { id: J, bucket: H, trust_level: H, level_since: H, invites_remaining: H, blockages: H, false_reports: H, pending: S },
     L.bucket = bucket,
     N.bucket = L.bucket,
@@ -141,10 +139,21 @@ pub fn request(
         ));
     }
 
-    // Check that we're reporting at least one bridge
+    // Check that we're reporting at least one bridge and that we're not
+    // reporting any bridges with pending reports
     let mut reporting_a_bridge = false;
-    for br in bridges_being_reported {
-        if br {
+    let bridges_with_pending_reports = R.bridges_pending.unwrap().as_bytes()[0];
+    for i in 0..MAX_BRIDGES_PER_BUCKET {
+        if bridges_being_reported[i] {
+            if bridges_with_pending_reports & 1 << i != 0 {
+                return Err(CredentialError::InvalidField(
+                    String::from("bridges_being_reported"),
+                    format!(
+                        "resolve credential shows bridge {} still has a pending report",
+                        i
+                    ),
+                ));
+            }
             reporting_a_bridge = true;
         }
     }
@@ -254,12 +263,14 @@ impl BridgeAuth {
                     }
                 };
 
-                // Check that user indicated at least one non-default bridge to
-                // submit a report for
-                let bridges_pending = [R.bridge_0_pending, R.bridge_1_pending, R.bridge_2_pending];
+                // Check that user indicated at least one non-default
+                // bridge to submit a report for and that the user is
+                // not submitting a report for any bridge that already
+                // has a pending report
+                let bridges_with_pending_reports = R.bridges_pending.unwrap().as_bytes()[0];
                 for i in 0..MAX_BRIDGES_PER_BUCKET {
                     if bridges_being_reported[i] {
-                        if bridges_pending[i] != Some(Scalar::ZERO) {
+                        if bridges_with_pending_reports & 1 << i != 0 {
                             return Err(CMZError::RevealAttrMissing(
                                 "bridges_being_reported",
                                 "Report submitted for a bridge that already has a pending report",
@@ -405,9 +416,7 @@ mod tests {
         assert_eq!(pending_1 + Scalar::ONE, pending_2);
         assert_eq!(resolve_cred.pending.unwrap(), pending_2);
         assert_eq!(resolve_cred.new_false_reports, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_0_pending, Some(Scalar::ONE));
-        assert_eq!(resolve_cred.bridge_1_pending, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_2_pending, Some(Scalar::ZERO));
+        assert_eq!(resolve_cred.bridges_pending, Some(Scalar::ONE));
 
         // Resolve (stay in pending state because we have a pending report)
         lox_cred = th.report_resolve(rng, lox_cred.clone(), resolve_cred.clone());
@@ -421,9 +430,7 @@ mod tests {
         assert_eq!(pending_2 + Scalar::ONE, pending_3);
         assert_eq!(resolve_cred.pending.unwrap(), pending_3);
         assert_eq!(resolve_cred.new_false_reports, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_0_pending, Some(Scalar::ONE));
-        assert_eq!(resolve_cred.bridge_1_pending, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_2_pending, Some(Scalar::ZERO));
+        assert_eq!(resolve_cred.bridges_pending, Some(Scalar::ONE));
 
         // We should be unable to submit another report for bridge 0 due
         // to pending report for bridge 0
@@ -434,12 +441,7 @@ mod tests {
             cc,
             [true, false, false],
         );
-        let ((rs_request, _rs_client_state), cc_server, D, bridges_being_reported_server) =
-            report_submit_request.unwrap();
-        let report_submit_response =
-            th.ba
-                .handle_report_submit(rs_request, cc_server, D, bridges_being_reported_server);
-        assert!(report_submit_response.is_err());
+        assert!(report_submit_request.is_err());
 
         // Let the report time out
         th.ba.report_table.mark_old_reports_simulated_time(
@@ -455,9 +457,7 @@ mod tests {
         assert_eq!(pending_3 + Scalar::ONE, pending_4);
         assert_eq!(resolve_cred.pending.unwrap(), pending_4);
         assert_eq!(resolve_cred.new_false_reports, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_0_pending, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_1_pending, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_2_pending, Some(Scalar::ZERO));
+        assert_eq!(resolve_cred.bridges_pending, Some(Scalar::ZERO));
 
         // Submit another report for bridge 0
         lox_cred = th.report_submit(
@@ -484,9 +484,7 @@ mod tests {
         assert_eq!(pending_4 + Scalar::ONE, pending_5);
         assert_eq!(resolve_cred.pending.unwrap(), pending_5);
         assert_eq!(resolve_cred.new_false_reports, Some(Scalar::ONE));
-        assert_eq!(resolve_cred.bridge_0_pending, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_1_pending, Some(Scalar::ZERO));
-        assert_eq!(resolve_cred.bridge_2_pending, Some(Scalar::ZERO));
+        assert_eq!(resolve_cred.bridges_pending, Some(Scalar::ZERO));
 
         // Submit a new report. We need to increase false_reports.
         lox_cred = th.report_submit(