[gnutls-devel] GnuTLS | p11tool fails to find certs with AWS KMS token (#1340)

Read-only notification of GnuTLS library development activities gnutls-devel at lists.gnutls.org
Fri Mar 18 02:55:17 CET 2022



Benjamin Herrenschmidt created an issue: https://gitlab.com/gnutls/gnutls/-/issues/1340



Hi !

I am a contributor to this "soft" token which talks to AWS KMS: https://github.com/JackOfMostTrades/aws-kms-pkcs11

A given slot with this token has just two objects: A private key and a certificate.

Retrieving the certificate fails with p11tool consistently. The error seem to be a disconnect between those two functions in gnutls lib/pkcs11.c:

* find_privkeys()

It properly finds the private key and reaches the following code:

```
	current = 0;
	while (pkcs11_find_objects
	       (sinfo->module, sinfo->pks, &ctx, 1, &count) == CKR_OK
	       && count == 1) {

		a[0].type = CKA_ID;
		a[0].value = certid_tmp;
		a[0].value_len = sizeof(certid_tmp);

		_gnutls_buffer_init(&list->key_ids[current]);

		if (pkcs11_get_attribute_value
		    (sinfo->module, sinfo->pks, ctx, a, 1) == CKR_OK) {
			ret = _gnutls_buffer_append_data(&list->key_ids[current],
						   a[0].value,
						   a[0].value_len);
			if (ret < 0)
				return gnutls_assert_val(ret);
			current++;
		}

		if (current > list->key_ids_size)
			break;
	}

	pkcs11_find_objects_final(sinfo);

	list->key_ids_size = current - 1;
```

There is only one iteration of the loop since there's only one object of type CKO_PRIVATE_KEY
in the token. The retrieval of the attribute works fine, so we exist the loop with:

```
current = 1
```

We thus return from the function with
```
list->key_ids_size = 0
```

Now, this is called from this code in find_multi_objs_cb() (note: this is the only caller)

```
	memset(&plist, 0, sizeof(plist));

	if (find_data->flags & GNUTLS_PKCS11_OBJ_FLAG_WITH_PRIVKEY) {
		ret = find_privkeys(sinfo, tinfo, &plist);
		if (ret < 0) {
			gnutls_assert();
			return ret;
		}

		if (plist.key_ids_size == 0) {
			gnutls_assert();
			return GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE;
		}
	}
```

As you can see, it will hit the case where plist.key_ids_size is 0 and fail. There seem
to be a disconnect as to whether key_ids_size is 0 or 1 based between the caller and the
callee....

Now I'm happy to send a pull request with a fix provided somebody can confirm that my analysis
is correct. I can see two main approach to fix this:

 - Remove the "-1" when setting key_ids_size in find_privKeys(). This is IMHO the most
   obvious fix and provides the clearest semantic

 - Remvoe the second test in the caller

Recommendations ? Did I get something very wrong ? :-)

-- 
Reply to this email directly or view it on GitLab: https://gitlab.com/gnutls/gnutls/-/issues/1340
You're receiving this email because of your account on gitlab.com.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.gnupg.org/pipermail/gnutls-devel/attachments/20220318/8b367213/attachment.html>


More information about the Gnutls-devel mailing list