// © 2002-2005 Chris Veness // http://www.movable-type.co.uk/scripts/sha1.html function getRandomString() { return (new Number(Math.floor(Math.random() * 4294967296))).toString(16) + (new Number(Math.floor(Math.random() * 4294967296))).toString(16); } function hashcashv1_create_loop(str, extn, bits, timestamp) { //alert(bits); //alert(timestamp); var random = getRandomString(); var fiddle = new Number(1); var input; var k = 0, tot = 1 << bits; var result = -1; var mask = 0xffffffff; mask = mask << (32-bits); var searchString = "1:"+ bits +":"+ timestamp +":"+ str +":"+ extn +":"+ getRandomString() +":"; while ((result & mask) != 0) { input = searchString + fiddle.toString(16); result = sha1Hash(input); fiddle += 1; k++; } return input; } function sha1Hash(msg) { // constants [§4.2.1] var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; // PREPROCESSING msg += String.fromCharCode(0x80); // add trailing '1' bit to string [§5.1.1] // convert string msg into 512-bit/16-integer blocks arrays of ints [§5.2.1] var l = Math.ceil(msg.length/4) + 2; // long enough to contain msg plus 2-word length var N = Math.ceil(l/16); // in N 16-int blocks var M = new Array(N); for (var i=0; i>> 32, but since JS converts // bitwise-op args to 32 bits, we need to simulate this by arithmetic operators M[N-1][14] = ((msg.length-1)*8) / Math.pow(2, 32); M[N-1][14] = Math.floor(M[N-1][14]) M[N-1][15] = ((msg.length-1)*8) & 0xffffffff; // set initial hash value [§5.3.1] var H0 = 0x67452301; var H1 = 0xefcdab89; var H2 = 0x98badcfe; var H3 = 0x10325476; var H4 = 0xc3d2e1f0; // HASH COMPUTATION [§6.1.2] var W = new Array(80); var a, b, c, d, e; for (var i=0; i>>(32-n)); } // // extend Number class with a tailored hex-string method // (note toString(16) is implementation-dependant, and // in IE returns signed numbers when used on full words) // Number.prototype.toHexStr = function() { var s="", v; for (var i=7; i>=0; i--) { v = (this>>>(i*4)) & 0xf; s += v.toString(16); } return s; }