/**
*@file    sr_md5.h
*@brief   哈希计算接口
*@details 提供哈希计算接口相关枚举、结构体
*@copyright Copyright (c) 2024 lierda. All rights reserved.
*@author  Lierda-RDC
*@date    2024-05-07
*@example ZhaoyangSDK\example\component\crypto\crypto_example.c
*/

#ifndef _SR_MD5_H
#define _SR_MD5_H

#include "mbedtls/md.h"

/**
* @brief 定义HASH类型枚举
*/
typedef enum
{
  SR_MD5 = MBEDTLS_MD_MD5,  		/**< The MD5 message digest. */
  SR_SHA224 = MBEDTLS_MD_SHA224,    /**< The SHA-224 message digest. */
  SR_SHA256 = MBEDTLS_MD_SHA256,    /**< The SHA-256 message digest. */
  SR_SHA384 = MBEDTLS_MD_SHA384,    /**< The SHA-384 message digest. */
  SR_SHA512 = MBEDTLS_MD_SHA512,    /**< The SHA-512 message digest. */    
}SR_HASH_TYPE_E;


/**
* @brief HASH上下文结构体
*/
typedef struct 
{
    mbedtls_md_context_t  mdCtx;    /*!<其他平他或库上下文句柄指针，用于存储计算过程中的中间状态*/

}SR_HASH_CTX_T;


/**  
 * @brief 初始化HASH上下文  
 *  
 * 此函数用于初始化一个HASH上下文结构体，为后续的哈希计算做准备。  
 *  
 * @param[in] ctx  HASH上下文指针
 * @return 错误码   成功返回0，失败返回负值错误码
 */  
int SR_HashStart(SR_HASH_CTX_T *ctx,SR_HASH_TYPE_E type);


/**  
 * @brief 更新哈希计算 
 *  
 * 使用给定的输入数据更新哈希计算。可多次调用  
 *  
 * @param[in] ctx HASH上下文指针
 * @param[in] in  输入数据指针  
 * @param[in] inLen 输入数据的长度（字节） 
 * @return 错误码   成功返回0，失败返回负值错误码 
 */
int SR_HashUpdate(SR_HASH_CTX_T *ctx, uint8_t *in, uint32_t inLen);


/**  
 * @brief 完成哈希计算并获取结果  
 *  
 * 完成哈希计算，并将最终的结果存储在提供的输出数组中。
 *  
 * @param[in]  ctx HASH上下文指针  
 * @param[out] out 存储哈希值的缓存，MD5至少16个字节的空间  
 * @return 错误码   成功(>0):返回输出长度，失败返回负值错误码
 */  
int SR_HashFinish(SR_HASH_CTX_T *ctx, uint8_t *out);


#endif


