package org.bouncycastle.pqc.crypto.test; import java.security.SecureRandom; import java.util.Random; import org.bouncycastle.crypto.AsymmetricCipherKeyPair; import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.digests.SHA256Digest; import org.bouncycastle.crypto.params.ParametersWithRandom; import org.bouncycastle.pqc.crypto.mceliece.McElieceCCA2KeyGenerationParameters; import org.bouncycastle.pqc.crypto.mceliece.McElieceCCA2KeyPairGenerator; import org.bouncycastle.pqc.crypto.mceliece.McElieceCCA2Parameters; import org.bouncycastle.pqc.crypto.mceliece.McEliecePointchevalCipher; import org.bouncycastle.pqc.crypto.mceliece.McEliecePointchevalDigestCipher; import org.bouncycastle.util.test.SimpleTest; public class McEliecePointchevalCipherTest extends SimpleTest { SecureRandom keyRandom = new SecureRandom(); public String getName() { return "McElieceFujisaki"; } public void performTest() { int numPassesKPG = 1; int numPassesEncDec = 10; Random rand = new Random(); byte[] mBytes; for (int j = 0; j < numPassesKPG; j++) { McElieceCCA2Parameters params = new McElieceCCA2Parameters(); McElieceCCA2KeyPairGenerator mcElieceCCA2KeyGen = new McElieceCCA2KeyPairGenerator(); McElieceCCA2KeyGenerationParameters genParam = new McElieceCCA2KeyGenerationParameters(keyRandom, params); mcElieceCCA2KeyGen.init(genParam); AsymmetricCipherKeyPair pair = mcElieceCCA2KeyGen.generateKeyPair(); ParametersWithRandom param = new ParametersWithRandom(pair.getPublic(), keyRandom); Digest msgDigest = new SHA256Digest(); McEliecePointchevalDigestCipher mcEliecePointchevalDigestCipher = new McEliecePointchevalDigestCipher(new McEliecePointchevalCipher(), msgDigest); for (int k = 1; k <= numPassesEncDec; k++) { System.out.println("############### test: " + k); // initialize for encryption mcEliecePointchevalDigestCipher.init(true, param); // generate random message int mLength = (rand.nextInt() & 0x1f) + 1; mBytes = new byte[mLength]; rand.nextBytes(mBytes); // encrypt mcEliecePointchevalDigestCipher.update(mBytes, 0, mBytes.length); byte[] enc = mcEliecePointchevalDigestCipher.messageEncrypt(); // initialize for decryption mcEliecePointchevalDigestCipher.init(false, pair.getPrivate()); byte[] constructedmessage = mcEliecePointchevalDigestCipher.messageDecrypt(enc); // XXX write in McElieceFujisakiDigestCipher? msgDigest.update(mBytes, 0, mBytes.length); byte[] hash = new byte[msgDigest.getDigestSize()]; msgDigest.doFinal(hash, 0); boolean verified = true; for (int i = 0; i < hash.length; i++) { verified = verified && hash[i] == constructedmessage[i]; } if (!verified) { fail("en/decryption fails"); } else { System.out.println("test okay"); System.out.println(); } } } } public static void main( String[] args) { runTest(new McEliecePointchevalCipherTest()); } }