diff options
Diffstat (limited to 'src/libstdcrypto/md5_update.c')
-rw-r--r-- | src/libstdcrypto/md5_update.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/libstdcrypto/md5_update.c b/src/libstdcrypto/md5_update.c new file mode 100644 index 0000000..63fdea3 --- /dev/null +++ b/src/libstdcrypto/md5_update.c @@ -0,0 +1,37 @@ +/* ISC license. */ + +#include <skalibs/uint32.h> +#include <skalibs/bytestr.h> +#include <skalibs/md5.h> +#include "md5-internal.h" + +void md5_update (MD5Schedule_ref ctx, char const *s, unsigned int len) +{ + register uint32 t = ctx->bits[0] ; + if ((ctx->bits[0] = t + (len << 3)) < t) + ctx->bits[1]++ ; + ctx->bits[1] += len >> 29 ; + t = (t >> 3) & 0x3f ; + if (t) + { + unsigned char *p = ctx->in + t ; + t = 64 - t ; + if (len < t) + { + byte_copy((char *)p, len, s) ; + return ; + } + byte_copy((char *)p, t, s) ; + uint32_little_endian((char *)ctx->in, 16) ; + md5_transform(ctx->buf, (uint32 *)ctx->in) ; + s += t ; len -= t ; + } + while (len >= 64) + { + byte_copy((char *)ctx->in, 64, s) ; + uint32_little_endian((char *)ctx->in, 16) ; + md5_transform(ctx->buf, (uint32 *)ctx->in) ; + s += 64 ; len -= 64 ; + } + byte_copy((char *)ctx->in, len, s) ; +} |