JSFiddle - React, Tailwind, and code Playground
by russau
HTML
<script src="http://jssha.sourceforge.net/sha.js"></script>
JavaScript
function dec2hex( s ) { return ( s<15.5 ? '0' : '' ) + Math.round( s ).toString( 16 ); }
function hex2dec( s ) { return parseInt( s, 16 ); }
function base32tohex(base32)
{
var base32chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
var bits = "";
var hex = "";
for (var i=0; i<base32.length; i++)
{
var val = base32chars.indexOf(base32.charAt(i));
bits += leftpad(val.toString(2), 5, '0');
}
// leftpad bits with 0 until length is a multiple of 4
while (bits.length % 4 != 0)
bits = "0" + bits;
for (var i=bits.length-4; i>=0; i=i-4)
{
var chunk = bits.substr(i, 4);
hex = parseInt(chunk, 2).toString(16) + hex;
}
return hex;
}
function leftpad(str, len, pad) {
if (len + 1 >= str.length) {
str = Array(len + 1 - str.length).join(pad) + str;
}
return str;
}
$(function()
{
var key = base32tohex("JBSWY3DPEHPK3PXP");
var epoch = Math.round(new Date().getTime()/1000.0);
var time = leftpad(dec2hex(Math.floor(epoch / 30)), 16, '0');
var hmacObj = new jsSHA(time, 'HEX');
var hmac = hmacObj.getHMAC(key,'HEX','SHA-1',"HEX");
var offset = hex2dec(hmac.substring(hmac.length-1));
var part1 = hmac.substr(0, offset*2);
var part2 = hmac.substr(offset*2, 8);
var part3 = hmac.substr(offset*2 + 8, hmac.length - offset );
$('body').append(hmac);
$('body').append($('<br/>'))
$('body').append(part1);
$('body').append("<span style='background-color:#ff0000'>" + part2 + "</span>");
$('body').append(part3);
var binary = (hex2dec(hmac.substr(offset*2, 8)) &
hex2dec('7fffffff')) + '';
binary = (binary).substr(binary.length - 6,6);
$('body').append($('<br/>')).append(binary);
//var time= "2000000000";
});