共计 2233 个字符,预计需要花费 6 分钟才能阅读完成。
译|王祖熙(花名:金九 )
蚂蚁团体开发工程师
负责国产化明码库 Tongsuo 的开发和保护
专一于密码学、高性能网络、网络安全等畛域
本文 2179 字 浏览 6 分钟
本文翻译 OpenSSL 官网文档:https://www.openssl.org/docs/OpenSSL300Design.html
Tongsuo-8.4.0 是基于 OpenSSL-3.0.3 开发,所以本文对 Tongsuo 开发者同样实用,内容丰盛,值得一读!
明天带来的是 OpenSSL 3.0.0 设计最初一部分内容 《遗留问题、遗留 Provider 模块、ENGINE API》,已公布文章可查看文章列表。
遗留问题
EVP 到低级 API 的桥接
在某些中央,低级 API 构造被赋值给 EVP_PKEY
对象,对公共的 EVP_PKEY
的影响是它必须保留指向可能的低级构造的指针,并且在 libcrypto 外部必须晓得该低级构造的类型,每当具备这种指针的 EVP_PKEY
用于任何计算时,都必须查看低级构造是否产生了变动,并将其数据转换为能够与新的 Provider 一起应用的参数。
确定如何查看低级构造的内容是否产生了变动的具体机制有待确定,一种可能的办法是在低级构造中设置一个 dirty 计数器,并在 EVP_PKEY
构造中复制一个正本,每当低级构造发生变化时(例如,RSA_set0_key
等函数必须执行递增操作),每当 EVP_PKEY
用于计算时,就会将其正本与低级脏计数器进行比拟,如果它们不同,则 EVP_PKEY
的 Provider 参数将应用低级构造的数据进行批改。
(另一个想法是通过遗留函数在 EVP_PKEY
中搁置一个回调函数,如果检测到低级别的更改,则更新参数)
EVP 办法创建者
在 OpenSSL 1.1.x 中有能够轻松创立各 EVP
办法构造的性能,能够像这样找到:
grep EVP_CIPHER_meth util/libcrypto.num
grep EVP_MD_meth util/libcrypto.num
grep EVP_PKEY_meth util/libcrypto.num
相干类型
低级 API 相当独立,因而除了在某些类型中增加了一个 dirty 标记外,所有低级 API 类型将放弃不变。关联的 EVP_CIPHER
、EVP_MD
、EVP_PKEY_METHOD
、EVP_MAC
或EVP_KDF
实例通过在遗留 Provider 模块中通过实现调度表来独自解决(见下文)。
遗留 Provider 模块
一些被认为是“遗留”的算法(例如 IDEA)且具备以后的 EVP_CIPHER
、EVP_MD
、EVP_PKEY_METHOD
、EVP_MAC
或EVP_KDF
实现将移至一个名为 “Legacy” 的 Provider 模块,而不是咱们的默认 Provider 模块。
以下算法的办法将成为“Legacy”Provider 模块中的调度表:
- Blowfish
- CAST
- DES(但不包含 3DES)
- DSA
- IDEA
- MD2
- MD4
- MDC2
- RC2
- RC4
- RC5
- RIPEMD160
- SEED
- Whirlpool
(留神:这不是一个详尽无遗的列表,只管对目前来说相当残缺)
ENGINE API
整个 ENGINE API 将在此版本之后的次要公布中被弃用和移除,到那时,人们必须学会如何创立 Provider 模块。与此同时,它将被转变为一个工具,帮忙实现者从 ENGINE 模块实现过渡到 Provider 模块实现。
因为算法构造函数将被更改为结构调度表,因而 ENGINE 类型将变为一组调度表,并且 ENGINE 构造函数的性能将更改为将它们收集到给定的 ENGINE 中。
通过这种注册形式注册的调度表将增加一个名为 “engine” 的属性,并将 ENGINE 标识作为 Provider 名称属性。这将使 ENGINE_by_id
和相似性能可能找到正确的 Provider。
ENGINE 模块的入口点 bind_engine 将被替换为 Provider 模块的入口点,并且宏 IMPLEMENT_DYNAMIC_BIND_FN
将被更改为结构此类入口点。此入口点将创立一个相似 Provider 的 ENGINE 构造,调用绑定函数,该函数将应用与之前雷同的办法创立函数将其填充到调度表中,而后应用与以前雷同的办法设置函数将所有这些收集到的调度表在 ENGINE 构造中注册,就像任何 Provider 模块一样。
与此版本的其余部分一样,咱们的指标是源代码级的兼容性。
在 OpenSSL 1.1.x 及更早版本中,能够应用诸如 ENGINE_get_default_RSA
和ENGINE_get_RSA
等函数,将 ENGINE 提供的办法挂钩以代替内置于 libcrypto 中的函数,前者无需批改,而后者将被更改为依据附加到引擎的相应调度表创立新式办法(例如RSA_METHOD
)。
附录与备注 局部内容请间接查看 铜锁语雀:
- 《附录 1- 属性语法》:https://www.yuque.com/tsdoc/ts/openssl-300-design#NDwuz
- 《附录 2- 参数传递》:https://www.yuque.com/tsdoc/ts/openssl-300-design#Q6UPj
- 《附录 3- 算法》:https://www.yuque.com/tsdoc/ts/openssl-300-design#CCzK4
- 《备注》:https://www.yuque.com/tsdoc/ts/openssl-300-design#JI5ez
铜锁语雀:https://www.yuque.com/tsdoc/ts