@@ -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 = RlweRelationProverVerifier :: 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,10 +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 =
278- RlweRelationProverVerifier :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
279- 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)
280281 }
281282}
282283
@@ -299,9 +300,8 @@ impl VerifiableEncrypt for ShellVahe {
299300 return Err ( status:: internal ( "Ciphertexts from encryption library are malformed." ) ) ;
300301 }
301302
302- let ( mut transcript, proof_seed ) = self . get_transcript_and_proof_seed ( b"encryption" ) ?;
303+ let mut transcript = self . transcript ( b"encryption" ) ?;
303304 transcript. append_message ( b"nonce:" , nonce) ;
304- let prover = RlweRelationProverVerifier :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
305305 let mut proof = vec ! [ ] ;
306306 for i in 0 ..num_polynomials {
307307 let rlwe_statement = RlweRelationProofStatement {
@@ -319,7 +319,7 @@ impl VerifiableEncrypt for ShellVahe {
319319 e : & metadata. error_e [ i] ,
320320 v : & wraparounds[ i] ,
321321 } ;
322- proof. push ( prover . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?) ;
322+ proof. push ( self . rlwe_zk . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?) ;
323323 }
324324 Ok ( ( ciphertext, ShellEncryptionProof ( proof) ) )
325325 }
@@ -339,10 +339,8 @@ impl EncryptVerify for ShellVahe {
339339 ) ) ;
340340 }
341341
342- let ( mut transcript, proof_seed ) = self . get_transcript_and_proof_seed ( b"encryption" ) ?;
342+ let mut transcript = self . transcript ( b"encryption" ) ?;
343343 transcript. append_message ( b"nonce:" , nonce) ;
344- let verifier =
345- RlweRelationProverVerifier :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
346344 for i in 0 ..num_polynomials {
347345 let statement = RlweRelationProofStatement {
348346 n : self . ahe . num_coeffs ( ) ,
@@ -354,7 +352,7 @@ impl EncryptVerify for ShellVahe {
354352 bound_r : 1 ,
355353 bound_e : 16 ,
356354 } ;
357- verifier . verify ( & statement, & proof. 0 [ i] , & mut transcript) ?;
355+ self . rlwe_zk . verify ( & statement, & proof. 0 [ i] , & mut transcript) ?;
358356 }
359357 Ok ( ( ) )
360358 }
@@ -377,9 +375,7 @@ impl VerifiablePartialDec for ShellVahe {
377375 ) ) ;
378376 }
379377
380- let ( mut transcript, proof_seed) =
381- self . get_transcript_and_proof_seed ( b"partial_decryption" ) ?;
382- let prover = RlweRelationProverVerifier :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
378+ let mut transcript = self . transcript ( b"partial_decryption" ) ?;
383379 let mut proof = vec ! [ ] ;
384380 for i in 0 ..num_polynomials {
385381 let rlwe_statement = RlweRelationProofStatement {
@@ -394,7 +390,7 @@ impl VerifiablePartialDec for ShellVahe {
394390 } ;
395391 let rlwe_witness =
396392 RlweRelationProofWitness { r : & sk. 0 , e : & errors[ i] , v : & wraparounds[ i] } ;
397- proof. push ( prover . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?) ;
393+ proof. push ( self . rlwe_zk . prove ( & rlwe_statement, & rlwe_witness, & mut transcript) ?) ;
398394 }
399395 Ok ( ( pd, ShellPartialDecProof ( proof) ) )
400396 }
@@ -414,10 +410,7 @@ impl PartialDecVerify for ShellVahe {
414410 ) ) ;
415411 }
416412
417- let ( mut transcript, proof_seed) =
418- self . get_transcript_and_proof_seed ( b"partial_decryption" ) ?;
419- let verifier =
420- RlweRelationProverVerifier :: new ( proof_seed. as_bytes ( ) , self . ahe . num_coeffs ( ) ) ;
413+ let mut transcript = self . transcript ( b"partial_decryption" ) ?;
421414 for i in 0 ..num_polynomials {
422415 let statement = RlweRelationProofStatement {
423416 n : self . ahe . num_coeffs ( ) ,
@@ -429,7 +422,7 @@ impl PartialDecVerify for ShellVahe {
429422 bound_r : 1 ,
430423 bound_e : self . ahe . flood_bound ( ) ?,
431424 } ;
432- verifier . verify ( & statement, & proof. 0 [ i] , & mut transcript) ?;
425+ self . rlwe_zk . verify ( & statement, & proof. 0 [ i] , & mut transcript) ?;
433426 }
434427 Ok ( ( ) )
435428 }
0 commit comments