var NUMBITS_ERROR = "Specified number of bits isn't correct.\n";
var ENCRYPT_EXP_ERROR = "Specified encryption exponent isn't correct.\n Ignored.";

var hex_re = /^[0-9a-fA-F]+/;

function is_valid_hex_num(string)
{
    var num = string.match(hex_re);

    if (num != string) {
	return false;
    }
    else {
	return true;
    }
}


function generate_rsa_key(numbits, e, entropy, callback)
{
    var numbits_int = Number(numbits);

    if (isNaN(numbits_int) || (numbits == "")) {
	alert(NUMBITS_ERROR);
	return "";
    }

    init_constants(numbits_int);
    init_starting_time();

    if (!is_valid_hex_num(e)) {
	if (e != "") {
	    alert(ENCRYPT_EXP_ERROR);
	}

	e = null;
    }
    else {
	e = biFromHex(e);
    }

    var sha256 = new SHA256();
    var hmac = new HMAC(sha256);
    var randpool = new Randpool(hmac, entropy);

    rsa_keygen(numbits_int, e, randpool, function(rsa_key){callback("e = " + biToHex(rsa_key[0]) + "\nd = " + biToHex(rsa_key[1]) + "\nm = " + biToHex(rsa_key[2]));});

}

