Browse Source

Merge branch 'utilize-system-wide-crypto' of https://github.com/grulja/tigervnc

tags/v1.11.90
Pierre Ossman 2 years ago
parent
commit
dfc9421dcf
4 changed files with 108 additions and 30 deletions
  1. 52
    14
      common/rfb/CSecurityTLS.cxx
  2. 52
    14
      common/rfb/SSecurityTLS.cxx
  3. 1
    1
      common/rfb/Security.cxx
  4. 3
    1
      unix/xserver/hw/vnc/Xvnc.man

+ 52
- 14
common/rfb/CSecurityTLS.cxx View File

@@ -210,26 +210,64 @@ void CSecurityTLS::setParam()
static const char kx_anon_priority[] = ":+ANON-ECDH:+ANON-DH";

int ret;
char *prio;
const char *err;

prio = (char*)malloc(strlen(Security::GnuTLSPriority) +
strlen(kx_anon_priority) + 1);
if (prio == NULL)
throw AuthFailureException("Not enough memory for GnuTLS priority string");
// Custom priority string specified?
if (strcmp(Security::GnuTLSPriority, "") != 0) {
char *prio;
const char *err;

strcpy(prio, Security::GnuTLSPriority);
if (anon)
prio = (char*)malloc(strlen(Security::GnuTLSPriority) +
strlen(kx_anon_priority) + 1);
if (prio == NULL)
throw AuthFailureException("Not enough memory for GnuTLS priority string");

strcpy(prio, Security::GnuTLSPriority);
if (anon)
strcat(prio, kx_anon_priority);

ret = gnutls_priority_set_direct(session, prio, &err);

free(prio);

if (ret != GNUTLS_E_SUCCESS) {
if (ret == GNUTLS_E_INVALID_REQUEST)
vlog.error("GnuTLS priority syntax error at: %s", err);
throw AuthFailureException("gnutls_set_priority_direct failed");
}
} else if (anon) {
const char *err;

#if GNUTLS_VERSION_NUMBER >= 0x030603
ret = gnutls_set_default_priority_append(session, kx_anon_priority, &err, 0);
if (ret != GNUTLS_E_SUCCESS) {
if (ret == GNUTLS_E_INVALID_REQUEST)
vlog.error("GnuTLS priority syntax error at: %s", err);
throw AuthFailureException("gnutls_set_default_priority_append failed");
}
#else
// We don't know what the system default priority is, so we guess
// it's what upstream GnuTLS has
static const char gnutls_default_priority[] = "NORMAL";
char *prio;

prio = (char*)malloc(strlen(gnutls_default_priority) +
strlen(kx_anon_priority) + 1);
if (prio == NULL)
throw AuthFailureException("Not enough memory for GnuTLS priority string");

strcpy(prio, gnutls_default_priority);
strcat(prio, kx_anon_priority);

ret = gnutls_priority_set_direct(session, prio, &err);
ret = gnutls_priority_set_direct(session, prio, &err);

free(prio);
free(prio);

if (ret != GNUTLS_E_SUCCESS) {
if (ret == GNUTLS_E_INVALID_REQUEST)
vlog.error("GnuTLS priority syntax error at: %s", err);
throw AuthFailureException("gnutls_set_priority_direct failed");
if (ret != GNUTLS_E_SUCCESS) {
if (ret == GNUTLS_E_INVALID_REQUEST)
vlog.error("GnuTLS priority syntax error at: %s", err);
throw AuthFailureException("gnutls_set_priority_direct failed");
}
#endif
}

if (anon) {

+ 52
- 14
common/rfb/SSecurityTLS.cxx View File

@@ -201,26 +201,64 @@ void SSecurityTLS::setParams(gnutls_session_t session)
static const char kx_anon_priority[] = ":+ANON-ECDH:+ANON-DH";

int ret;
char *prio;
const char *err;

prio = (char*)malloc(strlen(Security::GnuTLSPriority) +
strlen(kx_anon_priority) + 1);
if (prio == NULL)
throw AuthFailureException("Not enough memory for GnuTLS priority string");
// Custom priority string specified?
if (strcmp(Security::GnuTLSPriority, "") != 0) {
char *prio;
const char *err;

strcpy(prio, Security::GnuTLSPriority);
if (anon)
prio = (char*)malloc(strlen(Security::GnuTLSPriority) +
strlen(kx_anon_priority) + 1);
if (prio == NULL)
throw AuthFailureException("Not enough memory for GnuTLS priority string");

strcpy(prio, Security::GnuTLSPriority);
if (anon)
strcat(prio, kx_anon_priority);

ret = gnutls_priority_set_direct(session, prio, &err);

free(prio);

if (ret != GNUTLS_E_SUCCESS) {
if (ret == GNUTLS_E_INVALID_REQUEST)
vlog.error("GnuTLS priority syntax error at: %s", err);
throw AuthFailureException("gnutls_set_priority_direct failed");
}
} else if (anon) {
const char *err;

#if GNUTLS_VERSION_NUMBER >= 0x030603
ret = gnutls_set_default_priority_append(session, kx_anon_priority, &err, 0);
if (ret != GNUTLS_E_SUCCESS) {
if (ret == GNUTLS_E_INVALID_REQUEST)
vlog.error("GnuTLS priority syntax error at: %s", err);
throw AuthFailureException("gnutls_set_default_priority_append failed");
}
#else
// We don't know what the system default priority is, so we guess
// it's what upstream GnuTLS has
static const char gnutls_default_priority[] = "NORMAL";
char *prio;

prio = (char*)malloc(strlen(gnutls_default_priority) +
strlen(kx_anon_priority) + 1);
if (prio == NULL)
throw AuthFailureException("Not enough memory for GnuTLS priority string");

strcpy(prio, gnutls_default_priority);
strcat(prio, kx_anon_priority);

ret = gnutls_priority_set_direct(session, prio, &err);
ret = gnutls_priority_set_direct(session, prio, &err);

free(prio);
free(prio);

if (ret != GNUTLS_E_SUCCESS) {
if (ret == GNUTLS_E_INVALID_REQUEST)
vlog.error("GnuTLS priority syntax error at: %s", err);
throw AuthFailureException("gnutls_set_priority_direct failed");
if (ret != GNUTLS_E_SUCCESS) {
if (ret == GNUTLS_E_INVALID_REQUEST)
vlog.error("GnuTLS priority syntax error at: %s", err);
throw AuthFailureException("gnutls_set_priority_direct failed");
}
#endif
}

#if defined (SSECURITYTLS__USE_DEPRECATED_DH)

+ 1
- 1
common/rfb/Security.cxx View File

@@ -52,7 +52,7 @@ static LogWriter vlog("Security");
#ifdef HAVE_GNUTLS
StringParameter Security::GnuTLSPriority("GnuTLSPriority",
"GnuTLS priority string that controls the TLS session’s handshake algorithms",
"NORMAL");
"");
#endif

Security::Security()

+ 3
- 1
unix/xserver/hw/vnc/Xvnc.man View File

@@ -220,7 +220,9 @@ also be in PEM format.
.TP
.B \-GnuTLSPriority \fIpriority\fP
GnuTLS priority string that controls the TLS session’s handshake algorithms.
See the GnuTLS manual for possible values. Default is \fBNORMAL\fP.
See the GnuTLS manual for possible values. For GnuTLS < 3.6.3 the default
value will be \fBNORMAL\fP to use upstream default. For newer versions
of GnuTLS system-wide crypto policy will be used.
.
.TP
.B \-UseBlacklist

Loading…
Cancel
Save