UNPKG

react-chiptan

Version:

React component renders chipTAN flicker code

168 lines (137 loc) 4.33 kB
'use strict'; 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); }