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