OPT_SSHKDF_KEY_CHECK,
OPT_SSKDF_KEY_CHECK,
OPT_X963KDF_KEY_CHECK,
+ OPT_NO_PBKDF2_LOWER_BOUND_CHECK,
OPT_SELF_TEST_ONLOAD, OPT_SELF_TEST_ONINSTALL
} OPTION_CHOICE;
"Enable key check for SSKDF"},
{"x963kdf_key_check", OPT_X963KDF_KEY_CHECK, '-',
"Enable key check for X963KDF"},
+ {"no_pbkdf2_lower_bound_check", OPT_NO_PBKDF2_LOWER_BOUND_CHECK, '-',
+ "Disable lower bound check for PBKDF2"},
OPT_SECTION("Input"),
{"in", OPT_IN, '<', "Input config file, used when verifying"},
unsigned int sshkdf_key_check : 1;
unsigned int sskdf_key_check : 1;
unsigned int x963kdf_key_check : 1;
+ unsigned int pbkdf2_lower_bound_check : 1;
} FIPS_OPTS;
/* Pedantic FIPS compliance */
1, /* sshkdf_key_check */
1, /* sskdf_key_check */
1, /* x963kdf_key_check */
+ 1, /* pbkdf2_lower_bound_check */
};
/* Default FIPS settings for backward compatibility */
0, /* sshkdf_key_check */
0, /* sskdf_key_check */
0, /* x963kdf_key_check */
+ 1, /* pbkdf2_lower_bound_check */
};
static int check_non_pedantic_fips(int pedantic, const char *name)
opts->sskdf_key_check ? "1": "0") <= 0
|| BIO_printf(out, "%s = %s\n", OSSL_PROV_FIPS_PARAM_X963KDF_KEY_CHECK,
opts->x963kdf_key_check ? "1": "0") <= 0
+ || BIO_printf(out, "%s = %s\n",
+ OSSL_PROV_FIPS_PARAM_PBKDF2_LOWER_BOUND_CHECK,
+ opts->pbkdf2_lower_bound_check ? "1" : "0") <= 0
|| !print_mac(out, OSSL_PROV_FIPS_PARAM_MODULE_MAC, module_mac,
module_mac_len))
goto end;
case OPT_X963KDF_KEY_CHECK:
fips_opts.x963kdf_key_check = 1;
break;
+ case OPT_NO_PBKDF2_LOWER_BOUND_CHECK:
+ if (!check_non_pedantic_fips(pedantic, "no_pbkdf2_lower_bound_check"))
+ goto end;
+ fips_opts.pbkdf2_lower_bound_check = 0;
+ break;
case OPT_QUIET:
quiet = 1;
/* FALLTHROUGH */
[B<-sskdf_digest_check>]
[B<-x963kdf_digest_check>]
[B<-dsa_sign_disabled>]
+[B<-no_pbkdf2_lower_bound_check>]
[B<-no_short_mac>]
[B<-tdes_encrypt_disabled>]
[B<-rsa_sign_x931_disabled>]
deriving a key by X963KDF.
See NIST SP 800-131Ar2 for details.
+=item B<-no_pbkdf2_lower_bound_check>
+
+Configure the module to not perform run-time lower bound check for PBKDF2.
+See NIST SP 800-132 for details.
+
=item B<-self_test_onload>
Do not write the two fields related to the "test status indicator" and
*/
# define OSSL_PROV_FIPS_PARAM_X963KDF_KEY_CHECK "x963kdf-key-check"
+/*
+ * A boolean that determines if the runtime lower bound check for PBKDF2 is
+ * performed.
+ * This is enabled by default.
+ * Type: OSSL_PARAM_UTF8_STRING
+ */
+# define OSSL_PROV_FIPS_PARAM_PBKDF2_LOWER_BOUND_CHECK "pbkdf2-lower-bound-check"
+
# ifdef __cplusplus
}
# endif
int FIPS_sshkdf_key_check(OSSL_LIB_CTX *libctx);
int FIPS_sskdf_key_check(OSSL_LIB_CTX *libctx);
int FIPS_x963kdf_key_check(OSSL_LIB_CTX *libctx);
+int FIPS_pbkdf2_lower_bound_check(OSSL_LIB_CTX *libctx);
#endif
FIPS_OPTION fips_sshkdf_key_check;
FIPS_OPTION fips_sskdf_key_check;
FIPS_OPTION fips_x963kdf_key_check;
+ FIPS_OPTION fips_pbkdf2_lower_bound_check;
} FIPS_GLOBAL;
static void init_fips_option(FIPS_OPTION *opt, int enabled)
init_fips_option(&fgbl->fips_sshkdf_key_check, 0);
init_fips_option(&fgbl->fips_sskdf_key_check, 0);
init_fips_option(&fgbl->fips_x963kdf_key_check, 0);
+ init_fips_option(&fgbl->fips_pbkdf2_lower_bound_check, 1);
return fgbl;
}
0),
OSSL_PARAM_DEFN(OSSL_PROV_PARAM_X963KDF_KEY_CHECK, OSSL_PARAM_INTEGER, NULL,
0),
+ OSSL_PARAM_DEFN(OSSL_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK,
+ OSSL_PARAM_INTEGER, NULL, 0),
OSSL_PARAM_END
};
* OSSL_PROV_FIPS_PARAM_SECURITY_CHECKS and
* OSSL_PROV_FIPS_PARAM_TLS1_PRF_EMS_CHECK are not self test parameters.
*/
- OSSL_PARAM core_params[26], *p = core_params;
+ OSSL_PARAM core_params[27], *p = core_params;
*p++ = OSSL_PARAM_construct_utf8_ptr(
OSSL_PROV_PARAM_CORE_MODULE_FILENAME,
fips_sskdf_key_check);
FIPS_FEATURE_OPTION(fgbl, OSSL_PROV_FIPS_PARAM_X963KDF_KEY_CHECK,
fips_x963kdf_key_check);
+ FIPS_FEATURE_OPTION(fgbl, OSSL_PROV_FIPS_PARAM_PBKDF2_LOWER_BOUND_CHECK,
+ fips_pbkdf2_lower_bound_check);
#undef FIPS_FEATURE_OPTION
*p = OSSL_PARAM_construct_end();
fips_sskdf_key_check);
FIPS_FEATURE_GET(fgbl, OSSL_PROV_PARAM_X963KDF_KEY_CHECK,
fips_x963kdf_key_check);
+ FIPS_FEATURE_GET(fgbl, OSSL_PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK,
+ fips_pbkdf2_lower_bound_check);
#undef FIPS_FEATURE_GET
return 1;
}
FIPS_SET_OPTION(fgbl, fips_sshkdf_key_check);
FIPS_SET_OPTION(fgbl, fips_sskdf_key_check);
FIPS_SET_OPTION(fgbl, fips_x963kdf_key_check);
+ FIPS_SET_OPTION(fgbl, fips_pbkdf2_lower_bound_check);
#undef FIPS_SET_OPTION
ossl_prov_cache_exported_algorithms(fips_ciphers, exported_fips_ciphers);
FIPS_FEATURE_CHECK(FIPS_sshkdf_key_check, fips_sshkdf_key_check)
FIPS_FEATURE_CHECK(FIPS_sskdf_key_check, fips_sskdf_key_check)
FIPS_FEATURE_CHECK(FIPS_x963kdf_key_check, fips_x963kdf_key_check)
+FIPS_FEATURE_CHECK(FIPS_pbkdf2_lower_bound_check, fips_pbkdf2_lower_bound_check)
#undef FIPS_FEATURE_CHECK
#include "prov/providercommon.h"
#include "prov/implementations.h"
#include "prov/provider_util.h"
+#include "prov/fipscommon.h"
#include "prov/fipsindicator.h"
#include "pbkdf2.h"
}
#ifdef FIPS_MODULE
-static int fips_lower_bound_check_enabled(OSSL_LIB_CTX *libctx)
-{
- return ossl_kdf_pbkdf2_default_checks; /* Always is 1 */
-}
-
static int fips_lower_bound_check_passed(KDF_PBKDF2 *ctx, size_t keylen)
{
OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
if (!approved) {
if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0, libctx,
"PBKDF2", desc,
- fips_lower_bound_check_enabled)) {
+ FIPS_pbkdf2_lower_bound_check)) {
ERR_raise(ERR_LIB_PROV, error);
return 0;
}
# Incompatible options for pedantic FIPS compliance
my @pedantic_fail =
- ( 'no_conditional_errors', 'no_security_checks', 'self_test_oninstall' );
+ ( 'no_conditional_errors', 'no_security_checks', 'self_test_oninstall',
+ 'no_pbkdf2_lower_bound_check' );
plan tests => 35 + (scalar @pedantic_okay) + (scalar @pedantic_fail);
my $tdes_encrypt_disabled = 1;
my $rsa_sign_x931_pad_disabled = 1;
my $kdf_key_check = 1;
+my $pbkdf2_lower_bound_check = 1;
my $activate = 1;
my $version = 1;
sshkdf-key-check = $kdf_key_check
sskdf-key-check = $kdf_key_check
x963kdf-key-check = $kdf_key_check
+pbkdf2-lower-bound-check = $pbkdf2_lower_bound_check
_____
'PROV_PARAM_SSHKDF_KEY_CHECK' => "sshkdf-key-check", # uint
'PROV_PARAM_SSKDF_KEY_CHECK' => "sskdf-key-check", # uint
'PROV_PARAM_X963KDF_KEY_CHECK' => "x963kdf-key-check", # uint
+ 'PROV_PARAM_PBKDF2_LOWER_BOUND_CHECK' => "pbkdf2-lower-bound-check", # uint
# Self test callback parameters
'PROV_PARAM_SELF_TEST_PHASE' => "st-phase",# utf8_string