1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
2 *
3 * LibTomCrypt is a library that provides various cryptographic
4 * algorithms in a highly modular and flexible manner.
5 *
6 * The library is free for all purposes without any express
7 * guarantee it works.
8 *
9 * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10 */
11 #include "tomcrypt.h"
12
13 /**
14 @file rmd320.c
15 RMD320 hash function
16 */
17
18 #ifdef RIPEMD320
19
20 const struct ltc_hash_descriptor rmd320_desc =
21 {
22 "rmd320",
23 9,
24 20,
25 64,
26
27 /* OID */
28 { 0 },
29 0,
30
31 &rmd320_init,
32 &rmd320_process,
33 &rmd320_done,
34 &rmd320_test,
35 NULL
36 };
37
38 /* the five basic functions F(), G() and H() */
39 #define F(x, y, z) ((x) ^ (y) ^ (z))
40 #define G(x, y, z) (((x) & (y)) | (~(x) & (z)))
41 #define H(x, y, z) (((x) | ~(y)) ^ (z))
42 #define I(x, y, z) (((x) & (z)) | ((y) & ~(z)))
43 #define J(x, y, z) ((x) ^ ((y) | ~(z)))
44
45 /* the ten basic operations FF() through III() */
46 #define FF(a, b, c, d, e, x, s) \
47 (a) += F((b), (c), (d)) + (x);\
48 (a) = ROLc((a), (s)) + (e);\
49 (c) = ROLc((c), 10);
50
51 #define GG(a, b, c, d, e, x, s) \
52 (a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
53 (a) = ROLc((a), (s)) + (e);\
54 (c) = ROLc((c), 10);
55
56 #define HH(a, b, c, d, e, x, s) \
57 (a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
58 (a) = ROLc((a), (s)) + (e);\
59 (c) = ROLc((c), 10);
60
61 #define II(a, b, c, d, e, x, s) \
62 (a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
63 (a) = ROLc((a), (s)) + (e);\
64 (c) = ROLc((c), 10);
65
66 #define JJ(a, b, c, d, e, x, s) \
67 (a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL;\
68 (a) = ROLc((a), (s)) + (e);\
69 (c) = ROLc((c), 10);
70
71 #define FFF(a, b, c, d, e, x, s) \
72 (a) += F((b), (c), (d)) + (x);\
73 (a) = ROLc((a), (s)) + (e);\
74 (c) = ROLc((c), 10);
75
76 #define GGG(a, b, c, d, e, x, s) \
77 (a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\
78 (a) = ROLc((a), (s)) + (e);\
79 (c) = ROLc((c), 10);
80
81 #define HHH(a, b, c, d, e, x, s) \
82 (a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL;\
83 (a) = ROLc((a), (s)) + (e);\
84 (c) = ROLc((c), 10);
85
86 #define III(a, b, c, d, e, x, s) \
87 (a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL;\
88 (a) = ROLc((a), (s)) + (e);\
89 (c) = ROLc((c), 10);
90
91 #define JJJ(a, b, c, d, e, x, s) \
92 (a) += J((b), (c), (d)) + (x) + 0x50a28be6UL;\
93 (a) = ROLc((a), (s)) + (e);\
94 (c) = ROLc((c), 10);
95
96
97 #ifdef LTC_CLEAN_STACK
_rmd320_compress(hash_state * md,unsigned char * buf)98 static int _rmd320_compress(hash_state *md, unsigned char *buf)
99 #else
100 static int rmd320_compress(hash_state *md, unsigned char *buf)
101 #endif
102 {
103 ulong32 aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,tmp,X[16];
104 int i;
105
106 /* load words X */
107 for (i = 0; i < 16; i++){
108 LOAD32L(X[i], buf + (4 * i));
109 }
110
111 /* load state */
112 aa = md->rmd320.state[0];
113 bb = md->rmd320.state[1];
114 cc = md->rmd320.state[2];
115 dd = md->rmd320.state[3];
116 ee = md->rmd320.state[4];
117 aaa = md->rmd320.state[5];
118 bbb = md->rmd320.state[6];
119 ccc = md->rmd320.state[7];
120 ddd = md->rmd320.state[8];
121 eee = md->rmd320.state[9];
122
123 /* round 1 */
124 FF(aa, bb, cc, dd, ee, X[ 0], 11);
125 FF(ee, aa, bb, cc, dd, X[ 1], 14);
126 FF(dd, ee, aa, bb, cc, X[ 2], 15);
127 FF(cc, dd, ee, aa, bb, X[ 3], 12);
128 FF(bb, cc, dd, ee, aa, X[ 4], 5);
129 FF(aa, bb, cc, dd, ee, X[ 5], 8);
130 FF(ee, aa, bb, cc, dd, X[ 6], 7);
131 FF(dd, ee, aa, bb, cc, X[ 7], 9);
132 FF(cc, dd, ee, aa, bb, X[ 8], 11);
133 FF(bb, cc, dd, ee, aa, X[ 9], 13);
134 FF(aa, bb, cc, dd, ee, X[10], 14);
135 FF(ee, aa, bb, cc, dd, X[11], 15);
136 FF(dd, ee, aa, bb, cc, X[12], 6);
137 FF(cc, dd, ee, aa, bb, X[13], 7);
138 FF(bb, cc, dd, ee, aa, X[14], 9);
139 FF(aa, bb, cc, dd, ee, X[15], 8);
140
141 /* parallel round 1 */
142 JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
143 JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
144 JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9);
145 JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
146 JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
147 JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
148 JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
149 JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5);
150 JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7);
151 JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7);
152 JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8);
153 JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
154 JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
155 JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
156 JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
157 JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
158
159 tmp = aa; aa = aaa; aaa = tmp;
160
161 /* round 2 */
162 GG(ee, aa, bb, cc, dd, X[ 7], 7);
163 GG(dd, ee, aa, bb, cc, X[ 4], 6);
164 GG(cc, dd, ee, aa, bb, X[13], 8);
165 GG(bb, cc, dd, ee, aa, X[ 1], 13);
166 GG(aa, bb, cc, dd, ee, X[10], 11);
167 GG(ee, aa, bb, cc, dd, X[ 6], 9);
168 GG(dd, ee, aa, bb, cc, X[15], 7);
169 GG(cc, dd, ee, aa, bb, X[ 3], 15);
170 GG(bb, cc, dd, ee, aa, X[12], 7);
171 GG(aa, bb, cc, dd, ee, X[ 0], 12);
172 GG(ee, aa, bb, cc, dd, X[ 9], 15);
173 GG(dd, ee, aa, bb, cc, X[ 5], 9);
174 GG(cc, dd, ee, aa, bb, X[ 2], 11);
175 GG(bb, cc, dd, ee, aa, X[14], 7);
176 GG(aa, bb, cc, dd, ee, X[11], 13);
177 GG(ee, aa, bb, cc, dd, X[ 8], 12);
178
179 /* parallel round 2 */
180 III(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
181 III(ddd, eee, aaa, bbb, ccc, X[11], 13);
182 III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
183 III(bbb, ccc, ddd, eee, aaa, X[ 7], 7);
184 III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
185 III(eee, aaa, bbb, ccc, ddd, X[13], 8);
186 III(ddd, eee, aaa, bbb, ccc, X[ 5], 9);
187 III(ccc, ddd, eee, aaa, bbb, X[10], 11);
188 III(bbb, ccc, ddd, eee, aaa, X[14], 7);
189 III(aaa, bbb, ccc, ddd, eee, X[15], 7);
190 III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
191 III(ddd, eee, aaa, bbb, ccc, X[12], 7);
192 III(ccc, ddd, eee, aaa, bbb, X[ 4], 6);
193 III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
194 III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
195 III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
196
197 tmp = bb; bb = bbb; bbb = tmp;
198
199 /* round 3 */
200 HH(dd, ee, aa, bb, cc, X[ 3], 11);
201 HH(cc, dd, ee, aa, bb, X[10], 13);
202 HH(bb, cc, dd, ee, aa, X[14], 6);
203 HH(aa, bb, cc, dd, ee, X[ 4], 7);
204 HH(ee, aa, bb, cc, dd, X[ 9], 14);
205 HH(dd, ee, aa, bb, cc, X[15], 9);
206 HH(cc, dd, ee, aa, bb, X[ 8], 13);
207 HH(bb, cc, dd, ee, aa, X[ 1], 15);
208 HH(aa, bb, cc, dd, ee, X[ 2], 14);
209 HH(ee, aa, bb, cc, dd, X[ 7], 8);
210 HH(dd, ee, aa, bb, cc, X[ 0], 13);
211 HH(cc, dd, ee, aa, bb, X[ 6], 6);
212 HH(bb, cc, dd, ee, aa, X[13], 5);
213 HH(aa, bb, cc, dd, ee, X[11], 12);
214 HH(ee, aa, bb, cc, dd, X[ 5], 7);
215 HH(dd, ee, aa, bb, cc, X[12], 5);
216
217 /* parallel round 3 */
218 HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
219 HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
220 HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
221 HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
222 HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8);
223 HHH(ddd, eee, aaa, bbb, ccc, X[14], 6);
224 HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6);
225 HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
226 HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
227 HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
228 HHH(ddd, eee, aaa, bbb, ccc, X[12], 5);
229 HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
230 HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
231 HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
232 HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
233 HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
234
235 tmp = cc; cc = ccc; ccc = tmp;
236
237 /* round 4 */
238 II(cc, dd, ee, aa, bb, X[ 1], 11);
239 II(bb, cc, dd, ee, aa, X[ 9], 12);
240 II(aa, bb, cc, dd, ee, X[11], 14);
241 II(ee, aa, bb, cc, dd, X[10], 15);
242 II(dd, ee, aa, bb, cc, X[ 0], 14);
243 II(cc, dd, ee, aa, bb, X[ 8], 15);
244 II(bb, cc, dd, ee, aa, X[12], 9);
245 II(aa, bb, cc, dd, ee, X[ 4], 8);
246 II(ee, aa, bb, cc, dd, X[13], 9);
247 II(dd, ee, aa, bb, cc, X[ 3], 14);
248 II(cc, dd, ee, aa, bb, X[ 7], 5);
249 II(bb, cc, dd, ee, aa, X[15], 6);
250 II(aa, bb, cc, dd, ee, X[14], 8);
251 II(ee, aa, bb, cc, dd, X[ 5], 6);
252 II(dd, ee, aa, bb, cc, X[ 6], 5);
253 II(cc, dd, ee, aa, bb, X[ 2], 12);
254
255 /* parallel round 4 */
256 GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
257 GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
258 GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8);
259 GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
260 GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
261 GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
262 GGG(bbb, ccc, ddd, eee, aaa, X[15], 6);
263 GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
264 GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6);
265 GGG(ddd, eee, aaa, bbb, ccc, X[12], 9);
266 GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
267 GGG(bbb, ccc, ddd, eee, aaa, X[13], 9);
268 GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
269 GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
270 GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
271 GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
272
273 tmp = dd; dd = ddd; ddd = tmp;
274
275 /* round 5 */
276 JJ(bb, cc, dd, ee, aa, X[ 4], 9);
277 JJ(aa, bb, cc, dd, ee, X[ 0], 15);
278 JJ(ee, aa, bb, cc, dd, X[ 5], 5);
279 JJ(dd, ee, aa, bb, cc, X[ 9], 11);
280 JJ(cc, dd, ee, aa, bb, X[ 7], 6);
281 JJ(bb, cc, dd, ee, aa, X[12], 8);
282 JJ(aa, bb, cc, dd, ee, X[ 2], 13);
283 JJ(ee, aa, bb, cc, dd, X[10], 12);
284 JJ(dd, ee, aa, bb, cc, X[14], 5);
285 JJ(cc, dd, ee, aa, bb, X[ 1], 12);
286 JJ(bb, cc, dd, ee, aa, X[ 3], 13);
287 JJ(aa, bb, cc, dd, ee, X[ 8], 14);
288 JJ(ee, aa, bb, cc, dd, X[11], 11);
289 JJ(dd, ee, aa, bb, cc, X[ 6], 8);
290 JJ(cc, dd, ee, aa, bb, X[15], 5);
291 JJ(bb, cc, dd, ee, aa, X[13], 6);
292
293 /* parallel round 5 */
294 FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8);
295 FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5);
296 FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
297 FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9);
298 FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
299 FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5);
300 FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
301 FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6);
302 FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8);
303 FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
304 FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6);
305 FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5);
306 FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
307 FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
308 FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
309 FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
310
311 tmp = ee; ee = eee; eee = tmp;
312
313 /* combine results */
314 md->rmd320.state[0] += aa;
315 md->rmd320.state[1] += bb;
316 md->rmd320.state[2] += cc;
317 md->rmd320.state[3] += dd;
318 md->rmd320.state[4] += ee;
319 md->rmd320.state[5] += aaa;
320 md->rmd320.state[6] += bbb;
321 md->rmd320.state[7] += ccc;
322 md->rmd320.state[8] += ddd;
323 md->rmd320.state[9] += eee;
324
325 return CRYPT_OK;
326 }
327
328 #ifdef LTC_CLEAN_STACK
rmd320_compress(hash_state * md,unsigned char * buf)329 static int rmd320_compress(hash_state *md, unsigned char *buf)
330 {
331 int err;
332 err = _rmd320_compress(md, buf);
333 burn_stack(sizeof(ulong32) * 27 + sizeof(int));
334 return err;
335 }
336 #endif
337
338 /**
339 Initialize the hash state
340 @param md The hash state you wish to initialize
341 @return CRYPT_OK if successful
342 */
rmd320_init(hash_state * md)343 int rmd320_init(hash_state * md)
344 {
345 LTC_ARGCHK(md != NULL);
346 md->rmd320.state[0] = 0x67452301UL;
347 md->rmd320.state[1] = 0xefcdab89UL;
348 md->rmd320.state[2] = 0x98badcfeUL;
349 md->rmd320.state[3] = 0x10325476UL;
350 md->rmd320.state[4] = 0xc3d2e1f0UL;
351 md->rmd320.state[5] = 0x76543210UL;
352 md->rmd320.state[6] = 0xfedcba98UL;
353 md->rmd320.state[7] = 0x89abcdefUL;
354 md->rmd320.state[8] = 0x01234567UL;
355 md->rmd320.state[9] = 0x3c2d1e0fUL;
356 md->rmd320.curlen = 0;
357 md->rmd320.length = 0;
358 return CRYPT_OK;
359 }
360
361 /**
362 Process a block of memory though the hash
363 @param md The hash state
364 @param in The data to hash
365 @param inlen The length of the data (octets)
366 @return CRYPT_OK if successful
367 */
368 HASH_PROCESS(rmd320_process, rmd320_compress, rmd320, 64)
369
370 /**
371 Terminate the hash to get the digest
372 @param md The hash state
373 @param out [out] The destination of the hash (20 bytes)
374 @return CRYPT_OK if successful
375 */
rmd320_done(hash_state * md,unsigned char * out)376 int rmd320_done(hash_state * md, unsigned char *out)
377 {
378 int i;
379
380 LTC_ARGCHK(md != NULL);
381 LTC_ARGCHK(out != NULL);
382
383 if (md->rmd320.curlen >= sizeof(md->rmd320.buf)) {
384 return CRYPT_INVALID_ARG;
385 }
386
387
388 /* increase the length of the message */
389 md->rmd320.length += md->rmd320.curlen * 8;
390
391 /* append the '1' bit */
392 md->rmd320.buf[md->rmd320.curlen++] = (unsigned char)0x80;
393
394 /* if the length is currently above 56 bytes we append zeros
395 * then compress. Then we can fall back to padding zeros and length
396 * encoding like normal.
397 */
398 if (md->rmd320.curlen > 56) {
399 while (md->rmd320.curlen < 64) {
400 md->rmd320.buf[md->rmd320.curlen++] = (unsigned char)0;
401 }
402 rmd320_compress(md, md->rmd320.buf);
403 md->rmd320.curlen = 0;
404 }
405
406 /* pad upto 56 bytes of zeroes */
407 while (md->rmd320.curlen < 56) {
408 md->rmd320.buf[md->rmd320.curlen++] = (unsigned char)0;
409 }
410
411 /* store length */
412 STORE64L(md->rmd320.length, md->rmd320.buf+56);
413 rmd320_compress(md, md->rmd320.buf);
414
415 /* copy output */
416 for (i = 0; i < 10; i++) {
417 STORE32L(md->rmd320.state[i], out+(4*i));
418 }
419 #ifdef LTC_CLEAN_STACK
420 zeromem(md, sizeof(hash_state));
421 #endif
422 return CRYPT_OK;
423 }
424
425 /**
426 Self-test the hash
427 @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
428 */
rmd320_test(void)429 int rmd320_test(void)
430 {
431 #ifndef LTC_TEST
432 return CRYPT_NOP;
433 #else
434 static const struct {
435 char *msg;
436 unsigned char md[40];
437 } tests[] = {
438 { "",
439 { 0x22, 0xd6, 0x5d, 0x56, 0x61, 0x53, 0x6c, 0xdc, 0x75, 0xc1,
440 0xfd, 0xf5, 0xc6, 0xde, 0x7b, 0x41, 0xb9, 0xf2, 0x73, 0x25,
441 0xeb, 0xc6, 0x1e, 0x85, 0x57, 0x17, 0x7d, 0x70, 0x5a, 0x0e,
442 0xc8, 0x80, 0x15, 0x1c, 0x3a, 0x32, 0xa0, 0x08, 0x99, 0xb8 }
443 },
444 { "a",
445 { 0xce, 0x78, 0x85, 0x06, 0x38, 0xf9, 0x26, 0x58, 0xa5, 0xa5,
446 0x85, 0x09, 0x75, 0x79, 0x92, 0x6d, 0xda, 0x66, 0x7a, 0x57,
447 0x16, 0x56, 0x2c, 0xfc, 0xf6, 0xfb, 0xe7, 0x7f, 0x63, 0x54,
448 0x2f, 0x99, 0xb0, 0x47, 0x05, 0xd6, 0x97, 0x0d, 0xff, 0x5d }
449 },
450 { "abc",
451 { 0xde, 0x4c, 0x01, 0xb3, 0x05, 0x4f, 0x89, 0x30, 0xa7, 0x9d,
452 0x09, 0xae, 0x73, 0x8e, 0x92, 0x30, 0x1e, 0x5a, 0x17, 0x08,
453 0x5b, 0xef, 0xfd, 0xc1, 0xb8, 0xd1, 0x16, 0x71, 0x3e, 0x74,
454 0xf8, 0x2f, 0xa9, 0x42, 0xd6, 0x4c, 0xdb, 0xc4, 0x68, 0x2d }
455 },
456 { "message digest",
457 { 0x3a, 0x8e, 0x28, 0x50, 0x2e, 0xd4, 0x5d, 0x42, 0x2f, 0x68,
458 0x84, 0x4f, 0x9d, 0xd3, 0x16, 0xe7, 0xb9, 0x85, 0x33, 0xfa,
459 0x3f, 0x2a, 0x91, 0xd2, 0x9f, 0x84, 0xd4, 0x25, 0xc8, 0x8d,
460 0x6b, 0x4e, 0xff, 0x72, 0x7d, 0xf6, 0x6a, 0x7c, 0x01, 0x97 }
461 },
462 { "abcdefghijklmnopqrstuvwxyz",
463 { 0xca, 0xbd, 0xb1, 0x81, 0x0b, 0x92, 0x47, 0x0a, 0x20, 0x93,
464 0xaa, 0x6b, 0xce, 0x05, 0x95, 0x2c, 0x28, 0x34, 0x8c, 0xf4,
465 0x3f, 0xf6, 0x08, 0x41, 0x97, 0x51, 0x66, 0xbb, 0x40, 0xed,
466 0x23, 0x40, 0x04, 0xb8, 0x82, 0x44, 0x63, 0xe6, 0xb0, 0x09 }
467 },
468 { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
469 { 0xd0, 0x34, 0xa7, 0x95, 0x0c, 0xf7, 0x22, 0x02, 0x1b, 0xa4,
470 0xb8, 0x4d, 0xf7, 0x69, 0xa5, 0xde, 0x20, 0x60, 0xe2, 0x59,
471 0xdf, 0x4c, 0x9b, 0xb4, 0xa4, 0x26, 0x8c, 0x0e, 0x93, 0x5b,
472 0xbc, 0x74, 0x70, 0xa9, 0x69, 0xc9, 0xd0, 0x72, 0xa1, 0xac }
473 }
474 };
475 int x;
476 unsigned char buf[40];
477 hash_state md;
478
479 for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
480 rmd320_init(&md);
481 rmd320_process(&md, (unsigned char *)tests[x].msg, strlen(tests[x].msg));
482 rmd320_done(&md, buf);
483 if (XMEMCMP(buf, tests[x].md, 40) != 0) {
484 #if 0
485 printf("Failed test %d\n", x);
486 #endif
487 return CRYPT_FAIL_TESTVECTOR;
488 }
489 }
490 return CRYPT_OK;
491 #endif
492 }
493
494 #endif
495
496