/*****************************************************************************
* 函 数 名  : crypto_hash
*
* 功能描述  : 计算输入的数据,输出16字节的HASH值,当前支持MD5、和SHA-1算法。
*
* 输入参数  : data:      待计算HASH值的数据。
*             len:       待计算HASH值的数据长度。(byte)
*             algorithm: 所要使用的HASH算法。
*             hlen:      作为输入参数,存放HASH值的缓冲区的长度。(byte)
*
* 输出参数  : hash:      存放生成的HASH值。buffer必须大于16(MD5)/20(SHA-1)字节。
*             hlen:      作为输出参数,存放生成的HASH值的长度。(byte)
*
* 返 回 值  : OK:        生成成功。
*             ERROR:     生成失败。
*
* 其它说明  : hlen为输入/输出参数,传入的hlen变量所用内存必须可写回。
*             所以避免直接传入类似sizeof()的函数调用结果。
*
*****************************************************************************/
int crypto_hash_o(char *data, int len, CRYPTO_HASH_ALGORITHM algorithm, char *hash, int *hlen)
{
    if(data == NULL || hash == NULL || hlen == NULL)
    {
        security_print("ERROR crypto_hash: param is NULL pointer!\n");
        return BSP_ERROR;
    }

    if(len<=0 )
    {
        security_print("ERROR crypto_hash: param is invalid!\n");
        return BSP_ERROR;
    }

    switch(algorithm)
    {
    case CRYPTO_ALGORITHM_SHA256:

        if (*hlen < SHA256_DIGEST_LENGTH)
        {
            security_print("ERROR crypto_hash: param hlen is invalid!(hash bufsize is too small)\n");
            return BSP_ERROR;
        }

        SHA256_Hash((const sha2_byte*)data, (size_t)len,(sha2_byte*)hash);

        *hlen = SHA256_DIGEST_LENGTH;

        break;
    case CRYPTO_ALGORITHM_MD5:
    case CRYPTO_ALGORITHM_SHA1:
    default:
        security_print("ERROR crypto_hash: unknown algorithm!\n");

        return BSP_ERROR;
    }

    return BSP_OK;
}/*lint !e429*/
示例#2
0
/*****************************************************************************
* 函 数 名  : crypto_hash
*
* 功能描述  : 计算输入的数据,输出16字节的HASH值,当前支持MD5、和SHA-1算法。
*
* 输入参数  : data:      待计算HASH值的数据。
*             len:       待计算HASH值的数据长度。(byte)
*             algorithm: 所要使用的HASH算法。
*             hlen:      作为输入参数,存放HASH值的缓冲区的长度。(byte)
*
* 输出参数  : hash:      存放生成的HASH值。buffer必须大于16(MD5)/20(SHA-1)字节。
*             hlen:      作为输出参数,存放生成的HASH值的长度。(byte)
*
* 返 回 值  : OK:        生成成功。
*             ERROR:     生成失败。
*
* 其它说明  : hlen为输入/输出参数,传入的hlen变量所用内存必须可写回。
*             所以避免直接传入类似sizeof()的函数调用结果。
*
*****************************************************************************/
int crypto_hash_o(char *data, int len, CRYPTO_HASH_ALGORITHM algorithm, char *hash, int *hlen)
{
    if(data == NULL || hash == NULL || hlen == NULL)
    {
        security_print("ERROR crypto_hash: param is NULL pointer!\n");
        return BSP_ERROR;
    }

    if(len<=0 )
    {
        security_print("ERROR crypto_hash: param is invalid!\n");
        return BSP_ERROR;
    }

    switch(algorithm)
    {
    case CRYPTO_ALGORITHM_MD5:

        if(*hlen<16)
        {
            security_print("ERROR crypto_hash: param hlen is invalid!(hash bufsize is too small)\n");
            return BSP_ERROR;
        }

        // FIXME: need rewrite MD5 function! NO return value!
        encrypt_lock_md5_data (data, len, hash);
        /*
        if(BSP_OK != encrypt_lock_md5_data (data, len, hash))
        {
            security_print("ERROR crypto_hash: encrypt_lock_md5_data failed!\n");
            return BSP_ERROR;
        }
        */

        *hlen = MD5_HASH_LEN/8;

        break;

    case CRYPTO_ALGORITHM_SHA1:

        if(*hlen<20)
        {
            security_print("ERROR crypto_hash: param hlen is invalid!(hash bufsize is too small)\n");
            return BSP_ERROR;
        }

        /*if(BSP_OK != SHA1Hash(data,len,(BSP_U32*)hash))*/
        {
            security_print("ERROR crypto_hash: SHA1Hash not support!\n");
            return BSP_ERROR;
        }

        /* *hlen = SHA1_HASH_LEN; */

        break;

    case CRYPTO_ALGORITHM_SHA256:

        if (*hlen < SHA256_DIGEST_LENGTH)
        {
            security_print("ERROR crypto_hash: param hlen is invalid!(hash bufsize is too small)\n");
            return BSP_ERROR;
        }

        SHA256_Hash((unsigned char*)data,len,(unsigned char*)hash);

        *hlen = SHA256_DIGEST_LENGTH;

        break;
    default:
        security_print("ERROR crypto_hash: unknown algorithm!\n");

        return BSP_ERROR;
    }

    return BSP_OK;
}/*lint !e429*/