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 rmd160.c
15f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   RMD160 hash function
16f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
17f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
18f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* Implementation of RIPEMD-160 based on the source by Antoon Bosselaers, ESAT-COSIC
19f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project *
20f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * This source has been radically overhauled to be portable and work within
21f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project * the LibTomCrypt API by Tom St Denis
22f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project */
23f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
24f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef RIPEMD160
25f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
26f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectconst struct ltc_hash_descriptor rmd160_desc =
27f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
28f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    "rmd160",
29f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    9,
30f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    20,
31f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    64,
32f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
33f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* OID */
34f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { 1, 3, 36, 3, 2, 1,  },
35f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   6,
36f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
37f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd160_init,
38f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd160_process,
39f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd160_done,
40f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    &rmd160_test,
41f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    NULL
42f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project};
43f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
44f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* the five basic functions F(), G() and H() */
45f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define F(x, y, z)        ((x) ^ (y) ^ (z))
46f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define G(x, y, z)        (((x) & (y)) | (~(x) & (z)))
47f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define H(x, y, z)        (((x) | ~(y)) ^ (z))
48f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define I(x, y, z)        (((x) & (z)) | ((y) & ~(z)))
49f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define J(x, y, z)        ((x) ^ ((y) | ~(z)))
50f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
51f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* the ten basic operations FF() through III() */
52f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define FF(a, b, c, d, e, x, s)        \
53f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += F((b), (c), (d)) + (x);\
54f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
55f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
56f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
57f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define GG(a, b, c, d, e, x, s)        \
58f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += G((b), (c), (d)) + (x) + 0x5a827999UL;\
59f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
60f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
61f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
62f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define HH(a, b, c, d, e, x, s)        \
63f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
64f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
65f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
66f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
67f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define II(a, b, c, d, e, x, s)        \
68f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
69f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
70f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
71f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
72f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define JJ(a, b, c, d, e, x, s)        \
73f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += J((b), (c), (d)) + (x) + 0xa953fd4eUL;\
74f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
75f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
76f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
77f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define FFF(a, b, c, d, e, x, s)        \
78f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += F((b), (c), (d)) + (x);\
79f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
80f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
81f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
82f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define GGG(a, b, c, d, e, x, s)        \
83f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\
84f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
85f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
86f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
87f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define HHH(a, b, c, d, e, x, s)        \
88f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += H((b), (c), (d)) + (x) + 0x6d703ef3UL;\
89f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
90f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
91f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
92f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define III(a, b, c, d, e, x, s)        \
93f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += I((b), (c), (d)) + (x) + 0x5c4dd124UL;\
94f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
95f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
96f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
97f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#define JJJ(a, b, c, d, e, x, s)        \
98f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) += J((b), (c), (d)) + (x) + 0x50a28be6UL;\
99f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (a) = ROLc((a), (s)) + (e);\
100f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      (c) = ROLc((c), 10);
101f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
102f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
103f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
104f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int _rmd160_compress(hash_state *md, unsigned char *buf)
105f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
106f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int  rmd160_compress(hash_state *md, unsigned char *buf)
107f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
108f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
109f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ulong32 aa,bb,cc,dd,ee,aaa,bbb,ccc,ddd,eee,X[16];
110f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int i;
111f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
112f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* load words X */
113f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (i = 0; i < 16; i++){
114f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project      LOAD32L(X[i], buf + (4 * i));
115f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
116f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
117f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* load state */
118f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   aa = aaa = md->rmd160.state[0];
119f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   bb = bbb = md->rmd160.state[1];
120f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   cc = ccc = md->rmd160.state[2];
121f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   dd = ddd = md->rmd160.state[3];
122f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ee = eee = md->rmd160.state[4];
123f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
124f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 1 */
125f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, ee, X[ 0], 11);
126f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(ee, aa, bb, cc, dd, X[ 1], 14);
127f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, ee, aa, bb, cc, X[ 2], 15);
128f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, ee, aa, bb, X[ 3], 12);
129f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, ee, aa, X[ 4],  5);
130f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, ee, X[ 5],  8);
131f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(ee, aa, bb, cc, dd, X[ 6],  7);
132f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, ee, aa, bb, cc, X[ 7],  9);
133f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, ee, aa, bb, X[ 8], 11);
134f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, ee, aa, X[ 9], 13);
135f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, ee, X[10], 14);
136f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(ee, aa, bb, cc, dd, X[11], 15);
137f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(dd, ee, aa, bb, cc, X[12],  6);
138f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(cc, dd, ee, aa, bb, X[13],  7);
139f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(bb, cc, dd, ee, aa, X[14],  9);
140f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FF(aa, bb, cc, dd, ee, X[15],  8);
141f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
142f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 2 */
143f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(ee, aa, bb, cc, dd, X[ 7],  7);
144f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, ee, aa, bb, cc, X[ 4],  6);
145f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, ee, aa, bb, X[13],  8);
146f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, ee, aa, X[ 1], 13);
147f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, ee, X[10], 11);
148f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(ee, aa, bb, cc, dd, X[ 6],  9);
149f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, ee, aa, bb, cc, X[15],  7);
150f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, ee, aa, bb, X[ 3], 15);
151f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, ee, aa, X[12],  7);
152f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, ee, X[ 0], 12);
153f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(ee, aa, bb, cc, dd, X[ 9], 15);
154f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(dd, ee, aa, bb, cc, X[ 5],  9);
155f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(cc, dd, ee, aa, bb, X[ 2], 11);
156f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(bb, cc, dd, ee, aa, X[14],  7);
157f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(aa, bb, cc, dd, ee, X[11], 13);
158f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GG(ee, aa, bb, cc, dd, X[ 8], 12);
159f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
160f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 3 */
161f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, ee, aa, bb, cc, X[ 3], 11);
162f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, ee, aa, bb, X[10], 13);
163f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, ee, aa, X[14],  6);
164f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, ee, X[ 4],  7);
165f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(ee, aa, bb, cc, dd, X[ 9], 14);
166f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, ee, aa, bb, cc, X[15],  9);
167f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, ee, aa, bb, X[ 8], 13);
168f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, ee, aa, X[ 1], 15);
169f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, ee, X[ 2], 14);
170f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(ee, aa, bb, cc, dd, X[ 7],  8);
171f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, ee, aa, bb, cc, X[ 0], 13);
172f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(cc, dd, ee, aa, bb, X[ 6],  6);
173f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(bb, cc, dd, ee, aa, X[13],  5);
174f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(aa, bb, cc, dd, ee, X[11], 12);
175f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(ee, aa, bb, cc, dd, X[ 5],  7);
176f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HH(dd, ee, aa, bb, cc, X[12],  5);
177f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
178f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 4 */
179f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, ee, aa, bb, X[ 1], 11);
180f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, ee, aa, X[ 9], 12);
181f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, ee, X[11], 14);
182f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(ee, aa, bb, cc, dd, X[10], 15);
183f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, ee, aa, bb, cc, X[ 0], 14);
184f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, ee, aa, bb, X[ 8], 15);
185f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, ee, aa, X[12],  9);
186f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, ee, X[ 4],  8);
187f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(ee, aa, bb, cc, dd, X[13],  9);
188f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, ee, aa, bb, cc, X[ 3], 14);
189f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, ee, aa, bb, X[ 7],  5);
190f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(bb, cc, dd, ee, aa, X[15],  6);
191f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(aa, bb, cc, dd, ee, X[14],  8);
192f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(ee, aa, bb, cc, dd, X[ 5],  6);
193f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(dd, ee, aa, bb, cc, X[ 6],  5);
194f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   II(cc, dd, ee, aa, bb, X[ 2], 12);
195f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
196f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* round 5 */
197f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(bb, cc, dd, ee, aa, X[ 4],  9);
198f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(aa, bb, cc, dd, ee, X[ 0], 15);
199f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(ee, aa, bb, cc, dd, X[ 5],  5);
200f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(dd, ee, aa, bb, cc, X[ 9], 11);
201f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(cc, dd, ee, aa, bb, X[ 7],  6);
202f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(bb, cc, dd, ee, aa, X[12],  8);
203f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(aa, bb, cc, dd, ee, X[ 2], 13);
204f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(ee, aa, bb, cc, dd, X[10], 12);
205f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(dd, ee, aa, bb, cc, X[14],  5);
206f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(cc, dd, ee, aa, bb, X[ 1], 12);
207f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(bb, cc, dd, ee, aa, X[ 3], 13);
208f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(aa, bb, cc, dd, ee, X[ 8], 14);
209f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(ee, aa, bb, cc, dd, X[11], 11);
210f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(dd, ee, aa, bb, cc, X[ 6],  8);
211f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(cc, dd, ee, aa, bb, X[15],  5);
212f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJ(bb, cc, dd, ee, aa, X[13],  6);
213f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
214f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 1 */
215f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(aaa, bbb, ccc, ddd, eee, X[ 5],  8);
216f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(eee, aaa, bbb, ccc, ddd, X[14],  9);
217f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(ddd, eee, aaa, bbb, ccc, X[ 7],  9);
218f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
219f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
220f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
221f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
222f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(ddd, eee, aaa, bbb, ccc, X[ 4],  5);
223f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(ccc, ddd, eee, aaa, bbb, X[13],  7);
224f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(bbb, ccc, ddd, eee, aaa, X[ 6],  7);
225f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(aaa, bbb, ccc, ddd, eee, X[15],  8);
226f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
227f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
228f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
229f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
230f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   JJJ(aaa, bbb, ccc, ddd, eee, X[12],  6);
231f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
232f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 2 */
233f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(eee, aaa, bbb, ccc, ddd, X[ 6],  9);
234f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, eee, aaa, bbb, ccc, X[11], 13);
235f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
236f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, eee, aaa, X[ 7],  7);
237f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
238f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(eee, aaa, bbb, ccc, ddd, X[13],  8);
239f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, eee, aaa, bbb, ccc, X[ 5],  9);
240f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, eee, aaa, bbb, X[10], 11);
241f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, eee, aaa, X[14],  7);
242f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, eee, X[15],  7);
243f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
244f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ddd, eee, aaa, bbb, ccc, X[12],  7);
245f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(ccc, ddd, eee, aaa, bbb, X[ 4],  6);
246f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
247f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
248f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
249f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
250f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 3 */
251f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, eee, aaa, bbb, ccc, X[15],  9);
252f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, eee, aaa, bbb, X[ 5],  7);
253f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
254f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
255f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(eee, aaa, bbb, ccc, ddd, X[ 7],  8);
256f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, eee, aaa, bbb, ccc, X[14],  6);
257f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, eee, aaa, bbb, X[ 6],  6);
258f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
259f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
260f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
261f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, eee, aaa, bbb, ccc, X[12],  5);
262f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
263f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
264f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
265f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(eee, aaa, bbb, ccc, ddd, X[ 4],  7);
266f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   HHH(ddd, eee, aaa, bbb, ccc, X[13],  5);
267f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
268f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 4 */
269f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
270f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, eee, aaa, X[ 6],  5);
271f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, eee, X[ 4],  8);
272f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
273f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
274f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
275f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, eee, aaa, X[15],  6);
276f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
277f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(eee, aaa, bbb, ccc, ddd, X[ 5],  6);
278f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, eee, aaa, bbb, ccc, X[12],  9);
279f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
280f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(bbb, ccc, ddd, eee, aaa, X[13],  9);
281f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
282f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(eee, aaa, bbb, ccc, ddd, X[ 7],  5);
283f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
284f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   GGG(ccc, ddd, eee, aaa, bbb, X[14],  8);
285f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
286f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* parallel round 5 */
287f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, eee, aaa, X[12] ,  8);
288f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, eee, X[15] ,  5);
289f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
290f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, eee, aaa, bbb, ccc, X[ 4] ,  9);
291f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
292f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, eee, aaa, X[ 5] ,  5);
293f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
294f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(eee, aaa, bbb, ccc, ddd, X[ 7] ,  6);
295f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, eee, aaa, bbb, ccc, X[ 6] ,  8);
296f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
297f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, eee, aaa, X[13] ,  6);
298f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(aaa, bbb, ccc, ddd, eee, X[14] ,  5);
299f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
300f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
301f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
302f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
303f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
304f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   /* combine results */
305f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   ddd += cc + md->rmd160.state[1];               /* final result for md->rmd160.state[0] */
306f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[1] = md->rmd160.state[2] + dd + eee;
307f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[2] = md->rmd160.state[3] + ee + aaa;
308f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[3] = md->rmd160.state[4] + aa + bbb;
309f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[4] = md->rmd160.state[0] + bb + ccc;
310f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[0] = ddd;
311f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
312f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
313f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
314f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
315f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
316f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectstatic int rmd160_compress(hash_state *md, unsigned char *buf)
317f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
318f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int err;
319f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   err = _rmd160_compress(md, buf);
320f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   burn_stack(sizeof(ulong32) * 26 + sizeof(int));
321f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return err;
322f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
323f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
324f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
325f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
326f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Initialize the hash state
327f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md   The hash state you wish to initialize
328f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
329f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
330f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd160_init(hash_state * md)
331f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
332f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   LTC_ARGCHK(md != NULL);
333f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[0] = 0x67452301UL;
334f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[1] = 0xefcdab89UL;
335f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[2] = 0x98badcfeUL;
336f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[3] = 0x10325476UL;
337f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.state[4] = 0xc3d2e1f0UL;
338f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.curlen   = 0;
339f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   md->rmd160.length   = 0;
340f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
341f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
342f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
343f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
344f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Process a block of memory though the hash
345f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md     The hash state
346f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param in     The data to hash
347f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param inlen  The length of the data (octets)
348f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
349f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
350f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source ProjectHASH_PROCESS(rmd160_process, rmd160_compress, rmd160, 64)
351f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
352f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
353f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   Terminate the hash to get the digest
354f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param md  The hash state
355f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @param out [out] The destination of the hash (20 bytes)
356f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   @return CRYPT_OK if successful
357f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
358f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd160_done(hash_state * md, unsigned char *out)
359f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
360f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    int i;
361f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
362f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    LTC_ARGCHK(md  != NULL);
363f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    LTC_ARGCHK(out != NULL);
364f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
365f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if (md->rmd160.curlen >= sizeof(md->rmd160.buf)) {
366f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       return CRYPT_INVALID_ARG;
367f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
368f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
369f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
370f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* increase the length of the message */
371f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    md->rmd160.length += md->rmd160.curlen * 8;
372f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
373f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* append the '1' bit */
374f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    md->rmd160.buf[md->rmd160.curlen++] = (unsigned char)0x80;
375f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
376f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* if the length is currently above 56 bytes we append zeros
377f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     * then compress.  Then we can fall back to padding zeros and length
378f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     * encoding like normal.
379f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     */
380f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    if (md->rmd160.curlen > 56) {
381f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        while (md->rmd160.curlen < 64) {
382f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project            md->rmd160.buf[md->rmd160.curlen++] = (unsigned char)0;
383f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        }
384f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        rmd160_compress(md, md->rmd160.buf);
385f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        md->rmd160.curlen = 0;
386f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
387f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
388f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* pad upto 56 bytes of zeroes */
389f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    while (md->rmd160.curlen < 56) {
390f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        md->rmd160.buf[md->rmd160.curlen++] = (unsigned char)0;
391f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
392f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
393f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* store length */
394f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    STORE64L(md->rmd160.length, md->rmd160.buf+56);
395f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    rmd160_compress(md, md->rmd160.buf);
396f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
397f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    /* copy output */
398f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    for (i = 0; i < 5; i++) {
399f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        STORE32L(md->rmd160.state[i], out+(4*i));
400f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    }
401f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifdef LTC_CLEAN_STACK
402f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    zeromem(md, sizeof(hash_state));
403f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
404f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project    return CRYPT_OK;
405f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
406f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
407f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/**
408f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  Self-test the hash
409f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project  @return CRYPT_OK if successful, CRYPT_NOP if self-tests have been disabled
410f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project*/
411f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Projectint rmd160_test(void)
412f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project{
413f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#ifndef LTC_TEST
414f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_NOP;
415f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#else
416f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   static const struct {
417f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        char *msg;
418f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project        unsigned char md[20];
419f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   } tests[] = {
420f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "",
421f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,
422f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 }
423f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
424f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "a",
425f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,
426f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe }
427f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
428f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "abc",
429f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,
430f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc }
431f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
432f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "message digest",
433f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,
434f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 }
435f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
436f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "abcdefghijklmnopqrstuvwxyz",
437f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,
438f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc }
439f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   },
440f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
441f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project     { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,
442f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b }
443f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
444f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   };
445f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   int x;
446f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   unsigned char buf[20];
447f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   hash_state md;
448f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
449f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   for (x = 0; x < (int)(sizeof(tests)/sizeof(tests[0])); x++) {
450f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd160_init(&md);
451f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd160_process(&md, (unsigned char *)tests[x].msg, strlen(tests[x].msg));
452f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       rmd160_done(&md, buf);
453f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       if (XMEMCMP(buf, tests[x].md, 20) != 0) {
454f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#if 0
455f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          printf("Failed test %d\n", x);
456f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
457f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project          return CRYPT_FAIL_TESTVECTOR;
458f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project       }
459f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   }
460f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project   return CRYPT_OK;
461f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
462f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project}
463f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
464f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project#endif
465f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
466f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project
467f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Source: /cvs/libtom/libtomcrypt/src/hashes/rmd160.c,v $ */
468f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Revision: 1.8 $ */
469f7fc46c63fdc8f39234fea409b8dbe116d73ebf8The Android Open Source Project/* $Date: 2006/11/01 09:28:17 $ */
470