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

在FIPS模式下使用OpenSSL计算SHA256哈希,openssl,sha256,fips,Openssl,Sha256,Fips,背景 我已经使用OpenSSL FIPS对象模块编译了OpenSSL(遵循交叉编译到Android的说明) 现在,在我的代码中,我想使用SHA256(据我所见,至少有一些SHA256算法是FIPS批准的) 问题 调用set_mode(1)在运行时启用FIPS后,以下代码在OpenSSLDie中崩溃(可能意味着FIPS禁用) 问题 调用private\u SHA256\u Init似乎是可行的,但这是正确的方法还是绕过了FIPS合规性? 如果不是正确的方法,如何在FIPS模式下计算SHA256 如

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

现在,在我的代码中,我想使用SHA256(据我所见,至少有一些SHA256算法是FIPS批准的)

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

问题

  • 调用
    private\u SHA256\u Init
    似乎是可行的,但这是正确的方法还是绕过了FIPS合规性? 如果不是正确的方法,如何在FIPS模式下计算SHA256

  • 如果不用于加密,则允许使用未经批准的算法(根据FIPS-140.2),那么调用私有函数是否合适(例如,计算SHA1,这在FIPS模式下似乎根本不可能,但不用于加密)

  • 更多信息

    使用的版本:据我所知,openssl-1.0.1q、openssl-fips-2.0.11等低级函数的使用已被弃用,例如
    SHA256_Init

    目前批准的使用OpenSSL计算摘要的方法是通过
    EVP
    。SHA-256的示例取自:

    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, data, len);
    SHA256_Final(outputBuffer, &sha256);
    
    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);
    }