1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_bridges.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #ifndef TEST
29*b1cdbd2cSJim Jagielski #ifndef _SAL_TYPES_H_
30*b1cdbd2cSJim Jagielski #include <sal/types.h>
31*b1cdbd2cSJim Jagielski #endif
32*b1cdbd2cSJim Jagielski #else
33*b1cdbd2cSJim Jagielski typedef unsigned int sal_uInt32;
34*b1cdbd2cSJim Jagielski #endif
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <string.h>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski /*
39*b1cdbd2cSJim Jagielski  *	build a hash for a character buffer using the NIST algorithm
40*b1cdbd2cSJim Jagielski  */
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski class NIST_Hash
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski 	// helper functions
f1(sal_uInt32 x,sal_uInt32 y,sal_uInt32 z)46*b1cdbd2cSJim Jagielski 	sal_uInt32 f1( sal_uInt32 x, sal_uInt32 y, sal_uInt32 z )
47*b1cdbd2cSJim Jagielski 	{
48*b1cdbd2cSJim Jagielski 		return z ^ ( x & ( y ^ z ) );
49*b1cdbd2cSJim Jagielski 	}
50*b1cdbd2cSJim Jagielski 
f2(sal_uInt32 x,sal_uInt32 y,sal_uInt32 z)51*b1cdbd2cSJim Jagielski 	sal_uInt32 f2( sal_uInt32 x, sal_uInt32 y, sal_uInt32 z )
52*b1cdbd2cSJim Jagielski 	{
53*b1cdbd2cSJim Jagielski 		return x ^ y ^ z;
54*b1cdbd2cSJim Jagielski 	}
55*b1cdbd2cSJim Jagielski 
f3(sal_uInt32 x,sal_uInt32 y,sal_uInt32 z)56*b1cdbd2cSJim Jagielski 	sal_uInt32 f3( sal_uInt32 x, sal_uInt32 y, sal_uInt32 z )
57*b1cdbd2cSJim Jagielski 	{
58*b1cdbd2cSJim Jagielski 		return ( x & y ) + ( z & ( x ^ y ) );
59*b1cdbd2cSJim Jagielski 	}
60*b1cdbd2cSJim Jagielski 
rotl(sal_uInt32 nValue,sal_uInt32 nBits)61*b1cdbd2cSJim Jagielski 	sal_uInt32 rotl( sal_uInt32 nValue, sal_uInt32 nBits )
62*b1cdbd2cSJim Jagielski 	{
63*b1cdbd2cSJim Jagielski 		return ( nValue << nBits ) | ( nValue >> (32-nBits) );
64*b1cdbd2cSJim Jagielski 	}
65*b1cdbd2cSJim Jagielski 
expand_nostore(sal_uInt32 index)66*b1cdbd2cSJim Jagielski 	sal_uInt32 expand_nostore( sal_uInt32 index )
67*b1cdbd2cSJim Jagielski 	{
68*b1cdbd2cSJim Jagielski 		return data[index&15] ^ data[(index-14)&15] ^ data[(index-8)&15] ^ data[(index-3)&15];
69*b1cdbd2cSJim Jagielski 	}
70*b1cdbd2cSJim Jagielski 
expand_store(sal_uInt32 index)71*b1cdbd2cSJim Jagielski 	sal_uInt32 expand_store( sal_uInt32 index )
72*b1cdbd2cSJim Jagielski 	{
73*b1cdbd2cSJim Jagielski 		return data[index&15] ^= data[(index-14)&15] ^ data[(index-8)&15] ^ data[(index-3)&15];
74*b1cdbd2cSJim Jagielski 	}
75*b1cdbd2cSJim Jagielski 
subRound(sal_uInt32 a,sal_uInt32 & b,sal_uInt32 c,sal_uInt32 d,sal_uInt32 & e,sal_uInt32 constant,sal_uInt32 datum,sal_uInt32 nFunction)76*b1cdbd2cSJim Jagielski 	void subRound( sal_uInt32 a, sal_uInt32& b, sal_uInt32 c, sal_uInt32 d, sal_uInt32& e, sal_uInt32 constant, sal_uInt32 datum, sal_uInt32 nFunction )
77*b1cdbd2cSJim Jagielski 	{
78*b1cdbd2cSJim Jagielski 		e += rotl(a,5);
79*b1cdbd2cSJim Jagielski 		switch( nFunction )
80*b1cdbd2cSJim Jagielski 		{
81*b1cdbd2cSJim Jagielski 			case 1: e += f1( b, c, d );break;
82*b1cdbd2cSJim Jagielski 			case 2:
83*b1cdbd2cSJim Jagielski 			case 4: e += f2( b, c, d );break;
84*b1cdbd2cSJim Jagielski 			case 3: e += f3( b, c, d );break;
85*b1cdbd2cSJim Jagielski 		}
86*b1cdbd2cSJim Jagielski 		e += constant + datum;
87*b1cdbd2cSJim Jagielski 		b = rotl( b, 30 );
88*b1cdbd2cSJim Jagielski 	}
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski 	void transform();
91*b1cdbd2cSJim Jagielski 	void final();
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski 	// data members
94*b1cdbd2cSJim Jagielski 	sal_uInt32 data[16];
95*b1cdbd2cSJim Jagielski 	sal_uInt32 hashdata[5];
96*b1cdbd2cSJim Jagielski public:
97*b1cdbd2cSJim Jagielski 	NIST_Hash( const char* pString, sal_uInt32 nLen );
98*b1cdbd2cSJim Jagielski 
getHash()99*b1cdbd2cSJim Jagielski 	sal_uInt32 *getHash() { return hashdata; }
100*b1cdbd2cSJim Jagielski };
101*b1cdbd2cSJim Jagielski 
transform()102*b1cdbd2cSJim Jagielski void NIST_Hash::transform()
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski 	// constants
105*b1cdbd2cSJim Jagielski 	const sal_uInt32 K2		= 0x5A827999;
106*b1cdbd2cSJim Jagielski 	const sal_uInt32 K3		= 0x6ED9EBA1;
107*b1cdbd2cSJim Jagielski 	const sal_uInt32 K5		= 0x8F1BBCDC;
108*b1cdbd2cSJim Jagielski 	const sal_uInt32 K10	= 0xCA62C1D6;
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 	sal_uInt32 a, b, c, d, e;
111*b1cdbd2cSJim Jagielski 	a = hashdata[0];
112*b1cdbd2cSJim Jagielski 	b = hashdata[1];
113*b1cdbd2cSJim Jagielski 	c = hashdata[2];
114*b1cdbd2cSJim Jagielski 	d = hashdata[3];
115*b1cdbd2cSJim Jagielski 	e = hashdata[4];
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K2, data[ 0], 1 );
118*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K2, data[ 1], 1 );
119*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K2, data[ 2], 1 );
120*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K2, data[ 3], 1 );
121*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K2, data[ 4], 1 );
122*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K2, data[ 5], 1 );
123*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K2, data[ 6], 1 );
124*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K2, data[ 7], 1 );
125*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K2, data[ 8], 1 );
126*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K2, data[ 9], 1 );
127*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K2, data[10], 1 );
128*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K2, data[11], 1 );
129*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K2, data[12], 1 );
130*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K2, data[13], 1 );
131*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K2, data[14], 1 );
132*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K2, data[15], 1 );
133*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K2, expand_store( 16 ), 1 );
134*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K2, expand_store( 17 ), 1 );
135*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K2, expand_store( 18 ), 1 );
136*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K2, expand_store( 19 ), 1 );
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K3, expand_store( 20 ), 2 );
139*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K3, expand_store( 21 ), 2 );
140*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K3, expand_store( 22 ), 2 );
141*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K3, expand_store( 23 ), 2 );
142*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K3, expand_store( 24 ), 2 );
143*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K3, expand_store( 25 ), 2 );
144*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K3, expand_store( 26 ), 2 );
145*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K3, expand_store( 27 ), 2 );
146*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K3, expand_store( 28 ), 2 );
147*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K3, expand_store( 29 ), 2 );
148*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K3, expand_store( 30 ), 2 );
149*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K3, expand_store( 31 ), 2 );
150*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K3, expand_store( 32 ), 2 );
151*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K3, expand_store( 33 ), 2 );
152*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K3, expand_store( 34 ), 2 );
153*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K3, expand_store( 35 ), 2 );
154*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K3, expand_store( 36 ), 2 );
155*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K3, expand_store( 37 ), 2 );
156*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K3, expand_store( 38 ), 2 );
157*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K3, expand_store( 39 ), 2 );
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K5, expand_store( 40 ), 3 );
160*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K5, expand_store( 41 ), 3 );
161*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K5, expand_store( 42 ), 3 );
162*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K5, expand_store( 43 ), 3 );
163*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K5, expand_store( 44 ), 3 );
164*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K5, expand_store( 45 ), 3 );
165*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K5, expand_store( 46 ), 3 );
166*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K5, expand_store( 47 ), 3 );
167*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K5, expand_store( 48 ), 3 );
168*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K5, expand_store( 49 ), 3 );
169*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K5, expand_store( 50 ), 3 );
170*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K5, expand_store( 51 ), 3 );
171*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K5, expand_store( 52 ), 3 );
172*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K5, expand_store( 53 ), 3 );
173*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K5, expand_store( 54 ), 3 );
174*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K5, expand_store( 55 ), 3 );
175*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K5, expand_store( 56 ), 3 );
176*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K5, expand_store( 57 ), 3 );
177*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K5, expand_store( 58 ), 3 );
178*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K5, expand_store( 59 ), 3 );
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K10, expand_store( 60 ), 4 );
181*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K10, expand_store( 61 ), 4 );
182*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K10, expand_store( 62 ), 4 );
183*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K10, expand_store( 63 ), 4 );
184*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K10, expand_store( 64 ), 4 );
185*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K10, expand_store( 65 ), 4 );
186*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K10, expand_store( 66 ), 4 );
187*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K10, expand_store( 67 ), 4 );
188*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K10, expand_store( 68 ), 4 );
189*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K10, expand_store( 69 ), 4 );
190*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K10, expand_store( 70 ), 4 );
191*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K10, expand_store( 71 ), 4 );
192*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K10, expand_store( 72 ), 4 );
193*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K10, expand_store( 73 ), 4 );
194*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K10, expand_store( 74 ), 4 );
195*b1cdbd2cSJim Jagielski 	subRound( a, b, c, d, e, K10, expand_store( 75 ), 4 );
196*b1cdbd2cSJim Jagielski 	subRound( e, a, b, c, d, K10, expand_store( 76 ), 4 );
197*b1cdbd2cSJim Jagielski 	subRound( d, e, a, b, c, K10, expand_nostore( 77 ), 4 );
198*b1cdbd2cSJim Jagielski 	subRound( c, d, e, a, b, K10, expand_nostore( 78 ), 4 );
199*b1cdbd2cSJim Jagielski 	subRound( b, c, d, e, a, K10, expand_nostore( 79 ), 4 );
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski 	hashdata[0] += a;
202*b1cdbd2cSJim Jagielski 	hashdata[1] += b;
203*b1cdbd2cSJim Jagielski 	hashdata[2] += c;
204*b1cdbd2cSJim Jagielski 	hashdata[3] += d;
205*b1cdbd2cSJim Jagielski 	hashdata[4] += e;
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski #define BLOCKSIZE sizeof( data )
209*b1cdbd2cSJim Jagielski 
NIST_Hash(const char * pString,sal_uInt32 nLen)210*b1cdbd2cSJim Jagielski NIST_Hash::NIST_Hash( const char* pString, sal_uInt32 nLen )
211*b1cdbd2cSJim Jagielski {
212*b1cdbd2cSJim Jagielski 	hashdata[0] = 0x67452301;
213*b1cdbd2cSJim Jagielski 	hashdata[1] = 0xefcdab89;
214*b1cdbd2cSJim Jagielski 	hashdata[2] = 0x98badcfe;
215*b1cdbd2cSJim Jagielski 	hashdata[3] = 0x10325476;
216*b1cdbd2cSJim Jagielski 	hashdata[4] = 0xc3d2e1f0;
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski 	sal_uInt32 nBytes = nLen;
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 	while( nLen >= sizeof( data ) )
221*b1cdbd2cSJim Jagielski 	{
222*b1cdbd2cSJim Jagielski 		memcpy( data, pString, sizeof( data ) );
223*b1cdbd2cSJim Jagielski 		pString += sizeof( data );
224*b1cdbd2cSJim Jagielski 		nLen -= sizeof( data );
225*b1cdbd2cSJim Jagielski 		transform();
226*b1cdbd2cSJim Jagielski 	}
227*b1cdbd2cSJim Jagielski 	memcpy( data, pString, nLen );
228*b1cdbd2cSJim Jagielski 	((char*)data)[nLen++] = 0x80;
229*b1cdbd2cSJim Jagielski 	if( nLen > sizeof( data ) - 8 )
230*b1cdbd2cSJim Jagielski 	{
231*b1cdbd2cSJim Jagielski 		memset( ((char*)data)+nLen, 0, sizeof( data ) - nLen );
232*b1cdbd2cSJim Jagielski 		transform();
233*b1cdbd2cSJim Jagielski 		memset( data, 0, sizeof( data ) - 8 );
234*b1cdbd2cSJim Jagielski 	}
235*b1cdbd2cSJim Jagielski 	else
236*b1cdbd2cSJim Jagielski 		memset( ((char*)data)+nLen, 0, sizeof( data ) - 8 - nLen );
237*b1cdbd2cSJim Jagielski 	data[14] = 0;
238*b1cdbd2cSJim Jagielski 	data[15] = nBytes << 3;
239*b1cdbd2cSJim Jagielski 	transform();
240*b1cdbd2cSJim Jagielski }
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski #ifdef TEST
243*b1cdbd2cSJim Jagielski #include <stdio.h>
main(int argc,const char ** argv)244*b1cdbd2cSJim Jagielski int main( int argc, const char** argv )
245*b1cdbd2cSJim Jagielski {
246*b1cdbd2cSJim Jagielski 	const char* pHash = argc < 2 ? argv[0] : argv[1];
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 	NIST_Hash aHash( pHash, strlen( pHash ) );
249*b1cdbd2cSJim Jagielski 	sal_uInt32* pBits = aHash.getHash();
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski 	printf( "text : %s\n"
252*b1cdbd2cSJim Jagielski 			"bits : 0x%.8x 0x%.8x 0x%.8x 0x%.8x 0x%.8x\n",
253*b1cdbd2cSJim Jagielski 			pHash,
254*b1cdbd2cSJim Jagielski 			pBits[0], pBits[1], pBits[2],pBits[3],pBits[4]
255*b1cdbd2cSJim Jagielski 			);
256*b1cdbd2cSJim Jagielski 	return 0;
257*b1cdbd2cSJim Jagielski }
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski #endif
260