Skip to content

Commit 7ec4944

Browse files
schoppmpcopybara-github
authored andcommitted
Create ZK prover / verifier at ShellVahe construction and re-use it across operations
PiperOrigin-RevId: 860136204
1 parent c7b8436 commit 7ec4944

File tree

1 file changed

+28
-35
lines changed

1 file changed

+28
-35
lines changed

willow/src/shell/vahe.rs

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -100,22 +100,22 @@ pub struct ShellVahe {
100100
ahe: ShellAhe,
101101
q: u128,
102102
public_seed: Seed,
103+
rlwe_zk: RlweRelationProverVerifier,
103104
}
104105

105106
impl 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

Comments
 (0)