 Timestamp:
 20080119T12:36:30Z (17 years ago)
 Branches:
 master
 Children:
 003553b
 Parents:
 83ba3e5
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

lib/md5.c
r83ba3e5 rbea1305 34 34 * 20021120 35 35 */ 36 37 /* Turns out MD5 was designed for littleendian machines. If we're running 38 on a bigendian machines, we have to swap some bytes. Since detecting 39 endianness at compile time reliably seems pretty hard, let's do it at 40 runtime. It's not like we're going to checksum megabytes of data... */ 41 static uint32_t cvt32(uint32_t val) 42 { 43 static int little_endian = 1; 44 45 if (little_endian == 1) 46 { 47 little_endian = 1; 48 little_endian = *((char*) &little_endian); 49 } 50 51 if (little_endian) 52 return val; 53 else 54 return (val >> 24)  55 ((val >> 8) & 0xff00)  56 ((val << 8) & 0xff0000)  57 (val << 24); 58 } 36 59 37 60 void md5_init(struct MD5Context *ctx) … … 127 150 128 151 /* Append length in bits and transform */ 129 ((uint32_t *) ctx>in)[14] = c tx>bits[0];130 ((uint32_t *) ctx>in)[15] = c tx>bits[1];152 ((uint32_t *) ctx>in)[14] = cvt32(ctx>bits[0]); 153 ((uint32_t *) ctx>in)[15] = cvt32(ctx>bits[1]); 131 154 132 155 md5_transform(ctx>buf, (uint32_t *) ctx>in); 156 ctx>buf[0] = cvt32(ctx>buf[0]); 157 ctx>buf[1] = cvt32(ctx>buf[1]); 158 ctx>buf[2] = cvt32(ctx>buf[2]); 159 ctx>buf[3] = cvt32(ctx>buf[3]); 133 160 memcpy(digest, ctx>buf, 16); 134 161 memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ … … 161 188 d = buf[3]; 162 189 163 MD5STEP(F1, a, b, c, d, in[0]+ 0xd76aa478, 7);164 MD5STEP(F1, d, a, b, c, in[1]+ 0xe8c7b756, 12);165 MD5STEP(F1, c, d, a, b, in[2]+ 0x242070db, 17);166 MD5STEP(F1, b, c, d, a, in[3]+ 0xc1bdceee, 22);167 MD5STEP(F1, a, b, c, d, in[4]+ 0xf57c0faf, 7);168 MD5STEP(F1, d, a, b, c, in[5]+ 0x4787c62a, 12);169 MD5STEP(F1, c, d, a, b, in[6]+ 0xa8304613, 17);170 MD5STEP(F1, b, c, d, a, in[7]+ 0xfd469501, 22);171 MD5STEP(F1, a, b, c, d, in[8]+ 0x698098d8, 7);172 MD5STEP(F1, d, a, b, c, in[9]+ 0x8b44f7af, 12);173 MD5STEP(F1, c, d, a, b, in[10]+ 0xffff5bb1, 17);174 MD5STEP(F1, b, c, d, a, in[11]+ 0x895cd7be, 22);175 MD5STEP(F1, a, b, c, d, in[12]+ 0x6b901122, 7);176 MD5STEP(F1, d, a, b, c, in[13]+ 0xfd987193, 12);177 MD5STEP(F1, c, d, a, b, in[14]+ 0xa679438e, 17);178 MD5STEP(F1, b, c, d, a, in[15]+ 0x49b40821, 22);179 180 MD5STEP(F2, a, b, c, d, in[1]+ 0xf61e2562, 5);181 MD5STEP(F2, d, a, b, c, in[6]+ 0xc040b340, 9);182 MD5STEP(F2, c, d, a, b, in[11]+ 0x265e5a51, 14);183 MD5STEP(F2, b, c, d, a, in[0]+ 0xe9b6c7aa, 20);184 MD5STEP(F2, a, b, c, d, in[5]+ 0xd62f105d, 5);185 MD5STEP(F2, d, a, b, c, in[10]+ 0x02441453, 9);186 MD5STEP(F2, c, d, a, b, in[15]+ 0xd8a1e681, 14);187 MD5STEP(F2, b, c, d, a, in[4]+ 0xe7d3fbc8, 20);188 MD5STEP(F2, a, b, c, d, in[9]+ 0x21e1cde6, 5);189 MD5STEP(F2, d, a, b, c, in[14]+ 0xc33707d6, 9);190 MD5STEP(F2, c, d, a, b, in[3]+ 0xf4d50d87, 14);191 MD5STEP(F2, b, c, d, a, in[8]+ 0x455a14ed, 20);192 MD5STEP(F2, a, b, c, d, in[13]+ 0xa9e3e905, 5);193 MD5STEP(F2, d, a, b, c, in[2]+ 0xfcefa3f8, 9);194 MD5STEP(F2, c, d, a, b, in[7]+ 0x676f02d9, 14);195 MD5STEP(F2, b, c, d, a, in[12]+ 0x8d2a4c8a, 20);196 197 MD5STEP(F3, a, b, c, d, in[5]+ 0xfffa3942, 4);198 MD5STEP(F3, d, a, b, c, in[8]+ 0x8771f681, 11);199 MD5STEP(F3, c, d, a, b, in[11]+ 0x6d9d6122, 16);200 MD5STEP(F3, b, c, d, a, in[14]+ 0xfde5380c, 23);201 MD5STEP(F3, a, b, c, d, in[1]+ 0xa4beea44, 4);202 MD5STEP(F3, d, a, b, c, in[4]+ 0x4bdecfa9, 11);203 MD5STEP(F3, c, d, a, b, in[7]+ 0xf6bb4b60, 16);204 MD5STEP(F3, b, c, d, a, in[10]+ 0xbebfbc70, 23);205 MD5STEP(F3, a, b, c, d, in[13]+ 0x289b7ec6, 4);206 MD5STEP(F3, d, a, b, c, in[0]+ 0xeaa127fa, 11);207 MD5STEP(F3, c, d, a, b, in[3]+ 0xd4ef3085, 16);208 MD5STEP(F3, b, c, d, a, in[6]+ 0x04881d05, 23);209 MD5STEP(F3, a, b, c, d, in[9]+ 0xd9d4d039, 4);210 MD5STEP(F3, d, a, b, c, in[12]+ 0xe6db99e5, 11);211 MD5STEP(F3, c, d, a, b, in[15]+ 0x1fa27cf8, 16);212 MD5STEP(F3, b, c, d, a, in[2]+ 0xc4ac5665, 23);213 214 MD5STEP(F4, a, b, c, d, in[0]+ 0xf4292244, 6);215 MD5STEP(F4, d, a, b, c, in[7]+ 0x432aff97, 10);216 MD5STEP(F4, c, d, a, b, in[14]+ 0xab9423a7, 15);217 MD5STEP(F4, b, c, d, a, in[5]+ 0xfc93a039, 21);218 MD5STEP(F4, a, b, c, d, in[12]+ 0x655b59c3, 6);219 MD5STEP(F4, d, a, b, c, in[3]+ 0x8f0ccc92, 10);220 MD5STEP(F4, c, d, a, b, in[10]+ 0xffeff47d, 15);221 MD5STEP(F4, b, c, d, a, in[1]+ 0x85845dd1, 21);222 MD5STEP(F4, a, b, c, d, in[8]+ 0x6fa87e4f, 6);223 MD5STEP(F4, d, a, b, c, in[15]+ 0xfe2ce6e0, 10);224 MD5STEP(F4, c, d, a, b, in[6]+ 0xa3014314, 15);225 MD5STEP(F4, b, c, d, a, in[13]+ 0x4e0811a1, 21);226 MD5STEP(F4, a, b, c, d, in[4]+ 0xf7537e82, 6);227 MD5STEP(F4, d, a, b, c, in[11]+ 0xbd3af235, 10);228 MD5STEP(F4, c, d, a, b, in[2]+ 0x2ad7d2bb, 15);229 MD5STEP(F4, b, c, d, a, in[9]+ 0xeb86d391, 21);190 MD5STEP(F1, a, b, c, d, cvt32(in[0]) + 0xd76aa478, 7); 191 MD5STEP(F1, d, a, b, c, cvt32(in[1]) + 0xe8c7b756, 12); 192 MD5STEP(F1, c, d, a, b, cvt32(in[2]) + 0x242070db, 17); 193 MD5STEP(F1, b, c, d, a, cvt32(in[3]) + 0xc1bdceee, 22); 194 MD5STEP(F1, a, b, c, d, cvt32(in[4]) + 0xf57c0faf, 7); 195 MD5STEP(F1, d, a, b, c, cvt32(in[5]) + 0x4787c62a, 12); 196 MD5STEP(F1, c, d, a, b, cvt32(in[6]) + 0xa8304613, 17); 197 MD5STEP(F1, b, c, d, a, cvt32(in[7]) + 0xfd469501, 22); 198 MD5STEP(F1, a, b, c, d, cvt32(in[8]) + 0x698098d8, 7); 199 MD5STEP(F1, d, a, b, c, cvt32(in[9]) + 0x8b44f7af, 12); 200 MD5STEP(F1, c, d, a, b, cvt32(in[10]) + 0xffff5bb1, 17); 201 MD5STEP(F1, b, c, d, a, cvt32(in[11]) + 0x895cd7be, 22); 202 MD5STEP(F1, a, b, c, d, cvt32(in[12]) + 0x6b901122, 7); 203 MD5STEP(F1, d, a, b, c, cvt32(in[13]) + 0xfd987193, 12); 204 MD5STEP(F1, c, d, a, b, cvt32(in[14]) + 0xa679438e, 17); 205 MD5STEP(F1, b, c, d, a, cvt32(in[15]) + 0x49b40821, 22); 206 207 MD5STEP(F2, a, b, c, d, cvt32(in[1]) + 0xf61e2562, 5); 208 MD5STEP(F2, d, a, b, c, cvt32(in[6]) + 0xc040b340, 9); 209 MD5STEP(F2, c, d, a, b, cvt32(in[11]) + 0x265e5a51, 14); 210 MD5STEP(F2, b, c, d, a, cvt32(in[0]) + 0xe9b6c7aa, 20); 211 MD5STEP(F2, a, b, c, d, cvt32(in[5]) + 0xd62f105d, 5); 212 MD5STEP(F2, d, a, b, c, cvt32(in[10]) + 0x02441453, 9); 213 MD5STEP(F2, c, d, a, b, cvt32(in[15]) + 0xd8a1e681, 14); 214 MD5STEP(F2, b, c, d, a, cvt32(in[4]) + 0xe7d3fbc8, 20); 215 MD5STEP(F2, a, b, c, d, cvt32(in[9]) + 0x21e1cde6, 5); 216 MD5STEP(F2, d, a, b, c, cvt32(in[14]) + 0xc33707d6, 9); 217 MD5STEP(F2, c, d, a, b, cvt32(in[3]) + 0xf4d50d87, 14); 218 MD5STEP(F2, b, c, d, a, cvt32(in[8]) + 0x455a14ed, 20); 219 MD5STEP(F2, a, b, c, d, cvt32(in[13]) + 0xa9e3e905, 5); 220 MD5STEP(F2, d, a, b, c, cvt32(in[2]) + 0xfcefa3f8, 9); 221 MD5STEP(F2, c, d, a, b, cvt32(in[7]) + 0x676f02d9, 14); 222 MD5STEP(F2, b, c, d, a, cvt32(in[12]) + 0x8d2a4c8a, 20); 223 224 MD5STEP(F3, a, b, c, d, cvt32(in[5]) + 0xfffa3942, 4); 225 MD5STEP(F3, d, a, b, c, cvt32(in[8]) + 0x8771f681, 11); 226 MD5STEP(F3, c, d, a, b, cvt32(in[11]) + 0x6d9d6122, 16); 227 MD5STEP(F3, b, c, d, a, cvt32(in[14]) + 0xfde5380c, 23); 228 MD5STEP(F3, a, b, c, d, cvt32(in[1]) + 0xa4beea44, 4); 229 MD5STEP(F3, d, a, b, c, cvt32(in[4]) + 0x4bdecfa9, 11); 230 MD5STEP(F3, c, d, a, b, cvt32(in[7]) + 0xf6bb4b60, 16); 231 MD5STEP(F3, b, c, d, a, cvt32(in[10]) + 0xbebfbc70, 23); 232 MD5STEP(F3, a, b, c, d, cvt32(in[13]) + 0x289b7ec6, 4); 233 MD5STEP(F3, d, a, b, c, cvt32(in[0]) + 0xeaa127fa, 11); 234 MD5STEP(F3, c, d, a, b, cvt32(in[3]) + 0xd4ef3085, 16); 235 MD5STEP(F3, b, c, d, a, cvt32(in[6]) + 0x04881d05, 23); 236 MD5STEP(F3, a, b, c, d, cvt32(in[9]) + 0xd9d4d039, 4); 237 MD5STEP(F3, d, a, b, c, cvt32(in[12]) + 0xe6db99e5, 11); 238 MD5STEP(F3, c, d, a, b, cvt32(in[15]) + 0x1fa27cf8, 16); 239 MD5STEP(F3, b, c, d, a, cvt32(in[2]) + 0xc4ac5665, 23); 240 241 MD5STEP(F4, a, b, c, d, cvt32(in[0]) + 0xf4292244, 6); 242 MD5STEP(F4, d, a, b, c, cvt32(in[7]) + 0x432aff97, 10); 243 MD5STEP(F4, c, d, a, b, cvt32(in[14]) + 0xab9423a7, 15); 244 MD5STEP(F4, b, c, d, a, cvt32(in[5]) + 0xfc93a039, 21); 245 MD5STEP(F4, a, b, c, d, cvt32(in[12]) + 0x655b59c3, 6); 246 MD5STEP(F4, d, a, b, c, cvt32(in[3]) + 0x8f0ccc92, 10); 247 MD5STEP(F4, c, d, a, b, cvt32(in[10]) + 0xffeff47d, 15); 248 MD5STEP(F4, b, c, d, a, cvt32(in[1]) + 0x85845dd1, 21); 249 MD5STEP(F4, a, b, c, d, cvt32(in[8]) + 0x6fa87e4f, 6); 250 MD5STEP(F4, d, a, b, c, cvt32(in[15]) + 0xfe2ce6e0, 10); 251 MD5STEP(F4, c, d, a, b, cvt32(in[6]) + 0xa3014314, 15); 252 MD5STEP(F4, b, c, d, a, cvt32(in[13]) + 0x4e0811a1, 21); 253 MD5STEP(F4, a, b, c, d, cvt32(in[4]) + 0xf7537e82, 6); 254 MD5STEP(F4, d, a, b, c, cvt32(in[11]) + 0xbd3af235, 10); 255 MD5STEP(F4, c, d, a, b, cvt32(in[2]) + 0x2ad7d2bb, 15); 256 MD5STEP(F4, b, c, d, a, cvt32(in[9]) + 0xeb86d391, 21); 230 257 231 258 buf[0] += a;
Note: See TracChangeset
for help on using the changeset viewer.