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