Skip to content

Commit cf7efd4

Browse files
authored
Add info fields to Hybrid Report Structs (#1469)
Add info fields to Hybrid Report Structs and change encryption interfaces to no longer require info More specifically: Removes Serializable trait from HybridReport Rewrites HybridInfo and related structs to be serializable and deserializable Adds these info structs to report structs (as a struct for HybridReport, as bytes for EncryptedHybridReport) Changes the encryption/decryption interfaces to not require an Info argument (grabbed from the report instead) Changes TestHybridRecord to include info fields
1 parent dca5be7 commit cf7efd4

File tree

9 files changed

+685
-290
lines changed

9 files changed

+685
-290
lines changed

ipa-core/src/cli/csv.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,25 @@ impl Serializer for crate::test_fixture::hybrid::TestHybridRecord {
2828
crate::test_fixture::hybrid::TestHybridRecord::TestImpression {
2929
match_key,
3030
breakdown_key,
31+
key_id,
32+
helper_origin,
3133
} => {
32-
write!(buf, "i,{match_key},{breakdown_key}")?;
34+
write!(
35+
buf,
36+
"i,{match_key},{breakdown_key},{key_id},{helper_origin}"
37+
)?;
3338
}
34-
crate::test_fixture::hybrid::TestHybridRecord::TestConversion { match_key, value } => {
35-
write!(buf, "c,{match_key},{value}")?;
39+
crate::test_fixture::hybrid::TestHybridRecord::TestConversion {
40+
match_key,
41+
value,
42+
key_id,
43+
helper_origin,
44+
conversion_site_domain,
45+
timestamp,
46+
epsilon,
47+
sensitivity,
48+
} => {
49+
write!(buf, "c,{match_key},{value},{key_id},{helper_origin},{conversion_site_domain},{timestamp},{epsilon},{sensitivity}")?;
3650
}
3751
}
3852

ipa-core/src/cli/playbook/input.rs

Lines changed: 73 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -59,34 +59,81 @@ impl InputItem for TestRawDataRecord {
5959

6060
impl InputItem for TestHybridRecord {
6161
fn from_str(s: &str) -> Self {
62-
if let [event_type, match_key, number] = s.splitn(3, ',').collect::<Vec<_>>()[..] {
63-
let match_key: u64 = match_key
64-
.parse()
65-
.unwrap_or_else(|e| panic!("Expected an u64, got {match_key}: {e}"));
66-
67-
let number: u32 = number
68-
.parse()
69-
.unwrap_or_else(|e| panic!("Expected an u32, got {number}: {e}"));
70-
71-
match event_type {
72-
"i" => TestHybridRecord::TestImpression {
73-
match_key,
74-
breakdown_key: number,
75-
},
76-
77-
"c" => TestHybridRecord::TestConversion {
78-
match_key,
79-
value: number,
80-
},
81-
_ => panic!(
82-
"{}",
83-
format!(
62+
let event_type = s.chars().nth(0).unwrap();
63+
match event_type {
64+
'i' => {
65+
if let [_, match_key, number, key_id, helper_origin] =
66+
s.splitn(5, ',').collect::<Vec<_>>()[..]
67+
{
68+
let match_key: u64 = match_key
69+
.parse()
70+
.unwrap_or_else(|e| panic!("Expected a u64, got {match_key}: {e}"));
71+
72+
let number: u32 = number
73+
.parse()
74+
.unwrap_or_else(|e| panic!("Expected a u32, got {number}: {e}"));
75+
76+
let key_id: u8 = key_id
77+
.parse()
78+
.unwrap_or_else(|e| panic!("Expected a u8, got {key_id}: {e}"));
79+
TestHybridRecord::TestImpression {
80+
match_key,
81+
breakdown_key: number,
82+
key_id,
83+
helper_origin: helper_origin.to_string(),
84+
}
85+
} else {
86+
panic!("{s} is not a valid {}", type_name::<Self>())
87+
}
88+
}
89+
90+
'c' => {
91+
if let [_, match_key, number, key_id, helper_origin, conversion_site_domain, timestamp, epsilon, sensitivity] =
92+
s.splitn(9, ',').collect::<Vec<_>>()[..]
93+
{
94+
let match_key: u64 = match_key
95+
.parse()
96+
.unwrap_or_else(|e| panic!("Expected a u64, got {match_key}: {e}"));
97+
98+
let number: u32 = number
99+
.parse()
100+
.unwrap_or_else(|e| panic!("Expected a u32, got {number}: {e}"));
101+
102+
let key_id: u8 = key_id
103+
.parse()
104+
.unwrap_or_else(|e| panic!("Expected a u8, got {key_id}: {e}"));
105+
106+
let timestamp: u64 = timestamp
107+
.parse()
108+
.unwrap_or_else(|e| panic!("Expected a u64, got {timestamp}: {e}"));
109+
110+
let epsilon: f64 = epsilon
111+
.parse()
112+
.unwrap_or_else(|e| panic!("Expected an f64, got {epsilon}: {e}"));
113+
114+
let sensitivity: f64 = sensitivity
115+
.parse()
116+
.unwrap_or_else(|e| panic!("Expected an f64, got {sensitivity}: {e}"));
117+
TestHybridRecord::TestConversion {
118+
match_key,
119+
value: number,
120+
key_id,
121+
helper_origin: helper_origin.to_string(),
122+
conversion_site_domain: conversion_site_domain.to_string(),
123+
timestamp,
124+
epsilon,
125+
sensitivity,
126+
}
127+
} else {
128+
panic!("{s} is not a valid {}", type_name::<Self>())
129+
}
130+
}
131+
_ => panic!(
132+
"{}",
133+
format!(
84134
"Invalid input. Rows should start with 'i' or 'c'. Did not expect {event_type}"
85135
)
86-
),
87-
}
88-
} else {
89-
panic!("{s} is not a valid {}", type_name::<Self>())
136+
),
90137
}
91138
}
92139
}

ipa-core/src/protocol/hybrid/agg.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,65 +193,128 @@ pub mod test {
193193
const SHARD1_MKS: [u64; 7] = [12345, 12345, 34567, 34567, 78901, 78901, 78901];
194194
const SHARD2_MKS: [u64; 7] = [23456, 23456, 45678, 56789, 67890, 67890, 67890];
195195

196+
#[allow(clippy::too_many_lines)]
196197
fn get_records() -> Vec<TestHybridRecord> {
198+
let helper_origin = "HELPER_ORIGIN".to_string();
199+
let conversion_site_domain = "meta.com".to_string();
197200
let shard1_records = [
198201
TestHybridRecord::TestImpression {
199202
match_key: SHARD1_MKS[0],
200203
breakdown_key: 45,
204+
key_id: 0,
205+
helper_origin: helper_origin.clone(),
201206
},
202207
TestHybridRecord::TestConversion {
203208
match_key: SHARD1_MKS[1],
204209
value: 1,
210+
key_id: 0,
211+
helper_origin: helper_origin.clone(),
212+
conversion_site_domain: conversion_site_domain.clone(),
213+
timestamp: 102,
214+
epsilon: 0.0,
215+
sensitivity: 0.0,
205216
}, // attributed
206217
TestHybridRecord::TestConversion {
207218
match_key: SHARD1_MKS[2],
208219
value: 3,
220+
key_id: 0,
221+
helper_origin: helper_origin.clone(),
222+
conversion_site_domain: conversion_site_domain.clone(),
223+
timestamp: 103,
224+
epsilon: 0.0,
225+
sensitivity: 0.0,
209226
},
210227
TestHybridRecord::TestConversion {
211228
match_key: SHARD1_MKS[3],
212229
value: 4,
230+
key_id: 0,
231+
helper_origin: helper_origin.clone(),
232+
conversion_site_domain: conversion_site_domain.clone(),
233+
timestamp: 104,
234+
epsilon: 0.0,
235+
sensitivity: 0.0,
213236
}, // not attibuted, but duplicated conversion. will land in breakdown_key 0
214237
TestHybridRecord::TestImpression {
215238
match_key: SHARD1_MKS[4],
216239
breakdown_key: 1,
240+
key_id: 0,
241+
helper_origin: helper_origin.clone(),
217242
}, // duplicated impression with same match_key
218243
TestHybridRecord::TestImpression {
219244
match_key: SHARD1_MKS[4],
220245
breakdown_key: 2,
246+
key_id: 0,
247+
helper_origin: helper_origin.clone(),
221248
}, // duplicated impression with same match_key
222249
TestHybridRecord::TestConversion {
223250
match_key: SHARD1_MKS[5],
224251
value: 7,
252+
key_id: 0,
253+
helper_origin: helper_origin.clone(),
254+
conversion_site_domain: conversion_site_domain.clone(),
255+
timestamp: 105,
256+
epsilon: 0.0,
257+
sensitivity: 0.0,
225258
}, // removed
226259
];
227260
let shard2_records = [
228261
TestHybridRecord::TestImpression {
229262
match_key: SHARD2_MKS[0],
230263
breakdown_key: 56,
264+
key_id: 0,
265+
helper_origin: helper_origin.clone(),
231266
},
232267
TestHybridRecord::TestConversion {
233268
match_key: SHARD2_MKS[1],
234269
value: 2,
270+
key_id: 0,
271+
helper_origin: helper_origin.clone(),
272+
conversion_site_domain: conversion_site_domain.clone(),
273+
timestamp: 100,
274+
epsilon: 0.0,
275+
sensitivity: 0.0,
235276
}, // attributed
236277
TestHybridRecord::TestImpression {
237278
match_key: SHARD2_MKS[2],
238279
breakdown_key: 78,
280+
key_id: 0,
281+
helper_origin: helper_origin.clone(),
239282
}, // NOT attributed
240283
TestHybridRecord::TestConversion {
241284
match_key: SHARD2_MKS[3],
242285
value: 5,
286+
key_id: 0,
287+
helper_origin: helper_origin.clone(),
288+
conversion_site_domain: conversion_site_domain.clone(),
289+
timestamp: 101,
290+
epsilon: 0.0,
291+
sensitivity: 0.0,
243292
}, // NOT attributed
244293
TestHybridRecord::TestImpression {
245294
match_key: SHARD2_MKS[4],
246295
breakdown_key: 90,
296+
key_id: 0,
297+
helper_origin: helper_origin.clone(),
247298
}, // attributed twice, removed
248299
TestHybridRecord::TestConversion {
249300
match_key: SHARD2_MKS[5],
250301
value: 6,
302+
key_id: 0,
303+
helper_origin: helper_origin.clone(),
304+
conversion_site_domain: conversion_site_domain.clone(),
305+
timestamp: 102,
306+
epsilon: 0.0,
307+
sensitivity: 0.0,
251308
}, // attributed twice, removed
252309
TestHybridRecord::TestConversion {
253310
match_key: SHARD2_MKS[6],
254311
value: 7,
312+
key_id: 0,
313+
helper_origin: helper_origin.clone(),
314+
conversion_site_domain: conversion_site_domain.clone(),
315+
timestamp: 103,
316+
epsilon: 0.0,
317+
sensitivity: 0.0,
255318
}, // attributed twice, removed
256319
];
257320

ipa-core/src/protocol/hybrid/oprf.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ mod test {
216216
};
217217

218218
#[test]
219+
#[allow(clippy::too_many_lines)]
219220
fn hybrid_oprf() {
220221
run(|| async {
221222
const SHARDS: usize = 2;
@@ -229,26 +230,50 @@ mod test {
229230
TestHybridRecord::TestImpression {
230231
match_key: 12345,
231232
breakdown_key: 2,
233+
key_id: 0,
234+
helper_origin: "HELPER_ORIGIN".to_string(),
232235
},
233236
TestHybridRecord::TestImpression {
234237
match_key: 68362,
235238
breakdown_key: 1,
239+
key_id: 0,
240+
helper_origin: "HELPER_ORIGIN".to_string(),
236241
},
237242
TestHybridRecord::TestConversion {
238243
match_key: 12345,
239244
value: 5,
245+
key_id: 0,
246+
helper_origin: "HELPER_ORIGIN".to_string(),
247+
conversion_site_domain: "meta.com".to_string(),
248+
timestamp: 100,
249+
epsilon: 0.0,
250+
sensitivity: 0.0,
240251
},
241252
TestHybridRecord::TestConversion {
242253
match_key: 68362,
243254
value: 2,
255+
key_id: 0,
256+
helper_origin: "HELPER_ORIGIN".to_string(),
257+
conversion_site_domain: "meta.com".to_string(),
258+
timestamp: 102,
259+
epsilon: 0.0,
260+
sensitivity: 0.0,
244261
},
245262
TestHybridRecord::TestImpression {
246263
match_key: 68362,
247264
breakdown_key: 1,
265+
key_id: 0,
266+
helper_origin: "HELPER_ORIGIN".to_string(),
248267
},
249268
TestHybridRecord::TestConversion {
250269
match_key: 68362,
251270
value: 7,
271+
key_id: 0,
272+
helper_origin: "HELPER_ORIGIN".to_string(),
273+
conversion_site_domain: "meta.com".to_string(),
274+
timestamp: 104,
275+
epsilon: 0.0,
276+
sensitivity: 0.0,
252277
},
253278
];
254279

0 commit comments

Comments
 (0)