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]); } }