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 rmd256.c
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   RMD256 Hash function
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIPEMD256
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectconst struct ltc_hash_descriptor rmd256_desc =
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    "rmd256",
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    8,
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    16,
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    64,
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* OID */
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { 1, 3, 36, 3, 2, 3 },
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   6,
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd256_init,
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd256_process,
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd256_done,
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd256_test,
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    NULL
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project};
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* the four basic functions F(), G() and H() */
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define F(x, y, z)        ((x) ^ (y) ^ (z))
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define G(x, y, z)        (((x) & (y)) | (~(x) & (z)))
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define H(x, y, z)        (((x) | ~(y)) ^ (z))
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define I(x, y, z)        (((x) & (z)) | ((y) & ~(z)))
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* the eight basic operations FF() through III() */
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define FF(a, b, c, d, x, s)        \
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += F((b), (c), (d)) + (x);\
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define GG(a, b, c, d, x, s)        \
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define HH(a, b, c, d, x, s)        \
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define II(a, b, c, d, x, s)        \
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define FFF(a, b, c, d, x, s)        \
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += F((b), (c), (d)) + (x);\
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define GGG(a, b, c, d, x, s)        \
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += G((b), (c), (d)) + (x) + 0x6d703ef3UL;\
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define HHH(a, b, c, d, x, s)        \
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += H((b), (c), (d)) + (x) + 0x5c4dd124UL;\
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define III(a, b, c, d, x, s)        \
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += I((b), (c), (d)) + (x) + 0x50a28be6UL;\
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s));
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int _rmd256_compress(hash_state *md, unsigned char *buf)
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int  rmd256_compress(hash_state *md, unsigned char *buf)
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong32 aa,bb,cc,dd,aaa,bbb,ccc,ddd,tmp,X[16];
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int i;
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* load words X */
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (i = 0; i < 16; i++){
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      LOAD32L(X[i], buf + (4 * i));
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* load state */
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   aa = md->rmd256.state[0];
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   bb = md->rmd256.state[1];
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   cc = md->rmd256.state[2];
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   dd = md->rmd256.state[3];
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   aaa = md->rmd256.state[4];
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   bbb = md->rmd256.state[5];
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ccc = md->rmd256.state[6];
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ddd = md->rmd256.state[7];
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 1 */
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, X[ 0], 11);
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, aa, bb, cc, X[ 1], 14);
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, aa, bb, X[ 2], 15);
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, aa, X[ 3], 12);
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, X[ 4],  5);
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, aa, bb, cc, X[ 5],  8);
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, aa, bb, X[ 6],  7);
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, aa, X[ 7],  9);
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, X[ 8], 11);
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, aa, bb, cc, X[ 9], 13);
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, aa, bb, X[10], 14);
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, aa, X[11], 15);
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, X[12],  6);
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, aa, bb, cc, X[13],  7);
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, aa, bb, X[14],  9);
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, aa, X[15],  8);
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 1 */
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, X[ 5],  8);
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, aaa, bbb, ccc, X[14],  9);
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, aaa, bbb, X[ 7],  9);
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, aaa, X[ 0], 11);
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, X[ 9], 13);
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, aaa, bbb, ccc, X[ 2], 15);
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, aaa, bbb, X[11], 15);
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, aaa, X[ 4],  5);
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, X[13],  7);
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, aaa, bbb, ccc, X[ 6],  7);
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, aaa, bbb, X[15],  8);
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, aaa, X[ 8], 11);
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, X[ 1], 14);
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, aaa, bbb, ccc, X[10], 14);
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, aaa, bbb, X[ 3], 12);
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, aaa, X[12],  6);
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tmp = aa; aa = aaa; aaa = tmp;
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 2 */
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, X[ 7],  7);
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, aa, bb, cc, X[ 4],  6);
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, aa, bb, X[13],  8);
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, aa, X[ 1], 13);
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, X[10], 11);
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, aa, bb, cc, X[ 6],  9);
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, aa, bb, X[15],  7);
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, aa, X[ 3], 15);
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, X[12],  7);
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, aa, bb, cc, X[ 0], 12);
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, aa, bb, X[ 9], 15);
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, aa, X[ 5],  9);
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, X[ 2], 11);
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, aa, bb, cc, X[14],  7);
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, aa, bb, X[11], 13);
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, aa, X[ 8], 12);
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 2 */
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, X[ 6],  9);
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, aaa, bbb, ccc, X[11], 13);
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, aaa, bbb, X[ 3], 15);
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, aaa, X[ 7],  7);
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, X[ 0], 12);
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, aaa, bbb, ccc, X[13],  8);
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, aaa, bbb, X[ 5],  9);
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, aaa, X[10], 11);
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, X[14],  7);
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, aaa, bbb, ccc, X[15],  7);
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, aaa, bbb, X[ 8], 12);
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, aaa, X[12],  7);
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, X[ 4],  6);
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, aaa, bbb, ccc, X[ 9], 15);
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, aaa, bbb, X[ 1], 13);
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, aaa, X[ 2], 11);
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tmp = bb; bb = bbb; bbb = tmp;
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 3 */
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, X[ 3], 11);
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, aa, bb, cc, X[10], 13);
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, aa, bb, X[14],  6);
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, aa, X[ 4],  7);
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, X[ 9], 14);
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, aa, bb, cc, X[15],  9);
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, aa, bb, X[ 8], 13);
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, aa, X[ 1], 15);
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, X[ 2], 14);
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, aa, bb, cc, X[ 7],  8);
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, aa, bb, X[ 0], 13);
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, aa, X[ 6],  6);
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, X[13],  5);
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, aa, bb, cc, X[11], 12);
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, aa, bb, X[ 5],  7);
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, aa, X[12],  5);
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 3 */
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, X[15],  9);
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, aaa, bbb, ccc, X[ 5],  7);
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, aaa, bbb, X[ 1], 15);
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, aaa, X[ 3], 11);
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, X[ 7],  8);
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, aaa, bbb, ccc, X[14],  6);
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, aaa, bbb, X[ 6],  6);
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, aaa, X[ 9], 14);
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, X[11], 12);
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, aaa, bbb, ccc, X[ 8], 13);
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, aaa, bbb, X[12],  5);
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, aaa, X[ 2], 14);
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, X[10], 13);
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, aaa, bbb, ccc, X[ 0], 13);
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, aaa, bbb, X[ 4],  7);
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, aaa, X[13],  5);
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tmp = cc; cc = ccc; ccc = tmp;
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 4 */
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, X[ 1], 11);
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, aa, bb, cc, X[ 9], 12);
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, aa, bb, X[11], 14);
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, aa, X[10], 15);
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, X[ 0], 14);
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, aa, bb, cc, X[ 8], 15);
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, aa, bb, X[12],  9);
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, aa, X[ 4],  8);
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, X[13],  9);
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, aa, bb, cc, X[ 3], 14);
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, aa, bb, X[ 7],  5);
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, aa, X[15],  6);
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, X[14],  8);
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, aa, bb, cc, X[ 5],  6);
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, aa, bb, X[ 6],  5);
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, aa, X[ 2], 12);
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 4 */
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, X[ 8], 15);
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, aaa, bbb, ccc, X[ 6],  5);
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, aaa, bbb, X[ 4],  8);
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, aaa, X[ 1], 11);
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, X[ 3], 14);
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, aaa, bbb, ccc, X[11], 14);
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, aaa, bbb, X[15],  6);
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, aaa, X[ 0], 14);
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, X[ 5],  6);
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, aaa, bbb, ccc, X[12],  9);
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, aaa, bbb, X[ 2], 12);
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, aaa, X[13],  9);
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, X[ 9], 12);
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, aaa, bbb, ccc, X[ 7],  5);
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, aaa, bbb, X[10], 15);
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, aaa, X[14],  8);
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   tmp = dd; dd = ddd; ddd = tmp;
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* combine results */
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[0] += aa;
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[1] += bb;
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[2] += cc;
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[3] += dd;
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[4] += aaa;
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[5] += bbb;
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[6] += ccc;
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[7] += ddd;
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int rmd256_compress(hash_state *md, unsigned char *buf)
268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err;
270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   err = _rmd256_compress(md, buf);
271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   burn_stack(sizeof(ulong32) * 25 + sizeof(int));
272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return err;
273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Initialize the hash state
278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md   The hash state you wish to initialize
279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd256_init(hash_state * md)
282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(md != NULL);
284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[0] = 0x67452301UL;
285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[1] = 0xefcdab89UL;
286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[2] = 0x98badcfeUL;
287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[3] = 0x10325476UL;
288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[4] = 0x76543210UL;
289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[5] = 0xfedcba98UL;
290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[6] = 0x89abcdefUL;
291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.state[7] = 0x01234567UL;
292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.curlen   = 0;
293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd256.length   = 0;
294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Process a block of memory though the hash
299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md     The hash state
300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param in     The data to hash
301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param inlen  The length of the data (octets)
302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectHASH_PROCESS(rmd256_process, rmd256_compress, rmd256, 64)
305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Terminate the hash to get the digest
308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md  The hash state
309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param out [out] The destination of the hash (16 bytes)
310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd256_done(hash_state * md, unsigned char *out)
313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    int i;
315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    LTC_ARGCHK(md  != NULL);
317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    LTC_ARGCHK(out != NULL);
318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if (md->rmd256.curlen >= sizeof(md->rmd256.buf)) {
320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       return CRYPT_INVALID_ARG;
321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* increase the length of the message */
325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    md->rmd256.length += md->rmd256.curlen * 8;
326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* append the '1' bit */
328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    md->rmd256.buf[md->rmd256.curlen++] = (unsigned char)0x80;
329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* if the length is currently above 56 bytes we append zeros
331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     * then compress.  Then we can fall back to padding zeros and length
332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     * encoding like normal.
333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     */
334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if (md->rmd256.curlen > 56) {
335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        while (md->rmd256.curlen < 64) {
336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            md->rmd256.buf[md->rmd256.curlen++] = (unsigned char)0;
337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        rmd256_compress(md, md->rmd256.buf);
339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        md->rmd256.curlen = 0;
340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* pad upto 56 bytes of zeroes */
343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    while (md->rmd256.curlen < 56) {
344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        md->rmd256.buf[md->rmd256.curlen++] = (unsigned char)0;
345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* store length */
348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    STORE64L(md->rmd256.length, md->rmd256.buf+56);
349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    rmd256_compress(md, md->rmd256.buf);
350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* copy output */
352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (i = 0; i < 8; i++) {
353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        STORE32L(md->rmd256.state[i], out+(4*i));
354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    zeromem(md, sizeof(hash_state));
357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  Self-test the hash
363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd256_test(void)
366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef LTC_TEST
368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_NOP;
369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   static const struct {
371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        char *msg;
372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        unsigned char md[32];
373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } tests[] = {
374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "",
375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x02, 0xba, 0x4c, 0x4e, 0x5f, 0x8e, 0xcd, 0x18,
376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x77, 0xfc, 0x52, 0xd6, 0x4d, 0x30, 0xe3, 0x7a,
377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x2d, 0x97, 0x74, 0xfb, 0x1e, 0x5d, 0x02, 0x63,
378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x80, 0xae, 0x01, 0x68, 0xe3, 0xc5, 0x52, 0x2d }
379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "a",
381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0xf9, 0x33, 0x3e, 0x45, 0xd8, 0x57, 0xf5, 0xd9,
382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x0a, 0x91, 0xba, 0xb7, 0x0a, 0x1e, 0xba, 0x0c,
383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xfb, 0x1b, 0xe4, 0xb0, 0x78, 0x3c, 0x9a, 0xcf,
384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xcd, 0x88, 0x3a, 0x91, 0x34, 0x69, 0x29, 0x25 }
385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "abc",
387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0xaf, 0xbd, 0x6e, 0x22, 0x8b, 0x9d, 0x8c, 0xbb,
388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xce, 0xf5, 0xca, 0x2d, 0x03, 0xe6, 0xdb, 0xa1,
389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x0a, 0xc0, 0xbc, 0x7d, 0xcb, 0xe4, 0x68, 0x0e,
390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x1e, 0x42, 0xd2, 0xe9, 0x75, 0x45, 0x9b, 0x65 }
391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "message digest",
393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x87, 0xe9, 0x71, 0x75, 0x9a, 0x1c, 0xe4, 0x7a,
394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x51, 0x4d, 0x5c, 0x91, 0x4c, 0x39, 0x2c, 0x90,
395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x18, 0xc7, 0xc4, 0x6b, 0xc1, 0x44, 0x65, 0x55,
396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x4a, 0xfc, 0xdf, 0x54, 0xa5, 0x07, 0x0c, 0x0e }
397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "abcdefghijklmnopqrstuvwxyz",
399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x64, 0x9d, 0x30, 0x34, 0x75, 0x1e, 0xa2, 0x16,
400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x77, 0x6b, 0xf9, 0xa1, 0x8a, 0xcc, 0x81, 0xbc,
401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x78, 0x96, 0x11, 0x8a, 0x51, 0x97, 0x96, 0x87,
402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x82, 0xdd, 0x1f, 0xd9, 0x7d, 0x8d, 0x51, 0x33 }
403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x57, 0x40, 0xa4, 0x08, 0xac, 0x16, 0xb7, 0x20,
406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xb8, 0x44, 0x24, 0xae, 0x93, 0x1c, 0xbb, 0x1f,
407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xe3, 0x63, 0xd1, 0xd0, 0xbf, 0x40, 0x17, 0xf1,
408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xa8, 0x9f, 0x7e, 0xa6, 0xde, 0x77, 0xa0, 0xb8 }
409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   };
411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int x;
412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char buf[32];
413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   hash_state md;
414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd256_init(&md);
417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd256_process(&md, (unsigned char *)tests[x].msg, strlen(tests[x].msg));
418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd256_done(&md, buf);
419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if (XMEMCMP(buf, tests[x].md, 32) != 0) {
420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #if 0
421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          printf("Failed test %d\n", x);
422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       #endif
423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          return CRYPT_FAIL_TESTVECTOR;
424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
425f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
426f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
427f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
428f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
429f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
430f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
431f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
432