在FIPS模式下使用OpenSSL计算SHA256哈希值

时间:2016-01-07 09:28:58

标签: openssl sha256 fips

背景
我用OpenSSL FIPS对象模块编译了OpenSSL(遵循交叉编译到Android的说明)。

现在在我的代码中我想使用SHA256(从我所看到的至少一些sha256算法是FIPS批准的。)

问题
在调用set_mode(1)以在运行时启用FIPS后,以下代码在OpenSSLDie中崩溃(可能意味着FIPS禁用)

SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, data, len);
SHA256_Final(outputBuffer, &sha256);

问题

  1. 似乎调用private_SHA256_Init会起作用,但它是正确的方式还是绕过FIPS合规性? 如果不是正确的方法,我怎样才能在FIPS模式下计算SHA256?

  2. 由于不使用非批准算法(如果不是加密算法)(通过FIPS-140.2),因此调用私有函数会很好(例如计算SHA1,这似乎完全没有问题) FIPS模式,但它不能用于加密)

  3. 更多信息
    使用的版本:openssl-1.0.1q,openssl-fips-2.0.11

1 个答案:

答案 0 :(得分:1)

据我所知,不推荐使用SHA256_Init等低级函数。

目前批准的使用OpenSSL计算摘要的方法是EVP。 SHA-256的示例,取自https://wiki.openssl.org/index.php/EVP_Message_Digests

void digest_message(unsigned char *message, unsigned char **digest, unsigned int *digest_len)
{
    EVP_MD_CTX *mdctx;

    if((mdctx = EVP_MD_CTX_create()) == NULL)
        handleErrors();

    if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
        handleErrors();

    if(1 != EVP_DigestUpdate(mdctx, message, strlen(message)))
        handleErrors();

    if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL)
        handleErrors();

    if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
        handleErrors();

    EVP_MD_CTX_destroy(mdctx);
}