Example #1
0
      virtual void Shuffle()
      {
        Random &rand = Random::GetInstance();
        if((rand.GetInt(0, 1024) / 1024.0) > N) {
          ShuffleRound::Shuffle();
          return;
        }

        SetTriggered();

        QVector<QSharedPointer<AsymmetricKey> > outer_keys;
        for(int idx = GetShufflers().Count() - 1;
            idx >= GetShufflers().GetIndex(GetLocalId()); idx--)
        {
          int kidx = CalculateKidx(idx);
          outer_keys.append(_state->public_outer_keys[kidx]);
        }

        QByteArray get_data = DefaultData;
        QByteArray inner_ct, outer_ct;
        QSharedPointer<OnionEncryptor> oe;
        if(Utils::MultiThreading) {
          oe = QSharedPointer<OnionEncryptor>(new ThreadedOnionEncryptor());
        } else {
          oe = QSharedPointer<OnionEncryptor>(new OnionEncryptor());
        }
        oe->Encrypt(_state->public_inner_keys, get_data, inner_ct, 0);
        oe->Encrypt(outer_keys, inner_ct, outer_ct, 0);

        int x = Random::GetInstance().GetInt(0,
            _server_state->shuffle_input.count());
        _server_state->shuffle_input[x] = outer_ct;

        ShuffleRound::Shuffle();
      }
Example #2
0
      virtual void SubmitCiphertext()
      {
        Random &rand = Random::GetInstance();
        if((rand.GetInt(0, 1024) / 1024.0) > N) {
          ShuffleRound::SubmitCiphertext();
          return;
        }

        SetTriggered();

        QSharedPointer<OnionEncryptor> oe;
        if(Utils::MultiThreading) {
          oe = QSharedPointer<OnionEncryptor>(new ThreadedOnionEncryptor());
        } else {
          oe = QSharedPointer<OnionEncryptor>(new OnionEncryptor());
        }
        oe->Encrypt(_state->public_inner_keys, PrepareData(),
            _state->inner_ciphertext, 0);

        int count = Random::GetInstance().GetInt(0, GetShufflers().Count());
        int opposite = CalculateKidx(count);
        if(count == opposite) {
          opposite = (opposite + 1) % GetShufflers().Count();
        }

        QSharedPointer<AsymmetricKey> tmp(_state->public_outer_keys[opposite]);
        _state->public_outer_keys[opposite] = _state->public_outer_keys[count];
        QByteArray outer_ciphertext;
        oe->Encrypt(_state->public_outer_keys, _state->inner_ciphertext,
            outer_ciphertext, 0);
        _state->public_outer_keys[opposite] = tmp;

        QByteArray msg;
        QDataStream stream(&msg, QIODevice::WriteOnly);
        stream << DATA << GetRoundId() << outer_ciphertext;

        VerifiableSend(GetShufflers().GetId(0), msg);
        _state_machine.StateComplete();
      }