react-chiptan
Version:
React component renders chipTAN flicker code
168 lines (137 loc) • 4.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.flickerCode = flickerCode;
exports.flickerCanvas = flickerCanvas;
function flickerCode(newcode) {
var code = newcode.toUpperCase().replace(/[^a-fA-F0-9]/g, '');
var toHex = function toHex(n, minlen) {
var s = n.toString(16).toUpperCase();
while (s.length < minlen) {
s = '0' + s;
}
return s;
};
var quersumme = function quersumme(n) {
var q = 0;
while (n != 0) {
q += n % 10;
n = Math.floor(n / 10);
}
return q;
};
var getPayload = function getPayload() {
var i = 0;
var payload = '';
var len = parseInt(code.slice(0, 2), 16);
i += 2;
while (i < code.length - 2) {
i += 1;
len = parseInt(code.slice(i, i + 1), 16);
i += 1;
payload += code.slice(i, i + len * 2);
i += len * 2;
}
return payload;
};
var checksum = function checksum() {
var len = code.length / 2 - 1;
code = toHex(len, 2) + code.substr(2);
var luhndata = getPayload();
var luhnsum = 0;
for (var i = 0; i < luhndata.length; i += 2) {
luhnsum += 1 * parseInt(luhndata[i], 16) + quersumme(2 * parseInt(luhndata[i + 1], 16));
}
luhnsum = (10 - luhnsum % 10) % 10;
code = code.substr(0, code.length - 2) + toHex(luhnsum, 1) + code.substr(code.length - 1);
var xorsum = 0;
for (var _i = 0; _i < code.length - 2; _i++) {
xorsum ^= parseInt(code[_i], 16);
}
code = code.substr(0, code.length - 1) + toHex(xorsum, 1);
};
this.getCode = function () {
return code;
};
checksum();
}
function flickerCanvas(width, height, bgColor, barColor) {
var _this = this;
var code = void 0,
halfbyteid = void 0,
clock = void 0,
bitarray = void 0,
canvas = void 0,
ctx = void 0;
this.reset = function () {
halfbyteid = 0;
clock = 1;
};
var setup = function setup() {
var bits = new Object();
bits['0'] = [0, 0, 0, 0, 0];
bits['1'] = [0, 1, 0, 0, 0];
bits['2'] = [0, 0, 1, 0, 0];
bits['3'] = [0, 1, 1, 0, 0];
bits['4'] = [0, 0, 0, 1, 0];
bits['5'] = [0, 1, 0, 1, 0];
bits['6'] = [0, 0, 1, 1, 0];
bits['7'] = [0, 1, 1, 1, 0];
bits['8'] = [0, 0, 0, 0, 1];
bits['9'] = [0, 1, 0, 0, 1];
bits['A'] = [0, 0, 1, 0, 1];
bits['B'] = [0, 1, 1, 0, 1];
bits['C'] = [0, 0, 0, 1, 1];
bits['D'] = [0, 1, 0, 1, 1];
bits['E'] = [0, 0, 1, 1, 1];
bits['F'] = [0, 1, 1, 1, 1];
code = '0FFF' + code;
bitarray = new Array();
for (var i = 0; i < code.length; i += 2) {
bitarray[i] = bits[code[i + 1]];
bitarray[i + 1] = bits[code[i]];
}
};
var createCanvas = function createCanvas(width, height, bgColor, barColor) {
canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
if (canvas.getContext) {
ctx = canvas.getContext('2d');
}
ctx.fillStyle = bgColor;
ctx.fillRect(0, 0, canvas.width, canvas.height);
};
this.step = function () {
var margin = 7;
var barwidth = canvas.width / 5;
bitarray[halfbyteid][0] = clock;
for (var i = 0; i < 5; i++) {
if (bitarray[halfbyteid][i] == 1) {
ctx.fillStyle = barColor;
} else {
ctx.fillStyle = bgColor;
}
ctx.fillRect(i * barwidth + margin, margin, barwidth - 2 * margin, canvas.height - 2 * margin);
}
clock--;
if (clock < 0) {
clock = 1;
halfbyteid++;
if (halfbyteid >= bitarray.length) {
halfbyteid = 0;
}
}
return 0;
};
this.getCanvas = function () {
return canvas;
};
this.setCode = function (newcode) {
code = newcode.getCode();
setup();
_this.reset();
};
createCanvas(width, height, bgColor, barColor);
}