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提供程序与从同一主要版本系列中的任何版本编译的libcrypto和libssl一起使用。这种灵活性使您可以解决超出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 获取副本。