use base64::{engine::Engine as _, prelude::BASE64_STANDARD};
use env_logger::Env;
use log::info;
use ppoprf::ppoprf;
use reqwest::blocking::Client as HttpClient;
use serde::{Deserialize, Serialize};
fn fetch_ident(url: &str) -> reqwest::Result<()> {
let res = HttpClient::new().get(url).send()?;
let status = res.status();
let text = res.text()?;
info!("{} - {}", status, text);
Ok(())
}
#[derive(Serialize)]
struct Query {
name: String,
points: Vec<ppoprf::Point>,
}
#[derive(Deserialize)]
struct Response {
name: String,
results: Vec<ppoprf::Evaluation>,
}
fn fetch_randomness(url: &str) -> reqwest::Result<()> {
let message = "ppoprf test client";
let (blinded_message, r) = ppoprf::Client::blind(message.as_bytes());
let query = Query {
name: "example client".into(),
points: vec![blinded_message],
};
let res = HttpClient::new().post(url).json(&query).send()?;
let status = res.status();
let result = res.json::<Response>()?;
let results = result.results;
info!(
"{} {} - {} points returned",
status,
result.name,
results.len()
);
assert_eq!(
query.points.len(),
results.len(),
"Server returned a different number of points!"
);
assert_eq!(results.len(), 1, "Expected one point!");
if let Some(result) = results.first() {
let unblinded = ppoprf::Client::unblind(&result.output, &r);
let point = BASE64_STANDARD.encode(unblinded.as_bytes());
let proof = result.proof.is_some();
let meta = if proof { " proof" } else { "" };
info!(" {}{}", &point, &meta);
}
Ok(())
}
fn main() {
let url = "http://localhost:8080";
env_logger::init_from_env(Env::default().default_filter_or("info"));
info!("Contacting server at {}", url);
fetch_ident(url).unwrap();
fetch_randomness(url).unwrap();
}