WireguardConfigGen/qr/errorcode.js

78 lines
1.6 KiB
JavaScript

"use strict";
// {{{1 Galois Field Math
var GF256_BASE = 285;
var EXP_TABLE = [1];
var LOG_TABLE = [];
for (var i = 1; i < 256; i++) {
var n = EXP_TABLE[i - 1] << 1;
if (n > 255) n = n ^ GF256_BASE;
EXP_TABLE[i] = n;
}
for (var i = 0; i < 255; i++) {
LOG_TABLE[EXP_TABLE[i]] = i;
}
function exp(k) {
while (k < 0) k += 255;
while (k > 255) k -= 255;
return EXP_TABLE[k];
}
function log(k) {
if (k < 1 || k > 255) {
throw Error('Bad log(' + k + ')');
}
return LOG_TABLE[k];
}
// {{{1 Generator Polynomials
var POLYNOMIALS = [
[0], // a^0 x^0
[0, 0], // a^0 x^1 + a^0 x^0
[0, 25, 1], // a^0 x^2 + a^25 x^1 + a^1 x^0
// and so on...
];
function generatorPolynomial(num) {
if (POLYNOMIALS[num]) {
return POLYNOMIALS[num];
}
var prev = generatorPolynomial(num - 1);
var res = [];
res[0] = prev[0];
for (var i = 1; i <= num; i++) {
res[i] = log(exp(prev[i]) ^ exp(prev[i - 1] + num - 1));
}
POLYNOMIALS[num] = res;
return res;
}
// {{{1 export functions
module.exports = function calculate_ec(msg, ec_len) {
// `msg` could be array or buffer
// convert `msg` to array
msg = [].slice.call(msg);
// Generator Polynomial
var poly = generatorPolynomial(ec_len);
for (var i = 0; i < ec_len; i++) msg.push(0);
while (msg.length > ec_len) {
if (!msg[0]) {
msg.shift();
continue;
}
var log_k = log(msg[0]);
for (var i = 0; i <= ec_len; i++) {
msg[i] = msg[i] ^ exp(poly[i] + log_k);
}
msg.shift();
}
return Buffer.from(msg);
}