diff options
Diffstat (limited to 'src/libstdcrypto/md5_final.c')
-rw-r--r-- | src/libstdcrypto/md5_final.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/libstdcrypto/md5_final.c b/src/libstdcrypto/md5_final.c new file mode 100644 index 0000000..834d57c --- /dev/null +++ b/src/libstdcrypto/md5_final.c @@ -0,0 +1,30 @@ +/* ISC license. */ + +#include <skalibs/uint32.h> +#include <skalibs/bytestr.h> +#include <skalibs/md5.h> +#include "md5-internal.h" + +void md5_final (MD5Schedule_ref ctx, char *digest /* 16 chars */) +{ + register unsigned int count = (ctx->bits[0] >> 3) & 0x3F ; + register unsigned char *p = ctx->in + count ; + *p++ = 0x80; + count = 63 - count ; + if (count < 8) + { + byte_zero(p, count) ; + uint32_little_endian((char *)ctx->in, 16) ; + md5_transform(ctx->buf, (uint32 *)ctx->in) ; + byte_zero(ctx->in, 56) ; + } + else byte_zero(p, count - 8) ; + uint32_little_endian((char *)ctx->in, 14) ; + + byte_copy(ctx->in + 56, 4, (char *)&ctx->bits[0]) ; + byte_copy(ctx->in + 60, 4, (char *)&ctx->bits[1]) ; + + md5_transform(ctx->buf, (uint32 *)ctx->in) ; + uint32_little_endian((char *)ctx->buf, 4) ; + byte_copy(digest, 16, (char *)ctx->buf) ; +} |