1- use tlsn_sdk_core:: {
2- HttpRequest , NetworkSetting , ProverConfig , Reveal , SdkProver , SdkVerifier , VerifierConfig ,
3- } ;
1+ use futures:: io:: { AsyncReadExt , AsyncWriteExt } ;
2+ #[ cfg( not( target_arch = "wasm32" ) ) ]
3+ use tlsn_sdk_core:: { HttpRequest , NetworkSetting , ProverConfig , Reveal , SdkProver } ;
4+ use tlsn_sdk_core:: { SdkVerifier , VerifierConfig } ;
45use tlsn_server_fixture_certs:: { CA_CERT_DER , SERVER_DOMAIN } ;
56
67use crate :: IoProvider ;
@@ -13,6 +14,15 @@ const MAX_RECV_DATA: usize = 1 << 11;
1314crate :: test!( "sdk_core" , prover, verifier) ;
1415
1516async fn prover ( provider : & IoProvider ) {
17+ #[ cfg( target_arch = "wasm32" ) ]
18+ return prover_wasm ( provider) . await ;
19+
20+ #[ cfg( not( target_arch = "wasm32" ) ) ]
21+ prover_core ( provider) . await ;
22+ }
23+
24+ #[ cfg( not( target_arch = "wasm32" ) ) ]
25+ async fn prover_core ( provider : & IoProvider ) {
1626 let config = ProverConfig :: builder ( SERVER_DOMAIN )
1727 . max_sent_data ( MAX_SENT_DATA )
1828 . max_recv_data ( MAX_RECV_DATA )
@@ -60,6 +70,100 @@ async fn prover(provider: &IoProvider) {
6070 . unwrap ( ) ;
6171
6272 assert ! ( prover. is_complete( ) ) ;
73+
74+ let mut io = prover. finish ( ) . await . unwrap ( ) ;
75+ io. write_all ( b"prover-finished" ) . await . unwrap ( ) ;
76+ let mut response = [ 0 ; 17 ] ;
77+ io. read_exact ( & mut response) . await . unwrap ( ) ;
78+ assert_eq ! ( & response, b"verifier-finished" ) ;
79+ }
80+
81+ #[ cfg( target_arch = "wasm32" ) ]
82+ async fn prover_wasm ( provider : & IoProvider ) {
83+ use js_sys:: { Promise , Uint8Array } ;
84+ use std:: collections:: HashMap ;
85+ use tlsn_wasm:: {
86+ prover:: { JsProver , ProverConfig } ,
87+ types:: { HttpRequest , Method , Reveal } ,
88+ } ;
89+ use wasm_bindgen:: { JsCast , prelude:: * } ;
90+ use wasm_bindgen_futures:: JsFuture ;
91+
92+ #[ wasm_bindgen]
93+ extern "C" {
94+ type TestIoChannel ;
95+
96+ #[ wasm_bindgen( method) ]
97+ fn read ( this : & TestIoChannel ) -> Promise ;
98+
99+ #[ wasm_bindgen( method) ]
100+ fn write ( this : & TestIoChannel , data : & Uint8Array ) -> Promise ;
101+ }
102+
103+ let config: ProverConfig = serde_json:: from_value ( serde_json:: json!( {
104+ "server_name" : SERVER_DOMAIN ,
105+ "mode" : "Mpc" ,
106+ "max_sent_data" : MAX_SENT_DATA ,
107+ "max_sent_records" : null,
108+ "max_recv_data_online" : null,
109+ "max_recv_data" : MAX_RECV_DATA ,
110+ "max_recv_records_online" : null,
111+ "defer_decryption_from_start" : true ,
112+ "network" : "Latency" ,
113+ "client_auth" : null,
114+ "root_certs" : [ CA_CERT_DER ] ,
115+ } ) )
116+ . unwrap ( ) ;
117+ let mut prover = JsProver :: new ( config) . unwrap ( ) ;
118+
119+ let proto_io = provider. provide_proto_js_io ( ) . await . unwrap ( ) ;
120+ let retained_io = proto_io. unchecked_ref :: < TestIoChannel > ( ) ;
121+ prover
122+ . setup ( proto_io. clone ( ) . unchecked_into ( ) )
123+ . await
124+ . unwrap ( ) ;
125+
126+ let server_io = provider. provide_server_js_io ( ) . await . unwrap ( ) ;
127+ let response = prover
128+ . send_request (
129+ Some ( server_io. unchecked_into ( ) ) ,
130+ HttpRequest {
131+ uri : format ! (
132+ "https://{}/bytes?size={}" ,
133+ SERVER_DOMAIN ,
134+ MAX_RECV_DATA - 256
135+ ) ,
136+ method : Method :: GET ,
137+ headers : HashMap :: from ( [
138+ ( "Host" . to_string ( ) , SERVER_DOMAIN . as_bytes ( ) . to_vec ( ) ) ,
139+ ( "Connection" . to_string ( ) , b"close" . to_vec ( ) ) ,
140+ ] ) ,
141+ body : None ,
142+ } ,
143+ )
144+ . await
145+ . unwrap ( ) ;
146+ assert_eq ! ( response. status, 200 ) ;
147+
148+ let transcript = prover. transcript ( ) . unwrap ( ) ;
149+ prover
150+ . reveal (
151+ Reveal {
152+ sent : vec ! [ 0 ..transcript. sent. len( ) - 1 ] ,
153+ recv : vec ! [ 2 ..transcript. recv. len( ) ] ,
154+ server_identity : true ,
155+ } ,
156+ None ,
157+ )
158+ . await
159+ . unwrap ( ) ;
160+ prover. finish ( ) . await . unwrap ( ) ;
161+
162+ JsFuture :: from ( retained_io. write ( & Uint8Array :: from ( b"prover-finished" . as_slice ( ) ) ) )
163+ . await
164+ . unwrap ( ) ;
165+ let response = JsFuture :: from ( retained_io. read ( ) ) . await . unwrap ( ) ;
166+ assert_eq ! ( Uint8Array :: new( & response) . to_vec( ) , b"verifier-finished" ) ;
63167}
64168
65169async fn verifier ( provider : & IoProvider ) {
@@ -86,4 +190,10 @@ async fn verifier(provider: &IoProvider) {
86190 assert_eq ! ( output. server_name. as_deref( ) , Some ( SERVER_DOMAIN ) ) ;
87191 assert ! ( output. transcript. is_some( ) ) ;
88192 assert ! ( verifier. is_complete( ) ) ;
193+
194+ let mut io = verifier. finish ( ) . await . unwrap ( ) ;
195+ let mut request = [ 0 ; 15 ] ;
196+ io. read_exact ( & mut request) . await . unwrap ( ) ;
197+ assert_eq ! ( & request, b"prover-finished" ) ;
198+ io. write_all ( b"verifier-finished" ) . await . unwrap ( ) ;
89199}
0 commit comments