78 lines
1.6 KiB
JavaScript
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);
|
|
}
|