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