| 227 | }; |
| 228 | |
| 229 | void md5_finish( md5_context *ctx, uint8 digest[16] ) |
| 230 | { |
| 231 | uint32 last, padn; |
| 232 | uint32 high, low; |
| 233 | uint8 msglen[8]; |
| 234 | |
| 235 | high = (ctx->total[0] >> 29) |
| 236 | | (ctx->total[1] << 3); |
| 237 | low = (ctx->total[0] << 3); |
| 238 | |
| 239 | PUT_UINT32( low, msglen, 0 ); |
| 240 | PUT_UINT32( high, msglen, 4 ); |
| 241 | |
| 242 | last = ctx->total[0] & 0x3F; |
| 243 | padn = (last < 56) ? (56 - last) : (120 - last); |
| 244 | |
| 245 | md5_update( ctx, md5_padding, padn ); |
| 246 | md5_update( ctx, msglen, 8 ); |
| 247 | |
| 248 | PUT_UINT32( ctx->state[0], digest, 0 ); |
| 249 | PUT_UINT32( ctx->state[1], digest, 4 ); |
| 250 | PUT_UINT32( ctx->state[2], digest, 8 ); |
| 251 | PUT_UINT32( ctx->state[3], digest, 12 ); |
| 252 | } |