Line data Source code
1 : /********************************************************************\
2 : *
3 : * FILE: rmd160.c
4 : *
5 : * CONTENTS: A sample C-implementation of the RIPEMD-160
6 : * hash-function.
7 : * TARGET: any computer with an ANSI C compiler
8 : *
9 : * AUTHOR: Antoon Bosselaers, ESAT-COSIC
10 : * DATE: 1 March 1996
11 : * VERSION: 1.0
12 : *
13 : * Copyright (c) 1996 Katholieke Universiteit Leuven
14 : *
15 : * Permission is hereby granted, free of charge, to any person
16 : * obtaining a copy of this software and associated documentation
17 : * files (the "Software"), to deal in the Software without restriction,
18 : * including without limitation the rights to use, copy, modify, merge,
19 : * publish, distribute, sublicense, and/or sell copies of the Software,
20 : * and to permit persons to whom the Software is furnished to do so,
21 : * subject to the following conditions:
22 : *
23 : * The above copyright notice and this permission notice shall be
24 : * included in all copies or substantial portions of the Software.
25 : *
26 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 : * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 : * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
29 : * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
30 : * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
31 : * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
32 : * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 : *
34 : \********************************************************************/
35 :
36 : /* header files */
37 : #include "monetdb_config.h"
38 : #include "rmd160.h"
39 :
40 : /********************************************************************/
41 :
42 38428 : void MDinit(dword *MDbuf)
43 : {
44 38428 : MDbuf[0] = 0x67452301UL;
45 38428 : MDbuf[1] = 0xefcdab89UL;
46 38428 : MDbuf[2] = 0x98badcfeUL;
47 38428 : MDbuf[3] = 0x10325476UL;
48 38428 : MDbuf[4] = 0xc3d2e1f0UL;
49 :
50 38428 : return;
51 : }
52 :
53 : /********************************************************************/
54 :
55 115300 : void MDcompress(dword *MDbuf, dword *X)
56 : {
57 115300 : dword aa = MDbuf[0], bb = MDbuf[1], cc = MDbuf[2],
58 115300 : dd = MDbuf[3], ee = MDbuf[4];
59 115300 : dword aaa = MDbuf[0], bbb = MDbuf[1], ccc = MDbuf[2],
60 115300 : ddd = MDbuf[3], eee = MDbuf[4];
61 :
62 : /* round 1 */
63 115300 : FF(aa, bb, cc, dd, ee, X[ 0], 11);
64 115300 : FF(ee, aa, bb, cc, dd, X[ 1], 14);
65 115300 : FF(dd, ee, aa, bb, cc, X[ 2], 15);
66 115300 : FF(cc, dd, ee, aa, bb, X[ 3], 12);
67 115300 : FF(bb, cc, dd, ee, aa, X[ 4], 5);
68 115300 : FF(aa, bb, cc, dd, ee, X[ 5], 8);
69 115300 : FF(ee, aa, bb, cc, dd, X[ 6], 7);
70 115300 : FF(dd, ee, aa, bb, cc, X[ 7], 9);
71 115300 : FF(cc, dd, ee, aa, bb, X[ 8], 11);
72 115300 : FF(bb, cc, dd, ee, aa, X[ 9], 13);
73 115300 : FF(aa, bb, cc, dd, ee, X[10], 14);
74 115300 : FF(ee, aa, bb, cc, dd, X[11], 15);
75 115300 : FF(dd, ee, aa, bb, cc, X[12], 6);
76 115300 : FF(cc, dd, ee, aa, bb, X[13], 7);
77 115300 : FF(bb, cc, dd, ee, aa, X[14], 9);
78 115300 : FF(aa, bb, cc, dd, ee, X[15], 8);
79 :
80 : /* round 2 */
81 115300 : GG(ee, aa, bb, cc, dd, X[ 7], 7);
82 115300 : GG(dd, ee, aa, bb, cc, X[ 4], 6);
83 115300 : GG(cc, dd, ee, aa, bb, X[13], 8);
84 115300 : GG(bb, cc, dd, ee, aa, X[ 1], 13);
85 115300 : GG(aa, bb, cc, dd, ee, X[10], 11);
86 115300 : GG(ee, aa, bb, cc, dd, X[ 6], 9);
87 115300 : GG(dd, ee, aa, bb, cc, X[15], 7);
88 115300 : GG(cc, dd, ee, aa, bb, X[ 3], 15);
89 115300 : GG(bb, cc, dd, ee, aa, X[12], 7);
90 115300 : GG(aa, bb, cc, dd, ee, X[ 0], 12);
91 115300 : GG(ee, aa, bb, cc, dd, X[ 9], 15);
92 115300 : GG(dd, ee, aa, bb, cc, X[ 5], 9);
93 115300 : GG(cc, dd, ee, aa, bb, X[ 2], 11);
94 115300 : GG(bb, cc, dd, ee, aa, X[14], 7);
95 115300 : GG(aa, bb, cc, dd, ee, X[11], 13);
96 115300 : GG(ee, aa, bb, cc, dd, X[ 8], 12);
97 :
98 : /* round 3 */
99 115300 : HH(dd, ee, aa, bb, cc, X[ 3], 11);
100 115300 : HH(cc, dd, ee, aa, bb, X[10], 13);
101 115300 : HH(bb, cc, dd, ee, aa, X[14], 6);
102 115300 : HH(aa, bb, cc, dd, ee, X[ 4], 7);
103 115300 : HH(ee, aa, bb, cc, dd, X[ 9], 14);
104 115300 : HH(dd, ee, aa, bb, cc, X[15], 9);
105 115300 : HH(cc, dd, ee, aa, bb, X[ 8], 13);
106 115300 : HH(bb, cc, dd, ee, aa, X[ 1], 15);
107 115300 : HH(aa, bb, cc, dd, ee, X[ 2], 14);
108 115300 : HH(ee, aa, bb, cc, dd, X[ 7], 8);
109 115300 : HH(dd, ee, aa, bb, cc, X[ 0], 13);
110 115300 : HH(cc, dd, ee, aa, bb, X[ 6], 6);
111 115300 : HH(bb, cc, dd, ee, aa, X[13], 5);
112 115300 : HH(aa, bb, cc, dd, ee, X[11], 12);
113 115300 : HH(ee, aa, bb, cc, dd, X[ 5], 7);
114 115300 : HH(dd, ee, aa, bb, cc, X[12], 5);
115 :
116 : /* round 4 */
117 115300 : II(cc, dd, ee, aa, bb, X[ 1], 11);
118 115300 : II(bb, cc, dd, ee, aa, X[ 9], 12);
119 115300 : II(aa, bb, cc, dd, ee, X[11], 14);
120 115300 : II(ee, aa, bb, cc, dd, X[10], 15);
121 115300 : II(dd, ee, aa, bb, cc, X[ 0], 14);
122 115300 : II(cc, dd, ee, aa, bb, X[ 8], 15);
123 115300 : II(bb, cc, dd, ee, aa, X[12], 9);
124 115300 : II(aa, bb, cc, dd, ee, X[ 4], 8);
125 115300 : II(ee, aa, bb, cc, dd, X[13], 9);
126 115300 : II(dd, ee, aa, bb, cc, X[ 3], 14);
127 115300 : II(cc, dd, ee, aa, bb, X[ 7], 5);
128 115300 : II(bb, cc, dd, ee, aa, X[15], 6);
129 115300 : II(aa, bb, cc, dd, ee, X[14], 8);
130 115300 : II(ee, aa, bb, cc, dd, X[ 5], 6);
131 115300 : II(dd, ee, aa, bb, cc, X[ 6], 5);
132 115300 : II(cc, dd, ee, aa, bb, X[ 2], 12);
133 :
134 : /* round 5 */
135 115300 : JJ(bb, cc, dd, ee, aa, X[ 4], 9);
136 115300 : JJ(aa, bb, cc, dd, ee, X[ 0], 15);
137 115300 : JJ(ee, aa, bb, cc, dd, X[ 5], 5);
138 115300 : JJ(dd, ee, aa, bb, cc, X[ 9], 11);
139 115300 : JJ(cc, dd, ee, aa, bb, X[ 7], 6);
140 115300 : JJ(bb, cc, dd, ee, aa, X[12], 8);
141 115300 : JJ(aa, bb, cc, dd, ee, X[ 2], 13);
142 115300 : JJ(ee, aa, bb, cc, dd, X[10], 12);
143 115300 : JJ(dd, ee, aa, bb, cc, X[14], 5);
144 115300 : JJ(cc, dd, ee, aa, bb, X[ 1], 12);
145 115300 : JJ(bb, cc, dd, ee, aa, X[ 3], 13);
146 115300 : JJ(aa, bb, cc, dd, ee, X[ 8], 14);
147 115300 : JJ(ee, aa, bb, cc, dd, X[11], 11);
148 115300 : JJ(dd, ee, aa, bb, cc, X[ 6], 8);
149 115300 : JJ(cc, dd, ee, aa, bb, X[15], 5);
150 115300 : JJ(bb, cc, dd, ee, aa, X[13], 6);
151 :
152 : /* parallel round 1 */
153 115300 : JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
154 115300 : JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
155 115300 : JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9);
156 115300 : JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
157 115300 : JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
158 115300 : JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
159 115300 : JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
160 115300 : JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5);
161 115300 : JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7);
162 115300 : JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7);
163 115300 : JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8);
164 115300 : JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
165 115300 : JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
166 115300 : JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
167 115300 : JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
168 115300 : JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
169 :
170 : /* parallel round 2 */
171 115300 : III(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
172 115300 : III(ddd, eee, aaa, bbb, ccc, X[11], 13);
173 115300 : III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
174 115300 : III(bbb, ccc, ddd, eee, aaa, X[ 7], 7);
175 115300 : III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
176 115300 : III(eee, aaa, bbb, ccc, ddd, X[13], 8);
177 115300 : III(ddd, eee, aaa, bbb, ccc, X[ 5], 9);
178 115300 : III(ccc, ddd, eee, aaa, bbb, X[10], 11);
179 115300 : III(bbb, ccc, ddd, eee, aaa, X[14], 7);
180 115300 : III(aaa, bbb, ccc, ddd, eee, X[15], 7);
181 115300 : III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
182 115300 : III(ddd, eee, aaa, bbb, ccc, X[12], 7);
183 115300 : III(ccc, ddd, eee, aaa, bbb, X[ 4], 6);
184 115300 : III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
185 115300 : III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
186 115300 : III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
187 :
188 : /* parallel round 3 */
189 115300 : HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
190 115300 : HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
191 115300 : HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
192 115300 : HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
193 115300 : HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8);
194 115300 : HHH(ddd, eee, aaa, bbb, ccc, X[14], 6);
195 115300 : HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6);
196 115300 : HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
197 115300 : HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
198 115300 : HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
199 115300 : HHH(ddd, eee, aaa, bbb, ccc, X[12], 5);
200 115300 : HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
201 115300 : HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
202 115300 : HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
203 115300 : HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
204 115300 : HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
205 :
206 : /* parallel round 4 */
207 115300 : GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
208 115300 : GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
209 115300 : GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8);
210 115300 : GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
211 115300 : GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
212 115300 : GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
213 115300 : GGG(bbb, ccc, ddd, eee, aaa, X[15], 6);
214 115300 : GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
215 115300 : GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6);
216 115300 : GGG(ddd, eee, aaa, bbb, ccc, X[12], 9);
217 115300 : GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
218 115300 : GGG(bbb, ccc, ddd, eee, aaa, X[13], 9);
219 115300 : GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
220 115300 : GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
221 115300 : GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
222 115300 : GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
223 :
224 : /* parallel round 5 */
225 115300 : FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8);
226 115300 : FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5);
227 115300 : FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
228 115300 : FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9);
229 115300 : FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
230 115300 : FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5);
231 115300 : FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
232 115300 : FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6);
233 115300 : FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8);
234 115300 : FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
235 115300 : FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6);
236 115300 : FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5);
237 115300 : FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
238 115300 : FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
239 115300 : FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
240 115300 : FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
241 :
242 : /* combine results */
243 115300 : ddd += cc + MDbuf[1]; /* final result for MDbuf[0] */
244 115300 : MDbuf[1] = MDbuf[2] + dd + eee;
245 115300 : MDbuf[2] = MDbuf[3] + ee + aaa;
246 115300 : MDbuf[3] = MDbuf[4] + aa + bbb;
247 115300 : MDbuf[4] = MDbuf[0] + bb + ccc;
248 115300 : MDbuf[0] = ddd;
249 :
250 115300 : return;
251 : }
252 :
253 : /********************************************************************/
254 :
255 38433 : void MDfinish(dword *MDbuf, byte *strptr, dword lswlen, dword mswlen)
256 : {
257 38433 : unsigned int i; /* counter */
258 38433 : dword X[16]; /* message words */
259 :
260 38433 : memset(X, 0, 16*sizeof(dword));
261 :
262 : /* put bytes from strptr into X */
263 403411 : for (i=0; i<(lswlen&63); i++) {
264 : /* byte i goes into word X[i div 4] at pos. 8*(i mod 4) */
265 364978 : X[i>>2] ^= (dword) *strptr++ << (8 * (i&3));
266 : }
267 :
268 : /* append the bit m_n == 1 */
269 38433 : X[(lswlen>>2)&15] ^= (dword)1 << (8*(lswlen&3) + 7);
270 :
271 38433 : if ((lswlen & 63) > 55) {
272 : /* length goes to next block */
273 0 : MDcompress(MDbuf, X);
274 0 : memset(X, 0, 16*sizeof(dword));
275 : }
276 :
277 : /* append length in bits*/
278 38433 : X[14] = lswlen << 3;
279 38433 : X[15] = (lswlen >> 29) | (mswlen << 3);
280 38433 : MDcompress(MDbuf, X);
281 :
282 38438 : return;
283 : }
284 :
285 : /************************ end of file rmd160.c **********************/
|