JavaScript Misdirection Contest #0

See http://misdirect.ion.land

HTML

<!-- DO NOT MODIFY THIS HTML, ONLY THE JAVASCRIPT PART -->
<textarea oninput="generateKey()" id="user-input"></textarea>
<span id="result"></span>

<!-- DO NOT MODIFY THIS HTML, ONLY THE JAVASCRIPT PART -->

CSS

/* DO NOT MODIFY THIS CSS, ONLY THE JAVASCRIPT PART */

JavaScript

// *** Multi-precision arithmetic ***

// Compare x and y. Return -1 if x < y; 0 if x = y; and 1 if x > y.
function mp_cmp(x, y) {
    for (var x_top = x.length - 1; x_top > 0; --x_top)
        if (x[x_top])
            break;
    for (var y_top = y.length - 1; y_top > 0; --y_top)
        if (y[y_top])
            break;
    if (x_top > y_top)
        return 1;
    if (x_top < y_top)
        return -1;
    for (; x_top >= 0; --x_top) {
        if (x[x_top] > y[x_top])
            return 1;
        if (x[x_top] < y[x_top])
            return -1;
    }
    return 0;
}

// Add a list of numbers together.
function mp_sum(xs) {
    if (xs.length == 0)
        return [0];
    var z = xs[0].slice();
    for (var i = 1; i < xs.length; ++i) {
        var x = xs[i];
        for (var j = 0; j < Math.min(z.length, x.length); ++j)
            z[j] += x[j];
        for (; j < x.length; ++j)
            z[j] = x[j];
    }

    var r = 0;
    for (var i = 0; i < z.length; ++i) {
        z[i] += r;
        r = Math.floor(z[i] / 0x100000000);
        z[i] = z[i] >>> 0; // Convert to 32-bit unsigned integer!
    }
    if (r > 0)
        z.push(r);
    return z;
}

// Return x + y.
function mp_add(x, y) { return mp_sum([x, y]); }

// Return x - y. Requires x > y.
function mp_sub(x, y) {
    var z = new Array(x.length);
    var c = 0;
    for (var i = 0; i < y.length; ++i) {
        z[i] = (x[i] - y[i] - c) >>> 0;
        if (x[i] != y[i])
            c = x[i] < y[i];
    }
    for (; i < x.length; ++i) {
        z[i] = (x[i] - c) >>> 0;
        if (x[i] != 0)
            c = 0;
    }
    return z;
}

// Return x * y.
function mp_mul(x, y) {
    var xe = new Array(2*x.length);
    var ye = new Array(2*y.length);
    var a = new Array(xe.length + ye.length);
    for (var i = 0; i < x.length; ++i) {
        xe[2*i]     = x[i] & 0xffff;
        xe[2*i + 1] = x[i] >>> 16;
    }
    for (var i = 0; i < y.length; ++i) {
        ye[2*i]     = y[i] & 0xffff;
        ye[2*i + 1] = y[i] >>>...