File Coverage

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