Next: , Previous: Creating the Deck, Up: Operations on Stacks



3.4.2 Shuffling the Deck

Each player must perform a shuffle of the deck, because only such a procedure guarantees that no coalition has influence on the outcome. Thus we build a shuffle chain such that every player shuffles the deck. Consider the code fragment for the player P_j.

The regular stack s is initialized with open cards from deck. Then each player shuffles the stack (see TMCG_MixStack) and proves the correctness of this operation (see TMCG_ProveStackEquality). Consequently, every player should verify these proofs (see TMCG_VerifyStackEquality). Finally, the stack s contains the shuffled result.

     TMCG_Stack<VTMF_Card> s;
     s.push(deck);
     
     for (size_t i = 0; i < 5; i++)
     {
       TMCG_Stack<VTMF_Card> s2;
       if (i == j)
       {
         TMCG_StackSecret<VTMF_CardSecret> ss;
         tmcg->TMCG_CreateStackSecret(ss, false, s.size(), vtmf);
         tmcg->TMCG_MixStack(s, s2, ss, vtmf);
         for (size_t i2 = 0; i2 < 5; i2++)
         {
           if (i2 == j)
             continue;
           out_stream[i2] << s2 << std::endl;
           tmcg->TMCG_ProveStackEquality(s, s2, ss, false, vtmf,
             in_stream[i2], out_stream[i2]);
         }
       }
       else
       {
         in_stream[i] >> s2;
         if (!in_stream[i].good())
           std::cerr << "Read or parse error!" << std::endl;
         if (!tmcg->TMCG_VerifyStackEquality(s, s2, false, vtmf,
           in_stream[i], out_stream[i]))
             std::cerr << "Verification failed!" << std::endl;
       }
       s = s2;
     }

If you want to use the more efficient shuffle verification protocol of Groth, then you must simply replace TMCG_ProveStackEquality and TMCG_VerifyStackEquality by TMCG_ProveStackEquality_Groth and TMCG_VerifyStackEquality_Groth, respectively.