背景
我用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);
问题
似乎调用private_SHA256_Init
会起作用,但它是正确的方式还是绕过FIPS合规性?
如果不是正确的方法,我怎样才能在FIPS模式下计算SHA256?
由于不使用非批准算法(如果不是加密算法)(通过FIPS-140.2),因此调用私有函数会很好(例如计算SHA1,这似乎完全没有问题) FIPS模式,但它不能用于加密)
更多信息
使用的版本:openssl-1.0.1q,openssl-fips-2.0.11
答案 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);
}