1/********************************************************************\ 2 * 3 * FILE: rmd128.c 4 * 5 * CONTENTS: A sample C-implementation of the RIPEMD-128 6 * hash-function. This function is a plug-in substitute 7 * for RIPEMD. A 160-bit hash result is obtained using 8 * RIPEMD-160. 9 * TARGET: any computer with an ANSI C compiler 10 * 11 * AUTHOR: Antoon Bosselaers, ESAT-COSIC 12 * DATE: 1 March 1996 13 * VERSION: 1.0 14 * 15 * Copyright (c) Katholieke Universiteit Leuven 16 * 1996, All Rights Reserved 17 * 18\********************************************************************/ 19 20/* header files */ 21#include <stdio.h> 22#include <stdlib.h> 23#include <string.h> 24#include "rmd128.h" 25 26/********************************************************************/ 27 28void 29ripemd128_MDinit (MDbuf) 30 dword *MDbuf; 31{ 32 MDbuf[0] = 0x67452301UL; 33 MDbuf[1] = 0xefcdab89UL; 34 MDbuf[2] = 0x98badcfeUL; 35 MDbuf[3] = 0x10325476UL; 36 37 return; 38} 39 40/********************************************************************/ 41 42void 43ripemd128_compress (MDbuf, X) 44 dword* MDbuf; 45 dword* X; 46{ 47 dword aa = MDbuf[0], bb = MDbuf[1], cc = MDbuf[2], dd = MDbuf[3]; 48 dword aaa = MDbuf[0], bbb = MDbuf[1], ccc = MDbuf[2], ddd = MDbuf[3]; 49 50 /* round 1 */ 51 FF(aa, bb, cc, dd, X[ 0], 11); 52 FF(dd, aa, bb, cc, X[ 1], 14); 53 FF(cc, dd, aa, bb, X[ 2], 15); 54 FF(bb, cc, dd, aa, X[ 3], 12); 55 FF(aa, bb, cc, dd, X[ 4], 5); 56 FF(dd, aa, bb, cc, X[ 5], 8); 57 FF(cc, dd, aa, bb, X[ 6], 7); 58 FF(bb, cc, dd, aa, X[ 7], 9); 59 FF(aa, bb, cc, dd, X[ 8], 11); 60 FF(dd, aa, bb, cc, X[ 9], 13); 61 FF(cc, dd, aa, bb, X[10], 14); 62 FF(bb, cc, dd, aa, X[11], 15); 63 FF(aa, bb, cc, dd, X[12], 6); 64 FF(dd, aa, bb, cc, X[13], 7); 65 FF(cc, dd, aa, bb, X[14], 9); 66 FF(bb, cc, dd, aa, X[15], 8); 67 68 /* round 2 */ 69 GG(aa, bb, cc, dd, X[ 7], 7); 70 GG(dd, aa, bb, cc, X[ 4], 6); 71 GG(cc, dd, aa, bb, X[13], 8); 72 GG(bb, cc, dd, aa, X[ 1], 13); 73 GG(aa, bb, cc, dd, X[10], 11); 74 GG(dd, aa, bb, cc, X[ 6], 9); 75 GG(cc, dd, aa, bb, X[15], 7); 76 GG(bb, cc, dd, aa, X[ 3], 15); 77 GG(aa, bb, cc, dd, X[12], 7); 78 GG(dd, aa, bb, cc, X[ 0], 12); 79 GG(cc, dd, aa, bb, X[ 9], 15); 80 GG(bb, cc, dd, aa, X[ 5], 9); 81 GG(aa, bb, cc, dd, X[ 2], 11); 82 GG(dd, aa, bb, cc, X[14], 7); 83 GG(cc, dd, aa, bb, X[11], 13); 84 GG(bb, cc, dd, aa, X[ 8], 12); 85 86 /* round 3 */ 87 HH(aa, bb, cc, dd, X[ 3], 11); 88 HH(dd, aa, bb, cc, X[10], 13); 89 HH(cc, dd, aa, bb, X[14], 6); 90 HH(bb, cc, dd, aa, X[ 4], 7); 91 HH(aa, bb, cc, dd, X[ 9], 14); 92 HH(dd, aa, bb, cc, X[15], 9); 93 HH(cc, dd, aa, bb, X[ 8], 13); 94 HH(bb, cc, dd, aa, X[ 1], 15); 95 HH(aa, bb, cc, dd, X[ 2], 14); 96 HH(dd, aa, bb, cc, X[ 7], 8); 97 HH(cc, dd, aa, bb, X[ 0], 13); 98 HH(bb, cc, dd, aa, X[ 6], 6); 99 HH(aa, bb, cc, dd, X[13], 5); 100 HH(dd, aa, bb, cc, X[11], 12); 101 HH(cc, dd, aa, bb, X[ 5], 7); 102 HH(bb, cc, dd, aa, X[12], 5); 103 104 /* round 4 */ 105 II(aa, bb, cc, dd, X[ 1], 11); 106 II(dd, aa, bb, cc, X[ 9], 12); 107 II(cc, dd, aa, bb, X[11], 14); 108 II(bb, cc, dd, aa, X[10], 15); 109 II(aa, bb, cc, dd, X[ 0], 14); 110 II(dd, aa, bb, cc, X[ 8], 15); 111 II(cc, dd, aa, bb, X[12], 9); 112 II(bb, cc, dd, aa, X[ 4], 8); 113 II(aa, bb, cc, dd, X[13], 9); 114 II(dd, aa, bb, cc, X[ 3], 14); 115 II(cc, dd, aa, bb, X[ 7], 5); 116 II(bb, cc, dd, aa, X[15], 6); 117 II(aa, bb, cc, dd, X[14], 8); 118 II(dd, aa, bb, cc, X[ 5], 6); 119 II(cc, dd, aa, bb, X[ 6], 5); 120 II(bb, cc, dd, aa, X[ 2], 12); 121 122 /* parallel round 1 */ 123 III(aaa, bbb, ccc, ddd, X[ 5], 8); 124 III(ddd, aaa, bbb, ccc, X[14], 9); 125 III(ccc, ddd, aaa, bbb, X[ 7], 9); 126 III(bbb, ccc, ddd, aaa, X[ 0], 11); 127 III(aaa, bbb, ccc, ddd, X[ 9], 13); 128 III(ddd, aaa, bbb, ccc, X[ 2], 15); 129 III(ccc, ddd, aaa, bbb, X[11], 15); 130 III(bbb, ccc, ddd, aaa, X[ 4], 5); 131 III(aaa, bbb, ccc, ddd, X[13], 7); 132 III(ddd, aaa, bbb, ccc, X[ 6], 7); 133 III(ccc, ddd, aaa, bbb, X[15], 8); 134 III(bbb, ccc, ddd, aaa, X[ 8], 11); 135 III(aaa, bbb, ccc, ddd, X[ 1], 14); 136 III(ddd, aaa, bbb, ccc, X[10], 14); 137 III(ccc, ddd, aaa, bbb, X[ 3], 12); 138 III(bbb, ccc, ddd, aaa, X[12], 6); 139 140 /* parallel round 2 */ 141 HHH(aaa, bbb, ccc, ddd, X[ 6], 9); 142 HHH(ddd, aaa, bbb, ccc, X[11], 13); 143 HHH(ccc, ddd, aaa, bbb, X[ 3], 15); 144 HHH(bbb, ccc, ddd, aaa, X[ 7], 7); 145 HHH(aaa, bbb, ccc, ddd, X[ 0], 12); 146 HHH(ddd, aaa, bbb, ccc, X[13], 8); 147 HHH(ccc, ddd, aaa, bbb, X[ 5], 9); 148 HHH(bbb, ccc, ddd, aaa, X[10], 11); 149 HHH(aaa, bbb, ccc, ddd, X[14], 7); 150 HHH(ddd, aaa, bbb, ccc, X[15], 7); 151 HHH(ccc, ddd, aaa, bbb, X[ 8], 12); 152 HHH(bbb, ccc, ddd, aaa, X[12], 7); 153 HHH(aaa, bbb, ccc, ddd, X[ 4], 6); 154 HHH(ddd, aaa, bbb, ccc, X[ 9], 15); 155 HHH(ccc, ddd, aaa, bbb, X[ 1], 13); 156 HHH(bbb, ccc, ddd, aaa, X[ 2], 11); 157 158 /* parallel round 3 */ 159 GGG(aaa, bbb, ccc, ddd, X[15], 9); 160 GGG(ddd, aaa, bbb, ccc, X[ 5], 7); 161 GGG(ccc, ddd, aaa, bbb, X[ 1], 15); 162 GGG(bbb, ccc, ddd, aaa, X[ 3], 11); 163 GGG(aaa, bbb, ccc, ddd, X[ 7], 8); 164 GGG(ddd, aaa, bbb, ccc, X[14], 6); 165 GGG(ccc, ddd, aaa, bbb, X[ 6], 6); 166 GGG(bbb, ccc, ddd, aaa, X[ 9], 14); 167 GGG(aaa, bbb, ccc, ddd, X[11], 12); 168 GGG(ddd, aaa, bbb, ccc, X[ 8], 13); 169 GGG(ccc, ddd, aaa, bbb, X[12], 5); 170 GGG(bbb, ccc, ddd, aaa, X[ 2], 14); 171 GGG(aaa, bbb, ccc, ddd, X[10], 13); 172 GGG(ddd, aaa, bbb, ccc, X[ 0], 13); 173 GGG(ccc, ddd, aaa, bbb, X[ 4], 7); 174 GGG(bbb, ccc, ddd, aaa, X[13], 5); 175 176 /* parallel round 4 */ 177 FFF(aaa, bbb, ccc, ddd, X[ 8], 15); 178 FFF(ddd, aaa, bbb, ccc, X[ 6], 5); 179 FFF(ccc, ddd, aaa, bbb, X[ 4], 8); 180 FFF(bbb, ccc, ddd, aaa, X[ 1], 11); 181 FFF(aaa, bbb, ccc, ddd, X[ 3], 14); 182 FFF(ddd, aaa, bbb, ccc, X[11], 14); 183 FFF(ccc, ddd, aaa, bbb, X[15], 6); 184 FFF(bbb, ccc, ddd, aaa, X[ 0], 14); 185 FFF(aaa, bbb, ccc, ddd, X[ 5], 6); 186 FFF(ddd, aaa, bbb, ccc, X[12], 9); 187 FFF(ccc, ddd, aaa, bbb, X[ 2], 12); 188 FFF(bbb, ccc, ddd, aaa, X[13], 9); 189 FFF(aaa, bbb, ccc, ddd, X[ 9], 12); 190 FFF(ddd, aaa, bbb, ccc, X[ 7], 5); 191 FFF(ccc, ddd, aaa, bbb, X[10], 15); 192 FFF(bbb, ccc, ddd, aaa, X[14], 8); 193 194 /* combine results */ 195 ddd += cc + MDbuf[1]; /* final result for MDbuf[0] */ 196 MDbuf[1] = MDbuf[2] + dd + aaa; 197 MDbuf[2] = MDbuf[3] + aa + bbb; 198 MDbuf[3] = MDbuf[0] + bb + ccc; 199 MDbuf[0] = ddd; 200 201 return; 202} 203 204/********************************************************************/ 205 206void 207ripemd128_MDfinish (MDbuf, strptr, lswlen, mswlen) 208 dword* MDbuf; 209 byte* strptr; 210 dword lswlen; 211 dword mswlen; 212{ 213 dword i; /* counter */ 214 dword X[16]; /* message words */ 215 216 memset(X, 0, 16*sizeof(dword)); 217 218 /* put bytes from strptr into X */ 219 for (i=0; i<(lswlen&63); i++) { 220 /* byte i goes into word X[i div 4] at pos. 8*(i mod 4) */ 221 X[i>>2] ^= (dword) *strptr++ << (8 * (i&3)); 222 } 223 224 /* append the bit m_n == 1 */ 225 X[(lswlen>>2)&15] ^= (dword)1 << (8*(lswlen&3) + 7); 226 227 if ((lswlen & 63) > 55) { 228 /* length goes to next block */ 229 ripemd128_compress(MDbuf, X); 230 memset(X, 0, 16*sizeof(dword)); 231 } 232 233 /* append length in bits*/ 234 X[14] = lswlen << 3; 235 X[15] = (lswlen >> 29) | (mswlen << 3); 236 ripemd128_compress(MDbuf, X); 237 238 return; 239} 240 241/************************ end of file rmd128.c **********************/ 242 243