diff --git a/ipa-core/Cargo.toml b/ipa-core/Cargo.toml index 2eca7d8e7..8bf015974 100644 --- a/ipa-core/Cargo.toml +++ b/ipa-core/Cargo.toml @@ -18,7 +18,6 @@ default = [ "ipa-prf", ] cli = ["comfy-table", "clap"] -enable-serde = ["serde", "serde_json"] disable-metrics = [] # TODO move web-app to a separate crate. It adds a lot of build time to people who mostly write protocols # TODO Consider moving out benches as well @@ -28,7 +27,6 @@ web-app = [ "base64", "clap", "comfy-table", - "enable-serde", "hyper", "hyper-rustls", "rcgen", @@ -40,7 +38,7 @@ web-app = [ "tower", "tower-http", ] -test-fixture = ["enable-serde", "weak-field"] +test-fixture = ["weak-field"] # Include observability instruments that detect lack of progress inside MPC. If there is a bug that leads to helper # miscommunication, this feature helps to detect it. Turning it on has some cost. # If "shuttle" feature is enabled, turning this on has no effect. @@ -134,8 +132,8 @@ rustls-pemfile = { version = "1", optional = true } # we can remove pinning rustls-webpki = "^0.101.4" # TODO consider using zerocopy or serde_bytes or in-house serialization -serde = { version = "1.0", optional = true, features = ["derive"] } -serde_json = { version = "1.0", optional = true } +serde = { version = "1.0", features = ["derive"] } +serde_json = { version = "1.0" } sha2 = "0.10" shuttle-crate = { package = "shuttle", version = "0.6.1", optional = true } thiserror = "1.0" @@ -179,7 +177,7 @@ bench = false [[bin]] name = "ipa_bench" path = "src/bin/ipa_bench/ipa_bench.rs" -required-features = ["cli", "enable-serde"] +required-features = ["cli"] bench = false [[bin]] diff --git a/ipa-core/src/bin/ipa_bench/config.rs b/ipa-core/src/bin/ipa_bench/config.rs index 21bc41fa1..128577f9d 100644 --- a/ipa-core/src/bin/ipa_bench/config.rs +++ b/ipa-core/src/bin/ipa_bench/config.rs @@ -2,14 +2,12 @@ use std::ops::Range; use serde::{Deserialize, Serialize}; -#[cfg(feature = "enable-serde")] #[derive(Serialize, Deserialize, Debug)] pub struct WeightedIndex { pub index: T, pub weight: f64, } -#[cfg(feature = "enable-serde")] #[derive(Serialize, Deserialize, Debug)] pub struct Config { pub devices_per_user: Vec>, diff --git a/ipa-core/src/bin/ipa_bench/models.rs b/ipa-core/src/bin/ipa_bench/models.rs index cade92aaa..5391ac959 100644 --- a/ipa-core/src/bin/ipa_bench/models.rs +++ b/ipa-core/src/bin/ipa_bench/models.rs @@ -20,8 +20,7 @@ pub type Epoch = u8; /// An offset in seconds into a given epoch. Using an 32-bit value > 20-bit > 604,800 seconds. pub type Offset = u32; -#[derive(Debug, Clone)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct SecretShare { ss: [CipherText; 3], } @@ -119,8 +118,7 @@ impl SecretSharable for u64 { } } -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)] /// A timestamp of a source/trigger report represented by epoch and offset. /// /// Internally, the time is stored in `u32`, but the value is capped at `(Epoch::MAX + 1) * SECONDS_IN_EPOCH - 1`. @@ -206,8 +204,7 @@ impl From for u32 { } } -#[derive(Clone, Copy, Debug)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub struct Event { // An identifier, set in the user agent, which identifies an individual person. This must never be released (beyond /// the match key provider) to any party in unencrypted form. For the purpose of this tool, however, the value is in @@ -222,8 +219,7 @@ pub struct Event { pub timestamp: EventTimestamp, } -#[derive(Clone, Copy, Debug)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum GenericReport { /// An event produced on websites/apps when a user interacts with an ad (i.e. impression, click). Source { @@ -242,22 +238,20 @@ pub enum GenericReport { }, } -// TODO(taiki): Implement Serialize/Deserialize - -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] enum QueryType { SourceFanout, TriggerFanout, } -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Serialize, Deserialize)] enum Node { Helper1, Helper2, Helper3, } -#[cfg_attr(feature = "enable-serde", derive(Serialize))] +#[derive(Serialize)] struct IPAQuery { /// Caller authentication token. auth_token: PlainText, @@ -278,7 +272,7 @@ struct IPAQuery { reports: Vec, } -#[cfg_attr(feature = "enable-serde", derive(Serialize))] +#[derive(Serialize)] struct SourceFanoutQuery { query: IPAQuery, @@ -299,7 +293,7 @@ impl Debug for SourceFanoutQuery { } } -#[cfg_attr(feature = "enable-serde", derive(Serialize))] +#[derive(Serialize)] struct TriggerFanoutQuery { query: IPAQuery, diff --git a/ipa-core/src/cli/ipa_output.rs b/ipa-core/src/cli/ipa_output.rs index 466d324d0..7639d6810 100644 --- a/ipa-core/src/cli/ipa_output.rs +++ b/ipa-core/src/cli/ipa_output.rs @@ -1,9 +1,8 @@ use std::time::Duration; - +use serde::{Deserialize, Serialize}; use crate::helpers::query::{IpaQueryConfig, QuerySize}; -#[derive(Debug)] -#[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Serialize, Deserialize)] pub struct QueryResult { pub input_size: QuerySize, pub config: IpaQueryConfig, diff --git a/ipa-core/src/cli/noise.rs b/ipa-core/src/cli/noise.rs index b4cbb0af0..7a3e3e5ff 100644 --- a/ipa-core/src/cli/noise.rs +++ b/ipa-core/src/cli/noise.rs @@ -4,6 +4,7 @@ use std::{ fmt::{Debug, Display, Formatter}, }; +use serde::{Deserialize, Serialize}; use clap::Args; use rand::rngs::StdRng; use rand_core::SeedableRng; @@ -30,8 +31,7 @@ pub struct ApplyDpArgs { cap: u32, } -#[derive(Debug)] -#[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Serialize, Deserialize)] pub struct NoisyOutput { /// Aggregated breakdowns with noise applied. It is important to use unsigned values here /// to avoid bias/mean skew @@ -45,11 +45,10 @@ pub struct NoisyOutput { #[derive(Debug, Copy, Clone)] pub struct EpsilonBits(f64); -#[cfg(feature = "enable-serde")] -impl serde::Serialize for EpsilonBits { +impl Serialize for EpsilonBits { fn serialize(&self, serializer: S) -> Result where - S: serde::Serializer, + S: Serializer, { serializer.serialize_str(&self.0.to_string()) } diff --git a/ipa-core/src/error.rs b/ipa-core/src/error.rs index 0bd38cda2..b509d42ef 100644 --- a/ipa-core/src/error.rs +++ b/ipa-core/src/error.rs @@ -50,7 +50,6 @@ pub enum Error { #[error("runtime error")] RuntimeError(JoinError), #[error("failed to parse json: {0}")] - #[cfg(feature = "enable-serde")] Serde(#[from] serde_json::Error), #[error("MPC Infrastructure error: {0}")] MpcInfraError(#[from] crate::helpers::Error), diff --git a/ipa-core/src/ff/field.rs b/ipa-core/src/ff/field.rs index a7e9932ff..5e436fca6 100644 --- a/ipa-core/src/ff/field.rs +++ b/ipa-core/src/ff/field.rs @@ -4,6 +4,7 @@ use std::{ }; use typenum::{U1, U4}; +use serde::{Deserialize, Serialize}; use crate::{ protocol::prss::FromRandom, @@ -37,8 +38,7 @@ pub trait Field: const ONE: Self; } -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] #[cfg_attr(feature = "clap", derive(clap::ValueEnum))] pub enum FieldType { #[cfg(any(test, feature = "weak-field"))] diff --git a/ipa-core/src/helpers/mod.rs b/ipa-core/src/helpers/mod.rs index 1b4e287f8..46a821431 100644 --- a/ipa-core/src/helpers/mod.rs +++ b/ipa-core/src/helpers/mod.rs @@ -13,7 +13,7 @@ mod gateway; pub(crate) mod prss_protocol; pub mod stream; mod transport; - +use serde::{Deserialize, Serialize, Serializer}; use std::ops::{Index, IndexMut}; /// to validate that transport can actually send streams of this type @@ -81,22 +81,18 @@ pub const MESSAGE_PAYLOAD_SIZE_BYTES: usize = MessagePayloadArrayLen::USIZE; /// represents a helper's role within an MPC protocol, which may be different per protocol. /// `HelperIdentity` will be established at startup and then never change. Components that want to /// resolve this identifier into something (Uri, encryption keys, etc) must consult configuration -#[derive(Copy, Clone, Eq, PartialEq, Hash)] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Deserialize), - serde(try_from = "usize") -)] +#[derive(Copy, Clone, Eq, PartialEq, Hash, Deserialize)] +#[serde(try_from = "usize")] pub struct HelperIdentity { id: u8, } // Serialize as `serde(transparent)` would. Don't see how to enable that // for only one of (de)serialization. -impl serde::Serialize for HelperIdentity { +impl Serialize for HelperIdentity { fn serialize(&self, serializer: S) -> std::result::Result where - S: serde::Serializer, + S: Serializer, { self.id.serialize(serializer) } @@ -219,26 +215,18 @@ impl IndexMut for Vec { /// may be `H2` or `H3`. /// Each helper instance must be able to take any role, but once the role is assigned, it cannot /// be changed for the remainder of the query. -#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] #[cfg_attr(feature = "cli", derive(clap::ValueEnum))] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Serialize, serde::Deserialize), - serde(into = "&'static str", try_from = "&str") -)] +#[serde(into = "&'static str", try_from = "&str")] pub enum Role { H1 = 0, H2 = 1, H3 = 2, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr(test, derive(PartialEq, Eq))] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Serialize, serde::Deserialize), - serde(transparent) -)] +#[serde(transparent)] pub struct RoleAssignment { helper_roles: [HelperIdentity; 3], } diff --git a/ipa-core/src/helpers/transport/query/mod.rs b/ipa-core/src/helpers/transport/query/mod.rs index 5cbaa7aaf..41e673ed2 100644 --- a/ipa-core/src/helpers/transport/query/mod.rs +++ b/ipa-core/src/helpers/transport/query/mod.rs @@ -16,15 +16,13 @@ use crate::{ protocol::{step::Step, QueryId}, }; -#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize))] +#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Serialize)] pub struct QuerySize(u32); impl QuerySize { pub const MAX: u32 = 1_000_000_000; } -#[cfg(feature = "enable-serde")] impl<'de> Deserialize<'de> for QuerySize { fn deserialize(deserializer: D) -> Result where @@ -84,9 +82,8 @@ impl From for usize { } } -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, Serialize, Deserialize)] #[cfg_attr(test, derive(PartialEq, Eq))] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] pub struct QueryConfig { pub size: QuerySize, pub field_type: FieldType, @@ -99,9 +96,8 @@ pub enum QueryConfigError { BadQuerySize(#[from] BadQuerySizeError), } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr(test, derive(PartialEq, Eq))] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] pub struct PrepareQuery { pub query_id: QueryId, pub config: QueryConfig, @@ -123,15 +119,10 @@ impl RouteParams for &QueryConfig { NoStep } - #[cfg(feature = "enable-serde")] fn extra(&self) -> Self::Params { serde_json::to_string(self).unwrap() } - #[cfg(not(feature = "enable-serde"))] - fn extra(&self) -> Self::Params { - unimplemented!() - } } impl From<&QueryConfig> for GatewayConfig { @@ -177,15 +168,10 @@ impl RouteParams for &PrepareQuery { NoStep } - #[cfg(feature = "enable-serde")] fn extra(&self) -> Self::Params { serde_json::to_string(self).unwrap() } - #[cfg(not(feature = "enable-serde"))] - fn extra(&self) -> Self::Params { - unimplemented!() - } } pub struct QueryInput { @@ -199,8 +185,7 @@ impl Debug for QueryInput { } } -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)] pub enum QueryType { #[cfg(any(test, feature = "test-fixture", feature = "cli"))] TestMultiply, @@ -225,8 +210,7 @@ impl AsRef for QueryType { impl Step for QueryType {} -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "clap", derive(clap::Args))] pub struct IpaQueryConfig { #[cfg_attr(feature = "clap", arg(long, default_value = "8"))] @@ -331,8 +315,7 @@ impl std::fmt::Display for ContributionBits { } } -#[derive(Debug, Copy, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct SparseAggregateQueryConfig { pub contribution_bits: ContributionBits, pub num_contributions: u32, diff --git a/ipa-core/src/helpers/transport/query/oprf_shuffle.rs b/ipa-core/src/helpers/transport/query/oprf_shuffle.rs index c39242902..ac9ea5673 100644 --- a/ipa-core/src/helpers/transport/query/oprf_shuffle.rs +++ b/ipa-core/src/helpers/transport/query/oprf_shuffle.rs @@ -1,5 +1,4 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)] -#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[derive(Debug, Copy, Clone, PartialEq, Eq, Default, Serialize, Deserialize)] pub struct QueryConfig {} diff --git a/ipa-core/src/lib.rs b/ipa-core/src/lib.rs index e9db2d679..a4fafdef5 100644 --- a/ipa-core/src/lib.rs +++ b/ipa-core/src/lib.rs @@ -9,7 +9,7 @@ #[cfg(any(feature = "cli", feature = "web-app"))] pub mod cli; -#[cfg(all(feature = "enable-serde", feature = "web-app"))] +#[cfg( feature = "web-app")] pub mod config; pub mod error; pub mod ff; @@ -29,7 +29,6 @@ pub mod test_fixture; mod app; mod seq_join; -#[cfg(feature = "enable-serde")] mod serde; mod sharding; diff --git a/ipa-core/src/net/http_serde.rs b/ipa-core/src/net/http_serde.rs index 72ad9ceb2..d6a6f48c8 100644 --- a/ipa-core/src/net/http_serde.rs +++ b/ipa-core/src/net/http_serde.rs @@ -8,12 +8,12 @@ pub mod echo { use async_trait::async_trait; use axum::extract::{FromRequest, Query, RequestParts}; + use serde::{Deserialize, Serialize}; use hyper::http::uri; use crate::net::Error; - #[derive(Debug, Default, Clone, PartialEq, Eq)] - #[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct Request { pub query_params: HashMap, pub headers: HashMap, @@ -54,7 +54,6 @@ pub mod echo { } } - #[cfg(feature = "enable-serde")] #[async_trait] impl FromRequest for Request { type Rejection = Error; @@ -80,6 +79,7 @@ pub mod echo { } pub mod query { + use serde::Deserialize; use std::fmt::{Display, Formatter}; use async_trait::async_trait; @@ -108,7 +108,7 @@ pub mod query { type Rejection = Error; async fn from_request(req: &mut RequestParts) -> Result { - #[derive(serde::Deserialize)] + #[derive(Deserialize)] struct QueryTypeParam { size: QuerySize, field_type: FieldType, @@ -173,6 +173,8 @@ pub mod query { pub const BASE_AXUM_PATH: &str = "/query"; pub mod create { + + use serde::{Deserialize, Serialize}; use async_trait::async_trait; use axum::extract::{FromRequest, RequestParts}; use hyper::http::uri; @@ -224,7 +226,7 @@ pub mod query { } } - #[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Serialize, Deserialize)] pub struct ResponseBody { pub query_id: QueryId, } @@ -233,6 +235,7 @@ pub mod query { } pub mod prepare { + use serde::{Deserialize, Serialize}; use async_trait::async_trait; use axum::{ extract::{FromRequest, Path, RequestParts}, @@ -303,7 +306,7 @@ pub mod query { } } - #[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Serialize, Deserialize)] struct RequestBody { roles: RoleAssignment, } diff --git a/ipa-core/src/protocol/mod.rs b/ipa-core/src/protocol/mod.rs index 3d973ae8f..e45041eeb 100644 --- a/ipa-core/src/protocol/mod.rs +++ b/ipa-core/src/protocol/mod.rs @@ -12,7 +12,7 @@ use std::{ hash::Hash, ops::{Add, AddAssign}, }; - +use serde::{Deserialize, Serialize}; pub use basics::BasicProtocols; use crate::{ @@ -30,12 +30,8 @@ pub type Timestamp = Gf20Bit; /// them collaborating on constructing this unique id. These details haven't been flushed out yet, /// so for now it is just an empty struct. Once we know more about it, we will make necessary /// amendments to it -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] -#[cfg_attr( - feature = "serde", - derive(serde::Serialize, serde::Deserialize), - serde(into = "&'static str", try_from = "&str") -)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(into = "&'static str", try_from = "&str")] pub struct QueryId; impl Display for QueryId { @@ -78,8 +74,7 @@ impl TryFrom<&str> for QueryId { /// Unique identifier of the record inside the query. Support up to `$2^32$` max records because /// of the assumption that the maximum input is 1B records per query. -#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] -#[cfg_attr(feature = "enable-serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] pub struct RecordId(u32); impl Display for RecordId { diff --git a/ipa-core/src/protocol/step/compact.rs b/ipa-core/src/protocol/step/compact.rs index 985954b55..2c9ae3498 100644 --- a/ipa-core/src/protocol/step/compact.rs +++ b/ipa-core/src/protocol/step/compact.rs @@ -1,16 +1,12 @@ use std::fmt::{Debug, Display, Formatter}; use ipa_macros::Gate; - +use serde::{Deserialize, Serialize}; use super::StepNarrow; use crate::helpers::{prss_protocol::PrssExchangeStep, query::QueryType}; -#[derive(Gate, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Default)] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Deserialize), - serde(from = "&str") -)] +#[derive(Gate, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Default, Deserialize)] +#[serde(from = "&str")] pub struct Compact(pub u16); // serde::Deserialize requires From<&str> implementation diff --git a/ipa-core/src/protocol/step/descriptive.rs b/ipa-core/src/protocol/step/descriptive.rs index dc13e40a1..1f1e27163 100644 --- a/ipa-core/src/protocol/step/descriptive.rs +++ b/ipa-core/src/protocol/step/descriptive.rs @@ -1,5 +1,5 @@ use std::fmt::{Debug, Display, Formatter}; - +use serde::{Deserialize}; use super::{Step, StepNarrow}; #[cfg(feature = "step-trace")] use crate::telemetry::{labels::STEP, metrics::STEP_NARROWED}; @@ -22,12 +22,8 @@ use crate::telemetry::{labels::STEP, metrics::STEP_NARROWED}; /// Step "a" would be executed with a context identifier of "protocol/a", which it /// would `narrow()` into "protocol/a/x" and "protocol/a/y" to produce a final set /// of identifiers: ".../a/x", ".../a/y", ".../b", and ".../c". -#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord)] -#[cfg_attr( - feature = "enable-serde", - derive(serde::Deserialize), - serde(from = "&str") -)] +#[derive(Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Deserialize)] +#[serde(from = "&str")] pub struct Descriptive { id: String, }