summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Turek <brian.turek@gmail.com>2013-12-14 09:16:40 -0500
committerBrian Turek <brian.turek@gmail.com>2013-12-14 09:16:40 -0500
commit8a7fc050e71429eb331088667fe8bb5a34c2481d (patch)
treed3cf2387d82255ff4684996d2ea000819273f0b9
parent7b2da26c1dc803d4991b99e560f0b0962cee404b (diff)
downloadjsSHA-8a7fc050e71429eb331088667fe8bb5a34c2481d.zip
jsSHA-8a7fc050e71429eb331088667fe8bb5a34c2481d.tar.gz
jsSHA-8a7fc050e71429eb331088667fe8bb5a34c2481d.tar.bz2
Added support for multiple hashing rounds
-rwxr-xr-xCHANGELOG2
-rwxr-xr-xsrc/sha.js54
-rwxr-xr-xsrc/sha1.js24
-rwxr-xr-xsrc/sha256.js27
-rwxr-xr-xsrc/sha512.js40
-rwxr-xr-xsrc/sha_dev.js109
-rwxr-xr-xtest/genHashRounds.py26
-rwxr-xr-xtest/test.html137
8 files changed, 274 insertions, 145 deletions
diff --git a/CHANGELOG b/CHANGELOG
index b75c093..46b9cff 100755
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,8 @@
1.5 (2013-XX-XX)
=========================
+- Added optional numRounds argument to getHash
+ - Note: this necessitated removing the hash result caching functionality
- Removed charSize input and replaced with encoding to handle Unicode. NOTE:
Only Code points up to 0xFFFF are supported.
- charSize = 16 is effectively replaced by encoding = "UTF16"
diff --git a/src/sha.js b/src/sha.js
index fc4f040..c292bc5 100755
--- a/src/sha.js
+++ b/src/sha.js
@@ -9,32 +9,28 @@
Several functions taken from Paul Johnston
*/
-function q(a){throw a;}var r=null;function s(a,b){this.a=a;this.b=b}function y(a,b){var c=[],e,f=[],h=0,j;if("UTF8"==b)for(j=0;j<a.length;j+=1){e=a.charCodeAt(j);f=[];2048<e?(f[0]=224|(e&61440)>>>12,f[1]=128|(e&4032)>>>6,f[2]=128|e&63):128<e?(f[0]=192|(e&1984)>>>6,f[1]=128|e&63):f[0]=e;for(e=0;e<f.length;e+=1)c[h>>>2]|=f[e]<<24-8*(h%4),h+=1}else if("UTF16"==b)for(j=0;j<a.length;j+=1)c[h>>>2]|=a.charCodeAt(j)<<16-8*(h%4),h+=2;return{value:c,binLen:8*h}}
-function z(a){var b=[],c=a.length,e,f;0!==c%2&&q("String of HEX type must be in byte increments");for(e=0;e<c;e+=2)f=parseInt(a.substr(e,2),16),isNaN(f)&&q("String of HEX type contains invalid characters"),b[e>>>3]|=f<<24-4*(e%8);return{value:b,binLen:4*c}}
-function B(a){var b=[],c=0,e,f,h,j,l;-1===a.search(/^[a-zA-Z0-9=+\/]+$/)&&q("Invalid character in base-64 string");e=a.indexOf("=");a=a.replace(/\=/g,"");-1!==e&&e<a.length&&q("Invalid '=' found in base-64 string");for(f=0;f<a.length;f+=4){l=a.substr(f,4);for(h=j=0;h<l.length;h+=1)e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(l[h]),j|=e<<18-6*h;for(h=0;h<l.length-1;h+=1)b[c>>2]|=(j>>>16-8*h&255)<<24-8*(c%4),c+=1}return{value:b,binLen:8*c}}
-function E(a,b){var c="",e=4*a.length,f,h;for(f=0;f<e;f+=1)h=a[f>>>2]>>>8*(3-f%4),c+="0123456789abcdef".charAt(h>>>4&15)+"0123456789abcdef".charAt(h&15);return b.outputUpper?c.toUpperCase():c}
-function F(a,b){var c="",e=4*a.length,f,h,j;for(f=0;f<e;f+=3){j=(a[f>>>2]>>>8*(3-f%4)&255)<<16|(a[f+1>>>2]>>>8*(3-(f+1)%4)&255)<<8|a[f+2>>>2]>>>8*(3-(f+2)%4)&255;for(h=0;4>h;h+=1)c=8*f+6*h<=32*a.length?c+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(j>>>6*(3-h)&63):c+b.b64Pad}return c}
-function I(a){var b={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(b.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(b.b64Pad=a.b64Pad)}catch(c){}"boolean"!==typeof b.outputUpper&&q("Invalid outputUpper formatting option");"string"!==typeof b.b64Pad&&q("Invalid b64Pad formatting option");return b}function K(a,b){return a>>>b|a<<32-b}
-function R(a,b){var c=r,c=new s(a.a,a.b);return c=32>=b?new s(c.a>>>b|c.b<<32-b&4294967295,c.b>>>b|c.a<<32-b&4294967295):new s(c.b>>>b-32|c.a<<64-b&4294967295,c.a>>>b-32|c.b<<64-b&4294967295)}function S(a,b){var c=r;return c=32>=b?new s(a.a>>>b,a.b>>>b|a.a<<32-b&4294967295):new s(0,a.a>>>b-32)}function T(a,b,c){return a&b^~a&c}function U(a,b,c){return new s(a.a&b.a^~a.a&c.a,a.b&b.b^~a.b&c.b)}function V(a,b,c){return a&b^a&c^b&c}
-function aa(a,b,c){return new s(a.a&b.a^a.a&c.a^b.a&c.a,a.b&b.b^a.b&c.b^b.b&c.b)}function ba(a){return K(a,2)^K(a,13)^K(a,22)}function ca(a){var b=R(a,28),c=R(a,34);a=R(a,39);return new s(b.a^c.a^a.a,b.b^c.b^a.b)}function da(a){return K(a,6)^K(a,11)^K(a,25)}function ea(a){var b=R(a,14),c=R(a,18);a=R(a,41);return new s(b.a^c.a^a.a,b.b^c.b^a.b)}function fa(a){return K(a,7)^K(a,18)^a>>>3}function ga(a){var b=R(a,1),c=R(a,8);a=S(a,7);return new s(b.a^c.a^a.a,b.b^c.b^a.b)}
-function ha(a){return K(a,17)^K(a,19)^a>>>10}function ia(a){var b=R(a,19),c=R(a,61);a=S(a,6);return new s(b.a^c.a^a.a,b.b^c.b^a.b)}function W(a,b){var c=(a&65535)+(b&65535);return((a>>>16)+(b>>>16)+(c>>>16)&65535)<<16|c&65535}function ja(a,b,c,e){var f=(a&65535)+(b&65535)+(c&65535)+(e&65535);return((a>>>16)+(b>>>16)+(c>>>16)+(e>>>16)+(f>>>16)&65535)<<16|f&65535}
-function X(a,b,c,e,f){var h=(a&65535)+(b&65535)+(c&65535)+(e&65535)+(f&65535);return((a>>>16)+(b>>>16)+(c>>>16)+(e>>>16)+(f>>>16)+(h>>>16)&65535)<<16|h&65535}function ka(a,b){var c,e,f;c=(a.b&65535)+(b.b&65535);e=(a.b>>>16)+(b.b>>>16)+(c>>>16);f=(e&65535)<<16|c&65535;c=(a.a&65535)+(b.a&65535)+(e>>>16);e=(a.a>>>16)+(b.a>>>16)+(c>>>16);return new s((e&65535)<<16|c&65535,f)}
-function la(a,b,c,e){var f,h,j;f=(a.b&65535)+(b.b&65535)+(c.b&65535)+(e.b&65535);h=(a.b>>>16)+(b.b>>>16)+(c.b>>>16)+(e.b>>>16)+(f>>>16);j=(h&65535)<<16|f&65535;f=(a.a&65535)+(b.a&65535)+(c.a&65535)+(e.a&65535)+(h>>>16);h=(a.a>>>16)+(b.a>>>16)+(c.a>>>16)+(e.a>>>16)+(f>>>16);return new s((h&65535)<<16|f&65535,j)}
-function ma(a,b,c,e,f){var h,j,l;h=(a.b&65535)+(b.b&65535)+(c.b&65535)+(e.b&65535)+(f.b&65535);j=(a.b>>>16)+(b.b>>>16)+(c.b>>>16)+(e.b>>>16)+(f.b>>>16)+(h>>>16);l=(j&65535)<<16|h&65535;h=(a.a&65535)+(b.a&65535)+(c.a&65535)+(e.a&65535)+(f.a&65535)+(j>>>16);j=(a.a>>>16)+(b.a>>>16)+(c.a>>>16)+(e.a>>>16)+(f.a>>>16)+(h>>>16);return new s((j&65535)<<16|h&65535,l)}
-function Z(a,b){var c=[],e,f,h,j,l,n,p,k,m,g=[1732584193,4023233417,2562383102,271733878,3285377520],A=[1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,
-1859775393,1859775393,1859775393,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782];a[b>>>5]|=128<<24-b%32;a[(b+
-65>>>9<<4)+15]=b;m=a.length;for(p=0;p<m;p+=16){e=g[0];f=g[1];h=g[2];j=g[3];l=g[4];for(k=0;80>k;k+=1)c[k]=16>k?a[k+p]:(c[k-3]^c[k-8]^c[k-14]^c[k-16])<<1|(c[k-3]^c[k-8]^c[k-14]^c[k-16])>>>31,n=20>k?X(e<<5|e>>>27,f&h^~f&j,l,A[k],c[k]):40>k?X(e<<5|e>>>27,f^h^j,l,A[k],c[k]):60>k?X(e<<5|e>>>27,V(f,h,j),l,A[k],c[k]):X(e<<5|e>>>27,f^h^j,l,A[k],c[k]),l=j,j=h,h=f<<30|f>>>2,f=e,e=n;g[0]=W(e,g[0]);g[1]=W(f,g[1]);g[2]=W(h,g[2]);g[3]=W(j,g[3]);g[4]=W(l,g[4])}return g}
-function $(a,b,c){var e,f,h,j,l,n,p,k,m,g,A,G,t,L,w,u,M,N,x,C,D,v,O,P,d,Q,H=[],Y,J;"SHA-224"===c||"SHA-256"===c?(A=64,e=(b+65>>>9<<4)+15,L=16,w=1,d=Number,u=W,M=ja,N=X,x=fa,C=ha,D=ba,v=da,P=V,O=T,Q=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,
-3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],g="SHA-224"===c?[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428]:[1779033703,
-3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]):"SHA-384"===c||"SHA-512"===c?(A=80,e=(b+128>>>10<<5)+31,L=32,w=2,d=s,u=ka,M=la,N=ma,x=ga,C=ia,D=ca,v=ea,P=aa,O=U,Q=[new d(1116352408,3609767458),new d(1899447441,602891725),new d(3049323471,3964484399),new d(3921009573,2173295548),new d(961987163,4081628472),new d(1508970993,3053834265),new d(2453635748,2937671579),new d(2870763221,3664609560),new d(3624381080,2734883394),new d(310598401,1164996542),new d(607225278,1323610764),
-new d(1426881987,3590304994),new d(1925078388,4068182383),new d(2162078206,991336113),new d(2614888103,633803317),new d(3248222580,3479774868),new d(3835390401,2666613458),new d(4022224774,944711139),new d(264347078,2341262773),new d(604807628,2007800933),new d(770255983,1495990901),new d(1249150122,1856431235),new d(1555081692,3175218132),new d(1996064986,2198950837),new d(2554220882,3999719339),new d(2821834349,766784016),new d(2952996808,2566594879),new d(3210313671,3203337956),new d(3336571891,
-1034457026),new d(3584528711,2466948901),new d(113926993,3758326383),new d(338241895,168717936),new d(666307205,1188179964),new d(773529912,1546045734),new d(1294757372,1522805485),new d(1396182291,2643833823),new d(1695183700,2343527390),new d(1986661051,1014477480),new d(2177026350,1206759142),new d(2456956037,344077627),new d(2730485921,1290863460),new d(2820302411,3158454273),new d(3259730800,3505952657),new d(3345764771,106217008),new d(3516065817,3606008344),new d(3600352804,1432725776),new d(4094571909,
-1467031594),new d(275423344,851169720),new d(430227734,3100823752),new d(506948616,1363258195),new d(659060556,3750685593),new d(883997877,3785050280),new d(958139571,3318307427),new d(1322822218,3812723403),new d(1537002063,2003034995),new d(1747873779,3602036899),new d(1955562222,1575990012),new d(2024104815,1125592928),new d(2227730452,2716904306),new d(2361852424,442776044),new d(2428436474,593698344),new d(2756734187,3733110249),new d(3204031479,2999351573),new d(3329325298,3815920427),new d(3391569614,
-3928383900),new d(3515267271,566280711),new d(3940187606,3454069534),new d(4118630271,4000239992),new d(116418474,1914138554),new d(174292421,2731055270),new d(289380356,3203993006),new d(460393269,320620315),new d(685471733,587496836),new d(852142971,1086792851),new d(1017036298,365543100),new d(1126000580,2618297676),new d(1288033470,3409855158),new d(1501505948,4234509866),new d(1607167915,987167468),new d(1816402316,1246189591)],g="SHA-384"===c?[new d(3418070365,3238371032),new d(1654270250,914150663),
-new d(2438529370,812702999),new d(355462360,4144912697),new d(1731405415,4290775857),new d(41048885895,1750603025),new d(3675008525,1694076839),new d(1203062813,3204075428)]:[new d(1779033703,4089235720),new d(3144134277,2227873595),new d(1013904242,4271175723),new d(2773480762,1595750129),new d(1359893119,2917565137),new d(2600822924,725511199),new d(528734635,4215389547),new d(1541459225,327033209)]):q("Unexpected error in SHA-2 implementation");a[b>>>5]|=128<<24-b%32;a[e]=b;Y=a.length;for(G=0;G<
-Y;G+=L){b=g[0];e=g[1];f=g[2];h=g[3];j=g[4];l=g[5];n=g[6];p=g[7];for(t=0;t<A;t+=1)H[t]=16>t?new d(a[t*w+G],a[t*w+G+1]):M(C(H[t-2]),H[t-7],x(H[t-15]),H[t-16]),k=N(p,v(j),O(j,l,n),Q[t],H[t]),m=u(D(b),P(b,e,f)),p=n,n=l,l=j,j=u(h,k),h=f,f=e,e=b,b=u(k,m);g[0]=u(b,g[0]);g[1]=u(e,g[1]);g[2]=u(f,g[2]);g[3]=u(h,g[3]);g[4]=u(j,g[4]);g[5]=u(l,g[5]);g[6]=u(n,g[6]);g[7]=u(p,g[7])}"SHA-224"===c?J=[g[0],g[1],g[2],g[3],g[4],g[5],g[6]]:"SHA-256"===c?J=g:"SHA-384"===c?J=[g[0].a,g[0].b,g[1].a,g[1].b,g[2].a,g[2].b,g[3].a,
-g[3].b,g[4].a,g[4].b,g[5].a,g[5].b]:"SHA-512"===c?J=[g[0].a,g[0].b,g[1].a,g[1].b,g[2].a,g[2].b,g[3].a,g[3].b,g[4].a,g[4].b,g[5].a,g[5].b,g[6].a,g[6].b,g[7].a,g[7].b]:q("Unexpected error in SHA-2 implementation");return J}
-module.jsSHA=function(a,b,c){var e=r,f=r,h=r,j=r,l=r,n=0,p=[0],k="",m=r,k="undefined"!==typeof c?c:"UTF8";"UTF8"===k||"UTF16"===k||q("encoding must be UTF8 or UTF16");"HEX"===b?(0!==a.length%2&&q("srcString of HEX type must be in byte increments"),m=z(a),n=m.binLen,p=m.value):"ASCII"===b||"TEXT"===b?(m=y(a,k),n=m.binLen,p=m.value):"B64"===b?(m=B(a),n=m.binLen,p=m.value):q("inputFormat must be HEX, TEXT, ASCII, or B64");this.getHash=function(a,c,b){var k=r,m=p.slice(),w="";switch(c){case "HEX":k=E;break;
-case "B64":k=F;break;default:q("format must be HEX or B64")}"SHA-1"===a?(r===e&&(e=Z(m,n)),w=k(e,I(b))):"SHA-224"===a?(r===f&&(f=$(m,n,a)),w=k(f,I(b))):"SHA-256"===a?(r===h&&(h=$(m,n,a)),w=k(h,I(b))):"SHA-384"===a?(r===j&&(j=$(m,n,a)),w=k(j,I(b))):"SHA-512"===a?(r===l&&(l=$(m,n,a)),w=k(l,I(b))):q("Chosen SHA variant is not supported");return w};this.getHMAC=function(a,c,b,e,f){var h,j,l,m,x,C=[],D=[],v=r;switch(e){case "HEX":h=E;break;case "B64":h=F;break;default:q("outputFormat must be HEX or B64")}"SHA-1"===
-b?(l=64,x=160):"SHA-224"===b?(l=64,x=224):"SHA-256"===b?(l=64,x=256):"SHA-384"===b?(l=128,x=384):"SHA-512"===b?(l=128,x=512):q("Chosen SHA variant is not supported");"HEX"===c?(v=z(a),m=v.binLen,j=v.value):"ASCII"===c||"TEXT"===c?(v=y(a,k),m=v.binLen,j=v.value):"B64"===c?(v=B(a),m=v.binLen,j=v.value):q("inputFormat must be HEX, TEXT, ASCII, or B64");a=8*l;c=l/4-1;l<m/8?(j="SHA-1"===b?Z(j,m):$(j,m,b),j[c]&=4294967040):l>m/8&&(j[c]&=4294967040);for(l=0;l<=c;l+=1)C[l]=j[l]^909522486,D[l]=j[l]^1549556828;
-b="SHA-1"===b?Z(D.concat(Z(C.concat(p),a+n)),a+x):$(D.concat($(C.concat(p),a+n,b)),a+x,b);return h(b,I(f))}};})(this);
+(function(T){function q(a,c){this.a=a;this.b=c}function B(a,c){var b=[],g,f=[],h=0,k;if("UTF8"===c)for(k=0;k<a.length;k+=1)for(g=a.charCodeAt(k),f=[],2048<g?(f[0]=224|(g&61440)>>>12,f[1]=128|(g&4032)>>>6,f[2]=128|g&63):128<g?(f[0]=192|(g&1984)>>>6,f[1]=128|g&63):f[0]=g,g=0;g<f.length;g+=1)b[h>>>2]|=f[g]<<24-h%4*8,h+=1;else if("UTF16"===c)for(k=0;k<a.length;k+=1)b[h>>>2]|=a.charCodeAt(k)<<16-h%4*8,h+=2;return{value:b,binLen:8*h}}function J(a){var c=[],b=a.length,g,f;if(0!==b%2)throw"String of HEX type must be in byte increments";
+for(g=0;g<b;g+=2){f=parseInt(a.substr(g,2),16);if(isNaN(f))throw"String of HEX type contains invalid characters";c[g>>>3]|=f<<24-g%8*4}return{value:c,binLen:4*b}}function K(a){var c=[],b=0,g,f,h,k,r;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";g=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==g&&g<a.length)throw"Invalid '=' found in base-64 string";for(f=0;f<a.length;f+=4){r=a.substr(f,4);for(h=k=0;h<r.length;h+=1)g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(r[h]),
+k|=g<<18-6*h;for(h=0;h<r.length-1;h+=1)c[b>>2]|=(k>>>16-8*h&255)<<24-b%4*8,b+=1}return{value:c,binLen:8*b}}function L(a,c){var b="",g=4*a.length,f,h;for(f=0;f<g;f+=1)h=a[f>>>2]>>>8*(3-f%4),b+="0123456789abcdef".charAt(h>>>4&15)+"0123456789abcdef".charAt(h&15);return c.outputUpper?b.toUpperCase():b}function M(a,c){var b="",g=4*a.length,f,h,k;for(f=0;f<g;f+=3)for(k=(a[f>>>2]>>>8*(3-f%4)&255)<<16|(a[f+1>>>2]>>>8*(3-(f+1)%4)&255)<<8|a[f+2>>>2]>>>8*(3-(f+2)%4)&255,h=0;4>h;h+=1)b=8*f+6*h<=32*a.length?b+
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k>>>6*(3-h)&63):b+c.b64Pad;return b}function N(a){var c={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(c.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(c.b64Pad=a.b64Pad)}catch(b){}if("boolean"!==typeof c.outputUpper)throw"Invalid outputUpper formatting option";if("string"!==typeof c.b64Pad)throw"Invalid b64Pad formatting option";return c}function U(a,c){return a<<c|a>>>32-c}function t(a,c){return a>>>
+c|a<<32-c}function s(a,c){var b=null,b=new q(a.a,a.b);return b=32>=c?new q(b.a>>>c|b.b<<32-c&4294967295,b.b>>>c|b.a<<32-c&4294967295):new q(b.b>>>c-32|b.a<<64-c&4294967295,b.a>>>c-32|b.b<<64-c&4294967295)}function O(a,c){var b=null;return b=32>=c?new q(a.a>>>c,a.b>>>c|a.a<<32-c&4294967295):new q(0,a.a>>>c-32)}function V(a,c,b){return a^c^b}function P(a,c,b){return a&c^~a&b}function W(a,c,b){return new q(a.a&c.a^~a.a&b.a,a.b&c.b^~a.b&b.b)}function Q(a,c,b){return a&c^a&b^c&b}function X(a,c,b){return new q(a.a&
+c.a^a.a&b.a^c.a&b.a,a.b&c.b^a.b&b.b^c.b&b.b)}function Y(a){return t(a,2)^t(a,13)^t(a,22)}function Z(a){var c=s(a,28),b=s(a,34);a=s(a,39);return new q(c.a^b.a^a.a,c.b^b.b^a.b)}function $(a){return t(a,6)^t(a,11)^t(a,25)}function aa(a){var c=s(a,14),b=s(a,18);a=s(a,41);return new q(c.a^b.a^a.a,c.b^b.b^a.b)}function ba(a){return t(a,7)^t(a,18)^a>>>3}function ca(a){var c=s(a,1),b=s(a,8);a=O(a,7);return new q(c.a^b.a^a.a,c.b^b.b^a.b)}function da(a){return t(a,17)^t(a,19)^a>>>10}function ea(a){var c=s(a,
+19),b=s(a,61);a=O(a,6);return new q(c.a^b.a^a.a,c.b^b.b^a.b)}function R(a,c){var b=(a&65535)+(c&65535);return((a>>>16)+(c>>>16)+(b>>>16)&65535)<<16|b&65535}function fa(a,c,b,g){var f=(a&65535)+(c&65535)+(b&65535)+(g&65535);return((a>>>16)+(c>>>16)+(b>>>16)+(g>>>16)+(f>>>16)&65535)<<16|f&65535}function S(a,c,b,g,f){var h=(a&65535)+(c&65535)+(b&65535)+(g&65535)+(f&65535);return((a>>>16)+(c>>>16)+(b>>>16)+(g>>>16)+(f>>>16)+(h>>>16)&65535)<<16|h&65535}function ga(a,c){var b,g,f;b=(a.b&65535)+(c.b&65535);
+g=(a.b>>>16)+(c.b>>>16)+(b>>>16);f=(g&65535)<<16|b&65535;b=(a.a&65535)+(c.a&65535)+(g>>>16);g=(a.a>>>16)+(c.a>>>16)+(b>>>16);return new q((g&65535)<<16|b&65535,f)}function ha(a,c,b,g){var f,h,k;f=(a.b&65535)+(c.b&65535)+(b.b&65535)+(g.b&65535);h=(a.b>>>16)+(c.b>>>16)+(b.b>>>16)+(g.b>>>16)+(f>>>16);k=(h&65535)<<16|f&65535;f=(a.a&65535)+(c.a&65535)+(b.a&65535)+(g.a&65535)+(h>>>16);h=(a.a>>>16)+(c.a>>>16)+(b.a>>>16)+(g.a>>>16)+(f>>>16);return new q((h&65535)<<16|f&65535,k)}function ia(a,c,b,g,f){var h,
+k,r;h=(a.b&65535)+(c.b&65535)+(b.b&65535)+(g.b&65535)+(f.b&65535);k=(a.b>>>16)+(c.b>>>16)+(b.b>>>16)+(g.b>>>16)+(f.b>>>16)+(h>>>16);r=(k&65535)<<16|h&65535;h=(a.a&65535)+(c.a&65535)+(b.a&65535)+(g.a&65535)+(f.a&65535)+(k>>>16);k=(a.a>>>16)+(c.a>>>16)+(b.a>>>16)+(g.a>>>16)+(f.a>>>16)+(h>>>16);return new q((k&65535)<<16|h&65535,r)}function v(a,c){var b=[],g,f,h,k,r,w,z=P,q=V,t=Q,d=U,m=R,n,l,x=S,y,p=[1732584193,4023233417,2562383102,271733878,3285377520],s=[1518500249,1518500249,1518500249,1518500249,
+1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,
+2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782];a[c>>>5]|=128<<24-c%32;a[(c+65>>>9<<4)+15]=c;y=a.length;for(n=0;n<y;n+=16){g=p[0];f=p[1];h=p[2];k=p[3];r=p[4];for(l=0;80>l;l+=1)b[l]=16>l?a[l+n]:d(b[l-3]^b[l-8]^b[l-14]^b[l-
+16],1),w=20>l?x(d(g,5),z(f,h,k),r,s[l],b[l]):40>l?x(d(g,5),q(f,h,k),r,s[l],b[l]):60>l?x(d(g,5),t(f,h,k),r,s[l],b[l]):x(d(g,5),q(f,h,k),r,s[l],b[l]),r=k,k=h,h=d(f,30),f=g,g=w;p[0]=m(g,p[0]);p[1]=m(f,p[1]);p[2]=m(h,p[2]);p[3]=m(k,p[3]);p[4]=m(r,p[4])}return p}function u(a,c,b){var g,f,h,k,r,w,z,s,t,d,m,n,l,x,y,p,u,v,C,D,E,F,G,H,e,I,A=[],B;if("SHA-224"===b||"SHA-256"===b)m=64,g=(c+65>>>9<<4)+15,x=16,y=1,e=Number,p=R,u=fa,v=S,C=ba,D=da,E=Y,F=$,H=Q,G=P,I=[1116352408,1899447441,3049323471,3921009573,961987163,
+1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,
+958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],d="SHA-224"===b?[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428]:[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];else if("SHA-384"===b||"SHA-512"===b)m=80,g=(c+128>>>10<<5)+31,x=32,y=2,e=q,p=ga,u=ha,v=ia,C=ca,D=ea,E=Z,F=aa,H=X,G=W,I=[new e(1116352408,3609767458),new e(1899447441,602891725),
+new e(3049323471,3964484399),new e(3921009573,2173295548),new e(961987163,4081628472),new e(1508970993,3053834265),new e(2453635748,2937671579),new e(2870763221,3664609560),new e(3624381080,2734883394),new e(310598401,1164996542),new e(607225278,1323610764),new e(1426881987,3590304994),new e(1925078388,4068182383),new e(2162078206,991336113),new e(2614888103,633803317),new e(3248222580,3479774868),new e(3835390401,2666613458),new e(4022224774,944711139),new e(264347078,2341262773),new e(604807628,
+2007800933),new e(770255983,1495990901),new e(1249150122,1856431235),new e(1555081692,3175218132),new e(1996064986,2198950837),new e(2554220882,3999719339),new e(2821834349,766784016),new e(2952996808,2566594879),new e(3210313671,3203337956),new e(3336571891,1034457026),new e(3584528711,2466948901),new e(113926993,3758326383),new e(338241895,168717936),new e(666307205,1188179964),new e(773529912,1546045734),new e(1294757372,1522805485),new e(1396182291,2643833823),new e(1695183700,2343527390),new e(1986661051,
+1014477480),new e(2177026350,1206759142),new e(2456956037,344077627),new e(2730485921,1290863460),new e(2820302411,3158454273),new e(3259730800,3505952657),new e(3345764771,106217008),new e(3516065817,3606008344),new e(3600352804,1432725776),new e(4094571909,1467031594),new e(275423344,851169720),new e(430227734,3100823752),new e(506948616,1363258195),new e(659060556,3750685593),new e(883997877,3785050280),new e(958139571,3318307427),new e(1322822218,3812723403),new e(1537002063,2003034995),new e(1747873779,
+3602036899),new e(1955562222,1575990012),new e(2024104815,1125592928),new e(2227730452,2716904306),new e(2361852424,442776044),new e(2428436474,593698344),new e(2756734187,3733110249),new e(3204031479,2999351573),new e(3329325298,3815920427),new e(3391569614,3928383900),new e(3515267271,566280711),new e(3940187606,3454069534),new e(4118630271,4000239992),new e(116418474,1914138554),new e(174292421,2731055270),new e(289380356,3203993006),new e(460393269,320620315),new e(685471733,587496836),new e(852142971,
+1086792851),new e(1017036298,365543100),new e(1126000580,2618297676),new e(1288033470,3409855158),new e(1501505948,4234509866),new e(1607167915,987167468),new e(1816402316,1246189591)],d="SHA-384"===b?[new e(3418070365,3238371032),new e(1654270250,914150663),new e(2438529370,812702999),new e(355462360,4144912697),new e(1731405415,4290775857),new e(41048885895,1750603025),new e(3675008525,1694076839),new e(1203062813,3204075428)]:[new e(1779033703,4089235720),new e(3144134277,2227873595),new e(1013904242,
+4271175723),new e(2773480762,1595750129),new e(1359893119,2917565137),new e(2600822924,725511199),new e(528734635,4215389547),new e(1541459225,327033209)];else throw"Unexpected error in SHA-2 implementation";a[c>>>5]|=128<<24-c%32;a[g]=c;B=a.length;for(n=0;n<B;n+=x){c=d[0];g=d[1];f=d[2];h=d[3];k=d[4];r=d[5];w=d[6];z=d[7];for(l=0;l<m;l+=1)A[l]=16>l?new e(a[l*y+n],a[l*y+n+1]):u(D(A[l-2]),A[l-7],C(A[l-15]),A[l-16]),s=v(z,F(k),G(k,r,w),I[l],A[l]),t=p(E(c),H(c,g,f)),z=w,w=r,r=k,k=p(h,s),h=f,f=g,g=c,c=
+p(s,t);d[0]=p(c,d[0]);d[1]=p(g,d[1]);d[2]=p(f,d[2]);d[3]=p(h,d[3]);d[4]=p(k,d[4]);d[5]=p(r,d[5]);d[6]=p(w,d[6]);d[7]=p(z,d[7])}if("SHA-224"===b)a=[d[0],d[1],d[2],d[3],d[4],d[5],d[6]];else if("SHA-256"===b)a=d;else if("SHA-384"===b)a=[d[0].a,d[0].b,d[1].a,d[1].b,d[2].a,d[2].b,d[3].a,d[3].b,d[4].a,d[4].b,d[5].a,d[5].b];else if("SHA-512"===b)a=[d[0].a,d[0].b,d[1].a,d[1].b,d[2].a,d[2].b,d[3].a,d[3].b,d[4].a,d[4].b,d[5].a,d[5].b,d[6].a,d[6].b,d[7].a,d[7].b];else throw"Unexpected error in SHA-2 implementation";
+return a}T.jsSHA=function(a,c,b){var g=0,f=[0],h="",k=null,h=b||"UTF8";if("UTF8"!==h&&"UTF16"!==h)throw"encoding must be UTF8 or UTF16";if("HEX"===c){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";k=J(a);g=k.binLen;f=k.value}else if("ASCII"===c||"TEXT"===c)k=B(a,h),g=k.binLen,f=k.value;else if("B64"===c)k=K(a),g=k.binLen,f=k.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";this.getHash=function(a,c,b,h){var k=null,d=f.slice(),m=g,n;3===arguments.length?"number"!==
+typeof b&&(h=b,b=1):2===arguments.length&&(b=1);switch(c){case "HEX":k=L;break;case "B64":k=M;break;default:throw"format must be HEX or B64";}if("SHA-1"===a)for(n=0;n<b;n++)d=v(d,m),m=160;else if("SHA-224"===a)for(n=0;n<b;n++)d=u(d,m,a),m=224;else if("SHA-256"===a)for(n=0;n<b;n++)d=u(d,m,a),m=256;else if("SHA-384"===a)for(n=0;n<b;n++)d=u(d,m,a),m=384;else if("SHA-512"===a)for(n=0;n<b;n++)d=u(d,m,a),m=512;else throw"Chosen SHA variant is not supported";return k(d,N(h))};this.getHMAC=function(a,b,c,
+k,s){var d,m,n,l,q=[],t=[];d=null;switch(k){case "HEX":k=L;break;case "B64":k=M;break;default:throw"outputFormat must be HEX or B64";}if("SHA-1"===c)m=64,l=160;else if("SHA-224"===c)m=64,l=224;else if("SHA-256"===c)m=64,l=256;else if("SHA-384"===c)m=128,l=384;else if("SHA-512"===c)m=128,l=512;else throw"Chosen SHA variant is not supported";if("HEX"===b)d=J(a),n=d.binLen,d=d.value;else if("ASCII"===b||"TEXT"===b)d=B(a,h),n=d.binLen,d=d.value;else if("B64"===b)d=K(a),n=d.binLen,d=d.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";
+a=8*m;b=m/4-1;m<n/8?(d="SHA-1"===c?v(d,n):u(d,n,c),d[b]&=4294967040):m>n/8&&(d[b]&=4294967040);for(m=0;m<=b;m+=1)q[m]=d[m]^909522486,t[m]=d[m]^1549556828;c="SHA-1"===c?v(t.concat(v(q.concat(f),a+g)),a+l):u(t.concat(u(q.concat(f),a+g,c)),a+l,c);return k(c,N(s))}}})(this);})(this);
diff --git a/src/sha1.js b/src/sha1.js
index b397b76..f9e5bc5 100755
--- a/src/sha1.js
+++ b/src/sha1.js
@@ -9,16 +9,14 @@
Several functions taken from Paul Johnston
*/
-function k(d){throw d;}function s(d,f){var a=[],b,c=[],e=0,g;if("UTF8"==f)for(g=0;g<d.length;g+=1){b=d.charCodeAt(g);c=[];2048<b?(c[0]=224|(b&61440)>>>12,c[1]=128|(b&4032)>>>6,c[2]=128|b&63):128<b?(c[0]=192|(b&1984)>>>6,c[1]=128|b&63):c[0]=b;for(b=0;b<c.length;b+=1)a[e>>>2]|=c[b]<<24-8*(e%4),e+=1}else if("UTF16"==f)for(g=0;g<d.length;g+=1)a[e>>>2]|=d.charCodeAt(g)<<16-8*(e%4),e+=2;return{value:a,binLen:8*e}}
-function u(d){var f=[],a=d.length,b,c;0!==a%2&&k("String of HEX type must be in byte increments");for(b=0;b<a;b+=2)c=parseInt(d.substr(b,2),16),isNaN(c)&&k("String of HEX type contains invalid characters"),f[b>>>3]|=c<<24-4*(b%8);return{value:f,binLen:4*a}}
-function v(d){var f=[],a=0,b,c,e,g,h;-1===d.search(/^[a-zA-Z0-9=+\/]+$/)&&k("Invalid character in base-64 string");b=d.indexOf("=");d=d.replace(/\=/g,"");-1!==b&&b<d.length&&k("Invalid '=' found in base-64 string");for(c=0;c<d.length;c+=4){h=d.substr(c,4);for(e=g=0;e<h.length;e+=1)b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(h[e]),g|=b<<18-6*e;for(e=0;e<h.length-1;e+=1)f[a>>2]|=(g>>>16-8*e&255)<<24-8*(a%4),a+=1}return{value:f,binLen:8*a}}
-function w(d,f){var a="",b=4*d.length,c,e;for(c=0;c<b;c+=1)e=d[c>>>2]>>>8*(3-c%4),a+="0123456789abcdef".charAt(e>>>4&15)+"0123456789abcdef".charAt(e&15);return f.outputUpper?a.toUpperCase():a}
-function x(d,f){var a="",b=4*d.length,c,e,g;for(c=0;c<b;c+=3){g=(d[c>>>2]>>>8*(3-c%4)&255)<<16|(d[c+1>>>2]>>>8*(3-(c+1)%4)&255)<<8|d[c+2>>>2]>>>8*(3-(c+2)%4)&255;for(e=0;4>e;e+=1)a=8*c+6*e<=32*d.length?a+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>>6*(3-e)&63):a+f.b64Pad}return a}
-function y(d){var f={outputUpper:!1,b64Pad:"="};try{d.hasOwnProperty("outputUpper")&&(f.outputUpper=d.outputUpper),d.hasOwnProperty("b64Pad")&&(f.b64Pad=d.b64Pad)}catch(a){}"boolean"!==typeof f.outputUpper&&k("Invalid outputUpper formatting option");"string"!==typeof f.b64Pad&&k("Invalid b64Pad formatting option");return f}function z(d,f){var a=(d&65535)+(f&65535);return((d>>>16)+(f>>>16)+(a>>>16)&65535)<<16|a&65535}
-function A(d,f,a,b,c){var e=(d&65535)+(f&65535)+(a&65535)+(b&65535)+(c&65535);return((d>>>16)+(f>>>16)+(a>>>16)+(b>>>16)+(c>>>16)+(e>>>16)&65535)<<16|e&65535}
-function B(d,f){var a=[],b,c,e,g,h,C,t,j,D,l=[1732584193,4023233417,2562383102,271733878,3285377520],n=[1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,
-1859775393,1859775393,1859775393,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782];d[f>>>5]|=128<<24-f%32;d[(f+
-65>>>9<<4)+15]=f;D=d.length;for(t=0;t<D;t+=16){b=l[0];c=l[1];e=l[2];g=l[3];h=l[4];for(j=0;80>j;j+=1)a[j]=16>j?d[j+t]:(a[j-3]^a[j-8]^a[j-14]^a[j-16])<<1|(a[j-3]^a[j-8]^a[j-14]^a[j-16])>>>31,C=20>j?A(b<<5|b>>>27,c&e^~c&g,h,n[j],a[j]):40>j?A(b<<5|b>>>27,c^e^g,h,n[j],a[j]):60>j?A(b<<5|b>>>27,c&e^c&g^e&g,h,n[j],a[j]):A(b<<5|b>>>27,c^e^g,h,n[j],a[j]),h=g,g=e,e=c<<30|c>>>2,c=b,b=C;l[0]=z(b,l[0]);l[1]=z(c,l[1]);l[2]=z(e,l[2]);l[3]=z(g,l[3]);l[4]=z(h,l[4])}return l}
-module.jsSHA=function(d,f,a){var b=null,c=0,e=[0],g="",h=null,g="undefined"!==typeof a?a:"UTF8";"UTF8"===g||"UTF16"===g||k("encoding must be UTF8 or UTF16");"HEX"===f?(0!==d.length%2&&k("srcString of HEX type must be in byte increments"),h=u(d),c=h.binLen,e=h.value):"ASCII"===f||"TEXT"===f?(h=s(d,g),c=h.binLen,e=h.value):"B64"===f?(h=v(d),c=h.binLen,e=h.value):k("inputFormat must be HEX, TEXT, ASCII, or B64");this.getHash=function(a,d,f){var g=null,h=e.slice(),n="";switch(d){case "HEX":g=w;break;case "B64":g=
-x;break;default:k("format must be HEX or B64")}"SHA-1"===a?(null===b&&(b=B(h,c)),n=g(b,y(f))):k("Chosen SHA variant is not supported");return n};this.getHMAC=function(b,a,d,f,h){var n,p,m,E,r,F,G=[],H=[],q=null;switch(f){case "HEX":n=w;break;case "B64":n=x;break;default:k("outputFormat must be HEX or B64")}"SHA-1"===d?(m=64,F=160):k("Chosen SHA variant is not supported");"HEX"===a?(q=u(b),r=q.binLen,p=q.value):"ASCII"===a||"TEXT"===a?(q=s(b,g),r=q.binLen,p=q.value):"B64"===a?(q=v(b),r=q.binLen,p=
-q.value):k("inputFormat must be HEX, TEXT, ASCII, or B64");b=8*m;a=m/4-1;m<r/8?("SHA-1"===d?p=B(p,r):k("Unexpected error in HMAC implementation"),p[a]&=4294967040):m>r/8&&(p[a]&=4294967040);for(m=0;m<=a;m+=1)G[m]=p[m]^909522486,H[m]=p[m]^1549556828;"SHA-1"===d?E=B(H.concat(B(G.concat(e),b+c)),b+F):k("Unexpected error in HMAC implementation");return n(E,y(h))}};})(this);
+(function(C){function u(a,d){var b=[],f,e=[],c=0,g;if("UTF8"===d)for(g=0;g<a.length;g+=1)for(f=a.charCodeAt(g),e=[],2048<f?(e[0]=224|(f&61440)>>>12,e[1]=128|(f&4032)>>>6,e[2]=128|f&63):128<f?(e[0]=192|(f&1984)>>>6,e[1]=128|f&63):e[0]=f,f=0;f<e.length;f+=1)b[c>>>2]|=e[f]<<24-c%4*8,c+=1;else if("UTF16"===d)for(g=0;g<a.length;g+=1)b[c>>>2]|=a.charCodeAt(g)<<16-c%4*8,c+=2;return{value:b,binLen:8*c}}function v(a){var d=[],b=a.length,f,e;if(0!==b%2)throw"String of HEX type must be in byte increments";for(f=
+0;f<b;f+=2){e=parseInt(a.substr(f,2),16);if(isNaN(e))throw"String of HEX type contains invalid characters";d[f>>>3]|=e<<24-f%8*4}return{value:d,binLen:4*b}}function w(a){var d=[],b=0,f,e,c,g,p;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";f=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==f&&f<a.length)throw"Invalid '=' found in base-64 string";for(e=0;e<a.length;e+=4){p=a.substr(e,4);for(c=g=0;c<p.length;c+=1)f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(p[c]),
+g|=f<<18-6*c;for(c=0;c<p.length-1;c+=1)d[b>>2]|=(g>>>16-8*c&255)<<24-b%4*8,b+=1}return{value:d,binLen:8*b}}function x(a,d){var b="",f=4*a.length,e,c;for(e=0;e<f;e+=1)c=a[e>>>2]>>>8*(3-e%4),b+="0123456789abcdef".charAt(c>>>4&15)+"0123456789abcdef".charAt(c&15);return d.outputUpper?b.toUpperCase():b}function y(a,d){var b="",f=4*a.length,e,c,g;for(e=0;e<f;e+=3)for(g=(a[e>>>2]>>>8*(3-e%4)&255)<<16|(a[e+1>>>2]>>>8*(3-(e+1)%4)&255)<<8|a[e+2>>>2]>>>8*(3-(e+2)%4)&255,c=0;4>c;c+=1)b=8*e+6*c<=32*a.length?b+
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(g>>>6*(3-c)&63):b+d.b64Pad;return b}function z(a){var d={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(d.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(d.b64Pad=a.b64Pad)}catch(b){}if("boolean"!==typeof d.outputUpper)throw"Invalid outputUpper formatting option";if("string"!==typeof d.b64Pad)throw"Invalid b64Pad formatting option";return d}function D(a,d){return a<<d|a>>>32-d}function E(a,d,b){return a^
+d^b}function F(a,d,b){return a&d^~a&b}function G(a,d,b){return a&d^a&b^d&b}function H(a,d){var b=(a&65535)+(d&65535);return((a>>>16)+(d>>>16)+(b>>>16)&65535)<<16|b&65535}function I(a,d,b,f,e){var c=(a&65535)+(d&65535)+(b&65535)+(f&65535)+(e&65535);return((a>>>16)+(d>>>16)+(b>>>16)+(f>>>16)+(e>>>16)+(c>>>16)&65535)<<16|c&65535}function q(a,d){var b=[],f,e,c,g,p,A,J=F,B=E,t=G,h=D,l=H,m,k,r=I,s,n=[1732584193,4023233417,2562383102,271733878,3285377520],q=[1518500249,1518500249,1518500249,1518500249,1518500249,
+1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1518500249,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,1859775393,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,
+2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,2400959708,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782,3395469782];a[d>>>5]|=128<<24-d%32;a[(d+65>>>9<<4)+15]=d;s=a.length;for(m=0;m<s;m+=16){f=n[0];e=n[1];c=n[2];g=n[3];p=n[4];for(k=0;80>k;k+=1)b[k]=16>k?a[k+m]:h(b[k-3]^b[k-8]^b[k-14]^b[k-16],1),A=
+20>k?r(h(f,5),J(e,c,g),p,q[k],b[k]):40>k?r(h(f,5),B(e,c,g),p,q[k],b[k]):60>k?r(h(f,5),t(e,c,g),p,q[k],b[k]):r(h(f,5),B(e,c,g),p,q[k],b[k]),p=g,g=c,c=h(e,30),e=f,f=A;n[0]=l(f,n[0]);n[1]=l(e,n[1]);n[2]=l(c,n[2]);n[3]=l(g,n[3]);n[4]=l(p,n[4])}return n}C.jsSHA=function(a,d,b){var f=0,e=[0],c="",g=null,c=b||"UTF8";if("UTF8"!==c&&"UTF16"!==c)throw"encoding must be UTF8 or UTF16";if("HEX"===d){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";g=v(a);f=g.binLen;e=g.value}else if("ASCII"===
+d||"TEXT"===d)g=u(a,c),f=g.binLen,e=g.value;else if("B64"===d)g=w(a),f=g.binLen,e=g.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";this.getHash=function(a,b,c,d){var g=null,h=e.slice(),l=f,m;3===arguments.length?"number"!==typeof c&&(d=c,c=1):2===arguments.length&&(c=1);switch(b){case "HEX":g=x;break;case "B64":g=y;break;default:throw"format must be HEX or B64";}if("SHA-1"===a)for(m=0;m<c;m++)h=q(h,l),l=160;else throw"Chosen SHA variant is not supported";return g(h,z(d))};this.getHMAC=
+function(a,b,d,g,t){var h,l,m,k,r=[],s=[];h=null;switch(g){case "HEX":g=x;break;case "B64":g=y;break;default:throw"outputFormat must be HEX or B64";}if("SHA-1"===d)l=64,k=160;else throw"Chosen SHA variant is not supported";if("HEX"===b)h=v(a),m=h.binLen,h=h.value;else if("ASCII"===b||"TEXT"===b)h=u(a,c),m=h.binLen,h=h.value;else if("B64"===b)h=w(a),m=h.binLen,h=h.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";a=8*l;b=l/4-1;if(l<m/8){if("SHA-1"===d)h=q(h,m);else throw"Unexpected error in HMAC implementation";
+h[b]&=4294967040}else l>m/8&&(h[b]&=4294967040);for(l=0;l<=b;l+=1)r[l]=h[l]^909522486,s[l]=h[l]^1549556828;if("SHA-1"===d)d=q(s.concat(q(r.concat(e),a+f)),a+k);else throw"Unexpected error in HMAC implementation";return g(d,z(t))}}})(this);})(this);
diff --git a/src/sha256.js b/src/sha256.js
index 1700d8c..f8815df 100755
--- a/src/sha256.js
+++ b/src/sha256.js
@@ -9,18 +9,15 @@
Several functions taken from Paul Johnston
*/
-function n(a){throw a;}var r=null;function t(a,b){var d=[],e,c=[],f=0,h;if("UTF8"==b)for(h=0;h<a.length;h+=1){e=a.charCodeAt(h);c=[];2048<e?(c[0]=224|(e&61440)>>>12,c[1]=128|(e&4032)>>>6,c[2]=128|e&63):128<e?(c[0]=192|(e&1984)>>>6,c[1]=128|e&63):c[0]=e;for(e=0;e<c.length;e+=1)d[f>>>2]|=c[e]<<24-8*(f%4),f+=1}else if("UTF16"==b)for(h=0;h<a.length;h+=1)d[f>>>2]|=a.charCodeAt(h)<<16-8*(f%4),f+=2;return{value:d,binLen:8*f}}
-function w(a){var b=[],d=a.length,e,c;0!==d%2&&n("String of HEX type must be in byte increments");for(e=0;e<d;e+=2)c=parseInt(a.substr(e,2),16),isNaN(c)&&n("String of HEX type contains invalid characters"),b[e>>>3]|=c<<24-4*(e%8);return{value:b,binLen:4*d}}
-function A(a){var b=[],d=0,e,c,f,h,l;-1===a.search(/^[a-zA-Z0-9=+\/]+$/)&&n("Invalid character in base-64 string");e=a.indexOf("=");a=a.replace(/\=/g,"");-1!==e&&e<a.length&&n("Invalid '=' found in base-64 string");for(c=0;c<a.length;c+=4){l=a.substr(c,4);for(f=h=0;f<l.length;f+=1)e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(l[f]),h|=e<<18-6*f;for(f=0;f<l.length-1;f+=1)b[d>>2]|=(h>>>16-8*f&255)<<24-8*(d%4),d+=1}return{value:b,binLen:8*d}}
-function D(a,b){var d="",e=4*a.length,c,f;for(c=0;c<e;c+=1)f=a[c>>>2]>>>8*(3-c%4),d+="0123456789abcdef".charAt(f>>>4&15)+"0123456789abcdef".charAt(f&15);return b.outputUpper?d.toUpperCase():d}
-function E(a,b){var d="",e=4*a.length,c,f,h;for(c=0;c<e;c+=3){h=(a[c>>>2]>>>8*(3-c%4)&255)<<16|(a[c+1>>>2]>>>8*(3-(c+1)%4)&255)<<8|a[c+2>>>2]>>>8*(3-(c+2)%4)&255;for(f=0;4>f;f+=1)d=8*c+6*f<=32*a.length?d+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(h>>>6*(3-f)&63):d+b.b64Pad}return d}
-function F(a){var b={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(b.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(b.b64Pad=a.b64Pad)}catch(d){}"boolean"!==typeof b.outputUpper&&n("Invalid outputUpper formatting option");"string"!==typeof b.b64Pad&&n("Invalid b64Pad formatting option");return b}function G(a,b){return a>>>b|a<<32-b}function H(a,b,d){return a&b^~a&d}function S(a,b,d){return a&b^a&d^b&d}function T(a){return G(a,2)^G(a,13)^G(a,22)}
-function U(a){return G(a,6)^G(a,11)^G(a,25)}function V(a){return G(a,7)^G(a,18)^a>>>3}function W(a){return G(a,17)^G(a,19)^a>>>10}function X(a,b){var d=(a&65535)+(b&65535);return((a>>>16)+(b>>>16)+(d>>>16)&65535)<<16|d&65535}function Y(a,b,d,e){var c=(a&65535)+(b&65535)+(d&65535)+(e&65535);return((a>>>16)+(b>>>16)+(d>>>16)+(e>>>16)+(c>>>16)&65535)<<16|c&65535}
-function Z(a,b,d,e,c){var f=(a&65535)+(b&65535)+(d&65535)+(e&65535)+(c&65535);return((a>>>16)+(b>>>16)+(d>>>16)+(e>>>16)+(c>>>16)+(f>>>16)&65535)<<16|f&65535}
-function $(a,b,d){var e,c,f,h,l,k,z,B,I,g,J,u,j,m,s,p,x,y,q,K,L,M,N,O,P,Q,v=[],R,C;"SHA-224"===d||"SHA-256"===d?(J=64,m=16,s=1,P=Number,p=X,x=Y,y=Z,q=V,K=W,L=T,M=U,O=S,N=H,Q=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,
-338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],g="SHA-224"===d?[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428]:[1779033703,3144134277,1013904242,2773480762,
-1359893119,2600822924,528734635,1541459225]):n("Unexpected error in SHA-2 implementation");a[b>>>5]|=128<<24-b%32;a[(b+65>>>9<<4)+15]=b;R=a.length;for(u=0;u<R;u+=m){b=g[0];e=g[1];c=g[2];f=g[3];h=g[4];l=g[5];k=g[6];z=g[7];for(j=0;j<J;j+=1)v[j]=16>j?new P(a[j*s+u],a[j*s+u+1]):x(K(v[j-2]),v[j-7],q(v[j-15]),v[j-16]),B=y(z,M(h),N(h,l,k),Q[j],v[j]),I=p(L(b),O(b,e,c)),z=k,k=l,l=h,h=p(f,B),f=c,c=e,e=b,b=p(B,I);g[0]=p(b,g[0]);g[1]=p(e,g[1]);g[2]=p(c,g[2]);g[3]=p(f,g[3]);g[4]=p(h,g[4]);g[5]=p(l,g[5]);g[6]=
-p(k,g[6]);g[7]=p(z,g[7])}"SHA-224"===d?C=[g[0],g[1],g[2],g[3],g[4],g[5],g[6]]:"SHA-256"===d?C=g:n("Unexpected error in SHA-2 implementation");return C}
-module.jsSHA=function(a,b,d){var e=r,c=r,f=0,h=[0],l="",k=r,l="undefined"!==typeof d?d:"UTF8";"UTF8"===l||"UTF16"===l||n("encoding must be UTF8 or UTF16");"HEX"===b?(0!==a.length%2&&n("srcString of HEX type must be in byte increments"),k=w(a),f=k.binLen,h=k.value):"ASCII"===b||"TEXT"===b?(k=t(a,l),f=k.binLen,h=k.value):"B64"===b?(k=A(a),f=k.binLen,h=k.value):n("inputFormat must be HEX, TEXT, ASCII, or B64");this.getHash=function(a,b,d){var g=r,l=h.slice(),k="";switch(b){case "HEX":g=D;break;case "B64":g=
-E;break;default:n("format must be HEX or B64")}"SHA-224"===a?(r===e&&(e=$(l,f,a)),k=g(e,F(d))):"SHA-256"===a?(r===c&&(c=$(l,f,a)),k=g(c,F(d))):n("Chosen SHA variant is not supported");return k};this.getHMAC=function(a,b,c,d,e){var k,j,m,s,p,x=[],y=[],q=r;switch(d){case "HEX":k=D;break;case "B64":k=E;break;default:n("outputFormat must be HEX or B64")}"SHA-224"===c?(m=64,p=224):"SHA-256"===c?(m=64,p=256):n("Chosen SHA variant is not supported");"HEX"===b?(q=w(a),s=q.binLen,j=q.value):"ASCII"===b||"TEXT"===
-b?(q=t(a,l),s=q.binLen,j=q.value):"B64"===b?(q=A(a),s=q.binLen,j=q.value):n("inputFormat must be HEX, TEXT, ASCII, or B64");a=8*m;b=m/4-1;m<s/8?(j=$(j,s,c),j[b]&=4294967040):m>s/8&&(j[b]&=4294967040);for(m=0;m<=b;m+=1)x[m]=j[m]^909522486,y[m]=j[m]^1549556828;c=$(y.concat($(x.concat(h),a+f,c)),a+p,c);return k(c,F(e))}};})(this);
+(function(J){function u(a,b){var c=[],f,e=[],g=0,h;if("UTF8"===b)for(h=0;h<a.length;h+=1)for(f=a.charCodeAt(h),e=[],2048<f?(e[0]=224|(f&61440)>>>12,e[1]=128|(f&4032)>>>6,e[2]=128|f&63):128<f?(e[0]=192|(f&1984)>>>6,e[1]=128|f&63):e[0]=f,f=0;f<e.length;f+=1)c[g>>>2]|=e[f]<<24-g%4*8,g+=1;else if("UTF16"===b)for(h=0;h<a.length;h+=1)c[g>>>2]|=a.charCodeAt(h)<<16-g%4*8,g+=2;return{value:c,binLen:8*g}}function v(a){var b=[],c=a.length,f,e;if(0!==c%2)throw"String of HEX type must be in byte increments";for(f=
+0;f<c;f+=2){e=parseInt(a.substr(f,2),16);if(isNaN(e))throw"String of HEX type contains invalid characters";b[f>>>3]|=e<<24-f%8*4}return{value:b,binLen:4*c}}function w(a){var b=[],c=0,f,e,g,h,q;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";f=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==f&&f<a.length)throw"Invalid '=' found in base-64 string";for(e=0;e<a.length;e+=4){q=a.substr(e,4);for(g=h=0;g<q.length;g+=1)f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(q[g]),
+h|=f<<18-6*g;for(g=0;g<q.length-1;g+=1)b[c>>2]|=(h>>>16-8*g&255)<<24-c%4*8,c+=1}return{value:b,binLen:8*c}}function x(a,b){var c="",f=4*a.length,e,g;for(e=0;e<f;e+=1)g=a[e>>>2]>>>8*(3-e%4),c+="0123456789abcdef".charAt(g>>>4&15)+"0123456789abcdef".charAt(g&15);return b.outputUpper?c.toUpperCase():c}function y(a,b){var c="",f=4*a.length,e,g,h;for(e=0;e<f;e+=3)for(h=(a[e>>>2]>>>8*(3-e%4)&255)<<16|(a[e+1>>>2]>>>8*(3-(e+1)%4)&255)<<8|a[e+2>>>2]>>>8*(3-(e+2)%4)&255,g=0;4>g;g+=1)c=8*e+6*g<=32*a.length?c+
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(h>>>6*(3-g)&63):c+b.b64Pad;return c}function z(a){var b={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(b.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(b.b64Pad=a.b64Pad)}catch(c){}if("boolean"!==typeof b.outputUpper)throw"Invalid outputUpper formatting option";if("string"!==typeof b.b64Pad)throw"Invalid b64Pad formatting option";return b}function n(a,b){return a>>>b|a<<32-b}function K(a,b,c){return a&
+b^~a&c}function L(a,b,c){return a&b^a&c^b&c}function M(a){return n(a,2)^n(a,13)^n(a,22)}function N(a){return n(a,6)^n(a,11)^n(a,25)}function O(a){return n(a,7)^n(a,18)^a>>>3}function P(a){return n(a,17)^n(a,19)^a>>>10}function Q(a,b){var c=(a&65535)+(b&65535);return((a>>>16)+(b>>>16)+(c>>>16)&65535)<<16|c&65535}function R(a,b,c,f){var e=(a&65535)+(b&65535)+(c&65535)+(f&65535);return((a>>>16)+(b>>>16)+(c>>>16)+(f>>>16)+(e>>>16)&65535)<<16|e&65535}function S(a,b,c,f,e){var g=(a&65535)+(b&65535)+(c&
+65535)+(f&65535)+(e&65535);return((a>>>16)+(b>>>16)+(c>>>16)+(f>>>16)+(e>>>16)+(g>>>16)&65535)<<16|g&65535}function r(a,b,c){var f,e,g,h,q,A,B,C,n,d,k,l,m,r,s,p,u,v,w,x,y,z,E,F,G,H,t=[],I;if("SHA-224"===c||"SHA-256"===c)k=64,r=16,s=1,G=Number,p=Q,u=R,v=S,w=O,x=P,y=M,z=N,F=L,E=K,H=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,
+1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],d="SHA-224"===c?[3238371032,914150663,
+812702999,4144912697,4290775857,1750603025,1694076839,3204075428]:[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];else throw"Unexpected error in SHA-2 implementation";a[b>>>5]|=128<<24-b%32;a[(b+65>>>9<<4)+15]=b;I=a.length;for(l=0;l<I;l+=r){b=d[0];f=d[1];e=d[2];g=d[3];h=d[4];q=d[5];A=d[6];B=d[7];for(m=0;m<k;m+=1)t[m]=16>m?new G(a[m*s+l],a[m*s+l+1]):u(x(t[m-2]),t[m-7],w(t[m-15]),t[m-16]),C=v(B,z(h),E(h,q,A),H[m],t[m]),n=p(y(b),F(b,f,e)),B=A,A=q,q=h,h=p(g,C),
+g=e,e=f,f=b,b=p(C,n);d[0]=p(b,d[0]);d[1]=p(f,d[1]);d[2]=p(e,d[2]);d[3]=p(g,d[3]);d[4]=p(h,d[4]);d[5]=p(q,d[5]);d[6]=p(A,d[6]);d[7]=p(B,d[7])}if("SHA-224"===c)a=[d[0],d[1],d[2],d[3],d[4],d[5],d[6]];else if("SHA-256"===c)a=d;else throw"Unexpected error in SHA-2 implementation";return a}J.jsSHA=function(a,b,c){var f=0,e=[0],g="",h=null,g=c||"UTF8";if("UTF8"!==g&&"UTF16"!==g)throw"encoding must be UTF8 or UTF16";if("HEX"===b){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";h=
+v(a);f=h.binLen;e=h.value}else if("ASCII"===b||"TEXT"===b)h=u(a,g),f=h.binLen,e=h.value;else if("B64"===b)h=w(a),f=h.binLen,e=h.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";this.getHash=function(a,b,c,g){var h=null,d=e.slice(),k=f,l;3===arguments.length?"number"!==typeof c&&(g=c,c=1):2===arguments.length&&(c=1);switch(b){case "HEX":h=x;break;case "B64":h=y;break;default:throw"format must be HEX or B64";}if("SHA-224"===a)for(l=0;l<c;l++)d=r(d,k,a),k=224;else if("SHA-256"===a)for(l=
+0;l<c;l++)d=r(d,k,a),k=256;else throw"Chosen SHA variant is not supported";return h(d,z(g))};this.getHMAC=function(a,b,c,h,n){var d,k,l,m,D=[],s=[];d=null;switch(h){case "HEX":h=x;break;case "B64":h=y;break;default:throw"outputFormat must be HEX or B64";}if("SHA-224"===c)k=64,m=224;else if("SHA-256"===c)k=64,m=256;else throw"Chosen SHA variant is not supported";if("HEX"===b)d=v(a),l=d.binLen,d=d.value;else if("ASCII"===b||"TEXT"===b)d=u(a,g),l=d.binLen,d=d.value;else if("B64"===b)d=w(a),l=d.binLen,
+d=d.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";a=8*k;b=k/4-1;k<l/8?(d=r(d,l,c),d[b]&=4294967040):k>l/8&&(d[b]&=4294967040);for(k=0;k<=b;k+=1)D[k]=d[k]^909522486,s[k]=d[k]^1549556828;c=r(s.concat(r(D.concat(e),a+f,c)),a+m,c);return h(c,z(n))}}})(this);})(this);
diff --git a/src/sha512.js b/src/sha512.js
index f15b412..2415476 100755
--- a/src/sha512.js
+++ b/src/sha512.js
@@ -9,25 +9,21 @@
Several functions taken from Paul Johnston
*/
-function p(a){throw a;}var r=null;function t(a,b){this.a=a;this.b=b}function v(a,b){var d=[],f,e=[],g=0,j;if("UTF8"==b)for(j=0;j<a.length;j+=1){f=a.charCodeAt(j);e=[];2048<f?(e[0]=224|(f&61440)>>>12,e[1]=128|(f&4032)>>>6,e[2]=128|f&63):128<f?(e[0]=192|(f&1984)>>>6,e[1]=128|f&63):e[0]=f;for(f=0;f<e.length;f+=1)d[g>>>2]|=e[f]<<24-8*(g%4),g+=1}else if("UTF16"==b)for(j=0;j<a.length;j+=1)d[g>>>2]|=a.charCodeAt(j)<<16-8*(g%4),g+=2;return{value:d,binLen:8*g}}
-function y(a){var b=[],d=a.length,f,e;0!==d%2&&p("String of HEX type must be in byte increments");for(f=0;f<d;f+=2)e=parseInt(a.substr(f,2),16),isNaN(e)&&p("String of HEX type contains invalid characters"),b[f>>>3]|=e<<24-4*(f%8);return{value:b,binLen:4*d}}
-function C(a){var b=[],d=0,f,e,g,j,m;-1===a.search(/^[a-zA-Z0-9=+\/]+$/)&&p("Invalid character in base-64 string");f=a.indexOf("=");a=a.replace(/\=/g,"");-1!==f&&f<a.length&&p("Invalid '=' found in base-64 string");for(e=0;e<a.length;e+=4){m=a.substr(e,4);for(g=j=0;g<m.length;g+=1)f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(m[g]),j|=f<<18-6*g;for(g=0;g<m.length-1;g+=1)b[d>>2]|=(j>>>16-8*g&255)<<24-8*(d%4),d+=1}return{value:b,binLen:8*d}}
-function F(a,b){var d="",f=4*a.length,e,g;for(e=0;e<f;e+=1)g=a[e>>>2]>>>8*(3-e%4),d+="0123456789abcdef".charAt(g>>>4&15)+"0123456789abcdef".charAt(g&15);return b.outputUpper?d.toUpperCase():d}
-function G(a,b){var d="",f=4*a.length,e,g,j;for(e=0;e<f;e+=3){j=(a[e>>>2]>>>8*(3-e%4)&255)<<16|(a[e+1>>>2]>>>8*(3-(e+1)%4)&255)<<8|a[e+2>>>2]>>>8*(3-(e+2)%4)&255;for(g=0;4>g;g+=1)d=8*e+6*g<=32*a.length?d+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(j>>>6*(3-g)&63):d+b.b64Pad}return d}
-function H(a){var b={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(b.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(b.b64Pad=a.b64Pad)}catch(d){}"boolean"!==typeof b.outputUpper&&p("Invalid outputUpper formatting option");"string"!==typeof b.b64Pad&&p("Invalid b64Pad formatting option");return b}
-function I(a,b){var d=r,d=new t(a.a,a.b);return d=32>=b?new t(d.a>>>b|d.b<<32-b&4294967295,d.b>>>b|d.a<<32-b&4294967295):new t(d.b>>>b-32|d.a<<64-b&4294967295,d.a>>>b-32|d.b<<64-b&4294967295)}function J(a,b){var d=r;return d=32>=b?new t(a.a>>>b,a.b>>>b|a.a<<32-b&4294967295):new t(0,a.a>>>b-32)}function K(a,b,d){return new t(a.a&b.a^~a.a&d.a,a.b&b.b^~a.b&d.b)}function U(a,b,d){return new t(a.a&b.a^a.a&d.a^b.a&d.a,a.b&b.b^a.b&d.b^b.b&d.b)}
-function V(a){var b=I(a,28),d=I(a,34);a=I(a,39);return new t(b.a^d.a^a.a,b.b^d.b^a.b)}function W(a){var b=I(a,14),d=I(a,18);a=I(a,41);return new t(b.a^d.a^a.a,b.b^d.b^a.b)}function X(a){var b=I(a,1),d=I(a,8);a=J(a,7);return new t(b.a^d.a^a.a,b.b^d.b^a.b)}function Y(a){var b=I(a,19),d=I(a,61);a=J(a,6);return new t(b.a^d.a^a.a,b.b^d.b^a.b)}
-function Z(a,b){var d,f,e;d=(a.b&65535)+(b.b&65535);f=(a.b>>>16)+(b.b>>>16)+(d>>>16);e=(f&65535)<<16|d&65535;d=(a.a&65535)+(b.a&65535)+(f>>>16);f=(a.a>>>16)+(b.a>>>16)+(d>>>16);return new t((f&65535)<<16|d&65535,e)}
-function aa(a,b,d,f){var e,g,j;e=(a.b&65535)+(b.b&65535)+(d.b&65535)+(f.b&65535);g=(a.b>>>16)+(b.b>>>16)+(d.b>>>16)+(f.b>>>16)+(e>>>16);j=(g&65535)<<16|e&65535;e=(a.a&65535)+(b.a&65535)+(d.a&65535)+(f.a&65535)+(g>>>16);g=(a.a>>>16)+(b.a>>>16)+(d.a>>>16)+(f.a>>>16)+(e>>>16);return new t((g&65535)<<16|e&65535,j)}
-function ba(a,b,d,f,e){var g,j,m;g=(a.b&65535)+(b.b&65535)+(d.b&65535)+(f.b&65535)+(e.b&65535);j=(a.b>>>16)+(b.b>>>16)+(d.b>>>16)+(f.b>>>16)+(e.b>>>16)+(g>>>16);m=(j&65535)<<16|g&65535;g=(a.a&65535)+(b.a&65535)+(d.a&65535)+(f.a&65535)+(e.a&65535)+(j>>>16);j=(a.a>>>16)+(b.a>>>16)+(d.a>>>16)+(f.a>>>16)+(e.a>>>16)+(g>>>16);return new t((j&65535)<<16|g&65535,m)}
-function $(a,b,d){var f,e,g,j,m,l,B,D,L,h,M,w,k,n,u,q,z,A,s,N,O,P,Q,R,c,S,x=[],T,E;"SHA-384"===d||"SHA-512"===d?(M=80,f=(b+128>>>10<<5)+31,n=32,u=2,c=t,q=Z,z=aa,A=ba,s=X,N=Y,O=V,P=W,R=U,Q=K,S=[new c(1116352408,3609767458),new c(1899447441,602891725),new c(3049323471,3964484399),new c(3921009573,2173295548),new c(961987163,4081628472),new c(1508970993,3053834265),new c(2453635748,2937671579),new c(2870763221,3664609560),new c(3624381080,2734883394),new c(310598401,1164996542),new c(607225278,1323610764),
-new c(1426881987,3590304994),new c(1925078388,4068182383),new c(2162078206,991336113),new c(2614888103,633803317),new c(3248222580,3479774868),new c(3835390401,2666613458),new c(4022224774,944711139),new c(264347078,2341262773),new c(604807628,2007800933),new c(770255983,1495990901),new c(1249150122,1856431235),new c(1555081692,3175218132),new c(1996064986,2198950837),new c(2554220882,3999719339),new c(2821834349,766784016),new c(2952996808,2566594879),new c(3210313671,3203337956),new c(3336571891,
-1034457026),new c(3584528711,2466948901),new c(113926993,3758326383),new c(338241895,168717936),new c(666307205,1188179964),new c(773529912,1546045734),new c(1294757372,1522805485),new c(1396182291,2643833823),new c(1695183700,2343527390),new c(1986661051,1014477480),new c(2177026350,1206759142),new c(2456956037,344077627),new c(2730485921,1290863460),new c(2820302411,3158454273),new c(3259730800,3505952657),new c(3345764771,106217008),new c(3516065817,3606008344),new c(3600352804,1432725776),new c(4094571909,
-1467031594),new c(275423344,851169720),new c(430227734,3100823752),new c(506948616,1363258195),new c(659060556,3750685593),new c(883997877,3785050280),new c(958139571,3318307427),new c(1322822218,3812723403),new c(1537002063,2003034995),new c(1747873779,3602036899),new c(1955562222,1575990012),new c(2024104815,1125592928),new c(2227730452,2716904306),new c(2361852424,442776044),new c(2428436474,593698344),new c(2756734187,3733110249),new c(3204031479,2999351573),new c(3329325298,3815920427),new c(3391569614,
-3928383900),new c(3515267271,566280711),new c(3940187606,3454069534),new c(4118630271,4000239992),new c(116418474,1914138554),new c(174292421,2731055270),new c(289380356,3203993006),new c(460393269,320620315),new c(685471733,587496836),new c(852142971,1086792851),new c(1017036298,365543100),new c(1126000580,2618297676),new c(1288033470,3409855158),new c(1501505948,4234509866),new c(1607167915,987167468),new c(1816402316,1246189591)],h="SHA-384"===d?[new c(3418070365,3238371032),new c(1654270250,914150663),
-new c(2438529370,812702999),new c(355462360,4144912697),new c(1731405415,4290775857),new c(41048885895,1750603025),new c(3675008525,1694076839),new c(1203062813,3204075428)]:[new c(1779033703,4089235720),new c(3144134277,2227873595),new c(1013904242,4271175723),new c(2773480762,1595750129),new c(1359893119,2917565137),new c(2600822924,725511199),new c(528734635,4215389547),new c(1541459225,327033209)]):p("Unexpected error in SHA-2 implementation");a[b>>>5]|=128<<24-b%32;a[f]=b;T=a.length;for(w=0;w<
-T;w+=n){b=h[0];f=h[1];e=h[2];g=h[3];j=h[4];m=h[5];l=h[6];B=h[7];for(k=0;k<M;k+=1)x[k]=16>k?new c(a[k*u+w],a[k*u+w+1]):z(N(x[k-2]),x[k-7],s(x[k-15]),x[k-16]),D=A(B,P(j),Q(j,m,l),S[k],x[k]),L=q(O(b),R(b,f,e)),B=l,l=m,m=j,j=q(g,D),g=e,e=f,f=b,b=q(D,L);h[0]=q(b,h[0]);h[1]=q(f,h[1]);h[2]=q(e,h[2]);h[3]=q(g,h[3]);h[4]=q(j,h[4]);h[5]=q(m,h[5]);h[6]=q(l,h[6]);h[7]=q(B,h[7])}"SHA-384"===d?E=[h[0].a,h[0].b,h[1].a,h[1].b,h[2].a,h[2].b,h[3].a,h[3].b,h[4].a,h[4].b,h[5].a,h[5].b]:"SHA-512"===d?E=[h[0].a,h[0].b,
-h[1].a,h[1].b,h[2].a,h[2].b,h[3].a,h[3].b,h[4].a,h[4].b,h[5].a,h[5].b,h[6].a,h[6].b,h[7].a,h[7].b]:p("Unexpected error in SHA-2 implementation");return E}
-module.jsSHA=function(a,b,d){var f=r,e=r,g=0,j=[0],m="",l=r,m="undefined"!==typeof d?d:"UTF8";"UTF8"===m||"UTF16"===m||p("encoding must be UTF8 or UTF16");"HEX"===b?(0!==a.length%2&&p("srcString of HEX type must be in byte increments"),l=y(a),g=l.binLen,j=l.value):"ASCII"===b||"TEXT"===b?(l=v(a,m),g=l.binLen,j=l.value):"B64"===b?(l=C(a),g=l.binLen,j=l.value):p("inputFormat must be HEX, TEXT, ASCII, or B64");this.getHash=function(a,b,d){var h=r,m=j.slice(),l="";switch(b){case "HEX":h=F;break;case "B64":h=
-G;break;default:p("format must be HEX or B64")}"SHA-384"===a?(r===f&&(f=$(m,g,a)),l=h(f,H(d))):"SHA-512"===a?(r===e&&(e=$(m,g,a)),l=h(e,H(d))):p("Chosen SHA variant is not supported");return l};this.getHMAC=function(a,b,d,e,f){var l,k,n,u,q,z=[],A=[],s=r;switch(e){case "HEX":l=F;break;case "B64":l=G;break;default:p("outputFormat must be HEX or B64")}"SHA-384"===d?(n=128,q=384):"SHA-512"===d?(n=128,q=512):p("Chosen SHA variant is not supported");"HEX"===b?(s=y(a),u=s.binLen,k=s.value):"ASCII"===b||
-"TEXT"===b?(s=v(a,m),u=s.binLen,k=s.value):"B64"===b?(s=C(a),u=s.binLen,k=s.value):p("inputFormat must be HEX, TEXT, ASCII, or B64");a=8*n;b=n/4-1;n<u/8?(k=$(k,u,d),k[b]&=4294967040):n>u/8&&(k[b]&=4294967040);for(n=0;n<=b;n+=1)z[n]=k[n]^909522486,A[n]=k[n]^1549556828;d=$(A.concat($(z.concat(j),a+g,d)),a+q,d);return l(d,H(f))}};})(this);
+(function(J){function p(a,b){this.a=a;this.b=b}function w(a,b){var c=[],g,f=[],h=0,k;if("UTF8"===b)for(k=0;k<a.length;k+=1)for(g=a.charCodeAt(k),f=[],2048<g?(f[0]=224|(g&61440)>>>12,f[1]=128|(g&4032)>>>6,f[2]=128|g&63):128<g?(f[0]=192|(g&1984)>>>6,f[1]=128|g&63):f[0]=g,g=0;g<f.length;g+=1)c[h>>>2]|=f[g]<<24-h%4*8,h+=1;else if("UTF16"===b)for(k=0;k<a.length;k+=1)c[h>>>2]|=a.charCodeAt(k)<<16-h%4*8,h+=2;return{value:c,binLen:8*h}}function x(a){var b=[],c=a.length,g,f;if(0!==c%2)throw"String of HEX type must be in byte increments";
+for(g=0;g<c;g+=2){f=parseInt(a.substr(g,2),16);if(isNaN(f))throw"String of HEX type contains invalid characters";b[g>>>3]|=f<<24-g%8*4}return{value:b,binLen:4*c}}function y(a){var b=[],c=0,g,f,h,k,r;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw"Invalid character in base-64 string";g=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==g&&g<a.length)throw"Invalid '=' found in base-64 string";for(f=0;f<a.length;f+=4){r=a.substr(f,4);for(h=k=0;h<r.length;h+=1)g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(r[h]),
+k|=g<<18-6*h;for(h=0;h<r.length-1;h+=1)b[c>>2]|=(k>>>16-8*h&255)<<24-c%4*8,c+=1}return{value:b,binLen:8*c}}function z(a,b){var c="",g=4*a.length,f,h;for(f=0;f<g;f+=1)h=a[f>>>2]>>>8*(3-f%4),c+="0123456789abcdef".charAt(h>>>4&15)+"0123456789abcdef".charAt(h&15);return b.outputUpper?c.toUpperCase():c}function A(a,b){var c="",g=4*a.length,f,h,k;for(f=0;f<g;f+=3)for(k=(a[f>>>2]>>>8*(3-f%4)&255)<<16|(a[f+1>>>2]>>>8*(3-(f+1)%4)&255)<<8|a[f+2>>>2]>>>8*(3-(f+2)%4)&255,h=0;4>h;h+=1)c=8*f+6*h<=32*a.length?c+
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k>>>6*(3-h)&63):c+b.b64Pad;return c}function B(a){var b={outputUpper:!1,b64Pad:"="};try{a.hasOwnProperty("outputUpper")&&(b.outputUpper=a.outputUpper),a.hasOwnProperty("b64Pad")&&(b.b64Pad=a.b64Pad)}catch(c){}if("boolean"!==typeof b.outputUpper)throw"Invalid outputUpper formatting option";if("string"!==typeof b.b64Pad)throw"Invalid b64Pad formatting option";return b}function q(a,b){var c=null,c=new p(a.a,a.b);return c=32>=b?
+new p(c.a>>>b|c.b<<32-b&4294967295,c.b>>>b|c.a<<32-b&4294967295):new p(c.b>>>b-32|c.a<<64-b&4294967295,c.a>>>b-32|c.b<<64-b&4294967295)}function C(a,b){var c=null;return c=32>=b?new p(a.a>>>b,a.b>>>b|a.a<<32-b&4294967295):new p(0,a.a>>>b-32)}function K(a,b,c){return new p(a.a&b.a^~a.a&c.a,a.b&b.b^~a.b&c.b)}function L(a,b,c){return new p(a.a&b.a^a.a&c.a^b.a&c.a,a.b&b.b^a.b&c.b^b.b&c.b)}function M(a){var b=q(a,28),c=q(a,34);a=q(a,39);return new p(b.a^c.a^a.a,b.b^c.b^a.b)}function N(a){var b=q(a,14),
+c=q(a,18);a=q(a,41);return new p(b.a^c.a^a.a,b.b^c.b^a.b)}function O(a){var b=q(a,1),c=q(a,8);a=C(a,7);return new p(b.a^c.a^a.a,b.b^c.b^a.b)}function P(a){var b=q(a,19),c=q(a,61);a=C(a,6);return new p(b.a^c.a^a.a,b.b^c.b^a.b)}function Q(a,b){var c,g,f;c=(a.b&65535)+(b.b&65535);g=(a.b>>>16)+(b.b>>>16)+(c>>>16);f=(g&65535)<<16|c&65535;c=(a.a&65535)+(b.a&65535)+(g>>>16);g=(a.a>>>16)+(b.a>>>16)+(c>>>16);return new p((g&65535)<<16|c&65535,f)}function R(a,b,c,g){var f,h,k;f=(a.b&65535)+(b.b&65535)+(c.b&
+65535)+(g.b&65535);h=(a.b>>>16)+(b.b>>>16)+(c.b>>>16)+(g.b>>>16)+(f>>>16);k=(h&65535)<<16|f&65535;f=(a.a&65535)+(b.a&65535)+(c.a&65535)+(g.a&65535)+(h>>>16);h=(a.a>>>16)+(b.a>>>16)+(c.a>>>16)+(g.a>>>16)+(f>>>16);return new p((h&65535)<<16|f&65535,k)}function S(a,b,c,g,f){var h,k,r;h=(a.b&65535)+(b.b&65535)+(c.b&65535)+(g.b&65535)+(f.b&65535);k=(a.b>>>16)+(b.b>>>16)+(c.b>>>16)+(g.b>>>16)+(f.b>>>16)+(h>>>16);r=(k&65535)<<16|h&65535;h=(a.a&65535)+(b.a&65535)+(c.a&65535)+(g.a&65535)+(f.a&65535)+(k>>>
+16);k=(a.a>>>16)+(b.a>>>16)+(c.a>>>16)+(g.a>>>16)+(f.a>>>16)+(h>>>16);return new p((k&65535)<<16|h&65535,r)}function t(a,b,c){var g,f,h,k,r,D,E,F,q,e,l,m,n,t,u,s,w,x,y,z,A,B,C,G,d,H,v=[],I;if("SHA-384"===c||"SHA-512"===c)l=80,g=(b+128>>>10<<5)+31,t=32,u=2,d=p,s=Q,w=R,x=S,y=O,z=P,A=M,B=N,G=L,C=K,H=[new d(1116352408,3609767458),new d(1899447441,602891725),new d(3049323471,3964484399),new d(3921009573,2173295548),new d(961987163,4081628472),new d(1508970993,3053834265),new d(2453635748,2937671579),new d(2870763221,
+3664609560),new d(3624381080,2734883394),new d(310598401,1164996542),new d(607225278,1323610764),new d(1426881987,3590304994),new d(1925078388,4068182383),new d(2162078206,991336113),new d(2614888103,633803317),new d(3248222580,3479774868),new d(3835390401,2666613458),new d(4022224774,944711139),new d(264347078,2341262773),new d(604807628,2007800933),new d(770255983,1495990901),new d(1249150122,1856431235),new d(1555081692,3175218132),new d(1996064986,2198950837),new d(2554220882,3999719339),new d(2821834349,
+766784016),new d(2952996808,2566594879),new d(3210313671,3203337956),new d(3336571891,1034457026),new d(3584528711,2466948901),new d(113926993,3758326383),new d(338241895,168717936),new d(666307205,1188179964),new d(773529912,1546045734),new d(1294757372,1522805485),new d(1396182291,2643833823),new d(1695183700,2343527390),new d(1986661051,1014477480),new d(2177026350,1206759142),new d(2456956037,344077627),new d(2730485921,1290863460),new d(2820302411,3158454273),new d(3259730800,3505952657),new d(3345764771,
+106217008),new d(3516065817,3606008344),new d(3600352804,1432725776),new d(4094571909,1467031594),new d(275423344,851169720),new d(430227734,3100823752),new d(506948616,1363258195),new d(659060556,3750685593),new d(883997877,3785050280),new d(958139571,3318307427),new d(1322822218,3812723403),new d(1537002063,2003034995),new d(1747873779,3602036899),new d(1955562222,1575990012),new d(2024104815,1125592928),new d(2227730452,2716904306),new d(2361852424,442776044),new d(2428436474,593698344),new d(2756734187,
+3733110249),new d(3204031479,2999351573),new d(3329325298,3815920427),new d(3391569614,3928383900),new d(3515267271,566280711),new d(3940187606,3454069534),new d(4118630271,4000239992),new d(116418474,1914138554),new d(174292421,2731055270),new d(289380356,3203993006),new d(460393269,320620315),new d(685471733,587496836),new d(852142971,1086792851),new d(1017036298,365543100),new d(1126000580,2618297676),new d(1288033470,3409855158),new d(1501505948,4234509866),new d(1607167915,987167468),new d(1816402316,
+1246189591)],e="SHA-384"===c?[new d(3418070365,3238371032),new d(1654270250,914150663),new d(2438529370,812702999),new d(355462360,4144912697),new d(1731405415,4290775857),new d(41048885895,1750603025),new d(3675008525,1694076839),new d(1203062813,3204075428)]:[new d(1779033703,4089235720),new d(3144134277,2227873595),new d(1013904242,4271175723),new d(2773480762,1595750129),new d(1359893119,2917565137),new d(2600822924,725511199),new d(528734635,4215389547),new d(1541459225,327033209)];else throw"Unexpected error in SHA-2 implementation";
+a[b>>>5]|=128<<24-b%32;a[g]=b;I=a.length;for(m=0;m<I;m+=t){b=e[0];g=e[1];f=e[2];h=e[3];k=e[4];r=e[5];D=e[6];E=e[7];for(n=0;n<l;n+=1)v[n]=16>n?new d(a[n*u+m],a[n*u+m+1]):w(z(v[n-2]),v[n-7],y(v[n-15]),v[n-16]),F=x(E,B(k),C(k,r,D),H[n],v[n]),q=s(A(b),G(b,g,f)),E=D,D=r,r=k,k=s(h,F),h=f,f=g,g=b,b=s(F,q);e[0]=s(b,e[0]);e[1]=s(g,e[1]);e[2]=s(f,e[2]);e[3]=s(h,e[3]);e[4]=s(k,e[4]);e[5]=s(r,e[5]);e[6]=s(D,e[6]);e[7]=s(E,e[7])}if("SHA-384"===c)a=[e[0].a,e[0].b,e[1].a,e[1].b,e[2].a,e[2].b,e[3].a,e[3].b,e[4].a,
+e[4].b,e[5].a,e[5].b];else if("SHA-512"===c)a=[e[0].a,e[0].b,e[1].a,e[1].b,e[2].a,e[2].b,e[3].a,e[3].b,e[4].a,e[4].b,e[5].a,e[5].b,e[6].a,e[6].b,e[7].a,e[7].b];else throw"Unexpected error in SHA-2 implementation";return a}J.jsSHA=function(a,b,c){var g=0,f=[0],h="",k=null,h=c||"UTF8";if("UTF8"!==h&&"UTF16"!==h)throw"encoding must be UTF8 or UTF16";if("HEX"===b){if(0!==a.length%2)throw"srcString of HEX type must be in byte increments";k=x(a);g=k.binLen;f=k.value}else if("ASCII"===b||"TEXT"===b)k=w(a,
+h),g=k.binLen,f=k.value;else if("B64"===b)k=y(a),g=k.binLen,f=k.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";this.getHash=function(a,b,c,h){var k=null,e=f.slice(),l=g,m;3===arguments.length?"number"!==typeof c&&(h=c,c=1):2===arguments.length&&(c=1);switch(b){case "HEX":k=z;break;case "B64":k=A;break;default:throw"format must be HEX or B64";}if("SHA-384"===a)for(m=0;m<c;m++)e=t(e,l,a),l=384;else if("SHA-512"===a)for(m=0;m<c;m++)e=t(e,l,a),l=512;else throw"Chosen SHA variant is not supported";
+return k(e,B(h))};this.getHMAC=function(a,b,c,k,p){var e,l,m,n,q=[],u=[];e=null;switch(k){case "HEX":k=z;break;case "B64":k=A;break;default:throw"outputFormat must be HEX or B64";}if("SHA-384"===c)l=128,n=384;else if("SHA-512"===c)l=128,n=512;else throw"Chosen SHA variant is not supported";if("HEX"===b)e=x(a),m=e.binLen,e=e.value;else if("ASCII"===b||"TEXT"===b)e=w(a,h),m=e.binLen,e=e.value;else if("B64"===b)e=y(a),m=e.binLen,e=e.value;else throw"inputFormat must be HEX, TEXT, ASCII, or B64";a=8*
+l;b=l/4-1;l<m/8?(e=t(e,m,c),e[b]&=4294967040):l>m/8&&(e[b]&=4294967040);for(l=0;l<=b;l+=1)q[l]=e[l]^909522486,u[l]=e[l]^1549556828;c=t(u.concat(t(q.concat(f),a+g,c)),a+n,c);return k(c,B(p))}}})(this);})(this);
diff --git a/src/sha_dev.js b/src/sha_dev.js
index 6eb9859..bcf519f 100755
--- a/src/sha_dev.js
+++ b/src/sha_dev.js
@@ -52,8 +52,8 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
function str2binb(str, utfType)
{
var bin = [], codePnt, binArr = [], byteCnt = 0, i, j;
-
- if ("UTF8" == utfType)
+
+ if ("UTF8" === utfType)
{
for (i = 0; i < str.length; i += 1)
{
@@ -75,7 +75,7 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
{
binArr[0] = codePnt;
}
-
+
for (j = 0; j < binArr.length; j += 1)
{
bin[byteCnt >>> 2] |= binArr[j] << (24 - (8 * (byteCnt % 4)));
@@ -83,7 +83,7 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
}
}
}
- else if ("UTF16" == utfType)
+ else if ("UTF16" === utfType)
{
for (i = 0; i < str.length; i += 1)
{
@@ -264,7 +264,7 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
retVal["b64Pad"] = outputOpts["b64Pad"];
}
}
- catch(e)
+ catch(ignore)
{}
if ("boolean" !== typeof(retVal["outputUpper"]))
@@ -1097,11 +1097,9 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
*/
var jsSHA = function(srcString, inputFormat, encoding)
{
- var sha1 = null, sha224 = null, sha256 = null, sha384 = null,
- sha512 = null, strBinLen = 0, strToHash = [0], utfType = '',
- convertRet = null;
+ var strBinLen = 0, strToHash = [0], utfType = '', srcConvertRet = null;
- utfType = ("undefined" !== typeof(encoding)) ? encoding : "UTF8";
+ utfType = encoding || "UTF8";
if (!(("UTF8" === utfType) || ("UTF16" === utfType)))
{
@@ -1115,21 +1113,21 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
{
throw "srcString of HEX type must be in byte increments";
}
- convertRet = hex2binb(srcString);
- strBinLen = convertRet["binLen"];
- strToHash = convertRet["value"];
+ srcConvertRet = hex2binb(srcString);
+ strBinLen = srcConvertRet["binLen"];
+ strToHash = srcConvertRet["value"];
}
else if (("ASCII" === inputFormat) || ("TEXT" === inputFormat))
{
- convertRet = str2binb(srcString, utfType);
- strBinLen = convertRet["binLen"];
- strToHash = convertRet["value"];
+ srcConvertRet = str2binb(srcString, utfType);
+ strBinLen = srcConvertRet["binLen"];
+ strToHash = srcConvertRet["value"];
}
else if ("B64" === inputFormat)
{
- convertRet = b642binb(srcString);
- strBinLen = convertRet["binLen"];
- strToHash = convertRet["value"];
+ srcConvertRet = b642binb(srcString);
+ strBinLen = srcConvertRet["binLen"];
+ strToHash = srcConvertRet["value"];
}
else
{
@@ -1144,15 +1142,34 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
* @param {string} variant The desired SHA variant (SHA-1, SHA-224,
* SHA-256, SHA-384, or SHA-512)
* @param {string} format The desired output formatting (B64 or HEX)
+ * @param {number=} numRounds The number of rounds of hashing to be
+ * executed
* @param {{outputUpper : boolean, b64Pad : string}=} outputFormatOpts
* Hash list of output formatting options
* @return {string} The string representation of the hash in the format
* specified
*/
- this.getHash = function (variant, format, outputFormatOpts)
+ this.getHash = function(variant, format, numRounds, outputFormatOpts)
{
- var formatFunc = null, message = strToHash.slice(), retVal = "";
+ var formatFunc = null, message = strToHash.slice(),
+ messageBinLen = strBinLen, i;
+
+ /* Need to do argument patching since both numRounds and
+ outputFormatOpts are optional */
+ if (3 === arguments.length)
+ {
+ if ("number" !== typeof(numRounds))
+ {
+ outputFormatOpts = numRounds;
+ numRounds = 1;
+ }
+ }
+ else if (2 === arguments.length)
+ {
+ numRounds = 1;
+ }
+ /* Validate the output format selection */
switch (format)
{
case "HEX":
@@ -1167,50 +1184,50 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
if (("SHA-1" === variant) && (1 & SUPPORTED_ALGS))
{
- if (null === sha1)
+ for (i = 0; i < numRounds; i++)
{
- sha1 = coreSHA1(message, strBinLen);
+ message = coreSHA1(message, messageBinLen);
+ messageBinLen = 160;
}
- retVal = formatFunc(sha1, getOutputOpts(outputFormatOpts));
}
else if (("SHA-224" === variant) && (2 & SUPPORTED_ALGS))
{
- if (null === sha224)
+ for (i = 0; i < numRounds; i++)
{
- sha224 = coreSHA2(message, strBinLen, variant);
+ message = coreSHA2(message, messageBinLen, variant);
+ messageBinLen = 224;
}
- retVal = formatFunc(sha224, getOutputOpts(outputFormatOpts));
}
else if (("SHA-256" === variant) && (2 & SUPPORTED_ALGS))
{
- if (null === sha256)
+ for (i = 0; i < numRounds; i++)
{
- sha256 = coreSHA2(message, strBinLen, variant);
+ message = coreSHA2(message, messageBinLen, variant);
+ messageBinLen = 256;
}
- retVal = formatFunc(sha256, getOutputOpts(outputFormatOpts));
}
else if (("SHA-384" === variant) && (4 & SUPPORTED_ALGS))
{
- if (null === sha384)
+ for (i = 0; i < numRounds; i++)
{
- sha384 = coreSHA2(message, strBinLen, variant);
+ message = coreSHA2(message, messageBinLen, variant);
+ messageBinLen = 384;
}
- retVal = formatFunc(sha384, getOutputOpts(outputFormatOpts));
}
else if (("SHA-512" === variant) && (4 & SUPPORTED_ALGS))
{
- if (null === sha512)
+ for (i = 0; i < numRounds; i++)
{
- sha512 = coreSHA2(message, strBinLen, variant);
+ message = coreSHA2(message, messageBinLen, variant);
+ messageBinLen = 512;
}
- retVal = formatFunc(sha512, getOutputOpts(outputFormatOpts));
}
else
{
throw "Chosen SHA variant is not supported";
}
- return retVal;
+ return formatFunc(message, getOutputOpts(outputFormatOpts));
};
/**
@@ -1234,7 +1251,7 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
{
var formatFunc, keyToUse, blockByteSize, blockBitSize, i,
retVal, lastArrayIndex, keyBinLen, hashBitSize,
- keyWithIPad = [], keyWithOPad = [], convertRet = null;
+ keyWithIPad = [], keyWithOPad = [], keyConvertRet = null;
/* Validate the output format selection */
switch (outputFormat)
@@ -1283,21 +1300,21 @@ var SUPPORTED_ALGS = 4 | 2 | 1;
/* Validate input format selection */
if ("HEX" === inputFormat)
{
- convertRet = hex2binb(key);
- keyBinLen = convertRet["binLen"];
- keyToUse = convertRet["value"];
+ keyConvertRet = hex2binb(key);
+ keyBinLen = keyConvertRet["binLen"];
+ keyToUse = keyConvertRet["value"];
}
else if (("ASCII" === inputFormat) || ("TEXT" === inputFormat))
{
- convertRet = str2binb(key, utfType);
- keyBinLen = convertRet["binLen"];
- keyToUse = convertRet["value"];
+ keyConvertRet = str2binb(key, utfType);
+ keyBinLen = keyConvertRet["binLen"];
+ keyToUse = keyConvertRet["value"];
}
else if ("B64" === inputFormat)
{
- convertRet = b642binb(key);
- keyBinLen = convertRet["binLen"];
- keyToUse = convertRet["value"];
+ keyConvertRet = b642binb(key);
+ keyBinLen = keyConvertRet["binLen"];
+ keyToUse = keyConvertRet["value"];
}
else
{
diff --git a/test/genHashRounds.py b/test/genHashRounds.py
new file mode 100755
index 0000000..3b54236
--- /dev/null
+++ b/test/genHashRounds.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python2
+import hashlib
+
+def main():
+ hash_funcs = [
+ ('SHA-1', hashlib.sha1),
+ ('SHA-224', hashlib.sha224),
+ ('SHA-256', hashlib.sha256),
+ ('SHA-384', hashlib.sha384),
+ ('SHA-512', hashlib.sha512)]
+
+ for (sha_type, sha_func) in hash_funcs:
+ digest = sha_func(abc).digest()
+
+ # Only loop 4 times since an iteration was done above
+ for x in xrange(0, 4):
+ digest = sha_func(digest).digest()
+ print('{} with 5 Rounds: {}'.format(sha_type, digest.encode('hex')))
+
+ # Loop another 5 times to get to 10
+ for x in xrange(0, 5):
+ digest = sha_func(digest).digest()
+ print('{} with 10 Rounds: {}'.format(sha_type, digest.encode('hex')))
+
+if ('__main__' == __name__):
+ main()
diff --git a/test/test.html b/test/test.html
index 8307d9d..d7a8def 100755
--- a/test/test.html
+++ b/test/test.html
@@ -42,6 +42,7 @@
var algs = supportedAlgs();
calcHashes(algs);
+ calcHashesMulti(algs);
calcHMACs(algs);
}
@@ -308,6 +309,80 @@
}
}
+ function calcHashesMulti(algs)
+ {
+ /* Object that contains the case inputs and outputs for all the multi round hashes */
+ var data = {
+ "SHA-1" : {
+ "textIn" : "abc",
+ "hexOut5" : "b5c64925eb9940259be55c005c9cecc7d9897ef9",
+ "hexOut10" : "94ebc0d3c81b61eb98670666f5fde68560c4e165"
+ },
+ "SHA-224" : {
+ "textIn" : "abc",
+ "hexOut5" : "5b4b17f720d52c6a864229e784fb636184ca48ce7dd848fdad986239",
+ "hexOut10" : "5230eb37afcc115f4f380a9f50c4743d457bbe586e6faa6bf21696f9"
+ },
+ "SHA-256" : {
+ "textIn" : "abc",
+ "hexOut5" : "184f6d6e82554c051b33f15e7ffffecb0cc0f461a29096c41c214e168e34c21d",
+ "hexOut10" : "10e286f907c0fe9f02cea3864cbaec04ae47e2c0a13b60473bc9968a4851b219"
+ },
+ "SHA-384" : {
+ "textIn" : "abc",
+ "hexOut5" : "a4aa4cd8534aecb2d07765f928303d1d2609835ea85d14312bcee264e99dc5d7dc08bb18ec694053fd7fe6906706d55f",
+ "hexOut10" : "b80c82979453f2f3dcf89ec4cef5c71e89837537de170e3942af8b37757cc790d4cc4ebe16a52164ad19f3a02d192f1c"
+ },
+ "SHA-512" : {
+ "textIn" : "abc",
+ "hexOut5" : "299b2e3ce932e4d0e9005345e37af5a4cc6be21e6b6e21231ce71ccde2a7aba4a6822cd7a9aaf9b13918db05ede70d3f1e6af65f8ad0bda1c4c4fa263e3cabdd",
+ "hexOut10" : "4c3ead8c83442fff47d4386702044f2a6c19730a806de541964b0fa9987cac08641611e02b2e0742ef2600ff82bfe3a711567c8e76dda16b4948f4c76e3c6e9c"
+ }
+ }
+
+ var table = document.getElementById("HashRounds");
+ var table_head = table.tHead
+ var table_body = table.tBodies[0];
+
+ for (var j = 0; j < algs.length; j++)
+ {
+ var hashType = algs[j];
+
+ /* Dynamically build the table structure */
+ new_th = document.createElement('th');
+ new_th.innerHTML = hashType;
+ table_head.rows[0].appendChild(new_th);
+ table_body.rows[0].insertCell(-1);
+ table_body.rows[1].insertCell(-1);
+
+ /* Grab the TEXT input for a given hash and test case */
+ var shaObj = new jsSHA(data[hashType]['textIn'], 'TEXT');
+
+ /* Test the Hex output */
+ if (data[hashType]['hexOut5'] == shaObj.getHash(hashType, "HEX", 5))
+ {
+ table.rows[1].cells[j+1].innerHTML = "PASS";
+ table.rows[1].cells[j+1].className= "correct";
+ }
+ else
+ {
+ table.rows[1].cells[j+1].innerHTML = "FAIL";
+ table.rows[1].cells[j+1].className= "incorrect";
+ }
+
+ if (data[hashType]['hexOut10'] == shaObj.getHash(hashType, "HEX", 10))
+ {
+ table.rows[2].cells[j+1].innerHTML = "PASS";
+ table.rows[2].cells[j+1].className= "correct";
+ }
+ else
+ {
+ table.rows[2].cells[j+1].innerHTML = "FAIL";
+ table.rows[2].cells[j+1].className= "incorrect";
+ }
+ }
+ }
+
function calcHMACs(algs)
{
/* Object that contains the small/medium/large test case inputs and outputs for all the hashes */
@@ -884,6 +959,28 @@
</tr>
</tbody>
</table>
+
+ <h2>Multiple Round Tests</h2>
+ <p>
+ Values for the multiple round tests can be generated using the included getHashRounds.py
+ </p>
+
+ <table id="HashRounds">
+ <caption>Multiple Hash Rounds Tests</caption>
+ <thead>
+ <tr>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th>5 Rounds</th>
+ </tr>
+ <tr>
+ <th>10 Rounds</th>
+ </tr>
+ </tbody>
+ </table>
<h2>HMAC Tests</h2>
<p>
@@ -915,7 +1012,7 @@
<tbody>
<tr>
<th rowspan="2">Hex-Out</th>
- <th>Key-Hex</td>
+ <th>KeyHex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -927,7 +1024,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -940,7 +1037,7 @@
</tr>
<tr>
<th rowspan="2">B64-Out</th>
- <th>Key-Hex</td>
+ <th>KeyHex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -952,7 +1049,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -991,7 +1088,7 @@
<tbody>
<tr>
<th rowspan="2">Hex-Out</th>
- <th>Key-Hex</td>
+ <th>KeyHex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1003,7 +1100,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1016,7 +1113,7 @@
</tr>
<tr>
<th rowspan="2">B64-Out</th>
- <th>Key-Hex</td>
+ <th>KeyHex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1028,7 +1125,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1067,7 +1164,7 @@
<tbody>
<tr>
<th rowspan="2">Hex-Out</th>
- <th>Key-Hex</td>
+ <th>Key-Hex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1079,7 +1176,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1092,7 +1189,7 @@
</tr>
<tr>
<th rowspan="2">B64-Out</th>
- <th>Key-Hex</td>
+ <th>Key-Hex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1104,7 +1201,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1143,7 +1240,7 @@
<tbody>
<tr>
<th rowspan="2">Hex-Out</th>
- <th>Key-Hex</td>
+ <th>KeyHex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1155,7 +1252,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1168,7 +1265,7 @@
</tr>
<tr>
<th rowspan="2">B64-Out</th>
- <th>Key-Hex</td>
+ <th>KeyHex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1180,7 +1277,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1219,7 +1316,7 @@
<tbody>
<tr>
<th rowspan="2">Hex-Out</th>
- <th>Key-Hex</td>
+ <th>KeyHex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1231,7 +1328,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1244,7 +1341,7 @@
</tr>
<tr>
<th rowspan="2">B64-Out</th>
- <th>Key-Hex</td>
+ <th>KeyHex</th>
<td>?</td>
<td>?</td>
<td>?</td>
@@ -1256,7 +1353,7 @@
<td>?</td>
</tr>
<tr>
- <th>Key-B64</td>
+ <th>Key-B64</th>
<td>?</td>
<td>?</td>
<td>?</td>