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