// RSAJAX - A simple library for secure AJAX calls
// Andrew Peace <apeace@gmail.com>
// http://www.andrewpeace.com/rsajax
// See LICENSE for licensing details

rsajax = {
    get_url: '/rsajax/get_key.php',
    set_url: '/rsajax/set_key.php',
    client_key: null,
    server_n: null,
    server_e: null,
    key_object: {},
    decrypt: function decrypt(value)
    {
        return rc4Decrypt(rsajax.client_key, value);
    },
    encrypt: function encrypt(value)
    {
        return encryptedString(rsajax.key_object, value);
    },
    get_server_public_key: function get_server_public_key()
    {
        var params = arguments.length>0 ? arguments[0] : {};
        var get_url = params.url ? params.url : rsajax.get_url;
        var callback = params.callback ? params.callback : function(){};
        var error = params.error ? params.error : function(){};
        
        $.ajax({
            url: get_url,
            dataType: 'json',
            error: error,
            success: function(data)
                     {
                         rsajax.store_server_public_key(data.n, data.e);
                         callback.call(this);
                     }
        });
    },
    initiate_session: function initiate_session()
    {
        var params = arguments.length>0 ? arguments[0] : {};
        var set_url = params.url ? params.url : rsajax.set_url;
        var key = params.key ? params.key : rsajax.random_key();
        var get_url = params.url ? params.url : rsajax.get_url;
        var callback = params.callback ? params.callback : function(){};
        var error = params.error ? params.error : function(){};

        rsajax.get_server_public_key(
            {url:get_url, error:error, callback:function()
                {
                rsajax.set_client_key({url:set_url, key:key, error:error,
                                callback:callback});
                }
            });
    },
    random_key: function random_key()
    {
        var len = arguments.length>0 ? arguments[0] : 256;
        var from = 32;
        var to = 126;
        if(arguments.length>2)
        {
            from = arguments[1];
            to = arguments[2];
        }
        
        var codes = new Array();
        for(var i=0;i<len;i++)
            codes.push(Math.floor(Math.random() * (to - from + 1)) + from);
        return String.fromCharCode.apply(this, codes);
    },
    set_client_key: function set_client_key()
    {
        var params = arguments.length>0 ? arguments[0] : {};
        var set_url = params.url ? params.url : rsajax.set_url;
        var key = params.key ? params.key : rsajax.random_key();
        var callback = params.callback ? params.callback : function(){};
        var error = params.error ? params.error : function(){};

        rsajax.client_key = key;
        
        $.ajax({
            url: set_url,
            data: {key:rsajax.encrypt(key)},
            error: error,
            success: callback
        });
    },
    store_server_public_key: function store_server_public_key(n, e)
    {
        rsajax.server_n = biFromString(n, 10);
        rsajax.server_e = biFromString(e, 10);
        rsajax.key_object.m = rsajax.server_n;
        rsajax.key_object.e = rsajax.server_e;
        rsajax.key_object.chunkSize = 2 * biHighIndex(rsajax.server_n);
        rsajax.key_object.radix = 10;
        rsajax.key_object.barrett = new BarrettMu(rsajax.server_n);
    }
};
