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) Katholieke Universiteit Leuven
14 * 1996, All Rights Reserved
15 *
16 \********************************************************************/
17
18 /* header files */
19 #include "rmd160.h"
20
21 /********************************************************************/
22
rmd160_init(dword * MDbuf)23 void rmd160_init(dword *MDbuf)
24 {
25 MDbuf[0] = 0x67452301UL;
26 MDbuf[1] = 0xefcdab89UL;
27 MDbuf[2] = 0x98badcfeUL;
28 MDbuf[3] = 0x10325476UL;
29 MDbuf[4] = 0xc3d2e1f0UL;
30
31 return;
32 }
33
34 /********************************************************************/
35
rmd160_compress(dword * MDbuf,dword * X)36 void rmd160_compress(dword *MDbuf, dword *X)
37 {
38 dword aa = MDbuf[0], bb = MDbuf[1], cc = MDbuf[2],
39 dd = MDbuf[3], ee = MDbuf[4];
40 dword aaa = MDbuf[0], bbb = MDbuf[1], ccc = MDbuf[2],
41 ddd = MDbuf[3], eee = MDbuf[4];
42
43 /* round 1 */
44 FF(aa, bb, cc, dd, ee, X[ 0], 11);
45 FF(ee, aa, bb, cc, dd, X[ 1], 14);
46 FF(dd, ee, aa, bb, cc, X[ 2], 15);
47 FF(cc, dd, ee, aa, bb, X[ 3], 12);
48 FF(bb, cc, dd, ee, aa, X[ 4], 5);
49 FF(aa, bb, cc, dd, ee, X[ 5], 8);
50 FF(ee, aa, bb, cc, dd, X[ 6], 7);
51 FF(dd, ee, aa, bb, cc, X[ 7], 9);
52 FF(cc, dd, ee, aa, bb, X[ 8], 11);
53 FF(bb, cc, dd, ee, aa, X[ 9], 13);
54 FF(aa, bb, cc, dd, ee, X[10], 14);
55 FF(ee, aa, bb, cc, dd, X[11], 15);
56 FF(dd, ee, aa, bb, cc, X[12], 6);
57 FF(cc, dd, ee, aa, bb, X[13], 7);
58 FF(bb, cc, dd, ee, aa, X[14], 9);
59 FF(aa, bb, cc, dd, ee, X[15], 8);
60
61 /* round 2 */
62 GG(ee, aa, bb, cc, dd, X[ 7], 7);
63 GG(dd, ee, aa, bb, cc, X[ 4], 6);
64 GG(cc, dd, ee, aa, bb, X[13], 8);
65 GG(bb, cc, dd, ee, aa, X[ 1], 13);
66 GG(aa, bb, cc, dd, ee, X[10], 11);
67 GG(ee, aa, bb, cc, dd, X[ 6], 9);
68 GG(dd, ee, aa, bb, cc, X[15], 7);
69 GG(cc, dd, ee, aa, bb, X[ 3], 15);
70 GG(bb, cc, dd, ee, aa, X[12], 7);
71 GG(aa, bb, cc, dd, ee, X[ 0], 12);
72 GG(ee, aa, bb, cc, dd, X[ 9], 15);
73 GG(dd, ee, aa, bb, cc, X[ 5], 9);
74 GG(cc, dd, ee, aa, bb, X[ 2], 11);
75 GG(bb, cc, dd, ee, aa, X[14], 7);
76 GG(aa, bb, cc, dd, ee, X[11], 13);
77 GG(ee, aa, bb, cc, dd, X[ 8], 12);
78
79 /* round 3 */
80 HH(dd, ee, aa, bb, cc, X[ 3], 11);
81 HH(cc, dd, ee, aa, bb, X[10], 13);
82 HH(bb, cc, dd, ee, aa, X[14], 6);
83 HH(aa, bb, cc, dd, ee, X[ 4], 7);
84 HH(ee, aa, bb, cc, dd, X[ 9], 14);
85 HH(dd, ee, aa, bb, cc, X[15], 9);
86 HH(cc, dd, ee, aa, bb, X[ 8], 13);
87 HH(bb, cc, dd, ee, aa, X[ 1], 15);
88 HH(aa, bb, cc, dd, ee, X[ 2], 14);
89 HH(ee, aa, bb, cc, dd, X[ 7], 8);
90 HH(dd, ee, aa, bb, cc, X[ 0], 13);
91 HH(cc, dd, ee, aa, bb, X[ 6], 6);
92 HH(bb, cc, dd, ee, aa, X[13], 5);
93 HH(aa, bb, cc, dd, ee, X[11], 12);
94 HH(ee, aa, bb, cc, dd, X[ 5], 7);
95 HH(dd, ee, aa, bb, cc, X[12], 5);
96
97 /* round 4 */
98 II(cc, dd, ee, aa, bb, X[ 1], 11);
99 II(bb, cc, dd, ee, aa, X[ 9], 12);
100 II(aa, bb, cc, dd, ee, X[11], 14);
101 II(ee, aa, bb, cc, dd, X[10], 15);
102 II(dd, ee, aa, bb, cc, X[ 0], 14);
103 II(cc, dd, ee, aa, bb, X[ 8], 15);
104 II(bb, cc, dd, ee, aa, X[12], 9);
105 II(aa, bb, cc, dd, ee, X[ 4], 8);
106 II(ee, aa, bb, cc, dd, X[13], 9);
107 II(dd, ee, aa, bb, cc, X[ 3], 14);
108 II(cc, dd, ee, aa, bb, X[ 7], 5);
109 II(bb, cc, dd, ee, aa, X[15], 6);
110 II(aa, bb, cc, dd, ee, X[14], 8);
111 II(ee, aa, bb, cc, dd, X[ 5], 6);
112 II(dd, ee, aa, bb, cc, X[ 6], 5);
113 II(cc, dd, ee, aa, bb, X[ 2], 12);
114
115 /* round 5 */
116 JJ(bb, cc, dd, ee, aa, X[ 4], 9);
117 JJ(aa, bb, cc, dd, ee, X[ 0], 15);
118 JJ(ee, aa, bb, cc, dd, X[ 5], 5);
119 JJ(dd, ee, aa, bb, cc, X[ 9], 11);
120 JJ(cc, dd, ee, aa, bb, X[ 7], 6);
121 JJ(bb, cc, dd, ee, aa, X[12], 8);
122 JJ(aa, bb, cc, dd, ee, X[ 2], 13);
123 JJ(ee, aa, bb, cc, dd, X[10], 12);
124 JJ(dd, ee, aa, bb, cc, X[14], 5);
125 JJ(cc, dd, ee, aa, bb, X[ 1], 12);
126 JJ(bb, cc, dd, ee, aa, X[ 3], 13);
127 JJ(aa, bb, cc, dd, ee, X[ 8], 14);
128 JJ(ee, aa, bb, cc, dd, X[11], 11);
129 JJ(dd, ee, aa, bb, cc, X[ 6], 8);
130 JJ(cc, dd, ee, aa, bb, X[15], 5);
131 JJ(bb, cc, dd, ee, aa, X[13], 6);
132
133 /* parallel round 1 */
134 JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
135 JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
136 JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9);
137 JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
138 JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
139 JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
140 JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
141 JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5);
142 JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7);
143 JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7);
144 JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8);
145 JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
146 JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
147 JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
148 JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
149 JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
150
151 /* parallel round 2 */
152 III(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
153 III(ddd, eee, aaa, bbb, ccc, X[11], 13);
154 III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
155 III(bbb, ccc, ddd, eee, aaa, X[ 7], 7);
156 III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
157 III(eee, aaa, bbb, ccc, ddd, X[13], 8);
158 III(ddd, eee, aaa, bbb, ccc, X[ 5], 9);
159 III(ccc, ddd, eee, aaa, bbb, X[10], 11);
160 III(bbb, ccc, ddd, eee, aaa, X[14], 7);
161 III(aaa, bbb, ccc, ddd, eee, X[15], 7);
162 III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
163 III(ddd, eee, aaa, bbb, ccc, X[12], 7);
164 III(ccc, ddd, eee, aaa, bbb, X[ 4], 6);
165 III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
166 III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
167 III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
168
169 /* parallel round 3 */
170 HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
171 HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
172 HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
173 HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
174 HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8);
175 HHH(ddd, eee, aaa, bbb, ccc, X[14], 6);
176 HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6);
177 HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
178 HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
179 HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
180 HHH(ddd, eee, aaa, bbb, ccc, X[12], 5);
181 HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
182 HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
183 HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
184 HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
185 HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
186
187 /* parallel round 4 */
188 GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
189 GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
190 GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8);
191 GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
192 GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
193 GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
194 GGG(bbb, ccc, ddd, eee, aaa, X[15], 6);
195 GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
196 GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6);
197 GGG(ddd, eee, aaa, bbb, ccc, X[12], 9);
198 GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
199 GGG(bbb, ccc, ddd, eee, aaa, X[13], 9);
200 GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
201 GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
202 GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
203 GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
204
205 /* parallel round 5 */
206 FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8);
207 FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5);
208 FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
209 FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9);
210 FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
211 FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5);
212 FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
213 FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6);
214 FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8);
215 FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
216 FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6);
217 FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5);
218 FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
219 FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
220 FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
221 FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
222
223 /* combine results */
224 ddd += cc + MDbuf[1]; /* final result for MDbuf[0] */
225 MDbuf[1] = MDbuf[2] + dd + eee;
226 MDbuf[2] = MDbuf[3] + ee + aaa;
227 MDbuf[3] = MDbuf[4] + aa + bbb;
228 MDbuf[4] = MDbuf[0] + bb + ccc;
229 MDbuf[0] = ddd;
230
231 return;
232 }
233
234 /********************************************************************/
235
rmd160_finish(dword * MDbuf,byte * strptr,dword lswlen,dword mswlen)236 void rmd160_finish(dword *MDbuf, byte *strptr, dword lswlen, dword mswlen)
237 {
238 dword i; /* counter */
239 dword X[16]; /* message words */
240
241 for (i=0; i<16; X[i++]=0);
242
243 /* put bytes from strptr into X */
244 for (i=0; i<(lswlen&63); i++) {
245 /* byte i goes into word X[i div 4] at pos. 8*(i mod 4) */
246 X[i>>2] ^= (dword) *strptr++ << (8 * (i&3));
247 }
248
249 /* append the bit m_n == 1 */
250 X[(lswlen>>2)&15] ^= (dword)1 << (8*(lswlen&3) + 7);
251
252 if ((lswlen & 63) > 55) {
253 /* length goes to next block */
254 rmd160_compress(MDbuf, X);
255 for (i=0; i<16; X[i++]=0);
256 }
257
258 /* append length in bits*/
259 X[14] = lswlen << 3;
260 X[15] = (lswlen >> 29) | (mswlen << 3);
261 rmd160_compress(MDbuf, X);
262
263 return;
264 }
265
266 /************************ end of file rmd160.c **********************/
267
268