]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
fips: mark gnutls_key_generate with short key sizes non-approved
authorDaiki Ueno <ueno@gnu.org>
Mon, 19 Sep 2022 16:25:51 +0000 (01:25 +0900)
committerDaiki Ueno <ueno@gnu.org>
Mon, 17 Oct 2022 10:16:36 +0000 (19:16 +0900)
Signed-off-by: Daiki Ueno <ueno@gnu.org>
lib/crypto-api.c
tests/fips-test.c

index 9e246ce5376262bf8db3295796aa79f415df9fa2..d3e601ab3ac71371ad43d3ea78dfdd74c1b46363 100644 (file)
@@ -1056,6 +1056,7 @@ gnutls_hash_hd_t gnutls_hash_copy(gnutls_hash_hd_t handle)
 int gnutls_key_generate(gnutls_datum_t * key, unsigned int key_size)
 {
        int ret;
+       bool not_approved = false;
 
        FAIL_IF_LIB_ERROR;
 
@@ -1072,17 +1073,31 @@ int gnutls_key_generate(gnutls_datum_t * key, unsigned int key_size)
        key->data = gnutls_malloc(key->size);
        if (!key->data) {
                gnutls_assert();
-               return GNUTLS_E_MEMORY_ERROR;
+               ret = GNUTLS_E_MEMORY_ERROR;
+               goto error;
+       }
+
+       /* Key lengths of less than 112 bits are not approved */
+       if (key_size < 14) {
+               not_approved = true;
        }
 
        ret = gnutls_rnd(GNUTLS_RND_RANDOM, key->data, key->size);
        if (ret < 0) {
                gnutls_assert();
                _gnutls_free_datum(key);
-               return ret;
+               goto error;
        }
 
-       return 0;
+ error:
+       if (ret < 0) {
+               _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_ERROR);
+       } else if (not_approved) {
+               _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_NOT_APPROVED);
+       } else {
+               _gnutls_switch_fips_state(GNUTLS_FIPS140_OP_APPROVED);
+       }
+       return ret;
 }
 
 /* AEAD API */
index 704effeccba164eff4b5a788004f7accc6ac52b9..f7556d7bbbc080da093b87918e9d3563be0fffd4 100644 (file)
@@ -272,6 +272,7 @@ void doit(void)
        uint8_t hash[64];
        gnutls_datum_t hashed_data;
        uint8_t pbkdf2[64];
+       gnutls_datum_t temp_key = { NULL, 0 };
 
        fprintf(stderr,
                "Please note that if in FIPS140 mode, you need to assure the library's integrity prior to running this test\n");
@@ -403,6 +404,24 @@ void doit(void)
                fail("gnutls_rnd failed\n");
        }
 
+       /* Symmetric key generation equal to or longer than 112 bits: approved */
+       FIPS_PUSH_CONTEXT();
+       ret = gnutls_key_generate(&temp_key, 14);
+       if (ret < 0) {
+               fail("gnutls_key_generate failed\n");
+       }
+       gnutls_free(temp_key.data);
+       FIPS_POP_CONTEXT(APPROVED);
+
+       /* Symmetric key generation shorter than 112 bits: not approved */
+       FIPS_PUSH_CONTEXT();
+       ret = gnutls_key_generate(&temp_key, 13);
+       if (ret < 0) {
+               fail("gnutls_key_generate failed\n");
+       }
+       gnutls_free(temp_key.data);
+       FIPS_POP_CONTEXT(NOT_APPROVED);
+
        ret = gnutls_pubkey_init(&pubkey);
        if (ret < 0) {
                fail("gnutls_pubkey_init failed\n");