@@ -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 ,
0 commit comments