/**
* @file CM_MD5.h
* @brief MD5计算
* @details
* 两个不同文件具有相同MD5值的概率为1/2^64
* 错误的文件能匹配特定MD5值的概率为1/2^128
* @author GT-BU
* @date 2021.05.01
* @version V1.0
* @copyright TCT
* @par 修改日志
* <table>
* <tr><th>Date        <th>Version  <th>Author     <th>Description
* <tr><td>2021.05.01  <td>V1.0     <td>GT-BU      <td>创建初始版本
* </table>
*/
#ifndef CM_MD5_H
#define CM_MD5_H

#include "CM_Types.h"

#ifdef __cplusplus
extern "C"
{
#endif /**< __cplusplus */

#define CM_MD5_SIZE_BYTE (16U)

    /** MD5计算结构体 */
    typedef struct
    {
        CM_UINT32 state[4];  /* 状态 */
        CM_UINT32 count[2];  /* 计数 */
        unsigned char buffer[64]; /* 中间结果  */
    }MD5Context_T;/*MD5运算过程中缓存信息的结构体*/

    /**
    * @brief 计算MD5
    * @param[in] inputString
    * @param[in] len
    * @param[out] pOutMD5Buf
    * @return CM_BOOL
    */
    ENUM_CM_RETURN CM_MD5_Calc(IN const CM_UINT8* inputString, IN CM_UINT32 len, OUT CM_UINT8 pOutMD5Buf[CM_MD5_SIZE_BYTE]);

    /**
    * @brief 初始化Context结构，定义CM_MD5Context之后调用
    * @param[inout] context MD5Context_T结构指针
    * @return CM_BOOL
    * @note 分步计算MD5用
    */
    ENUM_CM_RETURN CM_MD5_Init(INOUT MD5Context_T* context);

    /**
    * @brief 将data信息，计算并入context中
    * @param[inout] context MD5Context_T结构指针
    * @param[in] buf 输入字符首指针
    * @param[in] len 输入字符数
    * @return CM_BOOL
    * @note 分步计算MD5用
    */
    ENUM_CM_RETURN CM_MD5_Update(INOUT MD5Context_T* context, IN const CM_UINT8 buf[], IN CM_UINT32 len);

    /**
    * @brief 计算context的MD5数值
    * @param[inout] context MD5Context_T结构指针
    * @param[out] digest MD5数值
    * @return CM_BOOL
    * @note 分步计算MD5用
    */
    ENUM_CM_RETURN CM_MD5_Final(INOUT MD5Context_T* context, OUT CM_UINT8 digest[CM_MD5_SIZE_BYTE]);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _CM_MD5_H */
