// Adds some functionality to used BigInt.js library.

var digit_to_hex = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');

//numbits must be multiple of 4
function random_bigint(numbits, randpool)
{
    var number_str = "";
    var rand_bytes;
    var j = 0;

    if (numbits % 4 != 0) {
	numbits = Math.ceil(numbits / 4) * 4;
    }

    if (numbits == 0) {
	numbits = 4;
    }

    rand_bytes = randpool.get_bytes(Math.ceil(numbits / 8));

    for (var i = 0; i < (numbits / 4); i++) {
	if (i & 0x1) {
	    number_str += digit_to_hex[(rand_bytes[i >>> 1] & 0xf0) >>> 4];
	}
	else {
	    number_str += digit_to_hex[rand_bytes[i >>> 1] & 0x0f];
	}
    }

    return biFromHex(number_str);
}

function random_bigint_below_near(number, randpool)
{
    var numbits = biNumBits(number);
    var generated_num;

    do {
	generated_num = random_bigint(numbits, randpool);
    } while ((biCompare(generated_num, number) >= 0) || (biCompare(generated_num, big_zero) == 0));

    return generated_num;
}

//non-zero
function random_bigint_below(number, randpool)
{
    var numbits = biNumBits(number);
    var rand_byte = randpool.get_bytes(1)[0];
    var gen_numbits = Math.round(numbits * (rand_byte / 0xff));
    var tmp;

    do {
	tmp = random_bigint(gen_numbits, randpool);
    } while (biCompare(tmp, big_zero) == 0);

    tmp = biAdd(tmp, big_one);

    if (biCompare(tmp, number) > 0) {
	tmp = number;
    }

    return random_bigint_below_near(tmp, randpool);
}

