怎么写一个openssl 3.0 版本的 provider,provider可以是空壳子,具体算法,可以是空的。
2条回答 默认 最新
- 阿里嘎多学长 2024-06-04 12:25关注
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
要创建一个OpenSSL 3.0版本的自定义provider,并为它添加随机数生成(rand)和摘要(digest)等功能,可以按照以下步骤进行:
-
定义Provider的入口点函数:每个Provider模块必须有一个入口点函数,这个函数是OpenSSL Core与Provider模块交互的接口。这个函数通常命名为
OSSL_provider_init
,并且需要遵循特定的签名。 -
注册Provider:在
OSSL_provider_init
函数中,你需要注册Provider,包括设置Provider的ID、名称、版本等信息,并注册Provider支持的算法。 -
实现随机数生成功能:在Provider中实现随机数生成功能,需要定义一个
RAND_METHOD
结构体,并实现其中的bytes
函数来生成随机数。 -
实现摘要功能:实现摘要功能需要定义一个
EVP_MD
结构体,并实现摘要算法的核心函数,如init
、update
、final
等。 -
编译和加载Provider:将Provider编译成动态链接库(
.so
或.dll
文件),并在OpenSSL应用程序中通过-provider
参数加载。
下面是一些代码示例和参考资料:
代码示例
入口点函数定义(参考[^5^]):
int OSSL_provider_init(const OSSL_PROVIDER *provider, const OSSL_DISPATCH *in, const OSSL_DISPATCH **out, void **provider_ctx);
随机数生成方法(参考[^5^]):
static int myrand_bytes(unsigned char *buf, size_t num) { // 实现随机数生成逻辑 return 1; } const RAND_METHOD rand_method = { NULL, // seed myrand_bytes, // bytes NULL, // cleanup NULL, // add NULL, // pseudorand myrand_status // status };
注册Provider(参考[^4^]):
static int OSSL_provider_init(const OSSL_PROVIDER *provider, const OSSL_DISPATCH *in, const OSSL_DISPATCH **out, void **provider_ctx) { // 收集由Core提供的函数 // ... // 注册Provider支持的算法 // ... return 1; }
参考资料
- OpenSSL 3.0自定义provider实现:openssl engine引擎 实现rand随机数[^5^]
- OpenSSL 3.0设计文档:OpenSSL 3.0.0 设计(二)|Core 和 Provider 设计[^4^]
- OpenSSL中文手册:实现Engine示例_OpenSSL 中文手册[^2^]
请注意,这些代码示例和参考资料提供了一个基本的框架和思路,具体的算法实现需要根据你的具体需求来完成。如果你需要一个空壳子的provider,你可以在
RAND_METHOD
和EVP_MD
中实现空函数,但在实际使用中,你需要填充这些函数以提供具体的功能。解决 无用评论 打赏 举报 编辑记录 -
悬赏问题
- ¥15 35114 SVAC视频验签的问题
- ¥15 impedancepy
- ¥15 在虚拟机环境下完成以下,要求截图!
- ¥15 求往届大挑得奖作品(ppt…)
- ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
- ¥50 浦育平台scratch图形化编程
- ¥20 求这个的原理图 只要原理图
- ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
- ¥20 微信的店铺小程序如何修改背景图
- ¥15 UE5.1局部变量对蓝图不可见