我与FIPS提供程序一起使用Openssl-3,并希望确认它被用于不同的算法。在OpenSSL3wiki中列出了一种方法:https://wiki.openssl.org/index.php/OpenSSL_3.0#Confirming_that_an_algorithm_is_being_provided_by_the_FIPS_module
它需要一些修改来解决Openssl 3中API的变化,我编写了一个小的C脚本来尝试它。
#include <stdio.h>
#include <openssl/provider.h>
#include <lopenssl/evp.h>
int main(void)
{
EVP_MD_CTX * mdctx;
md = EVP_get_digestbyname("sha1");
mdctx = EVP_MD_CTX_new();
EVP_DigestInit_ex2(mdctx,md,NULL);
printf(OSSL_PROVIDER_get0_name(EVP_MD_get0_provider(EVP_MD_CTX_get0_md(mdctx))));
}我期望模块的名称作为输出,在本例中应该是FIPS。但我有个分割错误。
为了理解这个问题,我尝试在GDB中进行调试,我在EVP_MD_get0_provider(md = 0x0)上得到了一个seg错误。以下是EVP_MD_get0_provider:https://github.com/openssl/openssl/blob/master/crypto/evp/evp_lib.c#L793的定义
因此,看起来EVP_MD_get0_provider中传递的参数为NULL,这将导致分段错误。传递的参数是EVP_MD_CTX_get0_md(ctx)的返回,在这里定义为:https://github.com/openssl/openssl/blob/master/crypto/evp/evp_lib.c#L1021
如果我的ctx是空的,那么返回将是空的,但是由于我已经初始化了ctx,所以它不应该是空的。
请帮我弄明白为什么我在这里出了故障,我该如何解决。
编辑
做了一些马特建议的修改:
#include <stdio.h>
#include <openssl/provider.h>
#include <openssl/evp.h>
int main(void)
{
EVP_MD_CTX * mdctx;
mdctx = EVP_MD_CTX_new();
printf("EVP_DigestInit_ex(mdctx,EVP_sha256(),NULL): %d\n", EVP_DigestInit_ex(mdctx,EVP_sha256(),NULL));
printf("OSSL_PROVIDER_available: %d\n",OSSL_PROVIDER_available(NULL,"fips"));
printf(OSSL_PROVIDER_get0_name(EVP_MD_get0_provider(EVP_MD_CTX_get0_md(mdctx))));
}以下是Config文件:
config_diagnostics = 1
openssl_conf = openssl_init
.include /Openssl/build/ssl/fipsmodule.cnf
[openssl_init]
providers = provider_sect
[provider_sect]
fips = fips_sect
base = base_sect
[base_sect]
activate = 1连接到GDB时的输出:
EVP_DigestInit_ex(mdctx,EVP_sha256(),NULL): 1
OSSL_PROVIDER_available: 1
Program received signal SIGSEGV, Segmentation fault.
ossl_provider_name (prov=0x0) at crypto/provider_core.c:1490
1490 return prov->name;我能够验证FIPS提供程序是否已经加载,而且错误现在也不同了,它在EVP_MD_get0_provider上失败了。
发布于 2022-10-10 21:33:32
OpenSSL-3wiki还讨论了从特定提供者获取算法https://wiki.openssl.org/index.php/OpenSSL_3.0#Fetching_algorithms_and_property_queries。
int main(void)
{
EVP_MD_CTX * mdctx;
EVP_MD * sha256;
mdctx = EVP_MD_CTX_new();
sha256 = EVP_MD_fetch(NULL,"SHA-256","fips=yes");
if (sha256 == NULL)
exit(1);
printf("EVP_DigestInit_ex(mdctx,sha256,NULL): %d\n", EVP_DigestInit_ex(mdctx,sha256,NULL));
printf("OSSL_PROVIDER_available: %d\n",OSSL_PROVIDER_available(NULL,"fips"));
printf(OSSL_PROVIDER_get0_name(EVP_MD_get0_provider(EVP_MD_CTX_get0_md(mdctx))));
}这给了我预期的输出:
EVP_DigestInit_ex(mdctx,EVP_sha256(),NULL): 1
OSSL_PROVIDER_available: 1
fips%https://stackoverflow.com/questions/73995787
复制相似问题