package org.bouncycastle.pqc.jcajce.provider.test; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher; import org.bouncycastle.pqc.jcajce.provider.util.AsymmetricHybridCipher; import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; /** * Base class for unit tests of {@link AsymmetricHybridCipher}s. */ public abstract class AsymmetricHybridCipherTest extends FlexiTest { /** * the {@link KeyPairGenerator} to use for the test */ protected KeyPairGenerator kpg; /** * the {@link AsymmetricHybridCipher} to use for the test */ protected Cipher cipher; private KeyPair keyPair; private PublicKey pubKey; private PrivateKey privKey; private byte[] mBytes, cBytes, dBytes; protected final void performEnDecryptionTest(int numPassesKPG, int numPassesEncDec, int plainTextSize, AlgorithmParameterSpec params) { try { for (int j = 0; j < numPassesKPG; j++) { // generate key pair //kpg.initialize(params); keyPair = kpg.genKeyPair(); pubKey = keyPair.getPublic(); privKey = keyPair.getPrivate(); for (int k = 1; k <= numPassesEncDec; k++) { // initialize for encryption cipher.init(Cipher.ENCRYPT_MODE, pubKey, params, sr); // generate random message int mLength = rand.nextInt(plainTextSize) + 1; mBytes = new byte[mLength]; rand.nextBytes(mBytes); // encrypt cBytes = cipher.doFinal(mBytes); // initialize for decryption cipher.init(Cipher.DECRYPT_MODE, privKey, params); // decrypt dBytes = cipher.doFinal(cBytes); // compare assertEquals( "Encryption/decryption test failed for message \"" + ByteUtils.toHexString(mBytes) + "\":\n actual decrypted text: " + ByteUtils.toHexString(dBytes) + "\n expected plain text: " + ByteUtils.toHexString(mBytes), mBytes, dBytes); } } } catch (Exception e) { e.printStackTrace(); fail(e); } } }