* Split core lib into multiple files * Refactor data encoding methods * Refactor data masking process * Improve qr code generation process * Increase minimum required node version to 0.10 * Add linter * Add tests and tests coverage * Update travis config to fix compilation issues * Add examples folder * Add missing license tag in package.json * Update build script and add sourcemap support * Publish only strictly needed files on npm * Update readme
64 lines
1.5 KiB
JavaScript
64 lines
1.5 KiB
JavaScript
var Buffer = require('../utils/buffer')
|
|
var GF = require('./galois-field')
|
|
|
|
/**
|
|
* Multiplies two polynomials inside Galois Field
|
|
*
|
|
* @param {Buffer} p1 Polynomial
|
|
* @param {Buffer} p2 Polynomial
|
|
* @return {Buffer} Product of p1 and p2
|
|
*/
|
|
exports.mul = function mul (p1, p2) {
|
|
var coeff = new Buffer(p1.length + p2.length - 1)
|
|
coeff.fill(0)
|
|
|
|
for (var i = 0; i < p1.length; i++) {
|
|
for (var j = 0; j < p2.length; j++) {
|
|
coeff[i + j] ^= GF.mul(p1[i], p2[j])
|
|
}
|
|
}
|
|
|
|
return coeff
|
|
}
|
|
|
|
/**
|
|
* Calculate the remainder of polynomials division
|
|
*
|
|
* @param {Buffer} divident Polynomial
|
|
* @param {Buffer} divisor Polynomial
|
|
* @return {Buffer} Remainder
|
|
*/
|
|
exports.mod = function mod (divident, divisor) {
|
|
var result = new Buffer(divident)
|
|
|
|
while ((result.length - divisor.length) >= 0) {
|
|
var coeff = result[0]
|
|
|
|
for (var i = 0; i < divisor.length; i++) {
|
|
result[i] ^= GF.mul(divisor[i], coeff)
|
|
}
|
|
|
|
// remove all zeros from buffer head
|
|
var offset = 0
|
|
while (offset < result.length && result[offset] === 0) offset++
|
|
result = result.slice(offset)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
/**
|
|
* Generate an irreducible generator polynomial of specified degree
|
|
* (used by Reed-Solomon encoder)
|
|
*
|
|
* @param {Number} degree Degree of the generator polynomial
|
|
* @return {Buffer} Buffer containing polynomial coefficients
|
|
*/
|
|
exports.generateECPolynomial = function generateECPolynomial (degree) {
|
|
var poly = new Buffer([1])
|
|
for (var i = 0; i < degree; i++) {
|
|
poly = exports.mul(poly, [1, GF.exp(i)])
|
|
}
|
|
|
|
return poly
|
|
}
|