@@ -19,7 +19,7 @@ use merlin::Transcript as MerlinTranscript;
1919use proofs_rust_proto:: { RlweRelationProofListProto , RlweRelationProofProto } ;
2020use proto_serialization_traits:: { FromProto , ToProto } ;
2121use protobuf:: { proto, AsView } ;
22- use rlwe_relation:: { RlweRelationProof , RlweRelationProver , RlweRelationVerifier } ;
22+ use rlwe_relation:: { RlweRelationProof , RlweRelationProverVerifier } ;
2323use rlwe_relation_serialization:: { rlwe_relation_proof_from_proto, rlwe_relation_proof_to_proto} ;
2424use single_thread_hkdf:: { compute_hkdf, Seed } ;
2525use status:: Status ;
@@ -100,22 +100,22 @@ pub struct ShellVahe {
100100 ahe : ShellAhe ,
101101 q : u128 ,
102102 public_seed : Seed ,
103+ rlwe_zk : RlweRelationProverVerifier ,
103104}
104105
105106impl ShellVahe {
106- fn get_transcript_and_proof_seed (
107+ fn transcript_seed ( & self ) -> & [ u8 ] {
108+ & self . public_seed . as_bytes ( )
109+ [ single_thread_hkdf:: seed_length ( ) ..2 * single_thread_hkdf:: seed_length ( ) ]
110+ }
111+
112+ fn transcript (
107113 & self ,
108114 operation_name : & ' static [ u8 ] ,
109- ) -> Result < ( MerlinTranscript , Seed ) , status:: StatusError > {
110- let proof_seed = compute_hkdf (
111- self . public_seed . as_bytes ( ) ,
112- b"" ,
113- & [ operation_name, b"_proof_seed" ] . concat ( ) ,
114- 16 ,
115- ) ?;
115+ ) -> Result < MerlinTranscript , status:: StatusError > {
116116 let mut transcript = MerlinTranscript :: new ( operation_name) ;
117- transcript. append_message ( b"public_seed :" , self . public_seed . as_bytes ( ) ) ;
118- Ok ( ( transcript, proof_seed ) )
117+ transcript. append_message ( b"transcript_seed :" , self . transcript_seed ( ) ) ;
118+ Ok ( transcript)
119119 }
120120}
121121
@@ -155,14 +155,18 @@ impl AheBase for ShellVahe {
155155 context_string,
156156 b"" ,
157157 b"ShellVahe.public_seed" ,
158- single_thread_hkdf:: seed_length ( ) ,
158+ 2 * single_thread_hkdf:: seed_length ( ) , // Separate seeds for transcripts and proofs.
159159 ) ?;
160160 let mut q = 1 ;
161161 for modulus in & config. qs {
162162 q *= * modulus as u128 ;
163163 }
164164 let ahe = ShellAhe :: new ( config, context_string) ?;
165- Ok ( ShellVahe { ahe : ahe, q : q, public_seed : public_seed } )
165+ let rlwe_zk = RlweRelationProverVerifier :: new (
166+ & public_seed. as_bytes ( ) [ ..single_thread_hkdf:: seed_length ( ) ] ,
167+ ahe. num_coeffs ( ) ,
168+ ) ;
169+ Ok ( ShellVahe { ahe : ahe, q : q, public_seed : public_seed, rlwe_zk : rlwe_zk } )
166170 }
167171
168172 fn aggregate_public_key_shares < ' a > (
@@ -253,9 +257,8 @@ impl VerifiableKeyGen for ShellVahe {
253257 let rlwe_witness =
254258 RlweRelationProofWitness { r : & sk_share. 0 , e : & pk_share_error. 0 , v : & pk_wraparound } ;
255259
256- let ( mut transcript, proof_seed) = self . get_transcript_and_proof_seed ( b"key_gen" ) ?;
257- let prover = RlweRelationProver :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
258- let key_gen_proof = prover. prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?;
260+ let mut transcript = self . transcript ( b"key_gen" ) ?;
261+ let key_gen_proof = self . rlwe_zk . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?;
259262 Ok ( ( sk_share, pk_share_b, ShellKeyGenProof ( key_gen_proof) ) )
260263 }
261264}
@@ -273,9 +276,8 @@ impl KeyGenVerify for ShellVahe {
273276 bound_e : 16 ,
274277 } ;
275278
276- let ( mut transcript, proof_seed) = self . get_transcript_and_proof_seed ( b"key_gen" ) ?;
277- let verifier = RlweRelationVerifier :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
278- verifier. verify ( & statement, & proof. 0 , & mut transcript)
279+ let mut transcript = self . transcript ( b"key_gen" ) ?;
280+ self . rlwe_zk . verify ( & statement, & proof. 0 , & mut transcript)
279281 }
280282}
281283
@@ -298,9 +300,8 @@ impl VerifiableEncrypt for ShellVahe {
298300 return Err ( status:: internal ( "Ciphertexts from encryption library are malformed." ) ) ;
299301 }
300302
301- let ( mut transcript, proof_seed ) = self . get_transcript_and_proof_seed ( b"encryption" ) ?;
303+ let mut transcript = self . transcript ( b"encryption" ) ?;
302304 transcript. append_message ( b"nonce:" , nonce) ;
303- let prover = RlweRelationProver :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
304305 let mut proof = vec ! [ ] ;
305306 for i in 0 ..num_polynomials {
306307 let rlwe_statement = RlweRelationProofStatement {
@@ -318,7 +319,7 @@ impl VerifiableEncrypt for ShellVahe {
318319 e : & metadata. error_e [ i] ,
319320 v : & wraparounds[ i] ,
320321 } ;
321- proof. push ( prover . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?) ;
322+ proof. push ( self . rlwe_zk . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?) ;
322323 }
323324 Ok ( ( ciphertext, ShellEncryptionProof ( proof) ) )
324325 }
@@ -338,9 +339,8 @@ impl EncryptVerify for ShellVahe {
338339 ) ) ;
339340 }
340341
341- let ( mut transcript, proof_seed ) = self . get_transcript_and_proof_seed ( b"encryption" ) ?;
342+ let mut transcript = self . transcript ( b"encryption" ) ?;
342343 transcript. append_message ( b"nonce:" , nonce) ;
343- let verifier = RlweRelationVerifier :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
344344 for i in 0 ..num_polynomials {
345345 let statement = RlweRelationProofStatement {
346346 n : self . ahe . num_coeffs ( ) ,
@@ -352,7 +352,7 @@ impl EncryptVerify for ShellVahe {
352352 bound_r : 1 ,
353353 bound_e : 16 ,
354354 } ;
355- verifier . verify ( & statement, & proof. 0 [ i] , & mut transcript) ?;
355+ self . rlwe_zk . verify ( & statement, & proof. 0 [ i] , & mut transcript) ?;
356356 }
357357 Ok ( ( ) )
358358 }
@@ -375,9 +375,7 @@ impl VerifiablePartialDec for ShellVahe {
375375 ) ) ;
376376 }
377377
378- let ( mut transcript, proof_seed) =
379- self . get_transcript_and_proof_seed ( b"partial_decryption" ) ?;
380- let prover = RlweRelationProver :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
378+ let mut transcript = self . transcript ( b"partial_decryption" ) ?;
381379 let mut proof = vec ! [ ] ;
382380 for i in 0 ..num_polynomials {
383381 let rlwe_statement = RlweRelationProofStatement {
@@ -392,7 +390,7 @@ impl VerifiablePartialDec for ShellVahe {
392390 } ;
393391 let rlwe_witness =
394392 RlweRelationProofWitness { r : & sk. 0 , e : & errors[ i] , v : & wraparounds[ i] } ;
395- proof. push ( prover . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?) ;
393+ proof. push ( self . rlwe_zk . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?) ;
396394 }
397395 Ok ( ( pd, ShellPartialDecProof ( proof) ) )
398396 }
@@ -412,9 +410,7 @@ impl PartialDecVerify for ShellVahe {
412410 ) ) ;
413411 }
414412
415- let ( mut transcript, proof_seed) =
416- self . get_transcript_and_proof_seed ( b"partial_decryption" ) ?;
417- let verifier = RlweRelationVerifier :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
413+ let mut transcript = self . transcript ( b"partial_decryption" ) ?;
418414 for i in 0 ..num_polynomials {
419415 let statement = RlweRelationProofStatement {
420416 n : self . ahe . num_coeffs ( ) ,
@@ -426,7 +422,7 @@ impl PartialDecVerify for ShellVahe {
426422 bound_r : 1 ,
427423 bound_e : self . ahe . flood_bound ( ) ?,
428424 } ;
429- verifier . verify ( & statement, & proof. 0 [ i] , & mut transcript) ?;
425+ self . rlwe_zk . verify ( & statement, & proof. 0 [ i] , & mut transcript) ?;
430426 }
431427 Ok ( ( ) )
432428 }
0 commit comments