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

Calculating SHA256 hash with OpenSSL in FIPS mode

背景
我已经使用 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 模式下完全没有问题,但它不能用于加密)

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

据我所知,不推荐使用 low-level 函数,例如 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);
}