Реализация кода Javascript в надстройках XUL/Thunderbird

Я хочу создать аддон Thunderbird для шифрования/дешифрования электронной почты. У меня есть код JavaScript, но я не знаю, как использовать XUL, чтобы заставить его работать. Вот код JavaScript в формате HTML: Fiddle.

var Alphabet = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ \n𮃩∆";

Alphabet = Alphabet.split("");

var Crypto = function (alpha, gen, C) {
    var p, B, encrypt, decrypt, f, g, modInv, modPow, toAlpha, to10;
    toAlpha = function (x) {
        var y, p, l, n;
        if (x === 0) {
            return "!!!!";
        }
        y = [];
        n = 4;
        n = Math.ceil(n);
        while (n--) {
            p = Math.pow(alpha.length, n);
            l = Math.floor(x / p);
            y.push(alpha[l]);
            x -= l * p;
        }
        y = y.join("");
        return y;
    };
    to10 = function (x) {
        var y, p, n;
        y = 0;
        p = 1;
        x = x.split("");
        n = x.length;
        while (n--) {
            y += alpha.indexOf(x[n]) * p;
            p *= alpha.length;
        }
        return y;
    };
    modInv = function (gen, mod) {
        var v, d, u, t, c, q;
        v = 1;
        d = gen;
        t = 1;
        c = mod % gen;
        u = Math.floor(mod / gen);
        while (d > 1) {
            q = Math.floor(d / c);
            d = d % c;
            v = v + q * u;
            if (d) {
                q = Math.floor(c / d);
                c = c % d;
                u = u + q * v;
            }
        }
        return d ? v : mod - u;
    };
    modPow = function (base, exp, mod) {
        var c, x;
        if (exp === 0) {
            return 1;
        } else if (exp < 0) {
            exp = -exp;
            base = modInv(base, mod);
        }
        c = 1;
        while (exp > 0) {
            if (exp % 2 === 0) {
                base = (base * base) % mod;
                exp /= 2;
            } else {
                c = (c * base) % mod;
                exp--;
            }
        }
        return c;
    };
    p = 91744613;
    C = parseInt(C, 10);
    if (isNaN(C)) {
        C = Math.round(Math.sqrt(Math.random() * Math.random()) * (p - 2) + 2);
        alert("Your new private key is "+C);
    }
    B = modPow(gen, C, p);
    decrypt = function (a) {
        var d, x, y;
        x = a[1];
        y = modPow(a[0], -C, p);
        d = (x * y) % p;
        d = Math.round(d) % p;
        return alpha[d - 2];
    };
    encrypt = function (key, d) {
        var k, a;
        k = Math.ceil(Math.sqrt(Math.random() * Math.random()) * 1E10);
        d = alpha.indexOf(d) + 2;
        a = [];
        a[0] = modPow(key[1], k, key[0]);
        a[1] = (d * modPow(key[2], k, key[0])) % key[0];
        return a;
    };
    f = function (message, key) {
        var n, x, y, w;
        y = [];
        message = message.split("");
        n = message.length;
        while (n--) {
            x = encrypt(key, message[n]);
            y.push(toAlpha(x[0]));
            y.push(toAlpha(x[1]));
        }
        y = y.join("");
        return y;
    };
    g = function (message) {
        var n, m, d, x;
        m = [];
        n = message.length / 8;
        while (n--) {
            x = message[8 * n + 4];
            x += message[8 * n + 5];
            x += message[8 * n + 6];
            x += message[8 * n + 7];
            m.unshift(x);
            x = message[8 * n];
            x += message[8 * n + 1];
            x += message[8 * n + 2];
            x += message[8 * n + 3];
            m.unshift(x);
        }
        x = [];
        d = [];
        n = m.length / 2;
        while (n--) {
            x[0] = m[2 * n];
            x[1] = m[2 * n + 1];
            x[0] = to10(x[0]);
            x[1] = to10(x[1]);
            d.push(decrypt(x));
        }
        message = d.join("");
        return message;
    };
    return {
        pubKey: [p, gen, B],
        priKey: C,
        decrypt: g,
        encrypt: f
    };
};

var key = prompt("Do you already have a private key? If so, enter it here. Otherwise, a new one will be generated for you.");

var user = Crypto(Alphabet, 62, key);

var dataBox = document.getElementById("inputBox");

document.getElementById("userPriKeyBox").innerHTML = user.priKey;
document.getElementById("userPubKeyBox").innerHTML = user.pubKey.join(" ");

document.getElementById("encryptBox").onclick = function () {
    var x, y, z;
    x = dataBox.value;
    if (x === "") {
        alert("Please enter some data in the input box.");
        return false;
    }
    y = document.getElementById("recPubKeyBox").value;
    if (y === "") {
        alert("Please enter a valid public key into the public key box.");
        return false;
    }
    y = y.split(" ");
    if (y.length != 3) {
        alert("Please enter a valid public key into the public key box.");
        return false;
    }
    y[0] = parseInt(y[0], 10);
    y[1] = parseInt(y[1], 10);
    y[2] = parseInt(y[2], 10);
    if (isNaN(y[0]) || y[0] < 1 || isNaN(y[1]) || y[1] < 1 || isNaN(y[2]) || y[2] < 1) {
        alert("Please enter a valid public key into the public key box.");
        return false;
    }
    z = user.encrypt(x, y);
    dataBox.value = z;
};

document.getElementById("decryptBox").onclick = function () {
    var x, z;
    x = dataBox.value;
    if (x === "") {
        alert("Please enter some data in the input box.");
        return false;
    }
    z = user.decrypt(x);
    dataBox.value = z;
};
<div style="font-family:monospace">Your private key:
<span id="userPriKeyBox"></span>

    <br/>Your public key:&nbsp;
<span id="userPubKeyBox"></span>

    <br/>Recipient's public key:
    <input id="recPubKeyBox" style="font-family:monospace">
    <br/>
    <textarea id="inputBox" rows="15" cols="50" style="font-family:monospace"></textarea>
    <br/>
    <input type="button" value="Encrypt" id="encryptBox" />
    <input type="button" value="Decrypt" id="decryptBox" />
    <br/>
</div>

Как я могу использовать этот код JavaScript в дополнении Thunderbird?


person user3543541    schedule 27.04.2014    source источник


Ответы (1)


Это руководство мне очень помогло.
Надеюсь, оно также поможет вам добиться успеха с вашим расширением.

person MSKV    schedule 14.05.2014