UNPKG

qr-image

Version:

QR Code generator (png, svg, pdf, eps)

78 lines (65 loc) 1.66 kB
"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 new Buffer(msg); }