summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2016-09-26 14:00:32 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2016-09-26 20:53:39 +0200
commitcd8c42a866c6909467008662dbcb0257023a324c (patch)
tree028646d4972bd590510f215ab89bacd391706459 /lib
parent73129548538242131efafb4aa228d4b7f1f55c0c (diff)
downloadgnutls-cd8c42a866c6909467008662dbcb0257023a324c.tar.gz
pkcs11: only staple extensions from a trust module when they are from a non-distrusted certificate
That is, make sure that the API for stapling extensions is only used for non-distrusted (blacklisted) certificates. The reason is to avoid duplicate extension entries from the p11-kit trust database. These come from blacklisted certificates, and we have no reason to support stapled extensions with blacklisted certificates.
Diffstat (limited to 'lib')
-rw-r--r--lib/pkcs11.c3
-rw-r--r--lib/pkcs11x.c16
2 files changed, 14 insertions, 5 deletions
diff --git a/lib/pkcs11.c b/lib/pkcs11.c
index e1ea59ce33..ff618a7116 100644
--- a/lib/pkcs11.c
+++ b/lib/pkcs11.c
@@ -3634,7 +3634,8 @@ find_cert_cb(struct ck_function_list *module, struct pkcs11_session_info *sinfo,
finalized = 1;
if (found != 0) {
- if (priv->flags & GNUTLS_PKCS11_OBJ_FLAG_OVERWRITE_TRUSTMOD_EXT && data.size > 0) {
+ if (!(priv->flags & GNUTLS_PKCS11_OBJ_FLAG_RETRIEVE_DISTRUSTED) &&
+ (priv->flags & GNUTLS_PKCS11_OBJ_FLAG_OVERWRITE_TRUSTMOD_EXT) && data.size > 0) {
gnutls_datum_t spki;
rv = pkcs11_get_attribute_avalue(sinfo->module, sinfo->pks, ctx, CKA_PUBLIC_KEY_INFO, &spki);
if (rv == CKR_OK) {
diff --git a/lib/pkcs11x.c b/lib/pkcs11x.c
index b12918a47a..a596c759b1 100644
--- a/lib/pkcs11x.c
+++ b/lib/pkcs11x.c
@@ -1,7 +1,7 @@
/*
* GnuTLS PKCS#11 support
- * Copyright (C) 2010-2014 Free Software Foundation, Inc.
- * Copyright (C) 2014 Red Hat
+ * Copyright (C) 2010-2016 Free Software Foundation, Inc.
+ * Copyright (C) 2016 Red Hat
*
* Authors: Nikos Mavrogiannopoulos
*
@@ -61,11 +61,14 @@ static int override_ext(gnutls_x509_crt_t crt, gnutls_datum_t *ext)
return ret;
}
+/* This function re-encodes a certificate to contain its stapled extensions.
+ * That assumes that the certificate is not in the distrusted list.
+ */
int pkcs11_override_cert_exts(struct pkcs11_session_info *sinfo, gnutls_datum_t *spki, gnutls_datum_t *der)
{
int ret;
gnutls_datum_t new_der = {NULL, 0};
- struct ck_attribute a[2];
+ struct ck_attribute a[3];
struct ck_attribute b[1];
unsigned long count;
unsigned ext_data_size = der->size;
@@ -75,6 +78,7 @@ int pkcs11_override_cert_exts(struct pkcs11_session_info *sinfo, gnutls_datum_t
unsigned finalize = 0;
ck_rv_t rv;
ck_object_handle_t obj;
+ ck_bool_t tfalse = 0;
/* retrieve the extensions */
class = CKO_X_CERTIFICATE_EXTENSION;
@@ -86,7 +90,11 @@ int pkcs11_override_cert_exts(struct pkcs11_session_info *sinfo, gnutls_datum_t
a[1].value = spki->data;
a[1].value_len = spki->size;
- rv = pkcs11_find_objects_init(sinfo->module, sinfo->pks, a, 2);
+ a[2].type = CKA_X_DISTRUSTED;
+ a[2].value = &tfalse;
+ a[2].value_len = sizeof(tfalse);
+
+ rv = pkcs11_find_objects_init(sinfo->module, sinfo->pks, a, 3);
if (rv != CKR_OK) {
gnutls_assert();
_gnutls_debug_log