191 lines
5.6 KiB
Java
191 lines
5.6 KiB
Java
// Just because I always forget Java compilation:
|
|
// javac Generator.java -cp bcprov-ext-jdk15on-159.jar
|
|
// java -cp "bcprov-ext-jdk15on-159.jar:." Generator
|
|
// Also, go here:
|
|
// https://www.bouncycastle.org/latest_releases.html
|
|
//
|
|
import java.io.FileWriter;
|
|
import java.io.IOException;
|
|
import java.lang.InterruptedException;
|
|
import java.lang.Math;
|
|
import java.lang.Thread;
|
|
import java.math.BigInteger;
|
|
import java.security.*;
|
|
import java.security.interfaces.RSAPrivateKey;
|
|
import java.security.interfaces.RSAPublicKey;
|
|
import javax.crypto.Cipher;
|
|
import javax.crypto.BadPaddingException;
|
|
import javax.crypto.IllegalBlockSizeException;
|
|
import javax.crypto.NoSuchPaddingException;
|
|
|
|
class Generator
|
|
{
|
|
public final static int[] KEY_SIZES = {512,1024,2048,3072,4096,8192,15360};
|
|
public final static int RUN_COUNT = 1;//750;
|
|
public final static int THREADS = 4;
|
|
|
|
private SecureRandom rng;
|
|
private FileWriter outf;
|
|
|
|
public Generator(SecureRandom rng, FileWriter outf)
|
|
{
|
|
this.rng = rng;
|
|
this.outf = outf;
|
|
}
|
|
|
|
synchronized public void output(RSAPrivateKey key,
|
|
String digest,
|
|
byte[] message,
|
|
byte[] signature,
|
|
byte[] cipher)
|
|
{
|
|
try {
|
|
this.outf.write("d: " + key.getPrivateExponent().toString(16) + "\n");
|
|
this.outf.write("n: " + key.getModulus().toString(16) + "\n");
|
|
this.outf.write("h: " + digest.substring(3) + "\n");
|
|
this.outf.write("m: " + asHex(message) + "\n");
|
|
this.outf.write("s: " + asHex(signature) + "\n");
|
|
this.outf.write("c: " + asHex(cipher) + "\n");
|
|
System.out.print(".");
|
|
this.outf.flush();
|
|
System.out.flush();
|
|
} catch(IOException e) {
|
|
System.out.println("EXCEPTION: " + e);
|
|
}
|
|
}
|
|
|
|
private String asHex(byte[] data) {
|
|
String result = "";
|
|
|
|
for(byte value : data) {
|
|
result = result + String.format("%02x", value);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
public void run(int size)
|
|
throws InterruptedException
|
|
{
|
|
Thread threads[] = new Thread[THREADS];
|
|
|
|
for(int i = 0; i < THREADS; i++) {
|
|
Runner runner = new Runner(size);
|
|
Thread runThread = new Thread(runner);
|
|
runThread.start();
|
|
threads[i] = runThread;
|
|
}
|
|
for(Thread t : threads) { t.join(); }
|
|
}
|
|
|
|
public static void main(String[] args)
|
|
throws IOException, InterruptedException
|
|
{
|
|
SecureRandom rng = new SecureRandom();
|
|
|
|
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
|
|
for(int size : KEY_SIZES) {
|
|
System.out.print("Generating " + size + "-bit RSA tests ");
|
|
FileWriter sig = new FileWriter("rsa" + size + ".test");
|
|
|
|
Generator gen = new Generator(rng, sig);
|
|
gen.run(size);
|
|
|
|
sig.close();
|
|
System.out.println(" done.");
|
|
}
|
|
}
|
|
|
|
private class Runner implements Runnable
|
|
{
|
|
private int size;
|
|
|
|
public Runner(int size)
|
|
{
|
|
this.size = size;
|
|
}
|
|
|
|
private KeyPair generateKey()
|
|
throws NoSuchAlgorithmException, NoSuchProviderException
|
|
{
|
|
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
|
|
generator.initialize(this.size, rng);
|
|
KeyPair kp = generator.generateKeyPair();
|
|
return kp;
|
|
}
|
|
|
|
private byte[] generateBlock(int maxSize)
|
|
{
|
|
int size = rng.nextInt(maxSize);
|
|
byte message[] = new byte[size];
|
|
rng.nextBytes(message);
|
|
return message;
|
|
}
|
|
|
|
private String randomDigest()
|
|
{
|
|
switch(rng.nextInt(5)) {
|
|
case 0: return "SHA1";
|
|
case 1: return "SHA224";
|
|
case 2: return "SHA256";
|
|
case 3: return "SHA384";
|
|
case 4: return "SHA512";
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private String signingAlgorithm(String digest)
|
|
{
|
|
return (digest + "withRSA");
|
|
}
|
|
|
|
private String encryptAlgorithm(String digest)
|
|
{
|
|
return ("RSA/None/OAEPWith" + digest + "AndMGF1Padding");
|
|
}
|
|
|
|
private byte[] sign(String algo, RSAPrivateKey key, byte[] msg)
|
|
throws IllegalArgumentException, SignatureException,
|
|
InvalidKeyException, NoSuchAlgorithmException
|
|
{
|
|
Signature sig = Signature.getInstance(signingAlgorithm(algo));
|
|
sig.initSign(key, rng);
|
|
sig.update(msg);
|
|
return sig.sign();
|
|
}
|
|
|
|
private byte[] encrypt(String algo, RSAPrivateKey key, byte[] msg)
|
|
throws IllegalArgumentException, NoSuchAlgorithmException,
|
|
NoSuchProviderException, InvalidKeyException,
|
|
IllegalBlockSizeException, NoSuchPaddingException,
|
|
BadPaddingException
|
|
{
|
|
Cipher cipher = Cipher.getInstance(encryptAlgorithm(algo), "BC");
|
|
cipher.init(Cipher.ENCRYPT_MODE, key);
|
|
return cipher.doFinal(msg);
|
|
}
|
|
|
|
public void run()
|
|
{
|
|
int i = 0;
|
|
|
|
while(i < RUN_COUNT) {
|
|
try {
|
|
KeyPair kpair = this.generateKey();
|
|
RSAPrivateKey key = (RSAPrivateKey)kpair.getPrivate();
|
|
byte[] msg = this.generateBlock(1024);
|
|
String digest = this.randomDigest();
|
|
byte[] sig = this.sign(digest, key, msg);
|
|
byte[] enc = this.encrypt(digest, key, msg);
|
|
output(key, digest, msg, sig, enc);
|
|
i = i + 1;
|
|
} catch(Exception e) {
|
|
System.out.println("Exception: " + e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|