 32);
        }
        return words;
    };

    var wordsToBytes = function (words) {
        var bytes = [];
        for (var b = 0; b < words.length * 32; b += 8) {
            bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
        }
        return bytes;
    };

    var processBlock = function (H, M, offset) {

        // Swap endian
        for (var i = 0; i < 16; i++) {
            var offset_i = offset + i;
            var M_offset_i = M[offset_i];

            // Swap
            M[offset_i