Skip to content

Commit 1786a25

Browse files
fix: Remove inlined circuit data bytes (#429)
* load artifacts from fs * expose setup data in wasm * expose setup data in ios * add swift code --------- Co-authored-by: devloper <3347622+devloper@users.noreply.github.com> Co-authored-by: Tracy <devloper@users.noreply.github.com>
1 parent c6942c7 commit 1786a25

File tree

15 files changed

+387
-134
lines changed

15 files changed

+387
-134
lines changed

client/src/errors.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ pub enum ClientErrors {
9999
#[error(transparent)]
100100
Canceled(#[from] futures::channel::oneshot::Canceled),
101101

102+
#[error("Missing setup data")]
103+
MissingSetupData,
104+
102105
#[error("Manifest missing")]
103106
ManifestMissingError,
104107

client/src/lib.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@ mod tls;
1616
pub mod tls_client_async2;
1717
use std::collections::HashMap;
1818

19-
use proofs::{program::manifest::NIVCRom, proof::FoldingProof};
19+
pub use proofs::program::data::UninitializedSetup;
20+
use proofs::{
21+
circuits::{construct_setup_data_from_fs, CIRCUIT_SIZE_512},
22+
program::manifest::NIVCRom,
23+
proof::FoldingProof,
24+
};
2025
use serde::{Deserialize, Serialize};
2126
pub use tlsn_core::proof::TlsProof;
2227
use tlsn_prover::tls::ProverConfig;
@@ -52,11 +57,12 @@ pub fn get_web_prover_circuits_version() -> String {
5257
pub async fn prover_inner(
5358
config: config::Config,
5459
proving_params: Option<Vec<u8>>,
60+
setup_data: Option<UninitializedSetup>,
5561
) -> Result<Proof, ClientErrors> {
5662
info!("GIT_HASH: {}", env!("GIT_HASH"));
5763
match config.mode {
5864
config::NotaryMode::TLSN => prover_inner_tlsn(config).await,
59-
config::NotaryMode::Origo => prover_inner_origo(config, proving_params).await,
65+
config::NotaryMode::Origo => prover_inner_origo(config, proving_params, setup_data).await,
6066
config::NotaryMode::TEE => prover_inner_tee(config).await,
6167
config::NotaryMode::Proxy => prover_inner_proxy(config).await,
6268
}
@@ -99,10 +105,22 @@ pub async fn prover_inner_tlsn(mut config: config::Config) -> Result<Proof, Clie
99105
pub async fn prover_inner_origo(
100106
config: config::Config,
101107
proving_params: Option<Vec<u8>>,
108+
setup_data: Option<UninitializedSetup>,
102109
) -> Result<Proof, ClientErrors> {
103110
let session_id = config.session_id.clone();
104111

105-
let mut proof = origo::proxy_and_sign_and_generate_proof(config.clone(), proving_params).await?;
112+
let setup_data = if let Some(setup_data) = setup_data {
113+
Ok(setup_data)
114+
} else if !cfg!(target_os = "ios") && !cfg!(target_arch = "wasm32") {
115+
// TODO: How do we decide which CIRCUIT_SIZE_* to use here?
116+
construct_setup_data_from_fs::<CIRCUIT_SIZE_512>()
117+
.map_err(|e| ClientErrors::Other(e.to_string()))
118+
} else {
119+
Err(ClientErrors::MissingSetupData)
120+
}?;
121+
122+
let mut proof =
123+
origo::proxy_and_sign_and_generate_proof(config.clone(), proving_params, setup_data).await?;
106124

107125
let manifest = config.proving.manifest.clone().ok_or(ClientErrors::ManifestMissingError)?;
108126

client/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ async fn main() -> Result<(), ClientErrors> {
3333
let mut config: Config = serde_json::from_str(&config_json)?;
3434
config.set_session_id();
3535

36-
let proving_params = std::fs::read(proofs::circuits::PROVING_PARAMS_512).unwrap();
37-
let proof = client::prover_inner(config, Some(proving_params)).await?;
36+
let proving_params = std::fs::read(proofs::circuits::PROVING_PARAMS_512)?;
37+
let proof = client::prover_inner(config, Some(proving_params), None).await?;
3838
let proof_json = serde_json::to_string_pretty(&proof)?;
3939
println!("Proving Successful: proof_len={:?}", proof_json.len());
4040
Ok(())

client/src/origo.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
use std::collections::HashMap;
33

44
use proofs::{
5-
circuits::construct_setup_data,
65
program::{
7-
data::{Offline, SetupParams},
6+
data::{Offline, SetupParams, UninitializedSetup},
87
manifest::{EncryptionInput, OrigoManifest, TLSEncryption},
98
},
109
F, G1, G2,
@@ -107,7 +106,7 @@ pub async fn verify(
107106
};
108107

109108
let response = client.post(url).json(&verify_body).send().await?;
110-
assert!(response.status() == hyper::StatusCode::OK, "response={:?}", response);
109+
assert_eq!(response.status(), hyper::StatusCode::OK, "response={:?}", response);
111110
let verify_response = response.json::<SignedVerificationReply>().await?;
112111

113112
debug!("\n{:?}\n\n", verify_response.clone());
@@ -119,6 +118,7 @@ pub async fn verify(
119118
pub(crate) async fn proxy_and_sign_and_generate_proof(
120119
config: config::Config,
121120
proving_params: Option<Vec<u8>>,
121+
setup_data: UninitializedSetup,
122122
) -> Result<OrigoProof, ClientErrors> {
123123
let session_id = config.session_id.clone();
124124

@@ -138,7 +138,6 @@ pub(crate) async fn proxy_and_sign_and_generate_proof(
138138

139139
let _sign_data = crate::origo::sign(config.clone(), session_id.clone(), sb).await;
140140

141-
debug!("generating program data!");
142141
let witness = origo_conn.to_witness_data();
143142

144143
// decrypt TLS ciphertext for request and response and create NIVC inputs
@@ -151,6 +150,7 @@ pub(crate) async fn proxy_and_sign_and_generate_proof(
151150
let mut proof = generate_proof(
152151
&manifest.clone().into(),
153152
&proving_params.unwrap(),
153+
&setup_data,
154154
&request_inputs,
155155
&response_inputs,
156156
)
@@ -170,28 +170,28 @@ pub(crate) async fn proxy_and_sign_and_generate_proof(
170170
pub(crate) async fn generate_proof(
171171
manifest: &OrigoManifest,
172172
proving_params: &[u8],
173+
setup_data: &UninitializedSetup,
173174
request_inputs: &EncryptionInput,
174175
response_inputs: &EncryptionInput,
175176
) -> Result<OrigoProof, ClientErrors> {
176-
let setup_data = construct_setup_data::<{ proofs::circuits::CIRCUIT_SIZE_512 }>()?;
177-
let program_data = SetupParams::<Offline> {
178-
public_params: proving_params.to_vec(),
179-
vk_digest_primary: F::<G1>::from(0), // These need to be right.
177+
let setup_params = SetupParams::<Offline> {
178+
public_params: proving_params.to_vec(),
179+
vk_digest_primary: F::<G1>::from(0), // These need to be right.
180180
vk_digest_secondary: F::<G2>::from(0),
181-
setup_data,
182-
rom_data: HashMap::new(),
181+
setup_data: setup_data.clone(),
182+
rom_data: HashMap::new(),
183183
}
184184
.into_online()?;
185185

186-
let vk_digest_primary = program_data.vk_digest_primary;
187-
let vk_digest_secondary = program_data.vk_digest_secondary;
186+
let vk_digest_primary = setup_params.vk_digest_primary;
187+
let vk_digest_secondary = setup_params.vk_digest_secondary;
188188
crate::proof::construct_program_data_and_proof::<{ proofs::circuits::CIRCUIT_SIZE_512 }>(
189189
manifest,
190190
request_inputs,
191191
response_inputs,
192192
(vk_digest_primary, vk_digest_secondary),
193-
program_data.public_params,
194-
program_data.setup_data,
193+
setup_params.public_params,
194+
setup_params.setup_data,
195195
)
196196
.await
197197

client_ios/demo/demo/ContentView.swift

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,48 @@
88
import SwiftUI
99

1010
@_silgen_name("prover")
11-
func c_prover(_ config: UnsafePointer<Int8>?) -> UnsafePointer<Int8>?
11+
func c_prover(
12+
_ config: UnsafePointer<Int8>?,
13+
_ setupData: UnsafePointer<UninitializedSetupFFI>?
14+
) -> UnsafePointer<Int8>?
1215

1316
@_silgen_name("setup_tracing")
1417
func c_setup_tracing()
1518

19+
struct UninitializedSetupFFI {
20+
let r1cs_types: UnsafePointer<UnsafePointer<UInt8>?>?
21+
let r1cs_lengths: UnsafePointer<Int>?
22+
let r1cs_count: Int
23+
let witness_generator_types: UnsafePointer<UnsafePointer<UInt8>?>?
24+
let witness_lengths: UnsafePointer<Int>?
25+
let witness_count: Int
26+
}
27+
28+
func createUninitializedSetupFFI(
29+
r1cs: [Data],
30+
witnessGenerators: [Data]
31+
) -> UninitializedSetupFFI {
32+
let r1csPointers = r1cs.map { r1csData in
33+
r1csData.withUnsafeBytes { $0.baseAddress!.assumingMemoryBound(to: UInt8.self) }
34+
}
35+
36+
let witnessPointers = witnessGenerators.map { witnessData in
37+
witnessData.withUnsafeBytes { $0.baseAddress!.assumingMemoryBound(to: UInt8.self) }
38+
}
39+
40+
let r1csLengths = r1cs.map { $0.count }
41+
let witnessLengths = witnessGenerators.map { $0.count }
42+
43+
return UninitializedSetupFFI(
44+
r1cs_types: UnsafePointer(r1csPointers),
45+
r1cs_lengths: UnsafePointer(r1csLengths),
46+
r1cs_count: r1cs.count,
47+
witness_generator_types: UnsafePointer(witnessPointers),
48+
witness_lengths: UnsafePointer(witnessLengths),
49+
witness_count: witnessGenerators.count
50+
)
51+
}
52+
1653
class CustomURLSessionDelegate: NSObject, URLSessionDelegate {
1754
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
1855
guard let serverTrust = challenge.protectionSpace.serverTrust else {
@@ -110,6 +147,11 @@ struct ContentView: View {
110147
return
111148
}
112149

150+
guard let r1csData = r1csData else {
151+
print("Failed to fetch R1CS data")
152+
return
153+
}
154+
113155
if let data = r1cs_data {
114156
print("data: \(data)")
115157
let arrayString = data.map { String($0) }.joined(separator: ",")
@@ -175,9 +217,16 @@ struct ContentView: View {
175217
}
176218
"""
177219

220+
// Dummy witness generators (replace with real data later)
221+
let witnessGenerators: [Data] = [Data([0x01, 0x02]), Data([0x03, 0x04])]
222+
223+
var setupData = createUninitializedSetupFFI(
224+
r1cs: r1cs_data,
225+
)
226+
178227
// NOTE: Witness generation happen in the library for ios
179228
jsonString.withCString { (cString) in
180-
c_prover(cString)
229+
c_prover(cString, &setupData)
181230
}
182231
let timeElapsed = CFAbsoluteTimeGetCurrent() - start
183232
print("Time elapsed: \(timeElapsed) seconds")

client_ios/src/lib.rs

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ use std::{
44
};
55

66
use client::config::Config;
7-
use proofs::circuits::PROVING_PARAMS_BYTES_512;
7+
use proofs::{
8+
circuits::{construct_setup_data_from_fs, load_proving_params_512},
9+
program::data::UninitializedSetup,
10+
};
811
use tracing::debug;
912

1013
#[derive(serde::Serialize)]
@@ -27,10 +30,48 @@ pub unsafe extern "C" fn setup_tracing() {
2730
tracing::subscriber::set_global_default(collector).map_err(|e| panic!("{e:?}")).unwrap();
2831
}
2932

33+
#[repr(C)]
34+
pub struct UninitializedSetupFFI {
35+
r1cs_types: *const *const u8,
36+
r1cs_lengths: *const usize,
37+
r1cs_count: usize,
38+
witness_generator_types: *const *const u8,
39+
witness_lengths: *const usize,
40+
witness_count: usize,
41+
}
42+
43+
impl UninitializedSetupFFI {
44+
pub unsafe fn to_canonical(&self) -> UninitializedSetup {
45+
// Deserialize `r1cs_types`
46+
let r1cs_types = (0..self.r1cs_count)
47+
.map(|i| {
48+
let len = *self.r1cs_lengths.add(i);
49+
let ptr = *self.r1cs_types.add(i);
50+
std::slice::from_raw_parts(ptr, len).to_vec()
51+
})
52+
.collect::<Vec<Vec<u8>>>();
53+
54+
// Deserialize `witness_generator_types`
55+
let witness_generator_types = (0..self.witness_count)
56+
.map(|i| {
57+
let len = *self.witness_lengths.add(i);
58+
let ptr = *self.witness_generator_types.add(i);
59+
std::slice::from_raw_parts(ptr, len).to_vec()
60+
})
61+
.collect::<Vec<Vec<u8>>>();
62+
63+
UninitializedSetup::from_raw_parts(r1cs_types, witness_generator_types)
64+
}
65+
}
66+
3067
#[no_mangle]
3168
// TODO: We should probably clarify this safety doc
3269
#[allow(clippy::missing_safety_doc)]
33-
pub unsafe extern "C" fn prover(config_json: *const c_char) -> *const c_char {
70+
pub unsafe extern "C" fn prover(
71+
config_json: *const c_char,
72+
// TODO: `setup_data` parameter handling is untested
73+
setup_data: *const UninitializedSetupFFI,
74+
) -> *const c_char {
3475
let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
3576
let config_str = unsafe {
3677
assert!(!config_json.is_null());
@@ -43,8 +84,22 @@ pub unsafe extern "C" fn prover(config_json: *const c_char) -> *const c_char {
4384
let start = Instant::now();
4485
debug!("starting proving");
4586

46-
let proof =
47-
rt.block_on(client::prover_inner(config, Some(PROVING_PARAMS_BYTES_512.to_vec()))).unwrap();
87+
// TODO: Remove this after updating Swift client code
88+
let setup_data = if setup_data.is_null() {
89+
construct_setup_data_from_fs::<512>().unwrap()
90+
} else {
91+
let setup_data = unsafe { &*setup_data };
92+
setup_data.to_canonical()
93+
};
94+
95+
let proof = rt
96+
.block_on(client::prover_inner(
97+
config,
98+
// TODO: Do I pass these here from `prover` call args or just make Some(...) in-place?
99+
Some(load_proving_params_512().unwrap()),
100+
Some(setup_data),
101+
))
102+
.unwrap();
48103
debug!("done proving: {:?}", Instant::now() - start);
49104
serde_json::to_string_pretty(&proof).unwrap()
50105
}));

0 commit comments

Comments
 (0)