Skip to content

Commit f6c1956

Browse files
committed
chore: towards better constant-time OR
1 parent 1417937 commit f6c1956

File tree

2 files changed

+28
-17
lines changed

2 files changed

+28
-17
lines changed

src/composition.rs

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub enum ComposedRelation<G: PrimeGroup> {
4646
Or(Vec<ComposedRelation<G>>),
4747
}
4848

49-
impl<G: PrimeGroup> ComposedRelation<G> {
49+
impl<G: PrimeGroup + ConstantTimeEq> ComposedRelation<G> {
5050
/// Create a [ComposedRelation] for an AND relation from the given list of relations.
5151
pub fn and<T: Into<ComposedRelation<G>>>(witness: impl IntoIterator<Item = T>) -> Self {
5252
Self::And(witness.into_iter().map(|x| x.into()).collect())
@@ -243,14 +243,19 @@ impl<G: PrimeGroup + ConstantTimeEq> ComposedRelation<G> {
243243
let (simulated_commitment, simulated_challenge, simulated_response) =
244244
instances[i].simulate_transcript(rng)?;
245245

246-
// TODO: Implement and use ConditionallySelectable here
247246
let valid_witness = instances[i].is_witness_valid(w);
248247
let select_witness = valid_witness & !valid_witness_found;
249-
commitments.push(if select_witness.unwrap_u8() == 1 {
250-
commitment
251-
} else {
252-
simulated_commitment.clone()
253-
});
248+
249+
let simulated_commitment_ptr = &simulated_commitment as *const ComposedCommitment<G> as u64;
250+
let commitment_ptr = &commitment as *const ComposedCommitment<G> as u64;
251+
252+
let selected_commitment_ptr = ConditionallySelectable::conditional_select(&simulated_commitment_ptr, &commitment_ptr, select_witness);
253+
let discarded_commitment_ptr = ConditionallySelectable::conditional_select(&simulated_commitment_ptr, &commitment_ptr, !select_witness);
254+
let commitment = unsafe { &*(selected_commitment_ptr as *const ComposedCommitment<G>) };
255+
let _discarded = unsafe { &*(discarded_commitment_ptr as *const ComposedCommitment<G>) };
256+
257+
258+
commitments.push(commitment.clone());
254259
prover_states.push(ComposedOrProverStateEntry(
255260
select_witness,
256261
prover_state,
@@ -310,24 +315,27 @@ impl<G: PrimeGroup + ConstantTimeEq> ComposedRelation<G> {
310315
valid_witness,
311316
);
312317

313-
let real_response = instance.prover_response(prover_state, &challenge_i)?;
318+
let response = instance.prover_response(prover_state, &challenge_i)?;
319+
let response_ptr = &response as *const ComposedResponse<G> as u64;
320+
let simulated_response_ptr = &simulated_response as *const ComposedResponse<G> as u64;
321+
let selected_response_ptr = ConditionallySelectable::conditional_select(&simulated_response_ptr, &response_ptr, valid_witness);
322+
let _discarded_response_ptr = ConditionallySelectable::conditional_select(&simulated_response_ptr, &response_ptr, !valid_witness);
323+
let response = unsafe { &*(selected_response_ptr as *const ComposedResponse<G>) };
324+
let _discarded_response = unsafe { &*(_discarded_response_ptr as *const ComposedResponse<G>) };
325+
314326

315-
// let response_i = ComposedResponse::conditional_select(&real_response, &simulated_response, *witness_location);
316-
let response_i = if valid_witness.unwrap_u8() == 1 {
317-
real_response
318-
} else {
319-
simulated_response
320-
};
321327
result_challenges.push(challenge_i);
322-
result_responses.push(response_i);
328+
result_responses.push(response.clone());
323329
}
324330

325331
result_challenges.pop();
326332
Ok(ComposedResponse::Or(result_challenges, result_responses))
327333
}
328334
}
329335

330-
impl<G: PrimeGroup + ConstantTimeEq> SigmaProtocol for ComposedRelation<G> {
336+
impl<G: PrimeGroup + ConstantTimeEq> SigmaProtocol
337+
for ComposedRelation<G>
338+
{
331339
type Commitment = ComposedCommitment<G>;
332340
type ProverState = ComposedProverState<G>;
333341
type Response = ComposedResponse<G>;
@@ -579,7 +587,9 @@ impl<G: PrimeGroup + ConstantTimeEq> SigmaProtocol for ComposedRelation<G> {
579587
}
580588
}
581589

582-
impl<G: PrimeGroup + ConstantTimeEq> SigmaProtocolSimulator for ComposedRelation<G> {
590+
impl<G: PrimeGroup + ConstantTimeEq> SigmaProtocolSimulator
591+
for ComposedRelation<G>
592+
{
583593
fn simulate_commitment(
584594
&self,
585595
challenge: &Self::Challenge,

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ pub mod errors;
5656
pub mod linear_relation;
5757
pub mod traits;
5858

59+
5960
pub(crate) mod duplex_sponge;
6061
pub(crate) mod fiat_shamir;
6162
pub(crate) mod group;

0 commit comments

Comments
 (0)