文章目录
🍧描述
OpenSSL FIPS 提供程序是符合 FIPS 140-2 中指定的联邦信息处理标准 (FIPS) 的特殊提供程序。该"模块"包含一组经批准的加密算法,这些算法由认可的测试实验室进行验证。
🍨属性
此提供程序中的实现专门定义了以下属性:
“provider=fips”
“fips=yes”
它可以用于具有获取函数(如EVP_MD_fetch或EVP_CIPHER_fetch)的属性查询字符串,以及获取属性查询字符串的其他函数(如EVP_PKEY_CTX_new_from_name)。
查询这些属性中的任何一个都不是强制性的,除非确保获取此提供程序的实现,而不是其他实现。
“fips=yes"属性可用于确保仅将 FIPS 批准的实现用于加密操作。这还可能包括不在 fips 提供程序中的其他非加密支持操作,例如非对称密钥编码器,请参阅OSSL_PROVIDER-default中的"非对称密钥管理”。
🍦操作和算法
OpenSSL FIPS 提供程序支持以下操作和算法:
🍰哈希算法/消息摘要
SHA1,参见EVP_MD-SHA1
SHA2,参见EVP_MD-SHA2
SHA3,参见EVP_MD-SHA3
KECCAK-KMAC,参见EVP_MD-KECCAK-KMAC
🎂对称密码
AES,参见EVP_CIPHER-AES
DES-EDE3 (TripleDES), 参见EVP_CIPHER-DES
🍮消息验证码 (MAC)
CMAC,请参见EVP_MAC-CMAC
GMAC,参见EVP_MAC-GMAC
HMAC,请参见EVP_MAC-HMAC
KMAC,见EVP_MAC-KMAC
🍬密钥派生函数 (KDF)
HKDF, 参见EVP_KDF-HKDF
TLS13-KDF,请参见EVP_KDF-TLS13_KDF
SSKDF,参见EVP_KDF-SSKDF
PBKDF2,请参见EVP_KDF-PBKDF2
SSHKDF,见EVP_KDF-SSHKDF
TLS1-PRF,参见EVP_KDF-TLS1_PRF
KBKDF,请参见EVP_KDF-KBKDF
X942KDF-ASN1,请参见EVP_KDF-X942-ASN1
X942KDF-CONCAT,请参见EVP_KDF-X942-CONCAT
X963KDF,请参见EVP_KDF-X963
🍭密钥交换
DH,参见EVP_KEYEXCH-DH
ECDH,见EVP_KEYEXCH-ECDH
X25519,请参见EVP_KEYEXCH-X25519
X448,请参阅EVP_KEYEXCH-X448
🍫非对称签名
DSA,参见EVP_KEYEXCH-DSA
RSA,请参见EVP_SIGNATURE-RSA
X25519,请参见EVP_SIGNATURE-ED25519
X448,请参阅EVP_SIGNATURE-ED448
HMAC,参见EVP_SIGNATURE-HMAC
CMAC,参见EVP_SIGNATURE-CMAC
🍿非对称密码
RSA,请参见EVP_KEYEXCH-RSA
🍩非对称密钥封装
RSA,请参见EVP_KEM-RSA
🍪非对称密钥管理
DH,见EVP_KEYMGMT-DH
DSA,参见EVP_KEYMGMT-DSA
RSA,请参见EVP_KEYMGMT-RSA
🧁自检
FIPS 模块的要求之一是自检。可选的回调机制可用于使用OSSL_SELF_TEST_set_callback向用户返回信息。
传递给回调的参数在OSSL_SELF_TEST_new中进行了描述。
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)
- “RSA” (OSSL_SELF_TEST_DESC_PCT_RSA_PKCS1)
“ECDSA” (OSSL_SELF_TEST_DESC_PCT_ECDSA)
“DSA” (OSSL_SELF_TEST_DESC_PCT_DSA)
- “RSA_Encrypt” (OSSL_SELF_TEST_DESC_ASYM_RSA_ENC)
“RSA_Decrypt” (OSSL_SELF_TEST_DESC_ASYM_RSA_DEC)
- “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)
- “SHA1” (OSSL_SELF_TEST_DESC_MD_SHA1)
“SHA2” (OSSL_SELF_TEST_DESC_MD_SHA2)
“SHA3” (OSSL_SELF_TEST_DESC_MD_SHA3)
- “DSA” (OSSL_SELF_TEST_DESC_SIGN_DSA)
“RSA” (OSSL_SELF_TEST_DESC_SIGN_RSA)
“ECDSA” (OSSL_SELF_TEST_DESC_SIGN_ECDSA)
- “ECDH” (OSSL_SELF_TEST_DESC_KA_ECDH)
“DH” (OSSL_SELF_TEST_DESC_KA_DH)
- “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)
- “CTR”(OSSL_SELF_TEST_DESC_DRBG_CTR)
“HASH” (OSSL_SELF_TEST_DESC_DRBG_HASH)
“HMAC” (OSSL_SELF_TEST_DESC_DRBG_HMAC)
- “RNG”(OSSL_SELF_TEST_DESC_RNG)
🧈示例
下面显示了一个简单的自检回调,以示说明。
#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;
}