void md2_final(MD2_CTX *ctx, BYTE hash[]) { int to_pad; to_pad = MD2_BLOCK_SIZE - ctx->len; while (ctx->len < MD2_BLOCK_SIZE) ctx->data[ctx->len++] = to_pad; md2_transform(ctx, ctx->data); md2_transform(ctx, ctx->checksum); memcpy(hash, ctx->state, MD2_BLOCK_SIZE); }
void md2_digest(struct md2_ctx *ctx, unsigned length, uint8_t *digest) { unsigned left; assert(length <= MD2_DIGEST_SIZE); left = MD2_DATA_SIZE - ctx->index; memset(ctx->block + ctx->index, left, left); md2_transform(ctx, ctx->block); md2_transform(ctx, ctx->C); memcpy(digest, ctx->X, length); md2_init(ctx); }
void md2_update(MD2_CTX *ctx, const BYTE data[], size_t len) { size_t i; for (i = 0; i < len; ++i) { ctx->data[ctx->len] = data[i]; ctx->len++; if (ctx->len == MD2_BLOCK_SIZE) { md2_transform(ctx, ctx->data); ctx->len = 0; } } }