OpenSSL

密码学和 SSL/TLS 工具包

property

名称

property - 属性,一种算法实现选择机制

描述

从 OpenSSL 3.0 开始,引入了一种新的方法来决定使用多个算法实现中的哪一个。该方法围绕属性的概念展开。每个实现都定义了一组属性,在选择算法时,可以使用基于这些属性的过滤器来选择最合适的算法实现。

属性类似于变量,它们通过名称引用,并分配一个值。

属性名称

属性名称分为两类:OpenSSL 项目保留的名称和用户定义的名称。保留属性名称由单个 C 样式标识符组成(除了不允许前导下划线),该标识符以字母开头,后面可以跟随任意数量的字母、数字和下划线。属性名称不区分大小写,但 OpenSSL 仅使用小写字母。

用户定义属性名称类似,但它必须由两个或多个以点分隔的 C 样式标识符组成。名称中的最后一个标识符可以被认为是“真实”属性名称,它由某种“命名空间”作为前缀。例如,提供者可以在前缀中包含其名称,并使用诸如

<provider_name>.<property_name>
<provider_name>.<algorithm_name>.<property_name>

属性

属性是一个name=value对。属性定义是一系列以逗号分隔的属性。定义中可以有任意数量的属性,但是每个名称必须唯一。例如:"" 定义一个空属性定义(即没有限制);"my.foo=bar" 定义了一个名为my.foo的属性,它具有一个字符串值bar,而 "iteration.count=3" 定义了一个名为iteration.count的属性,它具有一个数值3。属性定义的完整语法如下所示。

实现

每个算法实现都可以定义任意数量的属性。例如,默认提供者为其所有算法定义了属性provider=default。同样,OpenSSL 的 FIPS 提供者为其所有算法定义了provider=fips,而遗留提供者为其所有算法定义了provider=legacy

查询

属性查询子句是一个单一的条件测试。例如,“fips=yes”、“provider!=default”或“?iteration.count=3”。前两个表示强制性子句,这些子句必须与任何算法匹配,算法才能被考虑。第三个子句表示可选子句。匹配此类子句不是必需的,但任何额外的可选匹配都将有利于算法。有关这方面的更多详细信息,请参阅查找部分。属性查询是一系列以逗号分隔的属性查询子句。如果属性名称在多个查询子句中出现,则会发生错误。属性查询的完整语法如下所示,但可用的语法特性如下

  • =是一个中缀运算符,提供相等性测试。

  • !=是一个中缀运算符,提供不相等性测试。

  • ?是一个前缀运算符,表示以下子句是可选的,但优先级更高。

  • -是一个前缀运算符,表示应忽略涉及以下属性名称的任何全局查询子句。

  • "..."是一个带引号的字符串。引号不包含在字符串主体中。

  • '...'是一个带引号的字符串。引号不包含在字符串主体中。

查找

当查找算法时,属性查询用于确定最佳匹配算法。所有强制性查询子句必须存在,并且额外具有最大数量的匹配可选查询子句的实现将被使用。如果存在多个此类最佳候选,将从这些候选者中以不确定的方式选择结果。可选子句的排序无关紧要。

快捷方式

为了允许更简洁地表达布尔属性,提供了一个快捷方式:单独的属性名称(例如“my.property”)在定义和查询中与“my.property=yes”完全等效。

全局和本地

支持两种级别的属性查询。一个基于上下文的属性查询,它适用于所有获取操作,以及一个本地属性查询。如果上下文和本地查询都包含具有相同名称的子句,则本地子句将覆盖上下文子句。

本地属性查询可以通过在属性名称前添加“-”来删除上下文属性查询中的子句。例如,包含“fips=yes”的上下文属性查询通常会导致具有“fips=yes”的实现。

但是,如果“fips”属性的设置与正在执行的操作无关,则本地属性查询可以包含子句“-fips”。请注意,本地属性查询不能使用“fips=no”,因为这将不允许任何具有“fips=yes”的实现,而不是不关心设置。

语法

EBNF 中的词法语法由以下内容给出

Definition     ::= PropertyName ( '=' Value )?
                       ( ',' PropertyName ( '=' Value )? )*
Query          ::= PropertyQuery ( ',' PropertyQuery )*
PropertyQuery  ::= '-' PropertyName
                 | '?'? ( PropertyName (( '=' | '!=' ) Value)?)
Value          ::= NumberLiteral | StringLiteral
StringLiteral  ::= QuotedString | UnquotedString
QuotedString   ::= '"' [^"]* '"' | "'" [^']* "'"
UnquotedString ::= [A-Za-z] [^{space},]+
NumberLiteral  ::= '0' ( [0-7]* | 'x' [0-9A-Fa-f]+ ) | '-'? [1-9] [0-9]+
PropertyName   ::= [A-Za-z] [A-Za-z0-9_]* ( '.' [A-Za-z] [A-Za-z0-9_]* )*

使用的 EBNF 风格由以下内容定义:https://www.w3.org/TR/2010/REC-xquery-20101214/#EBNFNotation.

历史

属性是在 OpenSSL 3.0 中添加的

版权所有 2019-2023 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0(“许可证”)授权。除符合许可证的规定外,您不得使用本文件。您可以在源代码分发中的 LICENSE 文件或https://www.openssl.org/source/license.html中获取副本。