diff options
Diffstat (limited to 'src/plugins/hash/rmd160extractor.c')
-rw-r--r-- | src/plugins/hash/rmd160extractor.c | 625 |
1 files changed, 0 insertions, 625 deletions
diff --git a/src/plugins/hash/rmd160extractor.c b/src/plugins/hash/rmd160extractor.c deleted file mode 100644 index f0fef3d..0000000 --- a/src/plugins/hash/rmd160extractor.c +++ /dev/null | |||
@@ -1,625 +0,0 @@ | |||
1 | /* | ||
2 | This file is part of libextractor. | ||
3 | (C) 2004 Vidyut Samanta and Christian Grothoff | ||
4 | Copyright © 1999 - Philip Howard | ||
5 | |||
6 | libextractor is free software; you can redistribute it and/or modify | ||
7 | it under the terms of the GNU General Public License as published | ||
8 | by the Free Software Foundation; either version 2, or (at your | ||
9 | option) any later version. | ||
10 | |||
11 | libextractor is distributed in the hope that it will be useful, but | ||
12 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | General Public License for more details. | ||
15 | |||
16 | You should have received a copy of the GNU General Public License | ||
17 | along with libextractor; see the file COPYING. If not, write to the | ||
18 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
19 | Boston, MA 02111-1307, USA. | ||
20 | |||
21 | RMD code: | ||
22 | package rmd160 | ||
23 | version 1.2.1 | ||
24 | homepage http://phil.ipal.org/freeware/rmd160/ | ||
25 | |||
26 | author Philip Howard | ||
27 | email phil@ipal.org | ||
28 | homepage http://phil.ipal.org/ | ||
29 | |||
30 | */ | ||
31 | |||
32 | #include "platform.h" | ||
33 | #include "extractor.h" | ||
34 | |||
35 | #if ULONG_MAX>4294967295U | ||
36 | #if UINT_MAX>4294967295U | ||
37 | #if USHRT_MAX>4294967295U | ||
38 | #if UCHAR_MAX>=4294967295U | ||
39 | typedef unsigned char rmd160uint32; | ||
40 | #else | ||
41 | typedef unsigned short rmd160uint32; | ||
42 | #endif /*UCHAR_MAX */ | ||
43 | #else | ||
44 | typedef unsigned int rmd160uint32; | ||
45 | #endif /*USHRT_MAX */ | ||
46 | #else | ||
47 | typedef unsigned long rmd160uint32; | ||
48 | #endif /*UINT_MAX */ | ||
49 | #else | ||
50 | typedef unsigned long rmd160uint32; | ||
51 | #endif | ||
52 | |||
53 | struct rmd160_object | ||
54 | { | ||
55 | rmd160uint32 data[16]; | ||
56 | rmd160uint32 state[5]; | ||
57 | rmd160uint32 len[2]; | ||
58 | rmd160uint32 *wptr; | ||
59 | rmd160uint32 *wend; | ||
60 | unsigned int bpos; | ||
61 | }; | ||
62 | typedef struct rmd160_object *RMD160; | ||
63 | |||
64 | #define RMD160_OK 0 | ||
65 | #define RMD160_ERR_INVALID_ARG 1 | ||
66 | #define RMD160_ERR_READ 2 | ||
67 | |||
68 | |||
69 | #define RMD160_BUFSIZ 1024 | ||
70 | |||
71 | #define RMD160_INIT0 0x67452301UL | ||
72 | #define RMD160_INIT1 0xefcdab89UL | ||
73 | #define RMD160_INIT2 0x98badcfeUL | ||
74 | #define RMD160_INIT3 0x10325476UL | ||
75 | #define RMD160_INIT4 0xc3d2e1f0UL | ||
76 | |||
77 | static int | ||
78 | _rmd160_calc (rmd160uint32 * state, rmd160uint32 * data) | ||
79 | { | ||
80 | rmd160uint32 x0, x1, x2, x3, x4; | ||
81 | rmd160uint32 y0, y1, y2, y3, y4; | ||
82 | |||
83 | x0 = y0 = state[0]; | ||
84 | x1 = y1 = state[1]; | ||
85 | x2 = y2 = state[2]; | ||
86 | x3 = y3 = state[3]; | ||
87 | x4 = y4 = state[4]; | ||
88 | |||
89 | |||
90 | #define RL(x,n) (((x) << (n)) | ((x) >> (32-(n)))) | ||
91 | |||
92 | #define F1(x,y,z) ((x) ^ (y) ^ (z)) | ||
93 | #define F2(x,y,z) (((x) & (y)) | (~(x) & (z))) | ||
94 | #define F3(x,y,z) (((x) | ~(y)) ^ (z)) | ||
95 | #define F4(x,y,z) (((x) & (z)) | ((y) & ~(z))) | ||
96 | #define F5(x,y,z) ((x) ^ ((y) | ~(z))) | ||
97 | |||
98 | #define T1(a,b,c,d,e,x,s) { \ | ||
99 | (a) += F1((b),(c),(d)) + (x); \ | ||
100 | (a) = RL((a),(s)) + (e); \ | ||
101 | (c) = RL((c),10);} | ||
102 | #define T2(a,b,c,d,e,x,s) { \ | ||
103 | (a) += F2((b),(c),(d)) + (x) + 0x5a827999UL; \ | ||
104 | (a) = RL((a),(s)) + (e); \ | ||
105 | (c) = RL((c),10);} | ||
106 | #define T3(a,b,c,d,e,x,s) { \ | ||
107 | (a) += F3((b),(c),(d)) + (x) + 0x6ed9eba1UL; \ | ||
108 | (a) = RL((a),(s)) + (e); \ | ||
109 | (c) = RL((c),10);} | ||
110 | #define T4(a,b,c,d,e,x,s) { \ | ||
111 | (a) += F4((b),(c),(d)) + (x) + 0x8f1bbcdcUL; \ | ||
112 | (a) = RL((a),(s)) + (e); \ | ||
113 | (c) = RL((c),10);} | ||
114 | #define T5(a,b,c,d,e,x,s) { \ | ||
115 | (a) += F5((b),(c),(d)) + (x) + 0xa953fd4eUL; \ | ||
116 | (a) = RL((a),(s)) + (e); \ | ||
117 | (c) = RL((c),10);} | ||
118 | |||
119 | #define S1(a,b,c,d,e,x,s) { \ | ||
120 | (a) += F1((b),(c),(d)) + (x); \ | ||
121 | (a) = RL((a),(s)) + (e); \ | ||
122 | (c) = RL((c),10);} | ||
123 | #define S2(a,b,c,d,e,x,s) { \ | ||
124 | (a) += F2((b),(c),(d)) + (x) + 0x7a6d76e9UL; \ | ||
125 | (a) = RL((a),(s)) + (e); \ | ||
126 | (c) = RL((c),10);} | ||
127 | #define S3(a,b,c,d,e,x,s) { \ | ||
128 | (a) += F3((b),(c),(d)) + (x) + 0x6d703ef3UL; \ | ||
129 | (a) = RL((a),(s)) + (e); \ | ||
130 | (c) = RL((c),10);} | ||
131 | #define S4(a,b,c,d,e,x,s) { \ | ||
132 | (a) += F4((b),(c),(d)) + (x) + 0x5c4dd124UL; \ | ||
133 | (a) = RL((a),(s)) + (e); \ | ||
134 | (c) = RL((c),10);} | ||
135 | #define S5(a,b,c,d,e,x,s) { \ | ||
136 | (a) += F5((b),(c),(d)) + (x) + 0x50a28be6UL; \ | ||
137 | (a) = RL((a),(s)) + (e); \ | ||
138 | (c) = RL((c),10);} | ||
139 | |||
140 | T1 (x0, x1, x2, x3, x4, data[0], 11); | ||
141 | T1 (x4, x0, x1, x2, x3, data[1], 14); | ||
142 | T1 (x3, x4, x0, x1, x2, data[2], 15); | ||
143 | T1 (x2, x3, x4, x0, x1, data[3], 12); | ||
144 | T1 (x1, x2, x3, x4, x0, data[4], 5); | ||
145 | T1 (x0, x1, x2, x3, x4, data[5], 8); | ||
146 | T1 (x4, x0, x1, x2, x3, data[6], 7); | ||
147 | T1 (x3, x4, x0, x1, x2, data[7], 9); | ||
148 | T1 (x2, x3, x4, x0, x1, data[8], 11); | ||
149 | T1 (x1, x2, x3, x4, x0, data[9], 13); | ||
150 | T1 (x0, x1, x2, x3, x4, data[10], 14); | ||
151 | T1 (x4, x0, x1, x2, x3, data[11], 15); | ||
152 | T1 (x3, x4, x0, x1, x2, data[12], 6); | ||
153 | T1 (x2, x3, x4, x0, x1, data[13], 7); | ||
154 | T1 (x1, x2, x3, x4, x0, data[14], 9); | ||
155 | T1 (x0, x1, x2, x3, x4, data[15], 8); | ||
156 | |||
157 | T2 (x4, x0, x1, x2, x3, data[7], 7); | ||
158 | T2 (x3, x4, x0, x1, x2, data[4], 6); | ||
159 | T2 (x2, x3, x4, x0, x1, data[13], 8); | ||
160 | T2 (x1, x2, x3, x4, x0, data[1], 13); | ||
161 | T2 (x0, x1, x2, x3, x4, data[10], 11); | ||
162 | T2 (x4, x0, x1, x2, x3, data[6], 9); | ||
163 | T2 (x3, x4, x0, x1, x2, data[15], 7); | ||
164 | T2 (x2, x3, x4, x0, x1, data[3], 15); | ||
165 | T2 (x1, x2, x3, x4, x0, data[12], 7); | ||
166 | T2 (x0, x1, x2, x3, x4, data[0], 12); | ||
167 | T2 (x4, x0, x1, x2, x3, data[9], 15); | ||
168 | T2 (x3, x4, x0, x1, x2, data[5], 9); | ||
169 | T2 (x2, x3, x4, x0, x1, data[2], 11); | ||
170 | T2 (x1, x2, x3, x4, x0, data[14], 7); | ||
171 | T2 (x0, x1, x2, x3, x4, data[11], 13); | ||
172 | T2 (x4, x0, x1, x2, x3, data[8], 12); | ||
173 | |||
174 | T3 (x3, x4, x0, x1, x2, data[3], 11); | ||
175 | T3 (x2, x3, x4, x0, x1, data[10], 13); | ||
176 | T3 (x1, x2, x3, x4, x0, data[14], 6); | ||
177 | T3 (x0, x1, x2, x3, x4, data[4], 7); | ||
178 | T3 (x4, x0, x1, x2, x3, data[9], 14); | ||
179 | T3 (x3, x4, x0, x1, x2, data[15], 9); | ||
180 | T3 (x2, x3, x4, x0, x1, data[8], 13); | ||
181 | T3 (x1, x2, x3, x4, x0, data[1], 15); | ||
182 | T3 (x0, x1, x2, x3, x4, data[2], 14); | ||
183 | T3 (x4, x0, x1, x2, x3, data[7], 8); | ||
184 | T3 (x3, x4, x0, x1, x2, data[0], 13); | ||
185 | T3 (x2, x3, x4, x0, x1, data[6], 6); | ||
186 | T3 (x1, x2, x3, x4, x0, data[13], 5); | ||
187 | T3 (x0, x1, x2, x3, x4, data[11], 12); | ||
188 | T3 (x4, x0, x1, x2, x3, data[5], 7); | ||
189 | T3 (x3, x4, x0, x1, x2, data[12], 5); | ||
190 | |||
191 | T4 (x2, x3, x4, x0, x1, data[1], 11); | ||
192 | T4 (x1, x2, x3, x4, x0, data[9], 12); | ||
193 | T4 (x0, x1, x2, x3, x4, data[11], 14); | ||
194 | T4 (x4, x0, x1, x2, x3, data[10], 15); | ||
195 | T4 (x3, x4, x0, x1, x2, data[0], 14); | ||
196 | T4 (x2, x3, x4, x0, x1, data[8], 15); | ||
197 | T4 (x1, x2, x3, x4, x0, data[12], 9); | ||
198 | T4 (x0, x1, x2, x3, x4, data[4], 8); | ||
199 | T4 (x4, x0, x1, x2, x3, data[13], 9); | ||
200 | T4 (x3, x4, x0, x1, x2, data[3], 14); | ||
201 | T4 (x2, x3, x4, x0, x1, data[7], 5); | ||
202 | T4 (x1, x2, x3, x4, x0, data[15], 6); | ||
203 | T4 (x0, x1, x2, x3, x4, data[14], 8); | ||
204 | T4 (x4, x0, x1, x2, x3, data[5], 6); | ||
205 | T4 (x3, x4, x0, x1, x2, data[6], 5); | ||
206 | T4 (x2, x3, x4, x0, x1, data[2], 12); | ||
207 | |||
208 | T5 (x1, x2, x3, x4, x0, data[4], 9); | ||
209 | T5 (x0, x1, x2, x3, x4, data[0], 15); | ||
210 | T5 (x4, x0, x1, x2, x3, data[5], 5); | ||
211 | T5 (x3, x4, x0, x1, x2, data[9], 11); | ||
212 | T5 (x2, x3, x4, x0, x1, data[7], 6); | ||
213 | T5 (x1, x2, x3, x4, x0, data[12], 8); | ||
214 | T5 (x0, x1, x2, x3, x4, data[2], 13); | ||
215 | T5 (x4, x0, x1, x2, x3, data[10], 12); | ||
216 | T5 (x3, x4, x0, x1, x2, data[14], 5); | ||
217 | T5 (x2, x3, x4, x0, x1, data[1], 12); | ||
218 | T5 (x1, x2, x3, x4, x0, data[3], 13); | ||
219 | T5 (x0, x1, x2, x3, x4, data[8], 14); | ||
220 | T5 (x4, x0, x1, x2, x3, data[11], 11); | ||
221 | T5 (x3, x4, x0, x1, x2, data[6], 8); | ||
222 | T5 (x2, x3, x4, x0, x1, data[15], 5); | ||
223 | T5 (x1, x2, x3, x4, x0, data[13], 6); | ||
224 | |||
225 | S5 (y0, y1, y2, y3, y4, data[5], 8); | ||
226 | S5 (y4, y0, y1, y2, y3, data[14], 9); | ||
227 | S5 (y3, y4, y0, y1, y2, data[7], 9); | ||
228 | S5 (y2, y3, y4, y0, y1, data[0], 11); | ||
229 | S5 (y1, y2, y3, y4, y0, data[9], 13); | ||
230 | S5 (y0, y1, y2, y3, y4, data[2], 15); | ||
231 | S5 (y4, y0, y1, y2, y3, data[11], 15); | ||
232 | S5 (y3, y4, y0, y1, y2, data[4], 5); | ||
233 | S5 (y2, y3, y4, y0, y1, data[13], 7); | ||
234 | S5 (y1, y2, y3, y4, y0, data[6], 7); | ||
235 | S5 (y0, y1, y2, y3, y4, data[15], 8); | ||
236 | S5 (y4, y0, y1, y2, y3, data[8], 11); | ||
237 | S5 (y3, y4, y0, y1, y2, data[1], 14); | ||
238 | S5 (y2, y3, y4, y0, y1, data[10], 14); | ||
239 | S5 (y1, y2, y3, y4, y0, data[3], 12); | ||
240 | S5 (y0, y1, y2, y3, y4, data[12], 6); | ||
241 | |||
242 | S4 (y4, y0, y1, y2, y3, data[6], 9); | ||
243 | S4 (y3, y4, y0, y1, y2, data[11], 13); | ||
244 | S4 (y2, y3, y4, y0, y1, data[3], 15); | ||
245 | S4 (y1, y2, y3, y4, y0, data[7], 7); | ||
246 | S4 (y0, y1, y2, y3, y4, data[0], 12); | ||
247 | S4 (y4, y0, y1, y2, y3, data[13], 8); | ||
248 | S4 (y3, y4, y0, y1, y2, data[5], 9); | ||
249 | S4 (y2, y3, y4, y0, y1, data[10], 11); | ||
250 | S4 (y1, y2, y3, y4, y0, data[14], 7); | ||
251 | S4 (y0, y1, y2, y3, y4, data[15], 7); | ||
252 | S4 (y4, y0, y1, y2, y3, data[8], 12); | ||
253 | S4 (y3, y4, y0, y1, y2, data[12], 7); | ||
254 | S4 (y2, y3, y4, y0, y1, data[4], 6); | ||
255 | S4 (y1, y2, y3, y4, y0, data[9], 15); | ||
256 | S4 (y0, y1, y2, y3, y4, data[1], 13); | ||
257 | S4 (y4, y0, y1, y2, y3, data[2], 11); | ||
258 | |||
259 | S3 (y3, y4, y0, y1, y2, data[15], 9); | ||
260 | S3 (y2, y3, y4, y0, y1, data[5], 7); | ||
261 | S3 (y1, y2, y3, y4, y0, data[1], 15); | ||
262 | S3 (y0, y1, y2, y3, y4, data[3], 11); | ||
263 | S3 (y4, y0, y1, y2, y3, data[7], 8); | ||
264 | S3 (y3, y4, y0, y1, y2, data[14], 6); | ||
265 | S3 (y2, y3, y4, y0, y1, data[6], 6); | ||
266 | S3 (y1, y2, y3, y4, y0, data[9], 14); | ||
267 | S3 (y0, y1, y2, y3, y4, data[11], 12); | ||
268 | S3 (y4, y0, y1, y2, y3, data[8], 13); | ||
269 | S3 (y3, y4, y0, y1, y2, data[12], 5); | ||
270 | S3 (y2, y3, y4, y0, y1, data[2], 14); | ||
271 | S3 (y1, y2, y3, y4, y0, data[10], 13); | ||
272 | S3 (y0, y1, y2, y3, y4, data[0], 13); | ||
273 | S3 (y4, y0, y1, y2, y3, data[4], 7); | ||
274 | S3 (y3, y4, y0, y1, y2, data[13], 5); | ||
275 | |||
276 | S2 (y2, y3, y4, y0, y1, data[8], 15); | ||
277 | S2 (y1, y2, y3, y4, y0, data[6], 5); | ||
278 | S2 (y0, y1, y2, y3, y4, data[4], 8); | ||
279 | S2 (y4, y0, y1, y2, y3, data[1], 11); | ||
280 | S2 (y3, y4, y0, y1, y2, data[3], 14); | ||
281 | S2 (y2, y3, y4, y0, y1, data[11], 14); | ||
282 | S2 (y1, y2, y3, y4, y0, data[15], 6); | ||
283 | S2 (y0, y1, y2, y3, y4, data[0], 14); | ||
284 | S2 (y4, y0, y1, y2, y3, data[5], 6); | ||
285 | S2 (y3, y4, y0, y1, y2, data[12], 9); | ||
286 | S2 (y2, y3, y4, y0, y1, data[2], 12); | ||
287 | S2 (y1, y2, y3, y4, y0, data[13], 9); | ||
288 | S2 (y0, y1, y2, y3, y4, data[9], 12); | ||
289 | S2 (y4, y0, y1, y2, y3, data[7], 5); | ||
290 | S2 (y3, y4, y0, y1, y2, data[10], 15); | ||
291 | S2 (y2, y3, y4, y0, y1, data[14], 8); | ||
292 | |||
293 | S1 (y1, y2, y3, y4, y0, data[12], 8); | ||
294 | S1 (y0, y1, y2, y3, y4, data[15], 5); | ||
295 | S1 (y4, y0, y1, y2, y3, data[10], 12); | ||
296 | S1 (y3, y4, y0, y1, y2, data[4], 9); | ||
297 | S1 (y2, y3, y4, y0, y1, data[1], 12); | ||
298 | S1 (y1, y2, y3, y4, y0, data[5], 5); | ||
299 | S1 (y0, y1, y2, y3, y4, data[8], 14); | ||
300 | S1 (y4, y0, y1, y2, y3, data[7], 6); | ||
301 | S1 (y3, y4, y0, y1, y2, data[6], 8); | ||
302 | S1 (y2, y3, y4, y0, y1, data[2], 13); | ||
303 | S1 (y1, y2, y3, y4, y0, data[13], 6); | ||
304 | S1 (y0, y1, y2, y3, y4, data[14], 5); | ||
305 | S1 (y4, y0, y1, y2, y3, data[0], 15); | ||
306 | S1 (y3, y4, y0, y1, y2, data[3], 13); | ||
307 | S1 (y2, y3, y4, y0, y1, data[9], 11); | ||
308 | S1 (y1, y2, y3, y4, y0, data[11], 11); | ||
309 | |||
310 | y3 += x2 + state[1]; | ||
311 | state[1] = state[2] + x3 + y4; | ||
312 | state[2] = state[3] + x4 + y0; | ||
313 | state[3] = state[4] + x0 + y1; | ||
314 | state[4] = state[0] + x1 + y2; | ||
315 | state[0] = y3; | ||
316 | |||
317 | return RMD160_OK; | ||
318 | } | ||
319 | |||
320 | |||
321 | static int | ||
322 | rmd160_append (RMD160 arg_obj, size_t arg_len, const unsigned char *arg_data) | ||
323 | { | ||
324 | size_t alen; | ||
325 | |||
326 | rmd160uint32 *wend; | ||
327 | rmd160uint32 *wptr; | ||
328 | |||
329 | unsigned int bpos; | ||
330 | |||
331 | |||
332 | if (!arg_obj) | ||
333 | return RMD160_ERR_INVALID_ARG; | ||
334 | |||
335 | if (arg_len == 0) | ||
336 | return RMD160_OK; | ||
337 | if (!arg_data) | ||
338 | return RMD160_ERR_INVALID_ARG; | ||
339 | |||
340 | alen = arg_len; | ||
341 | wend = arg_obj->wend; | ||
342 | wptr = arg_obj->wptr; | ||
343 | bpos = arg_obj->bpos; | ||
344 | |||
345 | if (bpos) | ||
346 | { | ||
347 | register rmd160uint32 w; | ||
348 | w = *wptr; | ||
349 | if (bpos == 1) | ||
350 | { | ||
351 | w |= ((rmd160uint32) (0xff & *(arg_data++))) << 8; | ||
352 | --alen; | ||
353 | ++bpos; | ||
354 | } | ||
355 | if (bpos == 2 && alen) | ||
356 | { | ||
357 | w |= ((rmd160uint32) (0xff & *(arg_data++))) << 16; | ||
358 | --alen; | ||
359 | ++bpos; | ||
360 | } | ||
361 | if (bpos == 3 && alen) | ||
362 | { | ||
363 | w |= ((rmd160uint32) (0xff & *(arg_data++))) << 24; | ||
364 | --alen; | ||
365 | ++bpos; | ||
366 | } | ||
367 | *wptr = w; | ||
368 | if (!alen) | ||
369 | { | ||
370 | arg_obj->wptr = wptr; | ||
371 | arg_obj->bpos = bpos; | ||
372 | if ((arg_obj->len[0] = arg_len + arg_obj->len[0]) < arg_len) | ||
373 | { | ||
374 | arg_obj->len[1]++; | ||
375 | } | ||
376 | return RMD160_OK; | ||
377 | } | ||
378 | bpos = 0; | ||
379 | ++wptr; | ||
380 | } | ||
381 | |||
382 | for (;;) | ||
383 | { | ||
384 | while (alen >= 4 && wptr < wend) | ||
385 | { | ||
386 | |||
387 | #if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN | ||
388 | *wptr = *(const rmd160uint32 *) arg_data; | ||
389 | #else | ||
390 | *wptr = | ||
391 | ((rmd160uint32) (0xff & arg_data[0])) | | ||
392 | ((rmd160uint32) (0xff & arg_data[1])) << 8 | | ||
393 | ((rmd160uint32) (0xff & arg_data[2])) << 16 | | ||
394 | ((rmd160uint32) (0xff & arg_data[3])) << 24; | ||
395 | #endif | ||
396 | |||
397 | ++wptr; | ||
398 | arg_data += 4; | ||
399 | alen -= 4; | ||
400 | } | ||
401 | if (wptr < wend) | ||
402 | break; | ||
403 | _rmd160_calc (arg_obj->state, arg_obj->data); | ||
404 | wptr = arg_obj->data; | ||
405 | } | ||
406 | |||
407 | if (alen) | ||
408 | { | ||
409 | rmd160uint32 w; | ||
410 | w = ((rmd160uint32) (0xff & *(arg_data++))); | ||
411 | if (alen >= 2) | ||
412 | { | ||
413 | w |= ((rmd160uint32) (0xff & *(arg_data++))) << 8; | ||
414 | if (alen >= 3) | ||
415 | { | ||
416 | w |= ((rmd160uint32) (0xff & *(arg_data++))) << 16; | ||
417 | } | ||
418 | } | ||
419 | bpos = alen; | ||
420 | *wptr = w; | ||
421 | } | ||
422 | |||
423 | arg_obj->wptr = wptr; | ||
424 | arg_obj->bpos = bpos; | ||
425 | if ((arg_obj->len[0] = arg_len + arg_obj->len[0]) < arg_len) | ||
426 | { | ||
427 | arg_obj->len[1]++; | ||
428 | } | ||
429 | return RMD160_OK; | ||
430 | |||
431 | } | ||
432 | |||
433 | |||
434 | static int | ||
435 | rmd160_destroy (RMD160 ptr) | ||
436 | { | ||
437 | if (!ptr) | ||
438 | { | ||
439 | return RMD160_ERR_INVALID_ARG; | ||
440 | } | ||
441 | free (ptr); | ||
442 | return RMD160_OK; | ||
443 | } | ||
444 | |||
445 | |||
446 | |||
447 | static RMD160 | ||
448 | rmd160_copy (RMD160 target_p, RMD160 source_p) | ||
449 | { | ||
450 | if (!target_p) | ||
451 | { | ||
452 | if (! | ||
453 | (target_p = | ||
454 | (struct rmd160_object *) malloc (sizeof (struct rmd160_object)))) | ||
455 | { | ||
456 | return NULL; | ||
457 | } | ||
458 | } | ||
459 | |||
460 | if (source_p) | ||
461 | { | ||
462 | target_p->state[0] = source_p->state[0]; | ||
463 | target_p->state[1] = source_p->state[1]; | ||
464 | target_p->state[2] = source_p->state[2]; | ||
465 | target_p->state[3] = source_p->state[3]; | ||
466 | target_p->state[4] = source_p->state[4]; | ||
467 | { | ||
468 | int i; | ||
469 | for (i = 0; i < 16; ++i) | ||
470 | { | ||
471 | target_p->data[i] = source_p->data[i]; | ||
472 | } | ||
473 | } | ||
474 | target_p->len[0] = source_p->len[0]; | ||
475 | target_p->len[1] = source_p->len[1]; | ||
476 | target_p->bpos = source_p->bpos; | ||
477 | target_p->wptr = source_p->wptr - source_p->data + target_p->data; | ||
478 | target_p->wend = 16 + target_p->data; | ||
479 | } | ||
480 | else | ||
481 | { | ||
482 | target_p->state[0] = RMD160_INIT0; | ||
483 | target_p->state[1] = RMD160_INIT1; | ||
484 | target_p->state[2] = RMD160_INIT2; | ||
485 | target_p->state[3] = RMD160_INIT3; | ||
486 | target_p->state[4] = RMD160_INIT4; | ||
487 | { | ||
488 | int i; | ||
489 | for (i = 0; i < 16; ++i) | ||
490 | { | ||
491 | target_p->data[i] = 0U; | ||
492 | } | ||
493 | } | ||
494 | target_p->len[0] = 0U; | ||
495 | target_p->len[1] = 0U; | ||
496 | target_p->bpos = 0; | ||
497 | target_p->wptr = target_p->data; | ||
498 | target_p->wend = 16 + target_p->data; | ||
499 | } | ||
500 | |||
501 | return target_p; | ||
502 | } | ||
503 | |||
504 | |||
505 | |||
506 | static rmd160uint32 * | ||
507 | rmd160_sum_words (RMD160 arg_handle, rmd160uint32 * arg_result_p) | ||
508 | { | ||
509 | struct rmd160_object work; | ||
510 | |||
511 | |||
512 | if (!arg_handle) | ||
513 | return NULL; | ||
514 | |||
515 | if (!arg_result_p | ||
516 | && !(arg_result_p = | ||
517 | (rmd160uint32 *) malloc (5 * sizeof (rmd160uint32)))) | ||
518 | { | ||
519 | return NULL; | ||
520 | } | ||
521 | |||
522 | rmd160_copy (&work, arg_handle); | ||
523 | |||
524 | { | ||
525 | rmd160uint32 *p; | ||
526 | p = work.wptr; | ||
527 | if (work.bpos) | ||
528 | ++p; | ||
529 | while (p < work.wend) | ||
530 | *(p++) = 0U; | ||
531 | } | ||
532 | *(work.wptr) |= ((rmd160uint32) 0x80) << (work.bpos << 3); | ||
533 | |||
534 | if ((work.wend - work.wptr) <= 2) | ||
535 | { | ||
536 | _rmd160_calc (work.state, work.data); | ||
537 | |||
538 | memset (work.data, 0U, 14 * sizeof (rmd160uint32)); | ||
539 | } | ||
540 | |||
541 | work.data[14] = work.len[0] << 3; | ||
542 | work.data[15] = (work.len[1] << 3) | (work.len[0] >> 29); | ||
543 | |||
544 | _rmd160_calc (work.state, work.data); | ||
545 | |||
546 | memcpy (arg_result_p, work.state, 5 * sizeof (rmd160uint32)); | ||
547 | |||
548 | return arg_result_p; | ||
549 | |||
550 | } | ||
551 | |||
552 | |||
553 | |||
554 | static void | ||
555 | rmd160_sum_bytes (RMD160 arg_handle, unsigned char *result_p) | ||
556 | { | ||
557 | rmd160uint32 temp[5]; | ||
558 | rmd160uint32 *ptemp; | ||
559 | |||
560 | if (!rmd160_sum_words (arg_handle, temp)) | ||
561 | return; | ||
562 | |||
563 | ptemp = temp; | ||
564 | { | ||
565 | int i; | ||
566 | for (i = 0; i < 5; ++i) | ||
567 | { | ||
568 | rmd160uint32 w; | ||
569 | *(result_p++) = 0xff & (w = *ptemp); | ||
570 | *(result_p++) = 0xff & (w >> 8); | ||
571 | *(result_p++) = 0xff & (w >> 16); | ||
572 | *(result_p++) = 0xff & (w >> 24); | ||
573 | ++ptemp; | ||
574 | } | ||
575 | } | ||
576 | } | ||
577 | |||
578 | |||
579 | |||
580 | static struct EXTRACTOR_Keywords * | ||
581 | addKeyword (EXTRACTOR_KeywordList * oldhead, | ||
582 | const char *phrase, EXTRACTOR_KeywordType type) | ||
583 | { | ||
584 | |||
585 | EXTRACTOR_KeywordList *keyword; | ||
586 | keyword = malloc (sizeof (EXTRACTOR_KeywordList)); | ||
587 | keyword->next = oldhead; | ||
588 | keyword->keyword = strdup (phrase); | ||
589 | keyword->keywordType = type; | ||
590 | return keyword; | ||
591 | } | ||
592 | |||
593 | #define DIGEST_BITS 160 | ||
594 | #define DIGEST_HEX_BYTES (DIGEST_BITS / 4) | ||
595 | #define DIGEST_BIN_BYTES (DIGEST_BITS / 8) | ||
596 | #define MAX_DIGEST_BIN_BYTES DIGEST_BIN_BYTES | ||
597 | #define rmd160_init(t) rmd160_copy((t),NULL) | ||
598 | #define rmd160_new() rmd160_copy(NULL,NULL) | ||
599 | |||
600 | |||
601 | struct EXTRACTOR_Keywords * | ||
602 | libextractor_hash_rmd160_extract (const char *filename, | ||
603 | const unsigned char *data, | ||
604 | size_t size, | ||
605 | struct EXTRACTOR_Keywords *prev) | ||
606 | { | ||
607 | unsigned char bin_buffer[MAX_DIGEST_BIN_BYTES]; | ||
608 | char hash[8 * MAX_DIGEST_BIN_BYTES]; | ||
609 | char buf[16]; | ||
610 | RMD160 ptr; | ||
611 | int i; | ||
612 | |||
613 | ptr = rmd160_new (); | ||
614 | rmd160_append (ptr, size, data); | ||
615 | rmd160_sum_bytes (ptr, bin_buffer); | ||
616 | rmd160_destroy (ptr); | ||
617 | hash[0] = '\0'; | ||
618 | for (i = 0; i < DIGEST_HEX_BYTES / 2; i++) | ||
619 | { | ||
620 | snprintf (buf, 16, "%02x", bin_buffer[i]); | ||
621 | strcat (hash, buf); | ||
622 | } | ||
623 | prev = addKeyword (prev, hash, EXTRACTOR_HASH_RMD160); | ||
624 | return prev; | ||
625 | } | ||