diff --git a/crates/lox-library/Cargo.toml b/crates/lox-library/Cargo.toml index ea88540..0adbd53 100644 --- a/crates/lox-library/Cargo.toml +++ b/crates/lox-library/Cargo.toml @@ -12,6 +12,8 @@ zkp = "0.8" bincode = "1" rand = "0.7" serde = "1" +serde-big-array = "0.3.2" +serde_with = "1.9.1" sha2 = "0.9" lazy_static = "1" hex_fmt = "0.3" diff --git a/crates/lox-library/src/bridge_table.rs b/crates/lox-library/src/bridge_table.rs index 929ee64..94c9a46 100644 --- a/crates/lox-library/src/bridge_table.rs +++ b/crates/lox-library/src/bridge_table.rs @@ -18,10 +18,17 @@ use curve25519_dalek::ristretto::CompressedRistretto; use curve25519_dalek::ristretto::RistrettoBasepointTable; use curve25519_dalek::scalar::Scalar; use rand::RngCore; +use serde::{Serialize, Deserialize}; +use serde_big_array::big_array; use std::collections::{HashMap, HashSet}; use std::convert::TryInto; use subtle::ConstantTimeEq; +big_array! { + BigArray; + +202, +} + /// Each bridge information line is serialized into this many bytes pub const BRIDGE_BYTES: usize = 220; @@ -35,7 +42,7 @@ pub const MAX_BRIDGES_PER_BUCKET: usize = 3; pub const MIN_BUCKET_REACHABILITY: usize = 2; /// A bridge information line -#[derive(Copy, Clone, Hash, Eq, PartialEq, Debug)] +#[derive(Serialize, Deserialize, Copy, Clone, Hash, Eq, PartialEq, Debug)] pub struct BridgeLine { /// IPv4 or IPv6 address pub addr: [u8; 16], @@ -43,6 +50,7 @@ pub struct BridgeLine { pub port: u16, /// other protocol information, including pluggable transport, /// public key, etc. + #[serde(with = "BigArray")] pub info: [u8; BRIDGE_BYTES - 18], } diff --git a/crates/lox-library/src/proto/blockage_migration.rs b/crates/lox-library/src/proto/blockage_migration.rs index 694ad4e..8a1aab6 100644 --- a/crates/lox-library/src/proto/blockage_migration.rs +++ b/crates/lox-library/src/proto/blockage_migration.rs @@ -43,6 +43,8 @@ use zkp::CompactProof; use zkp::ProofError; use zkp::Transcript; +use serde::{Serialize, Deserialize}; + use super::super::cred; use super::super::dup_filter::SeenType; use super::super::migration_table::MigrationType; @@ -52,6 +54,7 @@ use super::super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE}; use super::check_blockage::MIN_TRUST_LEVEL; use super::level_up::LEVEL_INVITATIONS; +#[derive(Serialize, Deserialize)] pub struct Request { // Fields for blind showing the Lox credential P_lox: RistrettoPoint, @@ -92,6 +95,8 @@ pub struct State { blockages: Scalar, } + +#[derive(Serialize, Deserialize)] pub struct Response { // The new attributes; the trust_level and invites_remaining are // implicit diff --git a/crates/lox-library/src/proto/issue_invite.rs b/crates/lox-library/src/proto/issue_invite.rs index 699b660..97446f3 100644 --- a/crates/lox-library/src/proto/issue_invite.rs +++ b/crates/lox-library/src/proto/issue_invite.rs @@ -54,12 +54,15 @@ use zkp::CompactProof; use zkp::ProofError; use zkp::Transcript; +use serde::{Serialize, Deserialize}; + use super::super::cred; use super::super::dup_filter::SeenType; use super::super::scalar_u32; use super::super::{BridgeAuth, IssuerPubKey}; use super::super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE}; +#[derive(Serialize, Deserialize)] pub struct Request { // Fields for blind showing the Lox credential P: RistrettoPoint, @@ -116,6 +119,7 @@ pub struct State { inv_id_client: Scalar, } +#[derive(Serialize, Deserialize)] pub struct Response { // The fields for the new Lox credential; the new invites_remaining // is one less than the old value, so we don't have to include it diff --git a/crates/lox-library/src/proto/level_up.rs b/crates/lox-library/src/proto/level_up.rs index 553cdcf..aa23249 100644 --- a/crates/lox-library/src/proto/level_up.rs +++ b/crates/lox-library/src/proto/level_up.rs @@ -47,6 +47,8 @@ use zkp::CompactProof; use zkp::ProofError; use zkp::Transcript; +use serde::{Serialize, Deserialize}; + use super::super::cred; use super::super::dup_filter::SeenType; use super::super::{pt_dbl, scalar_dbl, scalar_u32}; @@ -80,6 +82,7 @@ pub const LEVEL_INVITATIONS: [u32; MAX_LEVEL + 1] = [0, 2, 4, 6, 8]; // one or more bits to the ZKP. pub const MAX_BLOCKAGES: [u32; MAX_LEVEL + 1] = [0, 4, 3, 2, 2]; +#[derive(Serialize, Deserialize)] pub struct Request { // Fields for blind showing the Lox credential P: RistrettoPoint, @@ -148,6 +151,7 @@ pub struct State { blockages: Scalar, } +#[derive(Serialize, Deserialize)] pub struct Response { // The fields for the new Lox credential; the new trust level is one // more than the old trust level, so we don't have to include it diff --git a/crates/lox-library/src/proto/migration.rs b/crates/lox-library/src/proto/migration.rs index 27cb622..bce93fb 100644 --- a/crates/lox-library/src/proto/migration.rs +++ b/crates/lox-library/src/proto/migration.rs @@ -39,11 +39,14 @@ use zkp::CompactProof; use zkp::ProofError; use zkp::Transcript; +use serde::{Serialize, Deserialize}; + use super::super::cred; use super::super::dup_filter::SeenType; use super::super::{BridgeAuth, IssuerPubKey}; use super::super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE}; +#[derive(Serialize, Deserialize)] pub struct Request { // Fields for blind showing the Lox credential // We don't need to include invites_remaining or blockages, @@ -80,6 +83,7 @@ pub struct State { to_bucket: Scalar, } +#[derive(Serialize, Deserialize)] pub struct Response { // The new attributes; trust_level = 1 is implicit level_since: Scalar, diff --git a/crates/lox-library/src/proto/open_invite.rs b/crates/lox-library/src/proto/open_invite.rs index 45ce347..fb9e86d 100644 --- a/crates/lox-library/src/proto/open_invite.rs +++ b/crates/lox-library/src/proto/open_invite.rs @@ -22,6 +22,9 @@ use zkp::CompactProof; use zkp::ProofError; use zkp::Transcript; +use serde::{Serialize, Deserialize}; +use serde_big_array::big_array; + use super::super::bridge_table; use super::super::bridge_table::BridgeLine; use super::super::cred; @@ -30,16 +33,20 @@ use super::super::OPENINV_LENGTH; use super::super::{BridgeAuth, BridgeDb, IssuerPubKey}; use super::super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE}; +big_array! { BigArray; } + /// The request message for this protocol +#[derive(Serialize, Deserialize)] pub struct Request { + #[serde(with = "BigArray")] invite: [u8; OPENINV_LENGTH], D: RistrettoPoint, EncIdClient: (RistrettoPoint, RistrettoPoint), piUserBlinding: CompactProof, } -#[derive(Debug)] /// The client state for this protocol +#[derive(Debug)] pub struct State { d: Scalar, D: RistrettoPoint, @@ -48,6 +55,7 @@ pub struct State { } /// The response message for this protocol +#[derive(Serialize, Deserialize)] pub struct Response { P: RistrettoPoint, EncQ: (RistrettoPoint, RistrettoPoint), diff --git a/crates/lox-library/src/proto/redeem_invite.rs b/crates/lox-library/src/proto/redeem_invite.rs index 20570e3..ed285e9 100644 --- a/crates/lox-library/src/proto/redeem_invite.rs +++ b/crates/lox-library/src/proto/redeem_invite.rs @@ -30,6 +30,8 @@ use zkp::CompactProof; use zkp::ProofError; use zkp::Transcript; +use serde::{Serialize, Deserialize}; + use super::super::cred; use super::super::dup_filter::SeenType; use super::super::{pt_dbl, scalar_dbl, scalar_u32}; @@ -41,6 +43,7 @@ use super::super::{CMZ_A, CMZ_A_TABLE, CMZ_B, CMZ_B_TABLE}; /// also add bits to the zero knowledge proof. pub const INVITATION_EXPIRY: u32 = 15; +#[derive(Serialize, Deserialize)] pub struct Request { // Fields for showing the Invitation credential P: RistrettoPoint, @@ -82,6 +85,7 @@ pub struct State { blockages: Scalar, } +#[derive(Serialize, Deserialize)] pub struct Response { // The fields for the new Lox credential; the new trust level is 1 // and the new invites_remaining is 0, so we don't have to include