OpenSSL

密碼學和 SSL/TLS 工具包

OSSL_PROVIDER-FIPS

名稱

OSSL_PROVIDER-FIPS - OpenSSL FIPS 提供者

說明

OpenSSL FIPS 提供者是一個特殊提供者,符合 FIPS 140-3 中規定的聯邦資訊處理標準 (FIPS)。此「模組」包含一組經由認可測試實驗室驗證的核准密碼演算法。

屬性

此提供者中的實作特別定義了這些屬性

"provider=fips"
"fips=yes"

它可用於屬性查詢字串,搭配擷取函數使用,例如 EVP_MD_fetch(3)EVP_CIPHER_fetch(3),以及其他採用屬性查詢字串的函數,例如 EVP_PKEY_CTX_new_from_name(3)

若要符合 FIPS,必須在所有屬性查詢中包含 fips=yes。這可確保密碼運算只使用 FIPS 核准的實作。fips=yes 查詢也可能包含 FIPS 提供者中不存在的其他非密碼支援運算,例如非對稱金鑰編碼器,請參閱 OSSL_PROVIDER-default(7) 中的「非對稱金鑰管理」

在屬性查詢中包含 provider=fips 並非強制性的。在屬性查詢中包含 provider=fips 可保證密碼運算使用 OpenSSL FIPS 提供者,而非其他具備 FIPS 功能的提供者。

提供者參數

請參閱 provider-base(7) 中的「提供者參數」,以取得基本參數清單。此外,OpenSSL FIPS 提供者也支援下列可取得參數

"security-checks" (OSSL_OSSL_PROV_PARAM_SECURITY_CHECKS) <unsigned integer>

如需進一步資訊,請參閱 openssl-fipsinstall(1) 選項 -no_security_checks

運算和演算法

OpenSSL FIPS 提供者支援這些運算和演算法

雜湊演算法/訊息摘要

SHA1,請參閱 EVP_MD-SHA1(7)
SHA2,請參閱 EVP_MD-SHA2(7)
SHA3,請參閱 EVP_MD-SHA3(7)
KECCAK-KMAC,請參閱 EVP_MD-KECCAK-KMAC(7)
SHAKE,請參閱 EVP_MD-SHAKE(7)

對稱式密碼

AES,請參閱 EVP_CIPHER-AES(7)
3DES,請參閱 EVP_CIPHER-DES(7)

這是一個未經核准的演算法。

訊息驗證碼 (MAC)

CMAC,請參閱 EVP_MAC-CMAC(7)
GMAC,請參閱 EVP_MAC-GMAC(7)
HMAC,請參閱 EVP_MAC-HMAC(7)
KMAC,請參閱 EVP_MAC-KMAC(7)

金鑰衍生函數 (KDF)

HKDF,請參閱 EVP_KDF-HKDF(7)
TLS13-KDF,請參閱 EVP_KDF-TLS13_KDF(7)
SSKDF,請參閱 EVP_KDF-SS(7)
PBKDF2,請參閱 EVP_KDF-PBKDF2(7)
SSHKDF,請參閱 EVP_KDF-SSHKDF(7)
TLS1-PRF,請參閱 EVP_KDF-TLS1_PRF(7)
KBKDF,請參閱 EVP_KDF-KB(7)
X942KDF-ASN1,請參閱 EVP_KDF-X942-ASN1(7)
X942KDF-CONCAT,請參閱 EVP_KDF-X942-CONCAT(7)
X963KDF,請參閱 EVP_KDF-X963(7)

金鑰交換

DH,請參閱 EVP_KEYEXCH-DH(7)
ECDH,請參閱 EVP_KEYEXCH-ECDH(7)
X25519,請參閱 EVP_KEYEXCH-X25519(7)
X448,請參閱 EVP_KEYEXCH-X448(7)
TLS1-PRF
HKDF

非對稱簽章

RSA,請參閱 EVP_SIGNATURE-RSA(7)
DSA,請參閱 EVP_SIGNATURE-DSA(7)
ED25519,請參閱 EVP_SIGNATURE-ED25519(7)

這是一個未經核准的演算法。

ED448,請參閱 EVP_SIGNATURE-ED448(7)

這是一個未經核准的演算法。

ECDSA,請參閱 EVP_SIGNATURE-ECDSA(7)
HMAC,請參閱 EVP_SIGNATURE-HMAC(7)
CMAC,請參閱 EVP_SIGNATURE-CMAC(7)

非對稱密碼

RSA,請參閱 EVP_ASYM_CIPHER-RSA(7)

非對稱金鑰封裝

RSA,請參閱 EVP_KEM-RSA(7)

非對稱金鑰管理

DH,請參閱 EVP_KEYMGMT-DH(7)
DHX,請參閱 EVP_KEYMGMT-DHX(7)
DSA,請參閱 EVP_KEYMGMT-DSA(7)
RSA,請參閱 EVP_KEYMGMT-RSA(7)
RSA-PSS
EC,請參閱 EVP_KEYMGMT-EC(7)
X25519,請參閱 EVP_KEYMGMT-X25519(7)
X448,請參閱 EVP_KEYMGMT-X448(7)
ED25519,請參閱 EVP_KEYMGMT-ED25519(7)

這是一個未經核准的演算法。

ED448,請參閱 EVP_KEYMGMT-ED448(7)

這是一個未經核准的演算法。

TLS1-PRF
HKDF
HMAC,請參閱 EVP_KEYMGMT-HMAC(7)
CMAC,請參閱 EVP_KEYMGMT-CMAC(7)

隨機數產生

CTR-DRBG,請參閱 EVP_RAND-CTR-DRBG(7)
HASH-DRBG,請參閱 EVP_RAND-HASH-DRBG(7)
HMAC-DRBG,請參閱 EVP_RAND-HMAC-DRBG(7)
TEST-RAND,請參閱 EVP_RAND-TEST-RAND(7)

TEST-RAND 是一種未經核准的演算法。

自我測試

FIPS 模組的要求之一是自我測試。可使用選用的回呼機制,以 OSSL_SELF_TEST_set_callback(3) 向使用者傳回資訊。

傳遞給回呼的參數說明於 OSSL_SELF_TEST_new(3)

OpenSSL FIPS 模組使用下列機制,在執行自我測試時提供相關資訊。如果自我測試失敗,這對於除錯很有用。回呼也允許強制任何自我測試失敗,以檢查它在失敗時是否正確運作。請注意,即使發生自我測試失敗,所有自我測試仍會執行。

FIPS 模組會傳遞下列類型至 OSSL_SELF_TEST_onbegin()。

"Module_Integrity" (OSSL_SELF_TEST_TYPE_MODULE_INTEGRITY)

對模組檔案使用 HMAC SHA256,以驗證模組未經修改。完整性值會與安裝期間寫入組態檔的值進行比較。

"Install_Integrity" (OSSL_SELF_TEST_TYPE_INSTALL_INTEGRITY)

對固定字串使用 HMAC SHA256,以驗證安裝程序已執行,且自我測試 KATS 已測試過。完整性值會與安裝期間成功執行自我測試後寫入組態檔的值進行比較。

"KAT_Cipher" (OSSL_SELF_TEST_TYPE_KAT_CIPHER)

對稱式密碼的已知答案測試。

"KAT_AsymmetricCipher" (OSSL_SELF_TEST_TYPE_KAT_ASYM_CIPHER)

非對稱式密碼的已知答案測試。

"KAT_Digest" (OSSL_SELF_TEST_TYPE_KAT_DIGEST)

摘要的已知答案測試。

"KAT_Signature" (OSSL_SELF_TEST_TYPE_KAT_SIGNATURE)

簽章的已知答案測試。

"PCT_Signature" (OSSL_SELF_TEST_TYPE_PCT_SIGNATURE)

簽章的成對一致性檢查。

"KAT_KDF" (OSSL_SELF_TEST_TYPE_KAT_KDF)

金鑰衍生函數的已知答案測試。

"KAT_KA" (OSSL_SELF_TEST_TYPE_KAT_KA)

金鑰協定的已知答案測試。

「DRBG」(OSSL_SELF_TEST_TYPE_DRBG)

確定性亂數位元產生器的已知答案測試。

「條件_PCT」(OSSL_SELF_TEST_TYPE_PCT)

在產生金鑰對期間執行的條件測試。

「連續_RNG_測試」(OSSL_SELF_TEST_TYPE_CRNG)

連續亂數產生器測試。

「模組_完整性」自我測試在啟動時總是執行。「安裝_完整性」自我測試用於檢查自我測試是否已在安裝時執行。如果已執行,則在後續啟動時不會執行自我測試。所有其他自我測試類別在安裝時執行一次,但「成對一致性_測試」除外。

「模組_完整性」和「安裝_完整性」自我測試只有一個執行個體。所有其他自我測試可能有多個執行個體。

FIPS 模組將下列說明傳遞給 OSSL_SELF_TEST_onbegin()。

「HMAC」(OSSL_SELF_TEST_DESC_INTEGRITY_HMAC)

「模組_完整性」和「安裝_完整性」使用此說明。

「RSA」(OSSL_SELF_TEST_DESC_PCT_RSA_PKCS1)
「ECDSA」(OSSL_SELF_TEST_DESC_PCT_ECDSA)
「EDDSA」(OSSL_SELF_TEST_DESC_PCT_EDDSA)
「DSA」(OSSL_SELF_TEST_DESC_PCT_DSA)

與「成對一致性_測試」類型搭配使用的金鑰產生測試。

「RSA_加密」(OSSL_SELF_TEST_DESC_ASYM_RSA_ENC)
「RSA_解密」(OSSL_SELF_TEST_DESC_ASYM_RSA_DEC)

「KAT_非對稱密碼」使用此說明來表示加密或解密 KAT。

「AES_GCM」(OSSL_SELF_TEST_DESC_CIPHER_AES_GCM)
「AES_ECB_解密」(OSSL_SELF_TEST_DESC_CIPHER_AES_ECB)
「TDES」(OSSL_SELF_TEST_DESC_CIPHER_TDES)

與「KAT_密碼」類型搭配使用的對稱密碼測試。

「SHA1」(OSSL_SELF_TEST_DESC_MD_SHA1)
「SHA2」(OSSL_SELF_TEST_DESC_MD_SHA2)
「SHA3」(OSSL_SELF_TEST_DESC_MD_SHA3)

與「KAT_摘要」類型搭配使用的摘要測試。

「DSA」(OSSL_SELF_TEST_DESC_SIGN_DSA)
「RSA」(OSSL_SELF_TEST_DESC_SIGN_RSA)
「ECDSA」(OSSL_SELF_TEST_DESC_SIGN_ECDSA)

與「KAT_簽章」類型搭配使用的簽章測試。

「ECDH」(OSSL_SELF_TEST_DESC_KA_ECDH)
「DH」(OSSL_SELF_TEST_DESC_KA_DH)

與「KAT_KA」類型搭配使用的金鑰協商測試。

「HKDF」(OSSL_SELF_TEST_DESC_KDF_HKDF)
「TLS13_KDF_EXTRACT」(OSSL_SELF_TEST_DESC_KDF_TLS13_EXTRACT)
「TLS13_KDF_EXPAND」(OSSL_SELF_TEST_DESC_KDF_TLS13_EXPAND)
「SSKDF」(OSSL_SELF_TEST_DESC_KDF_SSKDF)
「X963KDF」(OSSL_SELF_TEST_DESC_KDF_X963KDF)
「X942KDF」(OSSL_SELF_TEST_DESC_KDF_X942KDF)
「PBKDF2」(OSSL_SELF_TEST_DESC_KDF_PBKDF2)
「SSHKDF」(OSSL_SELF_TEST_DESC_KDF_SSHKDF)
「TLS12_PRF」(OSSL_SELF_TEST_DESC_KDF_TLS12_PRF)
「KBKDF」(OSSL_SELF_TEST_DESC_KDF_KBKDF)

與「KAT_KDF」類型搭配使用的金鑰衍生函數測試。

「CTR」(OSSL_SELF_TEST_DESC_DRBG_CTR)
「HASH」(OSSL_SELF_TEST_DESC_DRBG_HASH)
「HMAC」(OSSL_SELF_TEST_DESC_DRBG_HMAC)

與「DRBG」類型一起使用的 DRBG 測試。

「RNG」(OSSL_SELF_TEST_DESC_RNG)

「Continuous_RNG_Test」使用此功能。

範例

以下顯示一個簡單的自我測試回呼,以供說明之用。

#include <openssl/self_test.h>

static OSSL_CALLBACK self_test_cb;

static int self_test_cb(const OSSL_PARAM params[], void *arg)
{
  int ret = 0;
  const OSSL_PARAM *p = NULL;
  const char *phase = NULL, *type = NULL, *desc = NULL;

  p = OSSL_PARAM_locate_const(params, OSSL_PROV_PARAM_SELF_TEST_PHASE);
  if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING)
      goto err;
  phase = (const char *)p->data;

  p = OSSL_PARAM_locate_const(params, OSSL_PROV_PARAM_SELF_TEST_DESC);
  if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING)
      goto err;
  desc = (const char *)p->data;

  p = OSSL_PARAM_locate_const(params, OSSL_PROV_PARAM_SELF_TEST_TYPE);
  if (p == NULL || p->data_type != OSSL_PARAM_UTF8_STRING)
      goto err;
  type = (const char *)p->data;

  /* Do some logging */
  if (strcmp(phase, OSSL_SELF_TEST_PHASE_START) == 0)
      BIO_printf(bio_out, "%s : (%s) : ", desc, type);
  if (strcmp(phase, OSSL_SELF_TEST_PHASE_PASS) == 0
          || strcmp(phase, OSSL_SELF_TEST_PHASE_FAIL) == 0)
      BIO_printf(bio_out, "%s\n", phase);

  /* Corrupt the SHA1 self test during the 'corrupt' phase by returning 0 */
  if (strcmp(phase, OSSL_SELF_TEST_PHASE_CORRUPT) == 0
          && strcmp(desc, OSSL_SELF_TEST_DESC_MD_SHA1) == 0) {
      BIO_printf(bio_out, "%s %s", phase, desc);
      return 0;
  }
  ret = 1;
err:
  return ret;
}

注意事項

某些已發布的 OpenSSL 版本不包含經過驗證的 FIPS 提供者。若要確定哪些版本已進行驗證程序,請參閱 OpenSSL 下載頁面。如果您需要 FIPS 核准的功能,請務必使用所列的驗證版本之一來建置您的 FIPS 提供者。通常,可以利用從驗證版本之一建置的 FIPS 提供者,以及從同一個主要版本系列中任何版本編譯的 libcryptolibssl。這個彈性讓您可以處理超出 FIPS 界限的錯誤修正和 CVE。

OpenSSL 3.1 中的 FIPS 提供者包含一些未經 FIPS 驗證的演算法,因此屬性查詢 fips=yes 對於想要以 FIPS 核准方式運作的應用程式而言是必要的。演算法為

Triple DES ECB
Triple DES CBC
EdDSA

另請參閱

openssl-fipsinstall(1)fips_config(5)OSSL_SELF_TEST_set_callback(3)OSSL_SELF_TEST_new(3)OSSL_PARAM(3)openssl-core.h(7)openssl-core_dispatch.h(7)provider(7)https://www.openssl.org/source/

歷程

此功能已新增至 OpenSSL 3.0。

版權所有 2019-2024 The OpenSSL Project Authors。保留所有權利。

根據 Apache 許可 2.0 版(「許可」)授權。您只能在遵守許可的情況下使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案中取得一份副本,或在 https://www.openssl.org/source/license.html 取得。