File gnutls-FIPS-pbkdf2-additional-requirements.patch of Package gnutls.37572
Index: gnutls-3.7.3/lib/crypto-api.c
===================================================================
--- gnutls-3.7.3.orig/lib/crypto-api.c
+++ gnutls-3.7.3/lib/crypto-api.c
@@ -1849,8 +1849,23 @@ gnutls_pbkdf2(gnutls_mac_algorithm_t mac
not_approved = true;
}
- /* Key lengthes less than 112 bits are not approved */
- if (length < 14 || key->size < 14) {
+ /* FIPS requires a minimum key length of 112 bits, see FIPS 140-3 IG D.N */
+ if (length < 14) {
+ not_approved = true;
+ }
+
+ /* FIPS requires minimum salt length of 128 bits (SP 800-132 5.1) */
+ if (salt->size < 16) {
+ not_approved = true;
+ }
+
+ /* FIPS requires minimum iterations count (SP 800-132 5.2) */
+ if (iter_count < 1000) {
+ not_approved = true;
+ }
+
+ /* FIPS recommends minimum passlen of 20 characters (SP SP800-132 sec 5) */
+ if (key->size < 20) {
not_approved = true;
}
Index: gnutls-3.7.3/tests/kdf-api.c
===================================================================
--- gnutls-3.7.3.orig/tests/kdf-api.c
+++ gnutls-3.7.3/tests/kdf-api.c
@@ -32,6 +32,9 @@
#define MAX_BUF 1024
+#define GNUTLS_PBKDF2_FIPS_NOT_APPROVED 0
+#define GNUTLS_PBKDF2_FIPS_APPROVED 1
+
static gnutls_fips140_context_t fips_context;
static gnutls_fips140_operation_state_t fips_state;
@@ -130,7 +133,8 @@ test_pbkdf2(gnutls_mac_algorithm_t mac,
const char *salt_hex,
unsigned iter_count,
size_t length,
- const char *okm_hex)
+ const char *okm_hex,
+ unsigned is_fips_approved)
{
gnutls_datum_t hex;
gnutls_datum_t ikm;
@@ -151,7 +155,11 @@ test_pbkdf2(gnutls_mac_algorithm_t mac,
FIPS_PUSH_CONTEXT();
assert(gnutls_pbkdf2(mac, &ikm, &salt, iter_count, buf, length) >= 0);
- FIPS_POP_CONTEXT(APPROVED);
+ if (is_fips_approved) {
+ FIPS_POP_CONTEXT(APPROVED);
+ } else {
+ FIPS_POP_CONTEXT(NOT_APPROVED);
+ }
gnutls_free(ikm.data);
gnutls_free(salt.data);
@@ -185,6 +193,26 @@ doit(void)
"2d2d0a90cf1a5a4c5db02d56ecc4c5bf"
"34007208d5b887185865");
+ /* Test vector from RFC 6070. More thorough testing is done
+ * in nettle. */
+ test_pbkdf2(GNUTLS_MAC_SHA1,
+ "70617373776f7264", /* "password" */
+ "73616c74", /* "salt" */
+ 4096,
+ 20,
+ "4b007901b765489abead49d926f721d065a429c1",
+ /* Key sizes and output sizes less than 112-bit are not approved. */
+ GNUTLS_PBKDF2_FIPS_NOT_APPROVED);
+
+ test_pbkdf2(GNUTLS_MAC_AES_CMAC_128,
+ "70617373776f726470617373776f7264", /* "passwordpassword" */
+ "73616c74", /* "salt" */
+ 4096,
+ 20,
+ "c4c112c6e1e3b8757640603dec78825ff87605a7",
+ /* Use of AES-CMAC in PBKDF2 is not supported in ACVP. */
+ GNUTLS_PBKDF2_FIPS_NOT_APPROVED);
+
/* Test vector extracted from:
* https://dev.gnupg.org/source/libgcrypt/browse/master/cipher/kdf.c */
test_pbkdf2(GNUTLS_MAC_SHA256,
@@ -197,7 +225,9 @@ doit(void)
40,
"348c89dbcbd32b2f32d814b8"
"116e84cf2b17347ebc180018"
- "1c4e2a1fb8dd53e1c635518c7dac47e9");
+ "1c4e2a1fb8dd53e1c635518c7dac47e9",
+ /* FIPS approved */
+ GNUTLS_PBKDF2_FIPS_APPROVED);
gnutls_fips140_context_deinit(fips_context);
}