Exemplo n.º 1
0
  void ShufflePrimitivesTest(OnionEncryptor &oe)
  {
    int count = Random::GetInstance().GetInt(10, 20);

    Library *lib = CryptoFactory::GetInstance().GetLibrary();

    QVector<QSharedPointer<AsymmetricKey> > private_keys;
    QVector<QSharedPointer<AsymmetricKey> > public_keys;
    for(int idx = 0; idx < count; idx++) {
      private_keys.append(QSharedPointer<AsymmetricKey>(lib->CreatePrivateKey()));
      public_keys.append(QSharedPointer<AsymmetricKey>(private_keys.last()->GetPublicKey()));
    }

    QVector<QByteArray> cleartexts;
    QVector<QByteArray> ciphertexts;
    QVector<QVector<QByteArray> > random_bits;
    QScopedPointer<Random> rand(lib->GetRandomNumberGenerator());

    for(int idx = 0; idx < count; idx++) {
      QByteArray cleartext(1500, 0);
      rand->GenerateBlock(cleartext);
      QByteArray ciphertext;
      QVector<QByteArray> random;
      EXPECT_EQ(oe.Encrypt(public_keys, cleartext, ciphertext, &random), -1);
      cleartexts.append(cleartext);
      ciphertexts.append(ciphertext);
      random_bits.append(random);
    }

    QVector<QVector<QByteArray> > order_random_bits;
    EXPECT_EQ(oe.ReorderRandomBits(random_bits, order_random_bits), -1);

    EXPECT_TRUE(oe.VerifyOne(private_keys.first(), cleartexts,
          order_random_bits.first()));
    for(int idx = 1; idx < count - 1; idx++) {
      EXPECT_TRUE(oe.VerifyOne(private_keys[idx], order_random_bits[idx - 1],
            order_random_bits[idx]));
    }
    EXPECT_TRUE(oe.VerifyOne(private_keys.last(), order_random_bits.last(),
          ciphertexts));

    QVector<QVector<QByteArray> > onions(count + 1);
    onions.last() = ciphertexts;

    for(int idx = count - 1; idx >= 0; idx--) {
      EXPECT_TRUE(oe.Decrypt(private_keys[idx], onions[idx + 1], onions[idx], 0));
      oe.RandomizeBlocks(onions[idx]);
    }

    QBitArray bad;
    EXPECT_TRUE(oe.VerifyAll(private_keys, onions, bad));

    for(int idx = 0; idx < count; idx++) {
      EXPECT_TRUE(onions.first().contains(cleartexts[idx]));
      EXPECT_FALSE(bad[idx]);
    }
  }