開放SSL

密碼學和 SSL/TLS 工具組

屬性

名稱

屬性 - 屬性,演算法實作的選取機制

說明

自 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 取得副本。