package io.conducive.client.crypt;
import com.google.gwt.core.client.Callback;
import com.google.gwt.core.client.JavaScriptObject;
import com.googlecode.gwt.crypto.bouncycastle.AsymmetricCipherKeyPair;
import com.googlecode.gwt.crypto.bouncycastle.params.RSAKeyParameters;
import com.googlecode.gwt.crypto.bouncycastle.params.RSAPrivateCrtKeyParameters;
import java.math.BigInteger;
/**
*
*/
public class Forge {
public final static int DEFAULT_WORKERS = 2;
private Callback<AsymmetricCipherKeyPair, String> callback;
private int numWorkers;
private int strength;
public Forge(int numWorkers, RSA.Strength strength, Callback<AsymmetricCipherKeyPair, String> callback) {
this.callback = callback;
this.numWorkers = numWorkers;
this.strength = strength.getStrength();
}
public void generateKeys() {
generateKey(numWorkers, strength, callbackFunction(this));
}
public static native void generateKey(int numWorkers, int strength, JavaScriptObject callback) /*-{
var rsa = $wnd.forge.pki.rsa;
// generate an RSA key pair asynchronously (uses web workers if available)
rsa.generateKeyPair({bits: strength, workers: numWorkers, workerScript:'/js/forge/prime.worker.js'},
function(err, keypair) {
pub = keypair.publicKey;
priv = keypair.privateKey;
callback(pub.n.toString(), pub.e.toString(),
priv.d.toString(), priv.p.toString(), priv.q.toString(), priv.dP.toString(), priv.dQ.toString(), priv.qInv.toString());
});
}-*/;
public static native JavaScriptObject callbackFunction(Forge forge) /*-{
return forge == null ? null : $entry(function(m, pub, priv, p, q, dP, dQ, qInv) {
forge.@io.conducive.client.crypt.Forge::callback(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)
(m, pub, priv, p, q, dP, dQ, qInv)
});
}-*/;
public void callback(String modulus, String publicExponent, String privateExponent,
String p, String q, String dP, String dQ, String qInv)
{
RSAPrivateCrtKeyParameters priv = RSA.deserialize(modulus, publicExponent, privateExponent,
p, q, dP, dQ, qInv);
RSAKeyParameters pub = new RSAKeyParameters(false, new BigInteger(modulus), new BigInteger(publicExponent));
// TODO handle error from forge
AsymmetricCipherKeyPair keyPair = new AsymmetricCipherKeyPair(pub, priv);
callback.onSuccess(keyPair);
}
}