1f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* LibTomCrypt, modular cryptographic library -- Tom St Denis
2f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
3f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * LibTomCrypt is a library that provides various cryptographic
4f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * algorithms in a highly modular and flexible manner.
5f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
6f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * The library is free for all purposes without any express
7f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * guarantee it works.
8f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
9f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
10f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
11f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#include "tomcrypt.h"
12f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
13f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
14f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param rmd128.c
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   RMD128 Hash function
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Implementation of RIPEMD-128 based on the source by Antoon Bosselaers, ESAT-COSIC
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * This source has been radically overhauled to be portable and work within
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * the LibTomCrypt API by Tom St Denis
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIPEMD128
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectconst struct ltc_hash_descriptor rmd128_desc =
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    "rmd128",
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    8,
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    16,
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    64,
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* OID */
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { 1, 0, 10118, 3, 0, 50 },
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   6,
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd128_init,
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd128_process,
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd128_done,
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd128_test,
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    NULL
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project};
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* the four basic functions F(), G() and H() */
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define F(x, y, z)        ((x) ^ (y) ^ (z))
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define G(x, y, z)        (((x) & (y)) | (~(x) & (z)))
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define H(x, y, z)        (((x) | ~(y)) ^ (z))
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define I(x, y, z)        (((x) & (z)) | ((y) & ~(z)))
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* the eight basic operations FF() through III() */
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define FF(a, b, c, d, x, s)        \
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += F((b), (c), (d)) + (x);\
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define GG(a, b, c, d, x, s)        \
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define HH(a, b, c, d, x, s)        \
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define II(a, b, c, d, x, s)        \
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define FFF(a, b, c, d, x, s)        \
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += F((b), (c), (d)) + (x);\
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define GGG(a, b, c, d, x, s)        \
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += G((b), (c), (d)) + (x) + 0x6d703ef3UL;\
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define HHH(a, b, c, d, x, s)        \
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += H((b), (c), (d)) + (x) + 0x5c4dd124UL;\
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define III(a, b, c, d, x, s)        \
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += I((b), (c), (d)) + (x) + 0x50a28be6UL;\
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int _rmd128_compress(hash_state *md, unsigned char *buf)
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int  rmd128_compress(hash_state *md, unsigned char *buf)
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong32 aa,bb,cc,dd,aaa,bbb,ccc,ddd,X[16];
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int i;
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* load words X */
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (i = 0; i < 16; i++){
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      LOAD32L(X[i], buf + (4 * i));
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* load state */
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   aa = aaa = md->rmd128.state[0];
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   bb = bbb = md->rmd128.state[1];
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   cc = ccc = md->rmd128.state[2];
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   dd = ddd = md->rmd128.state[3];
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 1 */
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, X[ 0], 11);
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, aa, bb, cc, X[ 1], 14);
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, aa, bb, X[ 2], 15);
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, aa, X[ 3], 12);
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, X[ 4],  5);
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, aa, bb, cc, X[ 5],  8);
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, aa, bb, X[ 6],  7);
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, aa, X[ 7],  9);
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, X[ 8], 11);
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, aa, bb, cc, X[ 9], 13);
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, aa, bb, X[10], 14);
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, aa, X[11], 15);
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, X[12],  6);
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, aa, bb, cc, X[13],  7);
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, aa, bb, X[14],  9);
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, aa, X[15],  8);
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 2 */
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, X[ 7],  7);
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, aa, bb, cc, X[ 4],  6);
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, aa, bb, X[13],  8);
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, aa, X[ 1], 13);
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, X[10], 11);
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, aa, bb, cc, X[ 6],  9);
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, aa, bb, X[15],  7);
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, aa, X[ 3], 15);
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, X[12],  7);
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, aa, bb, cc, X[ 0], 12);
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, aa, bb, X[ 9], 15);
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, aa, X[ 5],  9);
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, X[ 2], 11);
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, aa, bb, cc, X[14],  7);
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, aa, bb, X[11], 13);
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, aa, X[ 8], 12);
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 3 */
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, X[ 3], 11);
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, aa, bb, cc, X[10], 13);
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, aa, bb, X[14],  6);
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, aa, X[ 4],  7);
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, X[ 9], 14);
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, aa, bb, cc, X[15],  9);
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, aa, bb, X[ 8], 13);
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, aa, X[ 1], 15);
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, X[ 2], 14);
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, aa, bb, cc, X[ 7],  8);
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, aa, bb, X[ 0], 13);
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, aa, X[ 6],  6);
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, X[13],  5);
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, aa, bb, cc, X[11], 12);
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, aa, bb, X[ 5],  7);
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, aa, X[12],  5);
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 4 */
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, X[ 1], 11);
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, aa, bb, cc, X[ 9], 12);
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, aa, bb, X[11], 14);
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, aa, X[10], 15);
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, X[ 0], 14);
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, aa, bb, cc, X[ 8], 15);
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, aa, bb, X[12],  9);
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, aa, X[ 4],  8);
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, X[13],  9);
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, aa, bb, cc, X[ 3], 14);
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, aa, bb, X[ 7],  5);
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, aa, X[15],  6);
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, X[14],  8);
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, aa, bb, cc, X[ 5],  6);
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, aa, bb, X[ 6],  5);
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, aa, X[ 2], 12);
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 1 */
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, X[ 5],  8);
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, aaa, bbb, ccc, X[14],  9);
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, aaa, bbb, X[ 7],  9);
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, aaa, X[ 0], 11);
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, X[ 9], 13);
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, aaa, bbb, ccc, X[ 2], 15);
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, aaa, bbb, X[11], 15);
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, aaa, X[ 4],  5);
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, X[13],  7);
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, aaa, bbb, ccc, X[ 6],  7);
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, aaa, bbb, X[15],  8);
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, aaa, X[ 8], 11);
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, X[ 1], 14);
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, aaa, bbb, ccc, X[10], 14);
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, aaa, bbb, X[ 3], 12);
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, aaa, X[12],  6);
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 2 */
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, X[ 6],  9);
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, aaa, bbb, ccc, X[11], 13);
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, aaa, bbb, X[ 3], 15);
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, aaa, X[ 7],  7);
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, X[ 0], 12);
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, aaa, bbb, ccc, X[13],  8);
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, aaa, bbb, X[ 5],  9);
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, aaa, X[10], 11);
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, X[14],  7);
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, aaa, bbb, ccc, X[15],  7);
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, aaa, bbb, X[ 8], 12);
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, aaa, X[12],  7);
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, X[ 4],  6);
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, aaa, bbb, ccc, X[ 9], 15);
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, aaa, bbb, X[ 1], 13);
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, aaa, X[ 2], 11);
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 3 */
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, X[15],  9);
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, aaa, bbb, ccc, X[ 5],  7);
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, aaa, bbb, X[ 1], 15);
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, aaa, X[ 3], 11);
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, X[ 7],  8);
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, aaa, bbb, ccc, X[14],  6);
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, aaa, bbb, X[ 6],  6);
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, aaa, X[ 9], 14);
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, X[11], 12);
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, aaa, bbb, ccc, X[ 8], 13);
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, aaa, bbb, X[12],  5);
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, aaa, X[ 2], 14);
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, X[10], 13);
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, aaa, bbb, ccc, X[ 0], 13);
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, aaa, bbb, X[ 4],  7);
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, aaa, X[13],  5);
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 4 */
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, X[ 8], 15);
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, aaa, bbb, ccc, X[ 6],  5);
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, aaa, bbb, X[ 4],  8);
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, aaa, X[ 1], 11);
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, X[ 3], 14);
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, aaa, bbb, ccc, X[11], 14);
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, aaa, bbb, X[15],  6);
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, aaa, X[ 0], 14);
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, X[ 5],  6);
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, aaa, bbb, ccc, X[12],  9);
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, aaa, bbb, X[ 2], 12);
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, aaa, X[13],  9);
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, X[ 9], 12);
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, aaa, bbb, ccc, X[ 7],  5);
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, aaa, bbb, X[10], 15);
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, aaa, X[14],  8);
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* combine results */
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ddd += cc + md->rmd128.state[1];               /* final result for MDbuf[0] */
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.state[1] = md->rmd128.state[2] + dd + aaa;
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.state[2] = md->rmd128.state[3] + aa + bbb;
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.state[3] = md->rmd128.state[0] + bb + ccc;
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.state[0] = ddd;
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int rmd128_compress(hash_state *md, unsigned char *buf)
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err;
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   err = _rmd128_compress(md, buf);
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   burn_stack(sizeof(ulong32) * 24 + sizeof(int));
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return err;
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Initialize the hash state
269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md   The hash state you wish to initialize
270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd128_init(hash_state * md)
273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(md != NULL);
275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.state[0] = 0x67452301UL;
276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.state[1] = 0xefcdab89UL;
277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.state[2] = 0x98badcfeUL;
278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.state[3] = 0x10325476UL;
279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.curlen   = 0;
280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd128.length   = 0;
281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Process a block of memory though the hash
286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md     The hash state
287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param in     The data to hash
288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param inlen  The length of the data (octets)
289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectHASH_PROCESS(rmd128_process, rmd128_compress, rmd128, 64)
292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Terminate the hash to get the digest
295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md  The hash state
296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param out [out] The destination of the hash (16 bytes)
297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd128_done(hash_state * md, unsigned char *out)
300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    int i;
302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    LTC_ARGCHK(md  != NULL);
304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    LTC_ARGCHK(out != NULL);
305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if (md->rmd128.curlen >= sizeof(md->rmd128.buf)) {
307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       return CRYPT_INVALID_ARG;
308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* increase the length of the message */
312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    md->rmd128.length += md->rmd128.curlen * 8;
313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* append the '1' bit */
315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    md->rmd128.buf[md->rmd128.curlen++] = (unsigned char)0x80;
316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* if the length is currently above 56 bytes we append zeros
318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     * then compress.  Then we can fall back to padding zeros and length
319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     * encoding like normal.
320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     */
321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if (md->rmd128.curlen > 56) {
322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        while (md->rmd128.curlen < 64) {
323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            md->rmd128.buf[md->rmd128.curlen++] = (unsigned char)0;
324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        rmd128_compress(md, md->rmd128.buf);
326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        md->rmd128.curlen = 0;
327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* pad upto 56 bytes of zeroes */
330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    while (md->rmd128.curlen < 56) {
331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        md->rmd128.buf[md->rmd128.curlen++] = (unsigned char)0;
332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* store length */
335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    STORE64L(md->rmd128.length, md->rmd128.buf+56);
336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    rmd128_compress(md, md->rmd128.buf);
337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* copy output */
339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (i = 0; i < 4; i++) {
340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        STORE32L(md->rmd128.state[i], out+(4*i));
341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    zeromem(md, sizeof(hash_state));
344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  Self-test the hash
350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd128_test(void)
353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef LTC_TEST
355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_NOP;
356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   static const struct {
358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        char *msg;
359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        unsigned char md[16];
360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } tests[] = {
361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "",
362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0xcd, 0xf2, 0x62, 0x13, 0xa1, 0x50, 0xdc, 0x3e,
363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xcb, 0x61, 0x0f, 0x18, 0xf6, 0xb3, 0x8b, 0x46 }
364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "a",
366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x86, 0xbe, 0x7a, 0xfa, 0x33, 0x9d, 0x0f, 0xc7,
367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xcf, 0xc7, 0x85, 0xe7, 0x2f, 0x57, 0x8d, 0x33 }
368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "abc",
370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0xc1, 0x4a, 0x12, 0x19, 0x9c, 0x66, 0xe4, 0xba,
371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x84, 0x63, 0x6b, 0x0f, 0x69, 0x14, 0x4c, 0x77 }
372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "message digest",
374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x9e, 0x32, 0x7b, 0x3d, 0x6e, 0x52, 0x30, 0x62,
375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xaf, 0xc1, 0x13, 0x2d, 0x7d, 0xf9, 0xd1, 0xb8 }
376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "abcdefghijklmnopqrstuvwxyz",
378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0xfd, 0x2a, 0xa6, 0x07, 0xf7, 0x1d, 0xc8, 0xf5,
379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x10, 0x71, 0x49, 0x22, 0xb3, 0x71, 0x83, 0x4e }
380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0xd1, 0xe9, 0x59, 0xeb, 0x17, 0x9c, 0x91, 0x1f,
383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xae, 0xa4, 0x62, 0x4c, 0x60, 0xc5, 0xc7, 0x02 }
384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   };
386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int x;
387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char buf[16];
388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   hash_state md;
389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd128_init(&md);
392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd128_process(&md, (unsigned char *)tests[x].msg, strlen(tests[x].msg));
393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd128_done(&md, buf);
394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if (XMEMCMP(buf, tests[x].md, 16) != 0) {
395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #if 0
396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          printf("Failed test %d\n", x);
397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #endif
398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          return CRYPT_FAIL_TESTVECTOR;
399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/hashes/rmd128.c,v $ */
409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.9 $ */
410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/01 09:28:17 $ */
411