/**
 * @file    myMd5.h
 * @brief   MD5 消息摘要算法接口（RFC 1321）
 * @details 计算 128 位哈希值，支持流式输入。
 *          提供单次调用便捷函数 md5_string()。
 */

#ifndef _MY_MD5_H_
#define _MY_MD5_H_
#include <stdint.h>

#ifdef __cplusplus
extern "C"
{
#endif

/**
 * @brief  MD5 计算上下文（状态 + 计数 + 待处理缓冲区）
 */
typedef struct
{
	uint32_t      state[4];    /* A, B, C, D 四个 32 位状态寄存器 */
	uint32_t      count[2];    /* 位计数（低 32 位, 高 32 位） */
	unsigned char buf[64];     /* 待处理数据缓冲区（64 字节） */
} stru_md5_ctx;

/**
 * @brief  初始化 MD5 上下文
 * @param  ctx  上下文指针（设置魔数 A=0x67452301 B=0xefcdab89 C=0x98badcfe D=0x10325476）
 */
void md5_start(stru_md5_ctx *ctx);

/**
 * @brief  输入待计算数据（可多次调用，支持流式处理）
 * @param  ctx   上下文指针
 * @param  data  数据缓冲区
 * @param  len   数据长度（字节）
 */
void md5_update(stru_md5_ctx *ctx, const unsigned char *data, int len);

/**
 * @brief  完成计算，输出 16 字节 MD5 摘要
 * @param  ctx     上下文指针
 * @param  result  输出缓冲区（至少 16 字节）
 */
void md5_final(stru_md5_ctx *ctx, unsigned char result[16]);

/**
 * @brief  单次调用便捷函数：计算字符串的 MD5，返回大写十六进制字符串
 * @param  input   输入字符串（以 '\0' 结尾）
 * @param  output  输出缓冲区（至少 33 字节，含结尾 '\0'）
 */
void md5_string(const char *input, char output[33]);

#ifdef __cplusplus
}
#endif
#endif
