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) <无符号整数>

有关更多信息,请参阅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)

确定性随机比特生成器的已知答案测试。

"Conditional_PCT" (OSSL_SELF_TEST_TYPE_PCT)

在密钥对生成期间运行的条件测试。

"Continuous_RNG_Test" (OSSL_SELF_TEST_TYPE_CRNG)

连续随机数生成器测试。

"Module_Integrity"自检始终在启动时运行。"Install_Integrity"自检用于检查自检是否已在安装时运行。如果它们已运行,则在后续启动时不会运行自检。所有其他自检类别在安装时运行一次,除了“Pairwise_Consistency_Test”以外。

"Module_Integrity"和"Install_Integrity"自检只有一个实例。所有其他自检可能有多个实例。

FIPS模块将以下描述传递给OSSL_SELF_TEST_onbegin()。

"HMAC" (OSSL_SELF_TEST_DESC_INTEGRITY_HMAC)

"Module_Integrity"和"Install_Integrity"使用此项。

"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)

与"Pairwise_Consistency_Test"类型一起使用的密钥生成测试。

"RSA_Encrypt" (OSSL_SELF_TEST_DESC_ASYM_RSA_ENC)
"RSA_Decrypt" (OSSL_SELF_TEST_DESC_ASYM_RSA_DEC)

"KAT_AsymmetricCipher"使用此项指示加密或解密KAT。

"AES_GCM" (OSSL_SELF_TEST_DESC_CIPHER_AES_GCM)
"AES_ECB_Decrypt" (OSSL_SELF_TEST_DESC_CIPHER_AES_ECB)
"TDES" (OSSL_SELF_TEST_DESC_CIPHER_TDES)

与"KAT_Cipher"类型一起使用的对称密码测试。

"SHA1" (OSSL_SELF_TEST_DESC_MD_SHA1)
"SHA2" (OSSL_SELF_TEST_DESC_MD_SHA2)
"SHA3" (OSSL_SELF_TEST_DESC_MD_SHA3)

与"KAT_Digest"类型一起使用的摘要测试。

"DSA" (OSSL_SELF_TEST_DESC_SIGN_DSA)
"RSA" (OSSL_SELF_TEST_DESC_SIGN_RSA)
"ECDSA" (OSSL_SELF_TEST_DESC_SIGN_ECDSA)

与"KAT_Signature"类型一起使用的签名测试。

"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批准的方式运行的应用程序,属性查询fips=yes是强制性的。这些算法是

三重DES ECB
三重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 OpenSSL项目作者。保留所有权利。

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