| /* |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| */ |
| |
| var HASH384 = function() { |
| this.length=[]; |
| this.h=[]; |
| this.w=[]; |
| this.init(); |
| }; |
| |
| HASH384.prototype={ |
| /* constants */ |
| |
| |
| transform: function() |
| { /* basic transformation step */ |
| var a,b,c,d,e,ee,zz,f,g,hh,t1,t2; |
| var j,r; |
| for (j=16;j<80;j++) |
| this.w[j]=HASH384.theta1(this.w[j-2]).add(this.w[j-7]).add(HASH384.theta0(this.w[j-15])).add(this.w[j-16]); |
| |
| a=this.h[0].copy(); b=this.h[1].copy(); c=this.h[2].copy(); d=this.h[3].copy(); |
| e=this.h[4].copy(); f=this.h[5].copy(); g=this.h[6].copy(); hh=this.h[7].copy(); |
| |
| for (j=0;j<80;j++) |
| { /* 80 times - mush it up */ |
| t1=hh.copy(); |
| t1.add(HASH384.Sig1(e)).add(HASH384.Ch(e,f,g)).add(HASH384.HK[j]).add(this.w[j]); |
| |
| t2=HASH384.Sig0(a); t2.add(HASH384.Maj(a,b,c)); |
| hh=g; g=f; f=e; |
| e=d.copy(); e.add(t1); |
| |
| d=c; |
| c=b; |
| b=a; |
| a=t1.copy(); a.add(t2); |
| } |
| |
| this.h[0].add(a); this.h[1].add(b); this.h[2].add(c); this.h[3].add(d); |
| this.h[4].add(e); this.h[5].add(f); this.h[6].add(g); this.h[7].add(hh); |
| }, |
| |
| /* Initialise Hash function */ |
| init: function() |
| { /* initialise */ |
| var i; |
| for (i=0;i<80;i++) this.w[i]=new UInt64(0,0); |
| this.length[0]=new UInt64(0,0); this.length[1]=new UInt64(0,0); |
| this.h[0]=HASH384.H[0].copy(); |
| this.h[1]=HASH384.H[1].copy(); |
| this.h[2]=HASH384.H[2].copy(); |
| this.h[3]=HASH384.H[3].copy(); |
| this.h[4]=HASH384.H[4].copy(); |
| this.h[5]=HASH384.H[5].copy(); |
| this.h[6]=HASH384.H[6].copy(); |
| this.h[7]=HASH384.H[7].copy(); |
| }, |
| |
| /* process a single byte */ |
| process: function(byt) |
| { /* process the next message byte */ |
| var cnt; |
| cnt=(this.length[0].bot>>>6)%16; |
| this.w[cnt].shlb(); |
| this.w[cnt].bot|=(byt&0xFF); |
| |
| var e=new UInt64(0,8); |
| this.length[0].add(e); |
| if (this.length[0].top===0 && this.length[0].bot==0) { e=new UInt64(0,1); this.length[1].add(e); } |
| if ((this.length[0].bot%1024)===0) this.transform(); |
| }, |
| |
| /* process an array of bytes */ |
| process_array: function(b) |
| { |
| for (var i=0;i<b.length;i++) this.process(b[i]); |
| }, |
| |
| /* process a 32-bit integer */ |
| process_num: function(n) |
| { |
| this.process((n>>24)&0xff); |
| this.process((n>>16)&0xff); |
| this.process((n>>8)&0xff); |
| this.process(n&0xff); |
| }, |
| |
| hash: function() |
| { /* pad message and finish - supply digest */ |
| var i; |
| var digest=[]; |
| var len0,len1; |
| len0=this.length[0].copy(); |
| len1=this.length[1].copy(); |
| this.process(0x80); |
| while ((this.length[0].bot%1024)!=896) this.process(0); |
| |
| this.w[14]=len1; |
| this.w[15]=len0; |
| this.transform(); |
| |
| for (i=0;i<HASH384.len;i++) |
| { /* convert to bytes */ |
| digest[i]=HASH384.R(8*(7-i%8),this.h[i>>>3]).bot&0xff; |
| } |
| |
| this.init(); |
| return digest; |
| } |
| }; |
| |
| |
| /* static functions */ |
| HASH384.S= function(n,x) |
| { |
| if (n==0) return x; |
| if (n<32) |
| return new UInt64((x.top>>>n) | (x.bot<<(32-n)), (x.bot>>>n) | (x.top << (32-n))); |
| else |
| return new UInt64((x.bot>>>(n-32)) | (x.top << (64-n)),(x.top>>>(n-32)) | (x.bot<<(64-n))); |
| |
| }; |
| |
| HASH384.R= function(n,x) |
| { |
| if (n==0) return x; |
| if (n<32) |
| return new UInt64((x.top>>>n),(x.bot>>>n | (x.top << (32-n)))); |
| else |
| return new UInt64(0,x.top >>> (n-32)); |
| }; |
| |
| HASH384.Ch= function(x,y,z) |
| { |
| return new UInt64((x.top&y.top)^(~(x.top)&z.top),(x.bot&y.bot)^(~(x.bot)&z.bot)); |
| }; |
| |
| HASH384.Maj= function(x,y,z) |
| { |
| return new UInt64((x.top&y.top)^(x.top&z.top)^(y.top&z.top),(x.bot&y.bot)^(x.bot&z.bot)^(y.bot&z.bot)); |
| }; |
| |
| HASH384.Sig0= function(x) |
| { |
| var r1=HASH384.S(28,x); |
| var r2=HASH384.S(34,x); |
| var r3=HASH384.S(39,x); |
| return new UInt64(r1.top^r2.top^r3.top,r1.bot^r2.bot^r3.bot); |
| }; |
| |
| HASH384.Sig1= function(x) |
| { |
| var r1=HASH384.S(14,x); |
| var r2=HASH384.S(18,x); |
| var r3=HASH384.S(41,x); |
| return new UInt64(r1.top^r2.top^r3.top,r1.bot^r2.bot^r3.bot); |
| }; |
| |
| HASH384.theta0= function(x) |
| { |
| var r1=HASH384.S(1,x); |
| var r2=HASH384.S(8,x); |
| var r3=HASH384.R(7,x); |
| return new UInt64(r1.top^r2.top^r3.top,r1.bot^r2.bot^r3.bot); |
| }; |
| |
| HASH384.theta1= function(x) |
| { |
| var r1=HASH384.S(19,x); |
| var r2=HASH384.S(61,x); |
| var r3=HASH384.R(6,x); |
| return new UInt64(r1.top^r2.top^r3.top,r1.bot^r2.bot^r3.bot); |
| }; |
| |
| HASH384.len= 48; |
| |
| HASH384.H = [new UInt64(0xcbbb9d5d,0xc1059ed8), new UInt64(0x629a292a,0x367cd507), |
| new UInt64(0x9159015a,0x3070dd17), new UInt64(0x152fecd8,0xf70e5939), |
| new UInt64(0x67332667,0xffc00b31), new UInt64(0x8eb44a87,0x68581511), |
| new UInt64(0xdb0c2e0d,0x64f98fa7), new UInt64(0x47b5481d,0xbefa4fa4)]; |
| |
| HASH384.HK = [new UInt64(0x428a2f98, 0xd728ae22), new UInt64(0x71374491, 0x23ef65cd), |
| new UInt64(0xb5c0fbcf, 0xec4d3b2f), new UInt64(0xe9b5dba5, 0x8189dbbc), |
| new UInt64(0x3956c25b, 0xf348b538), new UInt64(0x59f111f1, 0xb605d019), |
| new UInt64(0x923f82a4, 0xaf194f9b), new UInt64(0xab1c5ed5, 0xda6d8118), |
| new UInt64(0xd807aa98, 0xa3030242), new UInt64(0x12835b01, 0x45706fbe), |
| new UInt64(0x243185be, 0x4ee4b28c), new UInt64(0x550c7dc3, 0xd5ffb4e2), |
| new UInt64(0x72be5d74, 0xf27b896f), new UInt64(0x80deb1fe, 0x3b1696b1), |
| new UInt64(0x9bdc06a7, 0x25c71235), new UInt64(0xc19bf174, 0xcf692694), |
| new UInt64(0xe49b69c1, 0x9ef14ad2), new UInt64(0xefbe4786, 0x384f25e3), |
| new UInt64(0x0fc19dc6, 0x8b8cd5b5), new UInt64(0x240ca1cc, 0x77ac9c65), |
| new UInt64(0x2de92c6f, 0x592b0275), new UInt64(0x4a7484aa, 0x6ea6e483), |
| new UInt64(0x5cb0a9dc, 0xbd41fbd4), new UInt64(0x76f988da, 0x831153b5), |
| new UInt64(0x983e5152, 0xee66dfab), new UInt64(0xa831c66d, 0x2db43210), |
| new UInt64(0xb00327c8, 0x98fb213f), new UInt64(0xbf597fc7, 0xbeef0ee4), |
| new UInt64(0xc6e00bf3, 0x3da88fc2), new UInt64(0xd5a79147, 0x930aa725), |
| new UInt64(0x06ca6351, 0xe003826f), new UInt64(0x14292967, 0x0a0e6e70), |
| new UInt64(0x27b70a85, 0x46d22ffc), new UInt64(0x2e1b2138, 0x5c26c926), |
| new UInt64(0x4d2c6dfc, 0x5ac42aed), new UInt64(0x53380d13, 0x9d95b3df), |
| new UInt64(0x650a7354, 0x8baf63de), new UInt64(0x766a0abb, 0x3c77b2a8), |
| new UInt64(0x81c2c92e, 0x47edaee6), new UInt64(0x92722c85, 0x1482353b), |
| new UInt64(0xa2bfe8a1, 0x4cf10364), new UInt64(0xa81a664b, 0xbc423001), |
| new UInt64(0xc24b8b70, 0xd0f89791), new UInt64(0xc76c51a3, 0x0654be30), |
| new UInt64(0xd192e819, 0xd6ef5218), new UInt64(0xd6990624, 0x5565a910), |
| new UInt64(0xf40e3585, 0x5771202a), new UInt64(0x106aa070, 0x32bbd1b8), |
| new UInt64(0x19a4c116, 0xb8d2d0c8), new UInt64(0x1e376c08, 0x5141ab53), |
| new UInt64(0x2748774c, 0xdf8eeb99), new UInt64(0x34b0bcb5, 0xe19b48a8), |
| new UInt64(0x391c0cb3, 0xc5c95a63), new UInt64(0x4ed8aa4a, 0xe3418acb), |
| new UInt64(0x5b9cca4f, 0x7763e373), new UInt64(0x682e6ff3, 0xd6b2b8a3), |
| new UInt64(0x748f82ee, 0x5defb2fc), new UInt64(0x78a5636f, 0x43172f60), |
| new UInt64(0x84c87814, 0xa1f0ab72), new UInt64(0x8cc70208, 0x1a6439ec), |
| new UInt64(0x90befffa, 0x23631e28), new UInt64(0xa4506ceb, 0xde82bde9), |
| new UInt64(0xbef9a3f7, 0xb2c67915), new UInt64(0xc67178f2, 0xe372532b), |
| new UInt64(0xca273ece, 0xea26619c), new UInt64(0xd186b8c7, 0x21c0c207), |
| new UInt64(0xeada7dd6, 0xcde0eb1e), new UInt64(0xf57d4f7f, 0xee6ed178), |
| new UInt64(0x06f067aa, 0x72176fba), new UInt64(0x0a637dc5, 0xa2c898a6), |
| new UInt64(0x113f9804, 0xbef90dae), new UInt64(0x1b710b35, 0x131c471b), |
| new UInt64(0x28db77f5, 0x23047d84), new UInt64(0x32caab7b, 0x40c72493), |
| new UInt64(0x3c9ebe0a, 0x15c9bebc), new UInt64(0x431d67c4, 0x9c100d4c), |
| new UInt64(0x4cc5d4be, 0xcb3e42b6), new UInt64(0x597f299c, 0xfc657e2a), |
| new UInt64(0x5fcb6fab, 0x3ad6faec), new UInt64(0x6c44198c, 0x4a475817)]; |