乐趣区

关于openssl:OpenSSL-300-设计五|遗留问题遗留-Provider-模块ENGINE-API

译|王祖熙(花名:金九 )

蚂蚁团体开发工程师

负责国产化明码库 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_CIPHEREVP_MDEVP_PKEY_METHODEVP_MACEVP_KDF实例通过在遗留 Provider 模块中通过实现调度表来独自解决(见下文)。

遗留 Provider 模块

一些被认为是“遗留”的算法(例如 IDEA)且具备以后的 EVP_CIPHEREVP_MDEVP_PKEY_METHODEVP_MACEVP_KDF实现将移至一个名为 “Legacy” 的 Provider 模块,而不是咱们的默认 Provider 模块。

以下算法的办法将成为“Legacy”Provider 模块中的调度表:

  1. Blowfish
  2. CAST
  3. DES(但不包含 3DES)
  4. DSA
  5. IDEA
  6. MD2
  7. MD4
  8. MDC2
  9. RC2
  10. RC4
  11. RC5
  12. RIPEMD160
  13. SEED
  14. 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_RSAENGINE_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

退出移动版