X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=crc%2Fmd5.c;h=ade4f69721c7668a644c3459828ba250992b3d41;hb=4cbe3909942e913f3a71113bf4036824fcb54953;hp=8f9adb22ee745e41a8a212654524cefb67e8fd55;hpb=eef6eea1b935a67f1ae26b38e06a69d4410a12aa;p=fio.git diff --git a/crc/md5.c b/crc/md5.c index 8f9adb22..ade4f697 100644 --- a/crc/md5.c +++ b/crc/md5.c @@ -2,7 +2,6 @@ * Shamelessly lifted from the 2.6 kernel (crypto/md5.c) */ #include -#include #include "md5.h" static void md5_transform(uint32_t *hash, uint32_t const *in) @@ -88,7 +87,7 @@ static void md5_transform(uint32_t *hash, uint32_t const *in) hash[3] += d; } -void md5_init(struct md5_ctx *mctx) +void fio_md5_init(struct fio_md5_ctx *mctx) { mctx->hash[0] = 0x67452301; mctx->hash[1] = 0xefcdab89; @@ -96,7 +95,8 @@ void md5_init(struct md5_ctx *mctx) mctx->hash[3] = 0x10325476; } -void md5_update(struct md5_ctx *mctx, const uint8_t *data, unsigned int len) +void fio_md5_update(struct fio_md5_ctx *mctx, const uint8_t *data, + unsigned int len) { const uint32_t avail = sizeof(mctx->block) - (mctx->byte_count & 0x3f); @@ -124,3 +124,23 @@ void md5_update(struct md5_ctx *mctx, const uint8_t *data, unsigned int len) memcpy(mctx->block, data, len); } + +void fio_md5_final(struct fio_md5_ctx *mctx) +{ + const unsigned int offset = mctx->byte_count & 0x3f; + char *p = (char *)mctx->block + offset; + int padding = 56 - (offset + 1); + + *p++ = 0x80; + if (padding < 0) { + memset(p, 0x00, padding + sizeof (uint64_t)); + md5_transform(mctx->hash, mctx->block); + p = (char *)mctx->block; + padding = 56; + } + + memset(p, 0, padding); + mctx->block[14] = mctx->byte_count << 3; + mctx->block[15] = mctx->byte_count >> 29; + md5_transform(mctx->hash, mctx->block); +}