| package org.bouncycastle.crypto.test; |
| |
| import java.math.BigInteger; |
| import java.security.SecureRandom; |
| |
| import org.bouncycastle.crypto.AsymmetricCipherKeyPair; |
| import org.bouncycastle.crypto.agreement.DHStandardGroups; |
| import org.bouncycastle.crypto.engines.CramerShoupCiphertext; |
| import org.bouncycastle.crypto.engines.CramerShoupCoreEngine; |
| import org.bouncycastle.crypto.engines.CramerShoupCoreEngine.CramerShoupCiphertextException; |
| import org.bouncycastle.crypto.generators.CramerShoupKeyPairGenerator; |
| import org.bouncycastle.crypto.generators.CramerShoupParametersGenerator; |
| import org.bouncycastle.crypto.params.CramerShoupKeyGenerationParameters; |
| import org.bouncycastle.crypto.params.CramerShoupParameters; |
| import org.bouncycastle.util.BigIntegers; |
| import org.bouncycastle.util.test.SimpleTest; |
| |
| public class CramerShoupTest |
| extends SimpleTest |
| { |
| private static final BigInteger ONE = BigInteger.valueOf(1); |
| |
| private static final SecureRandom RND = new SecureRandom(); |
| |
| private AsymmetricCipherKeyPair keyPair; |
| |
| public static void main(String[] args) |
| { |
| runTest(new CramerShoupTest()); |
| } |
| |
| public String getName() |
| { |
| return "CramerShoup"; |
| } |
| |
| |
| public void performTest() |
| throws Exception |
| { |
| BigInteger pSubOne = DHStandardGroups.rfc3526_2048.getP().subtract(ONE); |
| for (int i = 0; i < 10; ++i) |
| { |
| BigInteger message = BigIntegers.createRandomInRange(ONE, pSubOne, RND); |
| |
| BigInteger m1 = encDecTest(message); |
| BigInteger m2 = labelledEncDecTest(message, "myRandomLabel"); |
| BigInteger m3 = encDecEncodingTest(message); |
| BigInteger m4 = labelledEncDecEncodingTest(message, "myOtherCoolLabel"); |
| |
| if (!message.equals(m1) || !message.equals(m2) || !message.equals(m3) || !message.equals(m4)) |
| { |
| fail("decrypted message != original message"); |
| } |
| } |
| } |
| |
| private BigInteger encDecEncodingTest(BigInteger m) |
| { |
| CramerShoupCiphertext ciphertext = encrypt(m); |
| byte[] c = ciphertext.toByteArray(); |
| CramerShoupCiphertext decC = new CramerShoupCiphertext(c); |
| return decrypt(decC); |
| } |
| |
| private BigInteger labelledEncDecEncodingTest(BigInteger m, String l) |
| { |
| byte[] c = encrypt(m, l).toByteArray(); |
| return decrypt(new CramerShoupCiphertext(c), l); |
| } |
| |
| private BigInteger encDecTest(BigInteger m) |
| { |
| CramerShoupCiphertext c = encrypt(m); |
| return decrypt(c); |
| } |
| |
| private BigInteger labelledEncDecTest(BigInteger m, String l) |
| { |
| CramerShoupCiphertext c = encrypt(m, l); |
| return decrypt(c, l); |
| } |
| |
| |
| private BigInteger decrypt(CramerShoupCiphertext ciphertext) |
| { |
| return decrypt(ciphertext, null); |
| } |
| |
| private BigInteger decrypt(CramerShoupCiphertext ciphertext, String label) |
| { |
| |
| CramerShoupCoreEngine engine = new CramerShoupCoreEngine(); |
| if (label != null) |
| { |
| engine.init(false, keyPair.getPrivate(), label); |
| } |
| else |
| { |
| engine.init(false, keyPair.getPrivate()); |
| } |
| try |
| { |
| BigInteger m = engine.decryptBlock(ciphertext); |
| |
| return m; |
| } |
| catch (CramerShoupCiphertextException e) |
| { |
| e.printStackTrace(); |
| } |
| |
| return null; |
| } |
| |
| private CramerShoupCiphertext encrypt(BigInteger message) |
| { |
| return encrypt(message, null); |
| } |
| |
| private CramerShoupCiphertext encrypt(BigInteger message, String label) |
| { |
| CramerShoupKeyPairGenerator kpGen = new CramerShoupKeyPairGenerator(); |
| CramerShoupParametersGenerator pGen = new CramerShoupParametersGenerator(); |
| |
| pGen.init(2048, 1, RND); |
| CramerShoupParameters params = pGen.generateParameters(DHStandardGroups.rfc3526_2048); |
| CramerShoupKeyGenerationParameters param = new CramerShoupKeyGenerationParameters(RND, params); |
| |
| kpGen.init(param); |
| keyPair = kpGen.generateKeyPair(); |
| |
| CramerShoupCoreEngine engine = new CramerShoupCoreEngine(); |
| if (label != null) |
| { |
| engine.init(true, keyPair.getPublic(), label); |
| } |
| else |
| { |
| engine.init(true, keyPair.getPublic()); |
| } |
| |
| CramerShoupCiphertext ciphertext = engine.encryptBlock(message); |
| |
| return ciphertext; |
| } |
| } |