Skip to content

Instantly share code, notes, and snippets.

@alastorid
Last active September 28, 2023 22:42
Show Gist options
  • Save alastorid/ae62c43d9ae22f03f8ae9e2cc9262982 to your computer and use it in GitHub Desktop.
Save alastorid/ae62c43d9ae22f03f8ae9e2cc9262982 to your computer and use it in GitHub Desktop.
Simple TOTP calculator in JS, use it at your own risk
function sha1(data) {
var K = [0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6];
var H = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0];
var words = [];
var data_len = data.length;
data.push(0x80);
while (data.length % 64 !== 56) {
data.push(0);
}
for (var i = 0; i < data.length; i += 4) {
words.push((data[i] << 24) | (data[i + 1] << 16) | (data[i + 2] << 8) | data[i + 3]);
}
words.push(data_len * 8 / 0x100000000 |0);
words.push(data_len * 8);
for (var i = 0; i < words.length; i += 16) {
var W = words.slice(i, i + 16);
var a = H[0], b = H[1], c = H[2], d = H[3], e = H[4];
for (var j = 0; j < 80; j++) {
if (j >= 16) {
W[j] = W[j - 3] ^ W[j - 8] ^ W[j - 14] ^ W[j - 16];
W[j] = (W[j] << 1) | (W[j] >>> 31);
}
var s = (a << 5) | (a >>> 27);
var f = 0;
if (j < 20) f = (b & c) | (~b & d);
else if (j < 40) f = b ^ c ^ d;
else if (j < 60) f = (b & c) | (b & d) | (c & d);
else f = b ^ c ^ d;
var temp = (s + f + e + K[j / 20 |0] + W[j]) | 0;
e = d;
d = c;
c = (b << 30) | (b >>> 2);
b = a;
a = temp;
}
H[0] = (H[0] + a) |0;
H[1] = (H[1] + b) |0;
H[2] = (H[2] + c) |0;
H[3] = (H[3] + d) |0;
H[4] = (H[4] + e) |0;
}
var hash = [];
for (var i = 0; i < H.length; i++) {
hash.push((H[i] >>> 24) & 0xFF, (H[i] >>> 16) & 0xFF, (H[i] >>> 8) & 0xFF, H[i] & 0xFF);
}
return hash;
}
function hmacSha1(key, data) {
var block_size = 64;
var o_key_pad = new Array(block_size);
var i_key_pad = new Array(block_size);
for (var i = 0; i < block_size; ++i) {
o_key_pad[i] = 0x5C;
i_key_pad[i] = 0x36;
}
for (var i = 0; i < key.length; ++i) {
o_key_pad[i] ^= key[i];
i_key_pad[i] ^= key[i];
}
return sha1(o_key_pad.concat(sha1(i_key_pad.concat(data))));
}
//
// Change the key and time step to meet your need
//
var key = [YOUR_KEY_IN_BYTES];
var now = new Date().getTime();
var t = now / 30000 |0;
var b = new Array(8);
while (key.length < 64) {
key.push(0);
}
for (var i = 0; i < 8; ++i) {
b[7 - i] = t & 0xFF;
t >>>= 8;
}
var hash = hmacSha1(key, b);
var offset = hash[19] & 0x0f;
var hash2 = 0;
for (var i = 0; i < 4; ++i) {
hash2 <<= 8;
hash2 |= hash[offset + i];
}
hash2 &= 0x7FFFFFFF;
hash2 %= 1000000;
var totp = ("000000" + hash2).slice(-6);
if (typeof (WScript) !== 'undefined') {
console = {
log: function(msg) {
WScript.Echo(msg);
}
};
}
console.log(totp);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment