UNPKG

ionic-cordova-gulp-seed

Version:

Ionic & Cordova & Gulp seed with organized code, tests, bower support and some other stuff. Originated from ionic-angular-cordova-seed.

136 lines (117 loc) 4.08 kB
(function(){ var root = this; //消息填充位,补足长度。 function fillString(str){ var blockAmount = ((str.length + 8) >> 6) + 1, blocks = [], i; for(i = 0; i < blockAmount * 16; i++){ blocks[i] = 0; } for(i = 0; i < str.length; i++){ blocks[i >> 2] |= str.charCodeAt(i) << (24 - (i & 3) * 8); } blocks[i >> 2] |= 0x80 << (24 - (i & 3) * 8); blocks[blockAmount * 16 - 1] = str.length * 8; return blocks; } //将输入的二进制数组转化为十六进制的字符串。 function binToHex(binArray){ var hexString = "0123456789abcdef", str = "", i; for(i = 0; i < binArray.length * 4; i++){ str += hexString.charAt((binArray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hexString.charAt((binArray[i >> 2] >> ((3 - i % 4) * 8 )) & 0xF); } return str; } //核心函数,输出为长度为5的number数组,对应160位的消息摘要。 function coreFunction(blockArray){ var w = [], a = 0x67452301, b = 0xEFCDAB89, c = 0x98BADCFE, d = 0x10325476, e = 0xC3D2E1F0, olda, oldb, oldc, oldd, olde, t, i, j; for(i = 0; i < blockArray.length; i += 16){ //每次处理512位 16*32 olda = a; oldb = b; oldc = c; oldd = d; olde = e; for(j = 0; j < 80; j++){ //对每个512位进行80步操作 if(j < 16){ w[j] = blockArray[i + j]; }else{ w[j] = cyclicShift(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); } t = modPlus(modPlus(cyclicShift(a, 5), ft(j, b, c, d)), modPlus(modPlus(e, w[j]), kt(j))); e = d; d = c; c = cyclicShift(b, 30); b = a; a = t; } a = modPlus(a, olda); b = modPlus(b, oldb); c = modPlus(c, oldc); d = modPlus(d, oldd); e = modPlus(e, olde); } return [a, b, c, d, e]; } //根据t值返回相应得压缩函数中用到的f函数。 function ft(t, b, c, d){ if(t < 20){ return (b & c) | ((~b) & d); }else if(t < 40){ return b ^ c ^ d; }else if(t < 60){ return (b & c) | (b & d) | (c & d); }else{ return b ^ c ^ d; } } //根据t值返回相应得压缩函数中用到的K值。 function kt(t){ return (t < 20) ? 0x5A827999 : (t < 40) ? 0x6ED9EBA1 : (t < 60) ? 0x8F1BBCDC : 0xCA62C1D6; } //模2的32次方加法,因为JavaScript的number是双精度浮点数表示,所以将32位数拆成高16位和低16位分别进行相加 function modPlus(x, y){ var low = (x & 0xFFFF) + (y & 0xFFFF), high = (x >> 16) + (y >> 16) + (low >> 16); return (high << 16) | (low & 0xFFFF); } //对输入的32位的num二进制数进行循环左移 ,因为JavaScript的number是双精度浮点数表示,所以移位需需要注意 function cyclicShift(num, k){ return (num << k) | (num >>> (32 - k)); } //主函数根据输入的消息字符串计算消息摘要,返回十六进制表示的消息摘要 function sha1(s){ return binToHex(coreFunction(fillString(s))); } // support AMD and Node if(typeof define === "function" && typeof define.amd){ define(function(){ return sha1; }); }else if(typeof exports !== 'undefined') { if(typeof module !== 'undefined' && module.exports) { exports = module.exports = sha1; } exports.sha1 = sha1; } else { root.sha1 = sha1; } }).call(this);