summaryrefslogtreecommitdiff
path: root/src/libstdcrypto/md5_final.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstdcrypto/md5_final.c')
-rw-r--r--src/libstdcrypto/md5_final.c30
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) ;
+}