Skip to content

Commit

Permalink
In case decryption fails, do not error out
Browse files Browse the repository at this point in the history
  • Loading branch information
richajaindce committed Sep 10, 2024
1 parent f199c46 commit afbe29c
Showing 1 changed file with 61 additions and 56 deletions.
117 changes: 61 additions & 56 deletions ipa-core/src/cli/crypto.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
use crate::report::InvalidReportError;
use clap::Parser;
use rand::thread_rng;
use std::{
fmt::Debug,
fs::{read_to_string, File, OpenOptions},
Expand All @@ -6,9 +9,6 @@ use std::{
path::PathBuf,
};

use clap::Parser;
use rand::thread_rng;

use crate::{
cli::playbook::{BreakdownKey, InputSource, Timestamp, TriggerValue},
config::{hpke_registry, HpkeServerConfig, KeyRegistries, NetworkConfig},
Expand Down Expand Up @@ -146,16 +146,15 @@ impl DecryptedReports {
}

impl Iterator for DecryptedReports {
type Item = OprfReport<BA8, BA3, BA20>;
type Item = Result<OprfReport<BA8, BA3, BA20>, InvalidReportError>;

fn next(&mut self) -> Option<Self::Item> {
let mut line = String::new();
if self.reader.read_line(&mut line).unwrap() > 0 {
let encrypted_report_bytes = hex::decode(line.trim()).unwrap();
let enc_report =
EncryptedOprfReport::from_bytes(encrypted_report_bytes.as_slice()).unwrap();
let dec_report: OprfReport<BA8, BA3, BA20> =
enc_report.decrypt(&self.key_registry).unwrap();
let dec_report = enc_report.decrypt(&self.key_registry);
Some(dec_report)
} else {
None
Expand All @@ -182,57 +181,63 @@ pub async fn decrypt_and_reconstruct(args: DecryptArgs) -> Result<(), BoxError>
.open(args.output_file)?,
);

for (dec_report1, (dec_report2, dec_report3)) in
decrypted_reports1.zip(decrypted_reports2.zip(decrypted_reports3))
for (idx, (dec_report1, (dec_report2, dec_report3))) in decrypted_reports1
.zip(decrypted_reports2.zip(decrypted_reports3))
.enumerate()
{
let timestamp = [
dec_report1.timestamp,
dec_report2.timestamp,
dec_report3.timestamp,
]
.reconstruct()
.as_u128();

let match_key = [
dec_report1.match_key,
dec_report2.match_key,
dec_report3.match_key,
]
.reconstruct()
.as_u128();

// these aren't reconstucted, so we explictly make sure
// they are consistent across all three files, then set
// it to the first one (without loss of generality)
assert_eq!(dec_report1.event_type, dec_report2.event_type);
assert_eq!(dec_report2.event_type, dec_report3.event_type);
let is_trigger_report = dec_report1.event_type == EventType::Trigger;

let breakdown_key = [
dec_report1.breakdown_key,
dec_report2.breakdown_key,
dec_report3.breakdown_key,
]
.reconstruct()
.as_u128();

let trigger_value = [
dec_report1.trigger_value,
dec_report2.trigger_value,
dec_report3.trigger_value,
]
.reconstruct()
.as_u128();

writeln!(
writer,
"{},{},{},{},{}",
timestamp,
match_key,
u8::from(is_trigger_report),
breakdown_key,
trigger_value,
)?;
match (dec_report1, dec_report2, dec_report3) {
(Ok(dec_report1), Ok(dec_report2), Ok(dec_report3)) => {
let timestamp = [
dec_report1.timestamp,
dec_report2.timestamp,
dec_report3.timestamp,
]
.reconstruct()
.as_u128();

let match_key = [
dec_report1.match_key,
dec_report2.match_key,
dec_report3.match_key,
]
.reconstruct()
.as_u128();

// these aren't reconstucted, so we explictly make sure
// they are consistent across all three files, then set
// it to the first one (without loss of generality)
assert_eq!(dec_report1.event_type, dec_report2.event_type);
assert_eq!(dec_report2.event_type, dec_report3.event_type);
let is_trigger_report = dec_report1.event_type == EventType::Trigger;

let breakdown_key = [
dec_report1.breakdown_key,
dec_report2.breakdown_key,
dec_report3.breakdown_key,
]
.reconstruct()
.as_u128();

let trigger_value = [
dec_report1.trigger_value,
dec_report2.trigger_value,
dec_report3.trigger_value,
]
.reconstruct()
.as_u128();

writeln!(
writer,
"{},{},{},{},{}",
timestamp,
match_key,
u8::from(is_trigger_report),
breakdown_key,
trigger_value,
)?;
}
_ => println!("Decryption failed for record no {idx}"),
}
}

Ok(())
Expand Down

0 comments on commit afbe29c

Please sign in to comment.