File Coverage

rmd160.c
Criterion Covered Total %
statement 191 191 100.0
branch 4 4 100.0
condition n/a
subroutine n/a
pod n/a
total 195 195 100.0


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