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