/**
 * BigIntMath contient un ensemble d'opérations Mathématiques 
 * utilisant BigInt et servant à générer un cryptage RSA compatible 
 * avec la classe PEAR de cryptage RSA
 * 
 * BigInt              =>  Dave Shapiro (dave@ohdave.com)  
 * Classe RSA de Pear  => Alexander Valyalkin <valyala@gmail.com>
 * 
 * @package Aedituus
 * @subpackage javascript
 * @version 2.0
 * @author Wamania
 * @copyright Copyright (c) 2008, Wamania
 * @license Creative Commons Paternité 2.0 ( http://creativecommons.org/licenses/by/2.0/fr/ )
 * @link http://www.wamania.com
 */

/**
 * Binaire vers Integer
 * 
 * @param {String} str
 * @return Integer
 */
function bin2int(str)
{
    var entier = biFromNumber(0);
    var NextInt = 0;
    n = str.length;
    do 
    {
        n--;
        NextInt = str.charCodeAt(n);
        entier = biAdd(biMultiply(entier, biFromNumber(256)), biFromNumber(NextInt));
    } 
    while (n > 0);
    
    return entier;
}

/**
 * 
 * @param {Integer} num
 * @return Binary
 */
function int2bin(num)
{
    var chaine = '';
    var charCode = '';
    do 
    {
        charCode = biToString(biModulo(num, biFromNumber(256)), 10);
        chaine += String.fromCharCode(parseInt(charCode));
        num = biDivide(num, biFromNumber(256));
    } 
    while (biCompare(num, biFromNumber(0)));
    
    return chaine;
}

/**
 * 
 * @param {Object} num
 * @param {Object} start
 * @param {Object} length
 */
function subint(num, start, length)
{
    var i = 0;
    var start_byte = parseInt(start / 8);
    var start_bit = start % 8;
    var byte_length = parseInt(length / 8);
    var bit_length = length % 8;
    if (bit_length) 
    {
        byte_length++;
    }
    
    num = biDivide(num, biFromNumber(1 << start_bit));
    var tmp = int2bin(num);
    tmp = tmp.substr(start_byte, byte_length);
    for (i=tmp.length; i<byte_length; i++)
    {
        tmp += "\0";
    }

    return bin2int(tmp);
}

/**
 * 
 * @param {Integer} num
 */
function bitLen(num)
{
    tmp = int2bin(num);
    bit_len = tmp.length * 8;
    tmp = tmp.charCodeAt( (tmp.length - 1) );
    if (!tmp) 
    {
        bit_len -= 8;
    }
    else 
    {
        while (!(tmp & 0x80)) 
        {
            bit_len--;
            tmp <<= 1;
        }
    }
    return bit_len;
}
