// HMAC implementation.
// rfc 2104.

// Used during secure random numbers generation.

var IPAD_PATTERN = 0x36;
var OPAD_PATTERN = 0x5c;

function array_xor(array, value)
{
    var result = new Array(array.length);

    for (var i = 0; i < array.length; i++) {
	result[i] = array[i] ^ value;
    }

    return result;
}

function HMAC(hash_object)
{
    this.hash_object = hash_object;
    this.block_size = hash_object.block_size();
    this.hash_size = hash_object.hash_size();

    this.digest = function(data) { return this.hash_object.digest(data); };
    this.calculate = HMAC_calculate;
    this.output_size = function() { return this.hash_size; };
}

function HMAC_calculate(key, text)
{
    var tmp = this.digest(array_xor(key, IPAD_PATTERN).concat(text));

    return this.digest(array_xor(key, OPAD_PATTERN).concat(tmp));
}
