1 /* crypto/ripemd/rmd_dgst.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
5 * This package is an SSL implementation written
6 * by Eric Young (eay@cryptsoft.com).
7 * The implementation was written so as to conform with Netscapes SSL.
9 * This library is free for commercial and non-commercial use as long as
10 * the following conditions are aheared to. The following conditions
11 * apply to all code found in this distribution, be it the RC4, RSA,
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13 * included with this distribution is covered by the same copyright terms
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
16 * Copyright remains Eric Young's, and as such any Copyright notices in
17 * the code are not to be removed.
18 * If this package is used in a product, Eric Young should be given attribution
19 * as the author of the parts of the library used.
20 * This can be in the form of a textual message at program startup or
21 * in documentation (online or textual) provided with the package.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
26 * 1. Redistributions of source code must retain the copyright
27 * notice, this list of conditions and the following disclaimer.
28 * 2. Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * 3. All advertising materials mentioning features or use of this software
32 * must display the following acknowledgement:
33 * "This product includes cryptographic software written by
34 * Eric Young (eay@cryptsoft.com)"
35 * The word 'cryptographic' can be left out if the rouines from the library
36 * being used are not cryptographic related :-).
37 * 4. If you include any Windows specific code (or a derivative thereof) from
38 * the apps directory (application code) you must include an acknowledgement:
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 * The licence and distribution terms for any publically available version or
54 * derivative of this code cannot be changed. i.e. this code cannot simply be
55 * copied and put under another distribution licence
56 * [including the GNU Public Licence.]
61 #include <openssl/opensslv.h>
62 #include <openssl/crypto.h>
64 const char RMD160_version
[] = "RIPE-MD160" OPENSSL_VERSION_PTEXT
;
67 void ripemd160_block_x86(RIPEMD160_CTX
*c
, unsigned long *p
, size_t num
);
68 # define ripemd160_block ripemd160_block_x86
70 void ripemd160_block(RIPEMD160_CTX
*c
, unsigned long *p
, size_t num
);
73 fips_md_init(RIPEMD160
)
75 memset(c
, 0, sizeof(*c
));
84 #ifndef ripemd160_block_data_order
88 void ripemd160_block_data_order(RIPEMD160_CTX
*ctx
, const void *p
, size_t num
)
90 const unsigned char *data
= p
;
91 register unsigned MD32_REG_T A
, B
, C
, D
, E
;
92 unsigned MD32_REG_T a
, b
, c
, d
, e
, l
;
94 /* See comment in crypto/sha/sha_locl.h for details. */
95 unsigned MD32_REG_T XX0
, XX1
, XX2
, XX3
, XX4
, XX5
, XX6
, XX7
,
96 XX8
, XX9
, XX10
, XX11
, XX12
, XX13
, XX14
, XX15
;
99 RIPEMD160_LONG XX
[16];
111 (void)HOST_c2l(data
, l
);
113 (void)HOST_c2l(data
, l
);
115 RIP1(A
, B
, C
, D
, E
, WL00
, SL00
);
116 (void)HOST_c2l(data
, l
);
118 RIP1(E
, A
, B
, C
, D
, WL01
, SL01
);
119 (void)HOST_c2l(data
, l
);
121 RIP1(D
, E
, A
, B
, C
, WL02
, SL02
);
122 (void)HOST_c2l(data
, l
);
124 RIP1(C
, D
, E
, A
, B
, WL03
, SL03
);
125 (void)HOST_c2l(data
, l
);
127 RIP1(B
, C
, D
, E
, A
, WL04
, SL04
);
128 (void)HOST_c2l(data
, l
);
130 RIP1(A
, B
, C
, D
, E
, WL05
, SL05
);
131 (void)HOST_c2l(data
, l
);
133 RIP1(E
, A
, B
, C
, D
, WL06
, SL06
);
134 (void)HOST_c2l(data
, l
);
136 RIP1(D
, E
, A
, B
, C
, WL07
, SL07
);
137 (void)HOST_c2l(data
, l
);
139 RIP1(C
, D
, E
, A
, B
, WL08
, SL08
);
140 (void)HOST_c2l(data
, l
);
142 RIP1(B
, C
, D
, E
, A
, WL09
, SL09
);
143 (void)HOST_c2l(data
, l
);
145 RIP1(A
, B
, C
, D
, E
, WL10
, SL10
);
146 (void)HOST_c2l(data
, l
);
148 RIP1(E
, A
, B
, C
, D
, WL11
, SL11
);
149 (void)HOST_c2l(data
, l
);
151 RIP1(D
, E
, A
, B
, C
, WL12
, SL12
);
152 (void)HOST_c2l(data
, l
);
154 RIP1(C
, D
, E
, A
, B
, WL13
, SL13
);
155 (void)HOST_c2l(data
, l
);
157 RIP1(B
, C
, D
, E
, A
, WL14
, SL14
);
158 RIP1(A
, B
, C
, D
, E
, WL15
, SL15
);
160 RIP2(E
, A
, B
, C
, D
, WL16
, SL16
, KL1
);
161 RIP2(D
, E
, A
, B
, C
, WL17
, SL17
, KL1
);
162 RIP2(C
, D
, E
, A
, B
, WL18
, SL18
, KL1
);
163 RIP2(B
, C
, D
, E
, A
, WL19
, SL19
, KL1
);
164 RIP2(A
, B
, C
, D
, E
, WL20
, SL20
, KL1
);
165 RIP2(E
, A
, B
, C
, D
, WL21
, SL21
, KL1
);
166 RIP2(D
, E
, A
, B
, C
, WL22
, SL22
, KL1
);
167 RIP2(C
, D
, E
, A
, B
, WL23
, SL23
, KL1
);
168 RIP2(B
, C
, D
, E
, A
, WL24
, SL24
, KL1
);
169 RIP2(A
, B
, C
, D
, E
, WL25
, SL25
, KL1
);
170 RIP2(E
, A
, B
, C
, D
, WL26
, SL26
, KL1
);
171 RIP2(D
, E
, A
, B
, C
, WL27
, SL27
, KL1
);
172 RIP2(C
, D
, E
, A
, B
, WL28
, SL28
, KL1
);
173 RIP2(B
, C
, D
, E
, A
, WL29
, SL29
, KL1
);
174 RIP2(A
, B
, C
, D
, E
, WL30
, SL30
, KL1
);
175 RIP2(E
, A
, B
, C
, D
, WL31
, SL31
, KL1
);
177 RIP3(D
, E
, A
, B
, C
, WL32
, SL32
, KL2
);
178 RIP3(C
, D
, E
, A
, B
, WL33
, SL33
, KL2
);
179 RIP3(B
, C
, D
, E
, A
, WL34
, SL34
, KL2
);
180 RIP3(A
, B
, C
, D
, E
, WL35
, SL35
, KL2
);
181 RIP3(E
, A
, B
, C
, D
, WL36
, SL36
, KL2
);
182 RIP3(D
, E
, A
, B
, C
, WL37
, SL37
, KL2
);
183 RIP3(C
, D
, E
, A
, B
, WL38
, SL38
, KL2
);
184 RIP3(B
, C
, D
, E
, A
, WL39
, SL39
, KL2
);
185 RIP3(A
, B
, C
, D
, E
, WL40
, SL40
, KL2
);
186 RIP3(E
, A
, B
, C
, D
, WL41
, SL41
, KL2
);
187 RIP3(D
, E
, A
, B
, C
, WL42
, SL42
, KL2
);
188 RIP3(C
, D
, E
, A
, B
, WL43
, SL43
, KL2
);
189 RIP3(B
, C
, D
, E
, A
, WL44
, SL44
, KL2
);
190 RIP3(A
, B
, C
, D
, E
, WL45
, SL45
, KL2
);
191 RIP3(E
, A
, B
, C
, D
, WL46
, SL46
, KL2
);
192 RIP3(D
, E
, A
, B
, C
, WL47
, SL47
, KL2
);
194 RIP4(C
, D
, E
, A
, B
, WL48
, SL48
, KL3
);
195 RIP4(B
, C
, D
, E
, A
, WL49
, SL49
, KL3
);
196 RIP4(A
, B
, C
, D
, E
, WL50
, SL50
, KL3
);
197 RIP4(E
, A
, B
, C
, D
, WL51
, SL51
, KL3
);
198 RIP4(D
, E
, A
, B
, C
, WL52
, SL52
, KL3
);
199 RIP4(C
, D
, E
, A
, B
, WL53
, SL53
, KL3
);
200 RIP4(B
, C
, D
, E
, A
, WL54
, SL54
, KL3
);
201 RIP4(A
, B
, C
, D
, E
, WL55
, SL55
, KL3
);
202 RIP4(E
, A
, B
, C
, D
, WL56
, SL56
, KL3
);
203 RIP4(D
, E
, A
, B
, C
, WL57
, SL57
, KL3
);
204 RIP4(C
, D
, E
, A
, B
, WL58
, SL58
, KL3
);
205 RIP4(B
, C
, D
, E
, A
, WL59
, SL59
, KL3
);
206 RIP4(A
, B
, C
, D
, E
, WL60
, SL60
, KL3
);
207 RIP4(E
, A
, B
, C
, D
, WL61
, SL61
, KL3
);
208 RIP4(D
, E
, A
, B
, C
, WL62
, SL62
, KL3
);
209 RIP4(C
, D
, E
, A
, B
, WL63
, SL63
, KL3
);
211 RIP5(B
, C
, D
, E
, A
, WL64
, SL64
, KL4
);
212 RIP5(A
, B
, C
, D
, E
, WL65
, SL65
, KL4
);
213 RIP5(E
, A
, B
, C
, D
, WL66
, SL66
, KL4
);
214 RIP5(D
, E
, A
, B
, C
, WL67
, SL67
, KL4
);
215 RIP5(C
, D
, E
, A
, B
, WL68
, SL68
, KL4
);
216 RIP5(B
, C
, D
, E
, A
, WL69
, SL69
, KL4
);
217 RIP5(A
, B
, C
, D
, E
, WL70
, SL70
, KL4
);
218 RIP5(E
, A
, B
, C
, D
, WL71
, SL71
, KL4
);
219 RIP5(D
, E
, A
, B
, C
, WL72
, SL72
, KL4
);
220 RIP5(C
, D
, E
, A
, B
, WL73
, SL73
, KL4
);
221 RIP5(B
, C
, D
, E
, A
, WL74
, SL74
, KL4
);
222 RIP5(A
, B
, C
, D
, E
, WL75
, SL75
, KL4
);
223 RIP5(E
, A
, B
, C
, D
, WL76
, SL76
, KL4
);
224 RIP5(D
, E
, A
, B
, C
, WL77
, SL77
, KL4
);
225 RIP5(C
, D
, E
, A
, B
, WL78
, SL78
, KL4
);
226 RIP5(B
, C
, D
, E
, A
, WL79
, SL79
, KL4
);
240 RIP5(A
, B
, C
, D
, E
, WR00
, SR00
, KR0
);
241 RIP5(E
, A
, B
, C
, D
, WR01
, SR01
, KR0
);
242 RIP5(D
, E
, A
, B
, C
, WR02
, SR02
, KR0
);
243 RIP5(C
, D
, E
, A
, B
, WR03
, SR03
, KR0
);
244 RIP5(B
, C
, D
, E
, A
, WR04
, SR04
, KR0
);
245 RIP5(A
, B
, C
, D
, E
, WR05
, SR05
, KR0
);
246 RIP5(E
, A
, B
, C
, D
, WR06
, SR06
, KR0
);
247 RIP5(D
, E
, A
, B
, C
, WR07
, SR07
, KR0
);
248 RIP5(C
, D
, E
, A
, B
, WR08
, SR08
, KR0
);
249 RIP5(B
, C
, D
, E
, A
, WR09
, SR09
, KR0
);
250 RIP5(A
, B
, C
, D
, E
, WR10
, SR10
, KR0
);
251 RIP5(E
, A
, B
, C
, D
, WR11
, SR11
, KR0
);
252 RIP5(D
, E
, A
, B
, C
, WR12
, SR12
, KR0
);
253 RIP5(C
, D
, E
, A
, B
, WR13
, SR13
, KR0
);
254 RIP5(B
, C
, D
, E
, A
, WR14
, SR14
, KR0
);
255 RIP5(A
, B
, C
, D
, E
, WR15
, SR15
, KR0
);
257 RIP4(E
, A
, B
, C
, D
, WR16
, SR16
, KR1
);
258 RIP4(D
, E
, A
, B
, C
, WR17
, SR17
, KR1
);
259 RIP4(C
, D
, E
, A
, B
, WR18
, SR18
, KR1
);
260 RIP4(B
, C
, D
, E
, A
, WR19
, SR19
, KR1
);
261 RIP4(A
, B
, C
, D
, E
, WR20
, SR20
, KR1
);
262 RIP4(E
, A
, B
, C
, D
, WR21
, SR21
, KR1
);
263 RIP4(D
, E
, A
, B
, C
, WR22
, SR22
, KR1
);
264 RIP4(C
, D
, E
, A
, B
, WR23
, SR23
, KR1
);
265 RIP4(B
, C
, D
, E
, A
, WR24
, SR24
, KR1
);
266 RIP4(A
, B
, C
, D
, E
, WR25
, SR25
, KR1
);
267 RIP4(E
, A
, B
, C
, D
, WR26
, SR26
, KR1
);
268 RIP4(D
, E
, A
, B
, C
, WR27
, SR27
, KR1
);
269 RIP4(C
, D
, E
, A
, B
, WR28
, SR28
, KR1
);
270 RIP4(B
, C
, D
, E
, A
, WR29
, SR29
, KR1
);
271 RIP4(A
, B
, C
, D
, E
, WR30
, SR30
, KR1
);
272 RIP4(E
, A
, B
, C
, D
, WR31
, SR31
, KR1
);
274 RIP3(D
, E
, A
, B
, C
, WR32
, SR32
, KR2
);
275 RIP3(C
, D
, E
, A
, B
, WR33
, SR33
, KR2
);
276 RIP3(B
, C
, D
, E
, A
, WR34
, SR34
, KR2
);
277 RIP3(A
, B
, C
, D
, E
, WR35
, SR35
, KR2
);
278 RIP3(E
, A
, B
, C
, D
, WR36
, SR36
, KR2
);
279 RIP3(D
, E
, A
, B
, C
, WR37
, SR37
, KR2
);
280 RIP3(C
, D
, E
, A
, B
, WR38
, SR38
, KR2
);
281 RIP3(B
, C
, D
, E
, A
, WR39
, SR39
, KR2
);
282 RIP3(A
, B
, C
, D
, E
, WR40
, SR40
, KR2
);
283 RIP3(E
, A
, B
, C
, D
, WR41
, SR41
, KR2
);
284 RIP3(D
, E
, A
, B
, C
, WR42
, SR42
, KR2
);
285 RIP3(C
, D
, E
, A
, B
, WR43
, SR43
, KR2
);
286 RIP3(B
, C
, D
, E
, A
, WR44
, SR44
, KR2
);
287 RIP3(A
, B
, C
, D
, E
, WR45
, SR45
, KR2
);
288 RIP3(E
, A
, B
, C
, D
, WR46
, SR46
, KR2
);
289 RIP3(D
, E
, A
, B
, C
, WR47
, SR47
, KR2
);
291 RIP2(C
, D
, E
, A
, B
, WR48
, SR48
, KR3
);
292 RIP2(B
, C
, D
, E
, A
, WR49
, SR49
, KR3
);
293 RIP2(A
, B
, C
, D
, E
, WR50
, SR50
, KR3
);
294 RIP2(E
, A
, B
, C
, D
, WR51
, SR51
, KR3
);
295 RIP2(D
, E
, A
, B
, C
, WR52
, SR52
, KR3
);
296 RIP2(C
, D
, E
, A
, B
, WR53
, SR53
, KR3
);
297 RIP2(B
, C
, D
, E
, A
, WR54
, SR54
, KR3
);
298 RIP2(A
, B
, C
, D
, E
, WR55
, SR55
, KR3
);
299 RIP2(E
, A
, B
, C
, D
, WR56
, SR56
, KR3
);
300 RIP2(D
, E
, A
, B
, C
, WR57
, SR57
, KR3
);
301 RIP2(C
, D
, E
, A
, B
, WR58
, SR58
, KR3
);
302 RIP2(B
, C
, D
, E
, A
, WR59
, SR59
, KR3
);
303 RIP2(A
, B
, C
, D
, E
, WR60
, SR60
, KR3
);
304 RIP2(E
, A
, B
, C
, D
, WR61
, SR61
, KR3
);
305 RIP2(D
, E
, A
, B
, C
, WR62
, SR62
, KR3
);
306 RIP2(C
, D
, E
, A
, B
, WR63
, SR63
, KR3
);
308 RIP1(B
, C
, D
, E
, A
, WR64
, SR64
);
309 RIP1(A
, B
, C
, D
, E
, WR65
, SR65
);
310 RIP1(E
, A
, B
, C
, D
, WR66
, SR66
);
311 RIP1(D
, E
, A
, B
, C
, WR67
, SR67
);
312 RIP1(C
, D
, E
, A
, B
, WR68
, SR68
);
313 RIP1(B
, C
, D
, E
, A
, WR69
, SR69
);
314 RIP1(A
, B
, C
, D
, E
, WR70
, SR70
);
315 RIP1(E
, A
, B
, C
, D
, WR71
, SR71
);
316 RIP1(D
, E
, A
, B
, C
, WR72
, SR72
);
317 RIP1(C
, D
, E
, A
, B
, WR73
, SR73
);
318 RIP1(B
, C
, D
, E
, A
, WR74
, SR74
);
319 RIP1(A
, B
, C
, D
, E
, WR75
, SR75
);
320 RIP1(E
, A
, B
, C
, D
, WR76
, SR76
);
321 RIP1(D
, E
, A
, B
, C
, WR77
, SR77
);
322 RIP1(C
, D
, E
, A
, B
, WR78
, SR78
);
323 RIP1(B
, C
, D
, E
, A
, WR79
, SR79
);
326 ctx
->B
= ctx
->C
+ d
+ E
;
327 ctx
->C
= ctx
->D
+ e
+ A
;
328 ctx
->D
= ctx
->E
+ a
+ B
;
329 ctx
->E
= ctx
->A
+ b
+ C
;