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