]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
rpc: allow priority string to be passed to TLS context
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 3 Jun 2016 16:44:55 +0000 (17:44 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 8 Jun 2016 12:48:45 +0000 (13:48 +0100)
Extend the virNetTLSContextNew* constructors to allow
the TLS priority string to be passed in, overriding the
compile time default.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
daemon/libvirtd.c
src/remote/remote_driver.c
src/rpc/virnettlscontext.c
src/rpc/virnettlscontext.h
tests/virnettlscontexttest.c
tests/virnettlssessiontest.c

index 5617e42afa223341b2eab1eabe306ae36a298dfa..b844af46d81700d3ddca157b2c485c4c5f6e84ca 100644 (file)
@@ -585,6 +585,7 @@ daemonSetupNetworking(virNetServerPtr srv,
                                                        config->cert_file,
                                                        config->key_file,
                                                        (const char *const*)config->tls_allowed_dn_list,
+                                                       NULL,
                                                        config->tls_no_sanity_certificate ? false : true,
                                                        config->tls_no_verify_certificate ? false : true)))
                     goto cleanup;
@@ -592,6 +593,7 @@ daemonSetupNetworking(virNetServerPtr srv,
                 if (!(ctxt = virNetTLSContextNewServerPath(NULL,
                                                            !privileged,
                                                            (const char *const*)config->tls_allowed_dn_list,
+                                                           NULL,
                                                            config->tls_no_sanity_certificate ? false : true,
                                                            config->tls_no_verify_certificate ? false : true)))
                     goto cleanup;
index e3cf5fbead36ed81a0a8927a2dbaa8d7b2a7add9..219cf478cac01889785cd6dfe28f78b0ebd69477 100644 (file)
@@ -845,6 +845,7 @@ doRemoteOpen(virConnectPtr conn,
 #ifdef WITH_GNUTLS
         priv->tls = virNetTLSContextNewClientPath(pkipath,
                                                   geteuid() != 0 ? true : false,
+                                                  NULL,
                                                   sanity, verify);
         if (!priv->tls)
             goto failed;
index dd22630de6804092cfc1f7e1eab9054852ed40ad..847d45761142224203696949207314eb31c50921 100644 (file)
@@ -65,6 +65,7 @@ struct _virNetTLSContext {
     bool isServer;
     bool requireValidCert;
     const char *const*x509dnWhitelist;
+    char *priority;
 };
 
 struct _virNetTLSSession {
@@ -696,6 +697,7 @@ static virNetTLSContextPtr virNetTLSContextNew(const char *cacert,
                                                const char *cert,
                                                const char *key,
                                                const char *const*x509dnWhitelist,
+                                               const char *priority,
                                                bool sanityCheckCert,
                                                bool requireValidCert,
                                                bool isServer)
@@ -709,6 +711,9 @@ static virNetTLSContextPtr virNetTLSContextNew(const char *cacert,
     if (!(ctxt = virObjectLockableNew(virNetTLSContextClass)))
         return NULL;
 
+    if (VIR_STRDUP(ctxt->priority, priority) < 0)
+        goto error;
+
     err = gnutls_certificate_allocate_credentials(&ctxt->x509cred);
     if (err) {
         virReportError(VIR_ERR_SYSTEM_ERROR,
@@ -896,6 +901,7 @@ static int virNetTLSContextLocateCredentials(const char *pkipath,
 static virNetTLSContextPtr virNetTLSContextNewPath(const char *pkipath,
                                                    bool tryUserPkiPath,
                                                    const char *const*x509dnWhitelist,
+                                                   const char *priority,
                                                    bool sanityCheckCert,
                                                    bool requireValidCert,
                                                    bool isServer)
@@ -908,7 +914,7 @@ static virNetTLSContextPtr virNetTLSContextNewPath(const char *pkipath,
         return NULL;
 
     ctxt = virNetTLSContextNew(cacert, cacrl, cert, key,
-                               x509dnWhitelist, sanityCheckCert,
+                               x509dnWhitelist, priority, sanityCheckCert,
                                requireValidCert, isServer);
 
     VIR_FREE(cacert);
@@ -922,19 +928,21 @@ static virNetTLSContextPtr virNetTLSContextNewPath(const char *pkipath,
 virNetTLSContextPtr virNetTLSContextNewServerPath(const char *pkipath,
                                                   bool tryUserPkiPath,
                                                   const char *const*x509dnWhitelist,
+                                                  const char *priority,
                                                   bool sanityCheckCert,
                                                   bool requireValidCert)
 {
-    return virNetTLSContextNewPath(pkipath, tryUserPkiPath, x509dnWhitelist,
+    return virNetTLSContextNewPath(pkipath, tryUserPkiPath, x509dnWhitelist, priority,
                                    sanityCheckCert, requireValidCert, true);
 }
 
 virNetTLSContextPtr virNetTLSContextNewClientPath(const char *pkipath,
                                                   bool tryUserPkiPath,
+                                                  const char *priority,
                                                   bool sanityCheckCert,
                                                   bool requireValidCert)
 {
-    return virNetTLSContextNewPath(pkipath, tryUserPkiPath, NULL,
+    return virNetTLSContextNewPath(pkipath, tryUserPkiPath, NULL, priority,
                                    sanityCheckCert, requireValidCert, false);
 }
 
@@ -944,10 +952,11 @@ virNetTLSContextPtr virNetTLSContextNewServer(const char *cacert,
                                               const char *cert,
                                               const char *key,
                                               const char *const*x509dnWhitelist,
+                                              const char *priority,
                                               bool sanityCheckCert,
                                               bool requireValidCert)
 {
-    return virNetTLSContextNew(cacert, cacrl, cert, key, x509dnWhitelist,
+    return virNetTLSContextNew(cacert, cacrl, cert, key, x509dnWhitelist, priority,
                                sanityCheckCert, requireValidCert, true);
 }
 
@@ -956,10 +965,11 @@ virNetTLSContextPtr virNetTLSContextNewClient(const char *cacert,
                                               const char *cacrl,
                                               const char *cert,
                                               const char *key,
+                                              const char *priority,
                                               bool sanityCheckCert,
                                               bool requireValidCert)
 {
-    return virNetTLSContextNew(cacert, cacrl, cert, key, NULL,
+    return virNetTLSContextNew(cacert, cacrl, cert, key, NULL, priority,
                                sanityCheckCert, requireValidCert, false);
 }
 
@@ -1138,6 +1148,7 @@ void virNetTLSContextDispose(void *obj)
     PROBE(RPC_TLS_CONTEXT_DISPOSE,
           "ctxt=%p", ctxt);
 
+    VIR_FREE(ctxt->priority);
     gnutls_dh_params_deinit(ctxt->dhParams);
     gnutls_certificate_free_credentials(ctxt->x509cred);
 }
@@ -1197,10 +1208,12 @@ virNetTLSSessionPtr virNetTLSSessionNew(virNetTLSContextPtr ctxt,
     /* avoid calling all the priority functions, since the defaults
      * are adequate.
      */
-    if ((err = gnutls_priority_set_direct(sess->session, TLS_PRIORITY, NULL)) != 0) {
+    if ((err = gnutls_priority_set_direct(sess->session,
+                                          ctxt->priority ? ctxt->priority : TLS_PRIORITY,
+                                          NULL)) != 0) {
         virReportError(VIR_ERR_SYSTEM_ERROR,
                        _("Failed to set TLS session priority to %s: %s"),
-                       TLS_PRIORITY, gnutls_strerror(err));
+                       ctxt->priority ? ctxt->priority : TLS_PRIORITY, gnutls_strerror(err));
         goto error;
     }
 
index 21539adb99076cd484849b52943c539871a17996..6100b45c396ede777be371ff064b556849f3360f 100644 (file)
@@ -36,11 +36,13 @@ void virNetTLSInit(void);
 virNetTLSContextPtr virNetTLSContextNewServerPath(const char *pkipath,
                                                   bool tryUserPkiPath,
                                                   const char *const*x509dnWhitelist,
+                                                  const char *priority,
                                                   bool sanityCheckCert,
                                                   bool requireValidCert);
 
 virNetTLSContextPtr virNetTLSContextNewClientPath(const char *pkipath,
                                                   bool tryUserPkiPath,
+                                                  const char *priority,
                                                   bool sanityCheckCert,
                                                   bool requireValidCert);
 
@@ -49,6 +51,7 @@ virNetTLSContextPtr virNetTLSContextNewServer(const char *cacert,
                                               const char *cert,
                                               const char *key,
                                               const char *const*x509dnWhitelist,
+                                              const char *priority,
                                               bool sanityCheckCert,
                                               bool requireValidCert);
 
@@ -56,6 +59,7 @@ virNetTLSContextPtr virNetTLSContextNewClient(const char *cacert,
                                               const char *cacrl,
                                               const char *cert,
                                               const char *key,
+                                              const char *priority,
                                               bool sanityCheckCert,
                                               bool requireValidCert);
 
index d33b896327a3ce9d558da94248ecdf61378f82f8..42c8b0cc12449d9f2b024eb97d0e13999444f40c 100644 (file)
@@ -72,6 +72,7 @@ static int testTLSContextInit(const void *opaque)
                                          data->crt,
                                          KEYFILE,
                                          NULL,
+                                         NULL,
                                          true,
                                          true);
     } else {
@@ -79,6 +80,7 @@ static int testTLSContextInit(const void *opaque)
                                          NULL,
                                          data->crt,
                                          KEYFILE,
+                                         NULL,
                                          true,
                                          true);
     }
index 3af948a9cd417b4ab075d57ea8dcc6e9e823b88d..8b79a1e8346849d430e5866ecfa06e2956b3c13b 100644 (file)
@@ -113,6 +113,7 @@ static int testTLSSessionInit(const void *opaque)
                                            data->servercrt,
                                            KEYFILE,
                                            data->wildcards,
+                                           NULL,
                                            false,
                                            true);
 
@@ -120,6 +121,7 @@ static int testTLSSessionInit(const void *opaque)
                                            NULL,
                                            data->clientcrt,
                                            KEYFILE,
+                                           NULL,
                                            false,
                                            true);