首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查FIPS模块是否提供了算法

检查FIPS模块是否提供了算法
EN

Stack Overflow用户
提问于 2022-10-08 09:17:50
回答 1查看 60关注 0票数 0

我与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脚本来尝试它。

代码语言:javascript
复制
#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,所以它不应该是空的。

请帮我弄明白为什么我在这里出了故障,我该如何解决。

编辑

做了一些马特建议的修改:

代码语言:javascript
复制
#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文件:

代码语言:javascript
复制
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时的输出:

代码语言:javascript
复制
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上失败了。

EN

回答 1

Stack Overflow用户

发布于 2022-10-10 21:33:32

OpenSSL-3wiki还讨论了从特定提供者获取算法https://wiki.openssl.org/index.php/OpenSSL_3.0#Fetching_algorithms_and_property_queries

代码语言:javascript
复制
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))));
}

这给了我预期的输出:

代码语言:javascript
复制
EVP_DigestInit_ex(mdctx,EVP_sha256(),NULL): 1
OSSL_PROVIDER_available: 1
fips%
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73995787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档