Checkpoint; not sure where this code is, but I'm rethinking.
This commit is contained in:
190
tests/rsa/dead/Generator.java
Normal file
190
tests/rsa/dead/Generator.java
Normal file
@@ -0,0 +1,190 @@
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user