屬性
名稱
屬性 - 屬性,演算法實作的選取機制
說明
自 OpenSSL 3.0 起,已導入一種新的方法,用於決定將使用哪個演算法的多重實作。此方法以屬性的概念為中心。每個實作定義多個屬性,而且在選取演算法時,可以根據這些屬性進行篩選,以選取最合適的演算法實作。
屬性就像變數,它們會根據名稱進行參照,並指派一個值。
屬性名稱
屬性名稱分為兩類:OpenSSL 專案保留的名稱和使用者定義的名稱。保留屬性名稱包含單一 C 式識別碼(不允許使用開頭底線),以字母開頭,後續可以接任意數量的字母、數字和底線。屬性名稱不區分大小寫,但 OpenSSL 只會使用小寫字母。
使用者定義屬性名稱類似,但必須包含兩個或更多個 C 式識別碼,並以句點分隔。名稱中的最後一個識別碼可以視為「真實」屬性名稱,前面加上某種「命名空間」。例如,提供者可以在字首中包含其名稱,並使用類似下列的屬性名稱
<provider_name>.<property_name>
<provider_name>.<algorithm_name>.<property_name>
屬性
屬性是名稱=值配對。屬性定義是逗號分隔屬性的序列。定義中可以包含任意數量的屬性,但每個名稱都必須是唯一的。例如:"" 定義一個空的屬性定義(即,沒有限制);"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 取得副本。