Greenbone Vulnerability Management Libraries  22.8.0
serverutils.h File Reference

GnuTLS based functions for server communication - header file. More...

#include <glib.h>
#include <gnutls/gnutls.h>
#include <stdarg.h>
#include <sys/param.h>
#include <netinet/ip.h>
Include dependency graph for serverutils.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  gvm_connection_t
 Connection. More...
 

Functions

void gvm_connection_free (gvm_connection_t *)
 Free connection. More...
 
void gvm_connection_close (gvm_connection_t *)
 Close a server connection and its socket. More...
 
int gvm_server_verify (gnutls_session_t)
 Verify certificate. More...
 
int gvm_server_open (gnutls_session_t *, const char *, int)
 Connect to the server using a given host and port. More...
 
int gvm_server_open_verify (gnutls_session_t *, const char *, int, const char *, const char *, const char *, int)
 Connect to the server using a given host, port and cert. More...
 
int gvm_server_open_with_cert (gnutls_session_t *, const char *, int, const char *, const char *, const char *)
 Connect to the server using a given host, port and cert. More...
 
int gvm_server_close (int, gnutls_session_t)
 Close a server connection and its socket. More...
 
int gvm_server_attach (int, gnutls_session_t *)
 Attach a socket to a session, and shake hands with the peer. More...
 
int gvm_server_sendf (gnutls_session_t *, const char *,...) __attribute__((format(printf
 
int int gvm_server_vsendf (gnutls_session_t *, const char *, va_list)
 Send a string to the server. More...
 
int gvm_socket_vsendf (int, const char *, va_list)
 Send a string to the server. More...
 
int gvm_server_sendf_xml (gnutls_session_t *, const char *,...)
 Format and send an XML string to the server. More...
 
int gvm_server_sendf_xml_quiet (gnutls_session_t *, const char *,...)
 Format and send an XML string to the server. More...
 
int gvm_connection_sendf_xml (gvm_connection_t *, const char *,...)
 Format and send an XML string to the server. More...
 
int gvm_connection_sendf_xml_quiet (gvm_connection_t *, const char *,...)
 Format and send an XML string to the server. More...
 
int gvm_connection_sendf (gvm_connection_t *, const char *,...)
 Format and send a string to the server. More...
 
int gvm_server_new (unsigned int, gchar *, gchar *, gchar *, gnutls_session_t *, gnutls_certificate_credentials_t *)
 Make a session for connecting to a server. More...
 
int gvm_server_new_mem (unsigned int, const char *, const char *, const char *, gnutls_session_t *, gnutls_certificate_credentials_t *)
 Make a session for connecting to a server, with certificates stored in memory. More...
 
int gvm_server_free (int, gnutls_session_t, gnutls_certificate_credentials_t)
 Cleanup a server session. More...
 
int gvm_server_session_free (gnutls_session_t, gnutls_certificate_credentials_t)
 
int load_gnutls_file (const char *, gnutls_datum_t *)
 Loads a file's data into gnutls_datum_t struct. More...
 
void unload_gnutls_file (gnutls_datum_t *)
 Unloads a gnutls_datum_t struct's data. More...
 
int set_gnutls_dhparams (gnutls_certificate_credentials_t, const char *)
 Set a gnutls session's Diffie-Hellman parameters. More...
 

Detailed Description

GnuTLS based functions for server communication - header file.

This module supplies low-level communication functions for communication with a server over GnuTLS.

Definition in file serverutils.h.

Function Documentation

◆ gvm_connection_close()

void gvm_connection_close ( gvm_connection_t connection)

Close a server connection and its socket.

Parameters
[in]connectionConnection.

Definition at line 505 of file serverutils.c.

506 {
507  gvm_connection_free (connection);
508 }

References gvm_connection_free().

Here is the call graph for this function:

◆ gvm_connection_free()

void gvm_connection_free ( gvm_connection_t client_connection)

Free connection.

Parameters
[in]client_connectionConnection.

Definition at line 92 of file serverutils.c.

93 {
94  if (client_connection->tls)
95  gvm_server_free (client_connection->socket, client_connection->session,
96  client_connection->credentials);
97  else
98  close_unix (client_connection);
99 }

References close_unix(), gvm_connection_t::credentials, gvm_server_free(), gvm_connection_t::session, gvm_connection_t::socket, and gvm_connection_t::tls.

Referenced by gvm_connection_close().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_connection_sendf()

int gvm_connection_sendf ( gvm_connection_t connection,
const char *  format,
  ... 
)

Format and send a string to the server.

Parameters
[in]connectionConnection.
[in]formatprintf-style format string for message.
Returns
0 on success, -1 on error.

Definition at line 824 of file serverutils.c.

825 {
826  va_list ap;
827  int rc;
828 
829  va_start (ap, format);
830  rc = gvm_connection_vsendf (connection, format, ap);
831  va_end (ap);
832  return rc;
833 }

References gvm_connection_vsendf().

Referenced by gmp_ping_c(), gmp_resume_task_report_c(), gmp_start_task_ext_c(), gmp_start_task_report_c(), gmp_stop_task_c(), and gvm_connection_sendf_xml().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_connection_sendf_xml()

int gvm_connection_sendf_xml ( gvm_connection_t connection,
const char *  format,
  ... 
)

Format and send an XML string to the server.

Escape XML in string and character args.

Parameters
[in]connectionConnection.
[in]formatprintf-style format string for message.
Returns
0 on success, -1 on error.

Definition at line 912 of file serverutils.c.

913 {
914  va_list ap;
915  gchar *msg;
916  int rc;
917 
918  va_start (ap, format);
919  msg = g_markup_vprintf_escaped (format, ap);
920  rc = gvm_connection_sendf (connection, "%s", msg);
921  g_free (msg);
922  va_end (ap);
923  return rc;
924 }

References gvm_connection_sendf().

Here is the call graph for this function:

◆ gvm_connection_sendf_xml_quiet()

int gvm_connection_sendf_xml_quiet ( gvm_connection_t connection,
const char *  format,
  ... 
)

Format and send an XML string to the server.

Escape XML in string and character args.

Quiet version, only logs warnings.

Parameters
[in]connectionConnection.
[in]formatprintf-style format string for message.
Returns
0 on success, -1 on error.

Definition at line 966 of file serverutils.c.

968 {
969  va_list ap;
970  gchar *msg;
971  int rc;
972 
973  va_start (ap, format);
974  msg = g_markup_vprintf_escaped (format, ap);
975  rc = gvm_connection_sendf_quiet (connection, "%s", msg);
976  g_free (msg);
977  va_end (ap);
978  return rc;
979 }

References gvm_connection_sendf_quiet().

Referenced by gmp_authenticate_info_ext_c().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_server_attach()

int gvm_server_attach ( int  socket,
gnutls_session_t *  session 
)

Attach a socket to a session, and shake hands with the peer.

Parameters
[in]socketSocket.
[in]sessionPointer to GNUTLS session. FIXME: Why is this a pointer to a session?
Returns
0 on success, -1 on error.

Definition at line 570 of file serverutils.c.

571 {
572  int ret;
573 
574  ret = server_attach_internal (socket, session, NULL, 0);
575  return ret ? -1 : 0;
576 }

References server_attach_internal().

Here is the call graph for this function:

◆ gvm_server_close()

int gvm_server_close ( int  socket,
gnutls_session_t  session 
)

Close a server connection and its socket.

Parameters
[in]socketSocket connected to server.
[in]sessionGNUTLS session with server.
Returns
0 on success, -1 on error.

Definition at line 494 of file serverutils.c.

495 {
496  return gvm_server_free (socket, session, NULL);
497 }

References gvm_server_free().

Referenced by osp_connection_close().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_server_free()

int gvm_server_free ( int  server_socket,
gnutls_session_t  server_session,
gnutls_certificate_credentials_t  server_credentials 
)

Cleanup a server session.

This shuts down the TLS session, closes the socket and releases the TLS resources.

Parameters
[in]server_socketThe socket connected to the server.
[in]server_sessionThe session with the server.
[in]server_credentialsCredentials or NULL.
Returns
0 success, -1 error.

Definition at line 1271 of file serverutils.c.

1273 {
1274  /* Turn off blocking. */
1275  // FIX get flags first
1276  if (fcntl (server_socket, F_SETFL, O_NONBLOCK) == -1)
1277  {
1278  g_warning ("%s: failed to set server socket flag: %s\n", __func__,
1279  strerror (errno));
1280  return -1;
1281  }
1282 
1283  while (1)
1284  {
1285  int ret = gnutls_bye (server_session, GNUTLS_SHUT_WR);
1286  if (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED)
1287  {
1288  continue;
1289  }
1290  if (ret)
1291  {
1292  g_debug (" Failed to gnutls_bye: %s\n",
1293  gnutls_strerror ((int) ret));
1294  /* Carry on successfully anyway, as this often fails, perhaps
1295  * because the server is closing the connection first. */
1296  break;
1297  }
1298  break;
1299  }
1300 
1301  /* The former separate code in gvm_server_close and here
1302  differed in the order the TLS session and socket was closed. The
1303  way we do it here seems to be the right thing but for full
1304  backward compatibility we do it for calls from
1305  gvm_server_close in the old way. We can distinguish the two
1306  modes by the existence of server_credentials. */
1307  if (server_credentials)
1308  {
1309  if (close (server_socket) == -1)
1310  {
1311  g_warning ("%s: failed to close server socket: %s\n", __func__,
1312  strerror (errno));
1313  return -1;
1314  }
1315  gnutls_deinit (server_session);
1316  gnutls_certificate_free_credentials (server_credentials);
1317  }
1318  else
1319  {
1320  gnutls_deinit (server_session);
1321  close (server_socket);
1322  }
1323 
1324  gnutls_global_deinit ();
1325 
1326  return 0;
1327 }

Referenced by gvm_connection_free(), and gvm_server_close().

Here is the caller graph for this function:

◆ gvm_server_new()

int gvm_server_new ( unsigned int  end_type,
gchar *  ca_cert_file,
gchar *  cert_file,
gchar *  key_file,
gnutls_session_t *  server_session,
gnutls_certificate_credentials_t *  server_credentials 
)

Make a session for connecting to a server.

Parameters
[in]end_typeConnection end type (GNUTLS_SERVER or GNUTLS_CLIENT).
[in]ca_cert_fileCertificate authority file.
[in]cert_fileCertificate file.
[in]key_fileKey file.
[out]server_sessionThe session with the server.
[out]server_credentialsServer credentials.
Returns
0 on success, -1 on error.

Definition at line 1144 of file serverutils.c.

1147 {
1148  return server_new_internal (end_type, NULL, ca_cert_file, cert_file, key_file,
1149  server_session, server_credentials);
1150 }

References server_new_internal().

Here is the call graph for this function:

◆ gvm_server_new_mem()

int gvm_server_new_mem ( unsigned int  end_type,
const char *  ca_cert,
const char *  pub_key,
const char *  priv_key,
gnutls_session_t *  session,
gnutls_certificate_credentials_t *  credentials 
)

Make a session for connecting to a server, with certificates stored in memory.

Parameters
[in]end_typeConnection end type: GNUTLS_SERVER or GNUTLS_CLIENT.
[in]ca_certCertificate authority public key.
[in]pub_keyPublic key.
[in]priv_keyPrivate key.
[out]sessionThe session with the server.
[out]credentialsServer credentials.
Returns
0 on success, -1 on error.

Definition at line 1166 of file serverutils.c.

1170 {
1171  if (server_new_gnutls_init (credentials))
1172  return -1;
1173 
1174  if (pub_key && priv_key)
1175  {
1176  int ret;
1177  gnutls_datum_t pub, priv;
1178 
1179  pub.data = (void *) pub_key;
1180  pub.size = strlen (pub_key);
1181  priv.data = (void *) priv_key;
1182  priv.size = strlen (priv_key);
1183 
1184  ret = gnutls_certificate_set_x509_key_mem (*credentials, &pub, &priv,
1185  GNUTLS_X509_FMT_PEM);
1186  if (ret < 0)
1187  {
1188  g_warning ("%s: %s\n", __func__, gnutls_strerror (ret));
1189  return -1;
1190  }
1191  }
1192 
1193  if (ca_cert)
1194  {
1195  int ret;
1196  gnutls_datum_t data;
1197 
1198  data.data = (void *) ca_cert;
1199  data.size = strlen (ca_cert);
1200  ret = gnutls_certificate_set_x509_trust_mem (*credentials, &data,
1201  GNUTLS_X509_FMT_PEM);
1202  if (ret < 0)
1203  {
1204  g_warning ("%s: %s\n", __func__, gnutls_strerror (ret));
1205  gnutls_certificate_free_credentials (*credentials);
1206  return -1;
1207  }
1208  }
1209 
1210  if (server_new_gnutls_set (end_type, NULL, session, credentials))
1211  {
1212  gnutls_certificate_free_credentials (*credentials);
1213  return -1;
1214  }
1215 
1216  return 0;
1217 }

References server_new_gnutls_init(), and server_new_gnutls_set().

Referenced by gvm_server_open_verify().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_server_open()

int gvm_server_open ( gnutls_session_t *  session,
const char *  host,
int  port 
)

Connect to the server using a given host and port.

Parameters
[in]sessionPointer to GNUTLS session.
[in]hostHost to connect to.
[in]portPort to connect to.
Returns
0 on success, -1 on error.

Definition at line 480 of file serverutils.c.

481 {
482  return gvm_server_open_with_cert (session, host, port, NULL, NULL, NULL);
483 }

References gvm_server_open_with_cert().

Here is the call graph for this function:

◆ gvm_server_open_verify()

int gvm_server_open_verify ( gnutls_session_t *  session,
const char *  host,
int  port,
const char *  ca_mem,
const char *  pub_mem,
const char *  priv_mem,
int  verify 
)

Connect to the server using a given host, port and cert.

Parameters
[in]sessionPointer to GNUTLS session.
[in]hostHost to connect to.
[in]portPort to connect to.
[in]ca_memCA cert.
[in]pub_memPublic key.
[in]priv_memPrivate key.
[in]verifyWhether to verify.
Returns
0 on success, -1 on error.
Warning
On success we are leaking the credentials. We can't free them because the session only makes a shallow copy.

Definition at line 314 of file serverutils.c.

317 {
318  int ret;
319  int server_socket;
320  struct addrinfo address_hints;
321  struct addrinfo *addresses, *address;
322  gchar *port_string;
323  int host_type;
324 
325  gnutls_certificate_credentials_t credentials;
326 
327  /* Ensure that host and port have sane values. */
328  if (port < 1 || port > 65535)
329  {
330  g_warning ("Failed to create client TLS session. "
331  "Invalid port %d",
332  port);
333  return -1;
334  }
335  host_type = gvm_get_host_type (host);
337  || host_type == HOST_TYPE_IPV6))
338  {
339  g_warning ("Failed to create client TLS session. Invalid host %s", host);
340  return -1;
341  }
342 
346  if (gvm_server_new_mem (GNUTLS_CLIENT, ca_mem, pub_mem, priv_mem, session,
347  &credentials))
348  {
349  g_warning ("Failed to create client TLS session.");
350  return -1;
351  }
352 
353  if (ca_mem && pub_mem && priv_mem)
354  {
355  set_cert_pub_mem (pub_mem);
356  set_cert_priv_mem (priv_mem);
357 
358  gnutls_certificate_set_retrieve_function (credentials,
360  }
361 
362  /* Create the port string. */
363 
364  port_string = g_strdup_printf ("%i", port);
365 
366  /* Get all possible addresses. */
367 
368  memset (&address_hints, 0, sizeof (address_hints));
369  address_hints.ai_family = AF_UNSPEC; /* IPv4 or IPv6. */
370  address_hints.ai_socktype = SOCK_STREAM;
371  address_hints.ai_protocol = 0;
372 
373  if (getaddrinfo (host, port_string, &address_hints, &addresses))
374  {
375  g_free (port_string);
376  g_warning ("Failed to get server addresses for %s: %s", host,
377  gai_strerror (errno));
378  gnutls_deinit (*session);
379  gnutls_certificate_free_credentials (credentials);
380  return -1;
381  }
382  g_free (port_string);
383 
384  /* Try to connect to each address in turn. */
385 
386  for (address = addresses; address; address = address->ai_next)
387  {
388  /* Make server socket. */
389 
390  if (address->ai_family == AF_INET6)
391  server_socket = socket (PF_INET6, SOCK_STREAM, 0);
392  else
393  server_socket = socket (PF_INET, SOCK_STREAM, 0);
394  if (server_socket == -1)
395  {
396  g_warning ("Failed to create server socket");
397  freeaddrinfo (addresses);
398  gnutls_deinit (*session);
399  gnutls_certificate_free_credentials (credentials);
400  return -1;
401  }
402 
403  /* Connect to server. */
404 
405  if (connect (server_socket, address->ai_addr, address->ai_addrlen) == -1)
406  {
407  close (server_socket);
408  continue;
409  }
410  break;
411  }
412 
413  freeaddrinfo (addresses);
414 
415  if (address == NULL)
416  {
417  g_warning ("Failed to connect to server");
418  gnutls_deinit (*session);
419  gnutls_certificate_free_credentials (credentials);
420  return -1;
421  }
422 
423  g_debug (" Connected to server '%s' port %d.", host, port);
424 
425  /* Complete setup of server session. */
426  ret = server_attach_internal (server_socket, session, host, port);
427  if (ret)
428  {
429  if (ret == -2)
430  {
431  close (server_socket);
432  gnutls_deinit (*session);
433  gnutls_certificate_free_credentials (credentials);
434  }
435  close (server_socket);
436  return -1;
437  }
438  if (verify && gvm_server_verify (*session))
439  {
440  close (server_socket);
441  return -1;
442  }
443 
444  return server_socket;
445 }

References client_cert_callback(), gvm_get_host_type(), gvm_server_new_mem(), gvm_server_verify(), HOST_TYPE_IPV4, HOST_TYPE_IPV6, HOST_TYPE_NAME, server_attach_internal(), set_cert_priv_mem(), and set_cert_pub_mem().

Referenced by gvm_server_open_with_cert().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_server_open_with_cert()

int gvm_server_open_with_cert ( gnutls_session_t *  session,
const char *  host,
int  port,
const char *  ca_mem,
const char *  pub_mem,
const char *  priv_mem 
)

Connect to the server using a given host, port and cert.

Verify if all cert args are given.

Parameters
[in]sessionPointer to GNUTLS session.
[in]hostHost to connect to.
[in]portPort to connect to.
[in]ca_memCA cert.
[in]pub_memPublic key.
[in]priv_memPrivate key.
Returns
0 on success, -1 on error.

Definition at line 462 of file serverutils.c.

465 {
466  return gvm_server_open_verify (session, host, port, ca_mem, pub_mem, priv_mem,
467  ca_mem && pub_mem && priv_mem);
468 }

References gvm_server_open_verify().

Referenced by gvm_server_open(), and osp_send_command().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_server_sendf()

int gvm_server_sendf ( gnutls_session_t *  ,
const char *  ,
  ... 
)

◆ gvm_server_sendf_xml()

int gvm_server_sendf_xml ( gnutls_session_t *  session,
const char *  format,
  ... 
)

Format and send an XML string to the server.

Escape XML in string and character args.

Parameters
[in]sessionPointer to GNUTLS session.
[in]formatprintf-style format string for message.
Returns
0 on success, -1 on error.

Definition at line 887 of file serverutils.c.

888 {
889  va_list ap;
890  gchar *msg;
891  int rc;
892 
893  va_start (ap, format);
894  msg = g_markup_vprintf_escaped (format, ap);
895  rc = gvm_server_sendf (session, "%s", msg);
896  g_free (msg);
897  va_end (ap);
898  return rc;
899 }

References gvm_server_sendf().

Referenced by gmp_create_lsc_credential(), gmp_create_lsc_credential_key(), and gmp_create_task().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_server_sendf_xml_quiet()

int gvm_server_sendf_xml_quiet ( gnutls_session_t *  session,
const char *  format,
  ... 
)

Format and send an XML string to the server.

Escape XML in string and character args.

Quiet version, only logs warnings.

Parameters
[in]sessionPointer to GNUTLS session.
[in]formatprintf-style format string for message.
Returns
0 on success, -1 on error.

Definition at line 939 of file serverutils.c.

940 {
941  va_list ap;
942  gchar *msg;
943  int rc;
944 
945  va_start (ap, format);
946  msg = g_markup_vprintf_escaped (format, ap);
947  rc = gvm_server_sendf_quiet (session, "%s", msg);
948  g_free (msg);
949  va_end (ap);
950  return rc;
951 }

References gvm_server_sendf_quiet().

Referenced by gmp_authenticate(), gmp_authenticate_info_ext(), and gmp_create_lsc_credential().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_server_session_free()

int gvm_server_session_free ( gnutls_session_t  ,
gnutls_certificate_credentials_t   
)

◆ gvm_server_verify()

int gvm_server_verify ( gnutls_session_t  session)

Verify certificate.

Parameters
[in]sessionPointer to GNUTLS session.
Returns
0 on success, 1 on failure, -1 on error.

Definition at line 111 of file serverutils.c.

112 {
113  unsigned int status;
114  int ret;
115 
116  ret = gnutls_certificate_verify_peers2 (session, &status);
117  if (ret < 0)
118  {
119  g_warning ("%s: failed to verify peers: %s", __func__,
120  gnutls_strerror (ret));
121  return -1;
122  }
123 
124  if (status & GNUTLS_CERT_INVALID)
125  g_warning ("%s: the certificate is not trusted", __func__);
126 
127  if (status & GNUTLS_CERT_SIGNER_NOT_CA)
128  g_warning ("%s: the certificate's issuer is not a CA", __func__);
129 
130  if (status & GNUTLS_CERT_INSECURE_ALGORITHM)
131  g_warning ("%s: the certificate was signed using an insecure algorithm",
132  __func__);
133 
134  if (status & GNUTLS_CERT_SIGNER_NOT_FOUND)
135  g_warning ("%s: the certificate hasn't got a known issuer", __func__);
136 
137  if (status & GNUTLS_CERT_REVOKED)
138  g_warning ("%s: the certificate has been revoked", __func__);
139 
140  if (status & GNUTLS_CERT_EXPIRED)
141  g_warning ("%s: the certificate has expired", __func__);
142 
143  if (status & GNUTLS_CERT_NOT_ACTIVATED)
144  g_warning ("%s: the certificate is not yet activated", __func__);
145 
146  if (status)
147  return 1;
148 
149  return 0;
150 }

Referenced by gvm_server_open_verify().

Here is the caller graph for this function:

◆ gvm_server_vsendf()

int int gvm_server_vsendf ( gnutls_session_t *  session,
const char *  fmt,
va_list  ap 
)

Send a string to the server.

Parameters
[in]sessionPointer to GNUTLS session.
[in]fmtFormat of string to send.
[in]apArgs for fmt.
Returns
0 on success, 1 if server closed connection, -1 on error.

Definition at line 728 of file serverutils.c.

729 {
730  return gvm_server_vsendf_internal (session, fmt, ap, 0);
731 }

References gvm_server_vsendf_internal().

Referenced by gvm_server_sendf(), osp_send_command(), and osp_send_command_str().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ gvm_socket_vsendf()

int gvm_socket_vsendf ( int  socket,
const char *  fmt,
va_list  ap 
)

Send a string to the server.

Parameters
[in]socketSocket to send string through.
[in]fmtFormat of string to send.
[in]apArgs for fmt.
Returns
0 on success, 1 if server closed connection, -1 on error.

Definition at line 743 of file serverutils.c.

744 {
745  return unix_vsendf_internal (socket, fmt, ap, 0);
746 }

References unix_vsendf_internal().

Referenced by osp_send_command(), and osp_send_command_str().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ load_gnutls_file()

int load_gnutls_file ( const char *  file,
gnutls_datum_t *  loaded_file 
)

Loads a file's data into gnutls_datum_t struct.

Parameters
[in]fileFile to load.
[out]loaded_fileDestination to load file into.
Returns
0 if success, -1 if error.

Definition at line 161 of file serverutils.c.

162 {
163  FILE *f = NULL;
164  int64_t filelen;
165  void *ptr;
166 
167  if (!(f = fopen (file, "r")) || fseek (f, 0, SEEK_END) != 0
168  || (filelen = ftell (f)) < 0 || fseek (f, 0, SEEK_SET) != 0
169  || !(ptr = g_malloc0 ((size_t) filelen))
170  || fread (ptr, 1, (size_t) filelen, f) < (size_t) filelen)
171  {
172  if (f)
173  fclose (f);
174  return -1;
175  }
176 
177  loaded_file->data = ptr;
178  loaded_file->size = filelen;
179  fclose (f);
180  return 0;
181 }

Referenced by set_gnutls_dhparams().

Here is the caller graph for this function:

◆ set_gnutls_dhparams()

int set_gnutls_dhparams ( gnutls_certificate_credentials_t  creds,
const char *  dhparams_file 
)

Set a gnutls session's Diffie-Hellman parameters.

Parameters
[in]credsGnuTLS credentials.
[in]dhparams_filePath to PEM file containing the DH parameters.
Returns
0 on success, -1 on error.

Definition at line 1228 of file serverutils.c.

1230 {
1231  int ret;
1232  gnutls_datum_t data;
1233 
1234  if (!creds || !dhparams_file)
1235  return -1;
1236 
1237  if (load_gnutls_file (dhparams_file, &data))
1238  return -1;
1239 
1240 /* Disable false positive warning about potential leak of memory */
1241 #ifndef __clang_analyzer__
1242 
1243  gnutls_dh_params_t params = g_malloc0 (sizeof (gnutls_dh_params_t));
1244  ret = gnutls_dh_params_import_pkcs3 (params, &data, GNUTLS_X509_FMT_PEM);
1245  unload_gnutls_file (&data);
1246  if (ret)
1247  {
1248  g_free (params);
1249  return -1;
1250  }
1251  else
1252  gnutls_certificate_set_dh_params (creds, params);
1253  return 0;
1254 
1255 #endif
1256 }

References load_gnutls_file(), and unload_gnutls_file().

Here is the call graph for this function:

◆ unload_gnutls_file()

void unload_gnutls_file ( gnutls_datum_t *  data)

Unloads a gnutls_datum_t struct's data.

Parameters
[in]dataPointer to gnutls_datum_t struct to be unloaded.

Definition at line 189 of file serverutils.c.

190 {
191  if (data)
192  g_free (data->data);
193 }

Referenced by set_gnutls_dhparams().

Here is the caller graph for this function:
gvm_server_new_mem
int gvm_server_new_mem(unsigned int end_type, const char *ca_cert, const char *pub_key, const char *priv_key, gnutls_session_t *session, gnutls_certificate_credentials_t *credentials)
Make a session for connecting to a server, with certificates stored in memory.
Definition: serverutils.c:1166
gvm_connection_vsendf
static int gvm_connection_vsendf(gvm_connection_t *connection, const char *fmt, va_list ap)
Send a string to the server.
Definition: serverutils.c:758
gvm_server_verify
int gvm_server_verify(gnutls_session_t session)
Verify certificate.
Definition: serverutils.c:111
unload_gnutls_file
void unload_gnutls_file(gnutls_datum_t *data)
Unloads a gnutls_datum_t struct's data.
Definition: serverutils.c:189
gvm_connection_sendf
int gvm_connection_sendf(gvm_connection_t *connection, const char *format,...)
Format and send a string to the server.
Definition: serverutils.c:824
gvm_server_sendf_quiet
static int gvm_server_sendf_quiet(gnutls_session_t *session, const char *format,...)
Format and send a string to the server.
Definition: serverutils.c:844
server_new_internal
static int server_new_internal(unsigned int, const char *, const gchar *, const gchar *, const gchar *, gnutls_session_t *, gnutls_certificate_credentials_t *)
Make a session for connecting to a server.
Definition: serverutils.c:1079
gvm_connection_sendf_quiet
static int gvm_connection_sendf_quiet(gvm_connection_t *connection, const char *format,...)
Format and send a string to the server.
Definition: serverutils.c:864
HOST_TYPE_IPV6
@ HOST_TYPE_IPV6
Definition: hosts.h:40
server_attach_internal
static int server_attach_internal(int, gnutls_session_t *, const char *, int)
Attach a socket to a session, and shake hands with the peer.
Definition: serverutils.c:522
close_unix
static int close_unix(gvm_connection_t *client_connection)
Close UNIX socket connection.
Definition: serverutils.c:57
unix_vsendf_internal
static int unix_vsendf_internal(int socket, const char *fmt, va_list ap, int quiet)
Send a string to the server.
Definition: serverutils.c:658
server_new_gnutls_init
static int server_new_gnutls_init(gnutls_certificate_credentials_t *server_credentials)
Initialize a server session.
Definition: serverutils.c:989
HOST_TYPE_IPV4
@ HOST_TYPE_IPV4
Definition: hosts.h:36
gvm_get_host_type
int gvm_get_host_type(const gchar *str_stripped)
Determines the host type in a buffer.
Definition: hosts.c:810
gvm_server_open_with_cert
int gvm_server_open_with_cert(gnutls_session_t *session, const char *host, int port, const char *ca_mem, const char *pub_mem, const char *priv_mem)
Connect to the server using a given host, port and cert.
Definition: serverutils.c:462
gvm_connection_t::socket
int socket
Socket.
Definition: serverutils.h:32
gvm_server_vsendf_internal
static int gvm_server_vsendf_internal(gnutls_session_t *session, const char *fmt, va_list ap, int quiet)
Send a string to the server.
Definition: serverutils.c:590
gvm_connection_t::tls
int tls
Whether uses TCP-TLS (vs UNIX socket).
Definition: serverutils.h:31
load_gnutls_file
int load_gnutls_file(const char *file, gnutls_datum_t *loaded_file)
Loads a file's data into gnutls_datum_t struct.
Definition: serverutils.c:161
gvm_server_free
int gvm_server_free(int server_socket, gnutls_session_t server_session, gnutls_certificate_credentials_t server_credentials)
Cleanup a server session.
Definition: serverutils.c:1271
gvm_server_open_verify
int gvm_server_open_verify(gnutls_session_t *session, const char *host, int port, const char *ca_mem, const char *pub_mem, const char *priv_mem, int verify)
Connect to the server using a given host, port and cert.
Definition: serverutils.c:314
client_cert_callback
static int client_cert_callback(gnutls_session_t session, const gnutls_datum_t *req_ca_rdn, int nreqs, const gnutls_pk_algorithm_t *sign_algos, int sign_algos_length, gnutls_retr2_st *st)
Callback function to be called in order to retrieve the certificate to be used in the handshake.
Definition: serverutils.c:262
gvm_connection_t::credentials
gnutls_certificate_credentials_t credentials
Credentials.
Definition: serverutils.h:34
gvm_connection_free
void gvm_connection_free(gvm_connection_t *client_connection)
Free connection.
Definition: serverutils.c:92
host_type
host_type
Definition: hosts.h:34
server_new_gnutls_set
static int server_new_gnutls_set(unsigned int end_type, const char *priority, gnutls_session_t *server_session, gnutls_certificate_credentials_t *server_credentials)
Set the server credencials.
Definition: serverutils.c:1021
gvm_server_sendf
int gvm_server_sendf(gnutls_session_t *session, const char *format,...)
Format and send a string to the server.
Definition: serverutils.c:804
HOST_TYPE_NAME
@ HOST_TYPE_NAME
Definition: hosts.h:35
gvm_connection_t::session
gnutls_session_t session
Session.
Definition: serverutils.h:33
set_cert_priv_mem
static void set_cert_priv_mem(const char *data)
Save cert_priv_mem with private certificate.
Definition: serverutils.c:217
set_cert_pub_mem
static void set_cert_pub_mem(const char *data)
Save cert_pub_mem with public certificate.
Definition: serverutils.c:204