parent
05b75d2241
commit
b3cc125a3f
|
|
@ -22,8 +22,8 @@ if (settings.tokens) tokens = settings.tokens; /* v0.03+ settings */
|
||||||
|
|
||||||
function b32decode(seedstr) {
|
function b32decode(seedstr) {
|
||||||
// RFC4648
|
// RFC4648
|
||||||
var buf = 0, bitcount = 0, retstr = "";
|
let buf = 0, bitcount = 0, retstr = "";
|
||||||
for (var c of seedstr.toUpperCase()) {
|
for (let c of seedstr.toUpperCase()) {
|
||||||
if (c == '0') c = 'O';
|
if (c == '0') c = 'O';
|
||||||
if (c == '1') c = 'I';
|
if (c == '1') c = 'I';
|
||||||
if (c == '8') c = 'B';
|
if (c == '8') c = 'B';
|
||||||
|
|
@ -39,63 +39,62 @@ function b32decode(seedstr) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var retbuf = new Uint8Array(retstr.length);
|
let retbuf = new Uint8Array(retstr.length);
|
||||||
for (var i in retstr) {
|
for (let i in retstr) {
|
||||||
retbuf[i] = retstr.charCodeAt(i);
|
retbuf[i] = retstr.charCodeAt(i);
|
||||||
}
|
}
|
||||||
return retbuf;
|
return retbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
function hmac(key, message, algo) {
|
function hmac(key, message, algo) {
|
||||||
var a = algos[algo.toUpperCase()];
|
let a = algos[algo.toUpperCase()];
|
||||||
// RFC2104
|
// RFC2104
|
||||||
if (key.length > a.blksz) {
|
if (key.length > a.blksz) {
|
||||||
key = a.sha(key);
|
key = a.sha(key);
|
||||||
}
|
}
|
||||||
var istr = new Uint8Array(a.blksz + message.length);
|
let istr = new Uint8Array(a.blksz + message.length);
|
||||||
var ostr = new Uint8Array(a.blksz + a.retsz);
|
let ostr = new Uint8Array(a.blksz + a.retsz);
|
||||||
for (var i = 0; i < a.blksz; ++i) {
|
for (let i = 0; i < a.blksz; ++i) {
|
||||||
var c = (i < key.length) ? key[i] : 0;
|
let c = (i < key.length) ? key[i] : 0;
|
||||||
istr[i] = c ^ 0x36;
|
istr[i] = c ^ 0x36;
|
||||||
ostr[i] = c ^ 0x5C;
|
ostr[i] = c ^ 0x5C;
|
||||||
}
|
}
|
||||||
istr.set(message, a.blksz);
|
istr.set(message, a.blksz);
|
||||||
ostr.set(a.sha(istr), a.blksz);
|
ostr.set(a.sha(istr), a.blksz);
|
||||||
var ret = a.sha(ostr);
|
let ret = a.sha(ostr);
|
||||||
// RFC4226 dynamic truncation
|
// RFC4226 dynamic truncation
|
||||||
var v = new DataView(ret, ret[ret.length - 1] & 0x0F, 4);
|
let v = new DataView(ret, ret[ret.length - 1] & 0x0F, 4);
|
||||||
return v.getUint32(0) & 0x7FFFFFFF;
|
return v.getUint32(0) & 0x7FFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatOtp(otp, digits) {
|
function formatOtp(otp, digits) {
|
||||||
// add 0 padding
|
// add 0 padding
|
||||||
var ret = "" + otp % Math.pow(10, digits);
|
let ret = "" + otp % Math.pow(10, digits);
|
||||||
while (ret.length < digits) {
|
while (ret.length < digits) {
|
||||||
ret = "0" + ret;
|
ret = "0" + ret;
|
||||||
}
|
}
|
||||||
// add a space after every 3rd or 4th digit
|
// add a space after every 3rd or 4th digit
|
||||||
var re = (digits % 3 == 0 || (digits % 3 >= digits % 4 && digits % 4 != 0)) ? "" : ".";
|
let re = (digits % 3 == 0 || (digits % 3 >= digits % 4 && digits % 4 != 0)) ? "" : ".";
|
||||||
return ret.replace(new RegExp("(..." + re + ")", "g"), "$1 ").trim();
|
return ret.replace(new RegExp("(..." + re + ")", "g"), "$1 ").trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
function hotp(token) {
|
function hotp(token) {
|
||||||
var d = Date.now();
|
let d = Date.now();
|
||||||
var tick, next;
|
let tick, next;
|
||||||
if (token.period > 0) {
|
if (token.period > 0) {
|
||||||
// RFC6238 - timed
|
// RFC6238 - timed
|
||||||
var seconds = Math.floor(d / 1000);
|
tick = Math.floor(Math.floor(d / 1000) / token.period);
|
||||||
tick = Math.floor(seconds / token.period);
|
|
||||||
next = (tick + 1) * token.period * 1000;
|
next = (tick + 1) * token.period * 1000;
|
||||||
} else {
|
} else {
|
||||||
// RFC4226 - counter
|
// RFC4226 - counter
|
||||||
tick = -token.period;
|
tick = -token.period;
|
||||||
next = d + 30000;
|
next = d + 30000;
|
||||||
}
|
}
|
||||||
var msg = new Uint8Array(8);
|
let msg = new Uint8Array(8);
|
||||||
var v = new DataView(msg.buffer);
|
let v = new DataView(msg.buffer);
|
||||||
v.setUint32(0, tick >> 16 >> 16);
|
v.setUint32(0, tick >> 16 >> 16);
|
||||||
v.setUint32(4, tick & 0xFFFFFFFF);
|
v.setUint32(4, tick & 0xFFFFFFFF);
|
||||||
var ret;
|
let ret;
|
||||||
try {
|
try {
|
||||||
ret = hmac(b32decode(token.secret), msg, token.algorithm);
|
ret = hmac(b32decode(token.secret), msg, token.algorithm);
|
||||||
ret = formatOtp(ret, token.digits);
|
ret = formatOtp(ret, token.digits);
|
||||||
|
|
@ -117,7 +116,7 @@ var state = {
|
||||||
};
|
};
|
||||||
|
|
||||||
function sizeFont(id, txt, w) {
|
function sizeFont(id, txt, w) {
|
||||||
var sz = fontszCache[id];
|
let sz = fontszCache[id];
|
||||||
if (sz) {
|
if (sz) {
|
||||||
g.setFont("Vector", sz);
|
g.setFont("Vector", sz);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue