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