LCOV - code coverage report
Current view: top level - src/backend/libpq - be-secure-openssl.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19beta1 Lines: 70.1 % 815 571
Test Date: 2026-06-15 18:16:44 Functions: 94.9 % 39 37
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*-------------------------------------------------------------------------
       2              :  *
       3              :  * be-secure-openssl.c
       4              :  *    functions for OpenSSL support in the backend.
       5              :  *
       6              :  *
       7              :  * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
       8              :  * Portions Copyright (c) 1994, Regents of the University of California
       9              :  *
      10              :  *
      11              :  * IDENTIFICATION
      12              :  *    src/backend/libpq/be-secure-openssl.c
      13              :  *
      14              :  *-------------------------------------------------------------------------
      15              :  */
      16              : 
      17              : #include "postgres.h"
      18              : 
      19              : #include <sys/stat.h>
      20              : #include <signal.h>
      21              : #include <fcntl.h>
      22              : #include <ctype.h>
      23              : #include <sys/socket.h>
      24              : #include <unistd.h>
      25              : #include <netdb.h>
      26              : #include <netinet/in.h>
      27              : #include <netinet/tcp.h>
      28              : #include <arpa/inet.h>
      29              : 
      30              : #include "common/hashfn.h"
      31              : #include "common/string.h"
      32              : #include "libpq/libpq.h"
      33              : #include "miscadmin.h"
      34              : #include "pgstat.h"
      35              : #include "storage/fd.h"
      36              : #include "storage/latch.h"
      37              : #include "utils/guc.h"
      38              : #include "utils/memutils.h"
      39              : #include "utils/wait_event.h"
      40              : 
      41              : /*
      42              :  * These SSL-related #includes must come after all system-provided headers.
      43              :  * This ensures that OpenSSL can take care of conflicts with Windows'
      44              :  * <wincrypt.h> by #undef'ing the conflicting macros.  (We don't directly
      45              :  * include <wincrypt.h>, but some other Windows headers do.)
      46              :  */
      47              : #include "common/openssl.h"
      48              : #include <openssl/bn.h>
      49              : #include <openssl/conf.h>
      50              : #include <openssl/dh.h>
      51              : #include <openssl/ec.h>
      52              : #include <openssl/x509v3.h>
      53              : 
      54              : /*
      55              :  * Simplehash for tracking configured hostnames to guard against duplicate
      56              :  * entries.  Each list of hosts is traversed and added to the hash during
      57              :  * parsing and if a duplicate error is detected an error will be thrown.
      58              :  */
      59              : typedef struct
      60              : {
      61              :     uint32      status;
      62              :     const char *hostname;
      63              : } HostCacheEntry;
      64              : static uint32 host_cache_pointer(const char *key);
      65              : #define SH_PREFIX       host_cache
      66              : #define SH_ELEMENT_TYPE HostCacheEntry
      67              : #define SH_KEY_TYPE     const char *
      68              : #define SH_KEY          hostname
      69              : #define SH_HASH_KEY(tb, key)    host_cache_pointer(key)
      70              : #define SH_EQUAL(tb, a, b)      (pg_strcasecmp(a, b) == 0)
      71              : #define SH_SCOPE                static inline
      72              : #define SH_DECLARE
      73              : #define SH_DEFINE
      74              : #include "lib/simplehash.h"
      75              : 
      76              : /* default init hook can be overridden by a shared library */
      77              : static void default_openssl_tls_init(SSL_CTX *context, bool isServerStart);
      78              : openssl_tls_init_hook_typ openssl_tls_init_hook = default_openssl_tls_init;
      79              : 
      80              : static int  port_bio_read(BIO *h, char *buf, int size);
      81              : static int  port_bio_write(BIO *h, const char *buf, int size);
      82              : static BIO_METHOD *port_bio_method(void);
      83              : static int  ssl_set_port_bio(Port *port);
      84              : 
      85              : static DH  *load_dh_file(char *filename, bool isServerStart);
      86              : static DH  *load_dh_buffer(const char *buffer, size_t len);
      87              : static int  ssl_external_passwd_cb(char *buf, int size, int rwflag, void *userdata);
      88              : static int  dummy_ssl_passwd_cb(char *buf, int size, int rwflag, void *userdata);
      89              : static int  verify_cb(int ok, X509_STORE_CTX *ctx);
      90              : static void info_cb(const SSL *ssl, int type, int args);
      91              : static int  alpn_cb(SSL *ssl,
      92              :                     const unsigned char **out,
      93              :                     unsigned char *outlen,
      94              :                     const unsigned char *in,
      95              :                     unsigned int inlen,
      96              :                     void *userdata);
      97              : static bool initialize_dh(SSL_CTX *context, bool isServerStart);
      98              : static bool initialize_ecdh(SSL_CTX *context, bool isServerStart);
      99              : static const char *SSLerrmessageExt(unsigned long ecode, const char *replacement);
     100              : static const char *SSLerrmessage(unsigned long ecode);
     101              : static bool init_host_context(HostsLine *host, bool isServerStart);
     102              : static void host_context_cleanup_cb(void *arg);
     103              : #ifdef HAVE_SSL_CTX_SET_CLIENT_HELLO_CB
     104              : static int  sni_clienthello_cb(SSL *ssl, int *al, void *arg);
     105              : #endif
     106              : 
     107              : static char *X509_NAME_to_cstring(const X509_NAME *name);
     108              : 
     109              : static SSL_CTX *SSL_context = NULL;
     110              : static MemoryContext SSL_hosts_memcxt = NULL;
     111              : static struct hosts
     112              : {
     113              :     /*
     114              :      * List of HostsLine structures containing SSL configurations for
     115              :      * connections with hostnames defined in the SNI extension.
     116              :      */
     117              :     List       *sni;
     118              : 
     119              :     /* The SSL configuration to use for connections without SNI */
     120              :     HostsLine  *no_sni;
     121              : 
     122              :     /*
     123              :      * The default SSL configuration to use as a fallback in case no hostname
     124              :      * matches the supplied hostname in the SNI extension.
     125              :      */
     126              :     HostsLine  *default_host;
     127              : }          *SSL_hosts;
     128              : 
     129              : static bool dummy_ssl_passwd_cb_called = false;
     130              : static bool ssl_is_server_start;
     131              : 
     132              : static int  ssl_protocol_version_to_openssl(int v);
     133              : static const char *ssl_protocol_version_to_string(int v);
     134              : 
     135              : struct CallbackErr
     136              : {
     137              :     /*
     138              :      * Storage for passing certificate verification error logging from the
     139              :      * callback.
     140              :      */
     141              :     char       *cert_errdetail;
     142              : };
     143              : 
     144              : /* ------------------------------------------------------------ */
     145              : /*                       Public interface                       */
     146              : /* ------------------------------------------------------------ */
     147              : 
     148              : int
     149           65 : be_tls_init(bool isServerStart)
     150              : {
     151           65 :     List       *pg_hosts = NIL;
     152              :     ListCell   *line;
     153              :     MemoryContext oldcxt;
     154           65 :     MemoryContext host_memcxt = NULL;
     155              :     MemoryContextCallback *host_memcxt_cb;
     156           65 :     char       *err_msg = NULL;
     157              :     HostsFileLoadResult res;
     158              :     struct hosts *new_hosts;
     159           65 :     SSL_CTX    *context = NULL;
     160           65 :     int         ssl_ver_min = -1;
     161           65 :     int         ssl_ver_max = -1;
     162           65 :     host_cache_hash *host_cache = NULL;
     163              : 
     164              :     /*
     165              :      * Since we don't know which host we're using until the ClientHello is
     166              :      * sent, ssl_loaded_verify_locations *always* starts out as false. The
     167              :      * only place it's set to true is in sni_clienthello_cb().
     168              :      */
     169           65 :     ssl_loaded_verify_locations = false;
     170              : 
     171           65 :     host_memcxt = AllocSetContextCreate(CurrentMemoryContext,
     172              :                                         "hosts file parser context",
     173              :                                         ALLOCSET_SMALL_SIZES);
     174           65 :     oldcxt = MemoryContextSwitchTo(host_memcxt);
     175              : 
     176              :     /* Allocate a tentative replacement for SSL_hosts. */
     177           65 :     new_hosts = palloc0_object(struct hosts);
     178              : 
     179              :     /*
     180              :      * Register a reset callback for the memory context which is responsible
     181              :      * for freeing OpenSSL managed allocations upon context deletion.  The
     182              :      * callback is allocated here to make sure it gets cleaned up along with
     183              :      * the memory context it's registered for.
     184              :      */
     185           65 :     host_memcxt_cb = palloc0_object(MemoryContextCallback);
     186           65 :     host_memcxt_cb->func = host_context_cleanup_cb;
     187           65 :     host_memcxt_cb->arg = new_hosts;
     188           65 :     MemoryContextRegisterResetCallback(host_memcxt, host_memcxt_cb);
     189              : 
     190              :     /*
     191              :      * If ssl_sni is enabled, attempt to load and parse TLS configuration from
     192              :      * the pg_hosts.conf file with the set of hosts returned as a list.  If
     193              :      * there are hosts configured they take precedence over the configuration
     194              :      * in postgresql.conf.  Make sure to allocate the parsed rows in their own
     195              :      * memory context so that we can delete them easily in case parsing fails.
     196              :      * If ssl_sni is disabled then set the state accordingly to make sure we
     197              :      * instead parse the config from postgresql.conf.
     198              :      *
     199              :      * The reason for not doing everything in this if-else conditional is that
     200              :      * we want to use the same processing of postgresql.conf for when ssl_sni
     201              :      * is off as well as when it's on but the hosts file is missing etc.  Thus
     202              :      * we set res to the state and continue with a new conditional instead of
     203              :      * duplicating logic and risk it diverging over time.
     204              :      */
     205           65 :     if (ssl_sni)
     206              :     {
     207              :         /*
     208              :          * The GUC check hook should have already blocked this but to be on
     209              :          * the safe side we double-check here.
     210              :          */
     211              : #ifndef HAVE_SSL_CTX_SET_CLIENT_HELLO_CB
     212              :         ereport(isServerStart ? FATAL : LOG,
     213              :                 errcode(ERRCODE_CONFIG_FILE_ERROR),
     214              :                 errmsg("ssl_sni is not supported with LibreSSL"));
     215              :         goto error;
     216              : #endif
     217              : 
     218              :         /* Attempt to load configuration from pg_hosts.conf */
     219           25 :         res = load_hosts(&pg_hosts, &err_msg);
     220              : 
     221              :         /*
     222              :          * pg_hosts.conf is not required to contain configuration, but if it
     223              :          * does we error out in case it fails to load rather than continue to
     224              :          * try the postgresql.conf configuration to avoid silently falling
     225              :          * back on an undesired configuration.
     226              :          */
     227           25 :         if (res == HOSTSFILE_LOAD_FAILED)
     228              :         {
     229            3 :             ereport(isServerStart ? FATAL : LOG,
     230              :                     errcode(ERRCODE_CONFIG_FILE_ERROR),
     231              :                     errmsg("could not load \"%s\": %s", "pg_hosts.conf",
     232              :                            err_msg ? err_msg : "unknown error"));
     233            0 :             goto error;
     234              :         }
     235              :     }
     236              :     else
     237           40 :         res = HOSTSFILE_DISABLED;
     238              : 
     239              :     /*
     240              :      * Loading and parsing the hosts file was successful, create configs for
     241              :      * each host entry and add to the list of hosts to be checked during
     242              :      * login.
     243              :      */
     244           62 :     if (res == HOSTSFILE_LOAD_OK)
     245              :     {
     246              :         Assert(ssl_sni);
     247              : 
     248           49 :         foreach(line, pg_hosts)
     249              :         {
     250           34 :             HostsLine  *host = lfirst(line);
     251              : 
     252           34 :             if (!init_host_context(host, isServerStart))
     253            1 :                 goto error;
     254              : 
     255              :             /*
     256              :              * The hostname in the config will be set to NULL for the default
     257              :              * host as well as in configs used for non-SNI connections.  Lists
     258              :              * of hostnames in pg_hosts.conf are not allowed to contain the
     259              :              * default '*' entry or a '/no_sni/' entry and this is checked
     260              :              * during parsing.  Thus we can inspect the head of the hostnames
     261              :              * list for these since they will never be anywhere else.
     262              :              */
     263           32 :             if (strcmp(linitial(host->hostnames), "*") == 0)
     264              :             {
     265            6 :                 if (new_hosts->default_host)
     266              :                 {
     267            1 :                     ereport(isServerStart ? FATAL : LOG,
     268              :                             errcode(ERRCODE_CONFIG_FILE_ERROR),
     269              :                             errmsg("multiple default hosts specified"),
     270              :                             errcontext("line %d of configuration file \"%s\"",
     271              :                                        host->linenumber, host->sourcefile));
     272            0 :                     goto error;
     273              :                 }
     274              : 
     275            5 :                 new_hosts->default_host = host;
     276              :             }
     277           26 :             else if (strcmp(linitial(host->hostnames), "/no_sni/") == 0)
     278              :             {
     279            3 :                 if (new_hosts->no_sni)
     280              :                 {
     281            1 :                     ereport(isServerStart ? FATAL : LOG,
     282              :                             errcode(ERRCODE_CONFIG_FILE_ERROR),
     283              :                             errmsg("multiple no_sni hosts specified"),
     284              :                             errcontext("line %d of configuration file \"%s\"",
     285              :                                        host->linenumber, host->sourcefile));
     286            0 :                     goto error;
     287              :                 }
     288              : 
     289            2 :                 new_hosts->no_sni = host;
     290              :             }
     291              :             else
     292              :             {
     293              :                 /* Check the hostnames for duplicates */
     294           23 :                 if (!host_cache)
     295           15 :                     host_cache = host_cache_create(host_memcxt, 32, NULL);
     296              : 
     297           71 :                 foreach_ptr(char, hostname, host->hostnames)
     298              :                 {
     299              :                     HostCacheEntry *entry;
     300              :                     bool        found;
     301              : 
     302           29 :                     entry = host_cache_insert(host_cache, hostname, &found);
     303           29 :                     if (found)
     304              :                     {
     305            2 :                         ereport(isServerStart ? FATAL : LOG,
     306              :                                 errcode(ERRCODE_CONFIG_FILE_ERROR),
     307              :                                 errmsg("multiple entries for host \"%s\" specified",
     308              :                                        hostname),
     309              :                                 errcontext("line %d of configuration file \"%s\"",
     310              :                                            host->linenumber, host->sourcefile));
     311            0 :                         goto error;
     312              :                     }
     313              :                     else
     314           27 :                         entry->hostname = pstrdup(hostname);
     315              :                 }
     316              : 
     317              :                 /*
     318              :                  * At this point we know we have a configuration with a list
     319              :                  * of distinct 1..n hostnames for literal string matching with
     320              :                  * the SNI extension from the user.
     321              :                  */
     322           21 :                 new_hosts->sni = lappend(new_hosts->sni, host);
     323              :             }
     324              :         }
     325              :     }
     326              : 
     327              :     /*
     328              :      * If SNI is disabled, then we load configuration from postgresql.conf. If
     329              :      * SNI is enabled but the pg_hosts.conf file doesn't exist, or is empty,
     330              :      * then we also load the config from postgresql.conf.
     331              :      */
     332           41 :     else if (res == HOSTSFILE_DISABLED || res == HOSTSFILE_EMPTY || res == HOSTSFILE_MISSING)
     333              :     {
     334           41 :         HostsLine  *pgconf = palloc0(sizeof(HostsLine));
     335              : 
     336              : #ifdef USE_ASSERT_CHECKING
     337              :         if (res == HOSTSFILE_DISABLED)
     338              :             Assert(ssl_sni == false);
     339              : #endif
     340              : 
     341           41 :         pgconf->ssl_cert = ssl_cert_file;
     342           41 :         pgconf->ssl_key = ssl_key_file;
     343           41 :         pgconf->ssl_ca = ssl_ca_file;
     344           41 :         pgconf->ssl_passphrase_cmd = ssl_passphrase_command;
     345           41 :         pgconf->ssl_passphrase_reload = ssl_passphrase_command_supports_reload;
     346              : 
     347           41 :         if (!init_host_context(pgconf, isServerStart))
     348            1 :             goto error;
     349              : 
     350              :         /*
     351              :          * If postgresql.conf is used to configure SSL then by definition it
     352              :          * will be the default context as we don't have per-host config.
     353              :          */
     354           38 :         new_hosts->default_host = pgconf;
     355              :     }
     356              : 
     357              :     /*
     358              :      * Make sure we have at least one configuration loaded to use, without
     359              :      * that we cannot drive a connection so exit.
     360              :      */
     361           53 :     if (new_hosts->sni == NIL && !new_hosts->default_host && !new_hosts->no_sni)
     362              :     {
     363            0 :         ereport(isServerStart ? FATAL : LOG,
     364              :                 errcode(ERRCODE_CONFIG_FILE_ERROR),
     365              :                 errmsg("no SSL configurations loaded"),
     366              :         /*- translator: The two %s contain filenames */
     367              :                 errhint("If ssl_sni is enabled then add configuration to \"%s\", else \"%s\"",
     368              :                         "pg_hosts.conf", "postgresql.conf"));
     369            0 :         goto error;
     370              :     }
     371              : 
     372              : #ifdef HAVE_SSL_CTX_SET_CLIENT_HELLO_CB
     373              : 
     374              :     /*
     375              :      * Create a new SSL context into which we'll load all the configuration
     376              :      * settings.  If we fail partway through, we can avoid memory leakage by
     377              :      * freeing this context; we don't install it as active until the end.
     378              :      *
     379              :      * We use SSLv23_method() because it can negotiate use of the highest
     380              :      * mutually supported protocol version, while alternatives like
     381              :      * TLSv1_2_method() permit only one specific version.  Note that we don't
     382              :      * actually allow SSL v2 or v3, only TLS protocols (see below).
     383              :      */
     384           53 :     context = SSL_CTX_new(SSLv23_method());
     385           53 :     if (!context)
     386              :     {
     387            0 :         ereport(isServerStart ? FATAL : LOG,
     388              :                 (errmsg("could not create SSL context: %s",
     389              :                         SSLerrmessage(ERR_get_error()))));
     390            0 :         goto error;
     391              :     }
     392              : #else
     393              : 
     394              :     /*
     395              :      * If the client hello callback isn't supported we want to use the default
     396              :      * context as the one to drive the handshake so avoid creating a new one
     397              :      * and use the already existing default one instead.
     398              :      */
     399              :     context = new_hosts->default_host->ssl_ctx;
     400              : 
     401              :     /*
     402              :      * Since we don't allocate a new SSL_CTX here like we do when SNI has been
     403              :      * enabled we need to bump the reference count on context to avoid double
     404              :      * free of the context when using the same cleanup logic across the cases.
     405              :      */
     406              :     SSL_CTX_up_ref(context);
     407              : #endif
     408              : 
     409              :     /*
     410              :      * Disable OpenSSL's moving-write-buffer sanity check, because it causes
     411              :      * unnecessary failures in nonblocking send cases.
     412              :      */
     413           53 :     SSL_CTX_set_mode(context, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
     414              : 
     415           53 :     if (ssl_min_protocol_version)
     416              :     {
     417           53 :         ssl_ver_min = ssl_protocol_version_to_openssl(ssl_min_protocol_version);
     418              : 
     419           53 :         if (ssl_ver_min == -1)
     420              :         {
     421            0 :             ereport(isServerStart ? FATAL : LOG,
     422              :             /*- translator: first %s is a GUC option name, second %s is its value */
     423              :                     (errmsg("\"%s\" setting \"%s\" not supported by this build",
     424              :                             "ssl_min_protocol_version",
     425              :                             GetConfigOption("ssl_min_protocol_version",
     426              :                                             false, false))));
     427            0 :             goto error;
     428              :         }
     429              : 
     430           53 :         if (!SSL_CTX_set_min_proto_version(context, ssl_ver_min))
     431              :         {
     432            0 :             ereport(isServerStart ? FATAL : LOG,
     433              :                     (errmsg("could not set minimum SSL protocol version")));
     434            0 :             goto error;
     435              :         }
     436              :     }
     437              : 
     438           53 :     if (ssl_max_protocol_version)
     439              :     {
     440            1 :         ssl_ver_max = ssl_protocol_version_to_openssl(ssl_max_protocol_version);
     441              : 
     442            1 :         if (ssl_ver_max == -1)
     443              :         {
     444            0 :             ereport(isServerStart ? FATAL : LOG,
     445              :             /*- translator: first %s is a GUC option name, second %s is its value */
     446              :                     (errmsg("\"%s\" setting \"%s\" not supported by this build",
     447              :                             "ssl_max_protocol_version",
     448              :                             GetConfigOption("ssl_max_protocol_version",
     449              :                                             false, false))));
     450            0 :             goto error;
     451              :         }
     452              : 
     453            1 :         if (!SSL_CTX_set_max_proto_version(context, ssl_ver_max))
     454              :         {
     455            0 :             ereport(isServerStart ? FATAL : LOG,
     456              :                     (errmsg("could not set maximum SSL protocol version")));
     457            0 :             goto error;
     458              :         }
     459              :     }
     460              : 
     461              :     /* Check compatibility of min/max protocols */
     462           53 :     if (ssl_min_protocol_version &&
     463              :         ssl_max_protocol_version)
     464              :     {
     465              :         /*
     466              :          * No need to check for invalid values (-1) for each protocol number
     467              :          * as the code above would have already generated an error.
     468              :          */
     469            1 :         if (ssl_ver_min > ssl_ver_max)
     470              :         {
     471            1 :             ereport(isServerStart ? FATAL : LOG,
     472              :                     (errcode(ERRCODE_CONFIG_FILE_ERROR),
     473              :                      errmsg("could not set SSL protocol version range"),
     474              :                      errdetail("\"%s\" cannot be higher than \"%s\"",
     475              :                                "ssl_min_protocol_version",
     476              :                                "ssl_max_protocol_version")));
     477            0 :             goto error;
     478              :         }
     479              :     }
     480              : 
     481              :     /*
     482              :      * Disallow SSL session tickets. OpenSSL use both stateful and stateless
     483              :      * tickets for TLSv1.3, and stateless ticket for TLSv1.2. SSL_OP_NO_TICKET
     484              :      * is available since 0.9.8f but only turns off stateless tickets. In
     485              :      * order to turn off stateful tickets we need SSL_CTX_set_num_tickets,
     486              :      * which is available since OpenSSL 1.1.1.  LibreSSL 3.5.4 (from OpenBSD
     487              :      * 7.1) introduced this API for compatibility, but doesn't support session
     488              :      * tickets at all so it's a no-op there.
     489              :      */
     490              : #ifdef HAVE_SSL_CTX_SET_NUM_TICKETS
     491           52 :     SSL_CTX_set_num_tickets(context, 0);
     492              : #endif
     493           52 :     SSL_CTX_set_options(context, SSL_OP_NO_TICKET);
     494              : 
     495              :     /* disallow SSL session caching, too */
     496           52 :     SSL_CTX_set_session_cache_mode(context, SSL_SESS_CACHE_OFF);
     497              : 
     498              :     /* disallow SSL compression */
     499           52 :     SSL_CTX_set_options(context, SSL_OP_NO_COMPRESSION);
     500              : 
     501              :     /*
     502              :      * Disallow SSL renegotiation.  This concerns only TLSv1.2 and older
     503              :      * protocol versions, as TLSv1.3 has no support for renegotiation.
     504              :      * SSL_OP_NO_RENEGOTIATION is available in OpenSSL since 1.1.0h (via a
     505              :      * backport from 1.1.1). SSL_OP_NO_CLIENT_RENEGOTIATION is available in
     506              :      * LibreSSL since 2.5.1 disallowing all client-initiated renegotiation
     507              :      * (this is usually on by default).
     508              :      */
     509              : #ifdef SSL_OP_NO_RENEGOTIATION
     510           52 :     SSL_CTX_set_options(context, SSL_OP_NO_RENEGOTIATION);
     511              : #endif
     512              : #ifdef SSL_OP_NO_CLIENT_RENEGOTIATION
     513              :     SSL_CTX_set_options(context, SSL_OP_NO_CLIENT_RENEGOTIATION);
     514              : #endif
     515              : 
     516              :     /* set up ephemeral DH and ECDH keys */
     517           52 :     if (!initialize_dh(context, isServerStart))
     518            0 :         goto error;
     519           52 :     if (!initialize_ecdh(context, isServerStart))
     520            0 :         goto error;
     521              : 
     522              :     /* set up the allowed cipher list for TLSv1.2 and below */
     523           50 :     if (SSL_CTX_set_cipher_list(context, SSLCipherList) != 1)
     524              :     {
     525            0 :         ereport(isServerStart ? FATAL : LOG,
     526              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
     527              :                  errmsg("could not set the TLSv1.2 cipher list (no valid ciphers available)")));
     528            0 :         goto error;
     529              :     }
     530              : 
     531              :     /*
     532              :      * Set up the allowed cipher suites for TLSv1.3. If the GUC is an empty
     533              :      * string we leave the allowed suites to be the OpenSSL default value.
     534              :      */
     535           50 :     if (SSLCipherSuites[0])
     536              :     {
     537              :         /* set up the allowed cipher suites */
     538           43 :         if (SSL_CTX_set_ciphersuites(context, SSLCipherSuites) != 1)
     539              :         {
     540            0 :             ereport(isServerStart ? FATAL : LOG,
     541              :                     (errcode(ERRCODE_CONFIG_FILE_ERROR),
     542              :                      errmsg("could not set the TLSv1.3 cipher suites (no valid ciphers available)")));
     543            0 :             goto error;
     544              :         }
     545              :     }
     546              : 
     547              :     /* Let server choose order */
     548           50 :     if (SSLPreferServerCiphers)
     549           50 :         SSL_CTX_set_options(context, SSL_OP_CIPHER_SERVER_PREFERENCE);
     550              : 
     551              :     /*
     552              :      * Success!  Replace any existing SSL_context and host configurations.
     553              :      */
     554           50 :     if (SSL_context)
     555              :     {
     556           11 :         SSL_CTX_free(SSL_context);
     557           11 :         SSL_context = NULL;
     558              :     }
     559              : 
     560           50 :     MemoryContextSwitchTo(oldcxt);
     561              : 
     562           50 :     if (SSL_hosts_memcxt)
     563           11 :         MemoryContextDelete(SSL_hosts_memcxt);
     564              : 
     565           50 :     SSL_hosts_memcxt = host_memcxt;
     566           50 :     SSL_hosts = new_hosts;
     567           50 :     SSL_context = context;
     568              : 
     569           50 :     return 0;
     570              : 
     571              :     /*
     572              :      * Clean up by releasing working SSL contexts as well as allocations
     573              :      * performed during parsing.  Since all our allocations are done in a
     574              :      * local memory context all we need to do is delete it.
     575              :      */
     576            2 : error:
     577            2 :     if (context)
     578            0 :         SSL_CTX_free(context);
     579              : 
     580            2 :     MemoryContextSwitchTo(oldcxt);
     581            2 :     MemoryContextDelete(host_memcxt);
     582            2 :     return -1;
     583              : }
     584              : 
     585              : /*
     586              :  * host_context_cleanup_cb
     587              :  *
     588              :  * Memory context reset callback for clearing OpenSSL managed resources when
     589              :  * hosts are reloaded and the previous set of configured hosts are freed. As
     590              :  * all hosts are allocated in a single context we don't need to free each host
     591              :  * individually, just resources managed by OpenSSL.
     592              :  */
     593              : static void
     594          408 : host_context_cleanup_cb(void *arg)
     595              : {
     596          408 :     struct hosts *hosts = arg;
     597              : 
     598          927 :     foreach_ptr(HostsLine, host, hosts->sni)
     599              :     {
     600          111 :         if (host->ssl_ctx != NULL)
     601          111 :             SSL_CTX_free(host->ssl_ctx);
     602              :     }
     603              : 
     604          408 :     if (hosts->no_sni && hosts->no_sni->ssl_ctx)
     605            9 :         SSL_CTX_free(hosts->no_sni->ssl_ctx);
     606              : 
     607          408 :     if (hosts->default_host && hosts->default_host->ssl_ctx)
     608          349 :         SSL_CTX_free(hosts->default_host->ssl_ctx);
     609          408 : }
     610              : 
     611              : static bool
     612           75 : init_host_context(HostsLine *host, bool isServerStart)
     613              : {
     614           75 :     SSL_CTX    *ctx = SSL_CTX_new(SSLv23_method());
     615              :     static bool init_warned = false;
     616              : 
     617           75 :     if (!ctx)
     618              :     {
     619            0 :         ereport(isServerStart ? FATAL : LOG,
     620              :                 (errmsg("could not create SSL context: %s",
     621              :                         SSLerrmessage(ERR_get_error()))));
     622            0 :         goto error;
     623              :     }
     624              : 
     625              :     /*
     626              :      * Call init hook (usually to set password callback) in case SNI hasn't
     627              :      * been enabled. If SNI is enabled the hook won't operate on the actual
     628              :      * TLS context used so it cannot function properly; we warn if one has
     629              :      * been installed.
     630              :      *
     631              :      * If SNI is enabled, we set password callback based what was configured.
     632              :      */
     633           75 :     if (!ssl_sni)
     634           40 :         (*openssl_tls_init_hook) (ctx, isServerStart);
     635              :     else
     636              :     {
     637           35 :         if (openssl_tls_init_hook != default_openssl_tls_init && !init_warned)
     638              :         {
     639            1 :             ereport(WARNING,
     640              :                     errcode(ERRCODE_CONFIG_FILE_ERROR),
     641              :                     errmsg("SNI is enabled; installed TLS init hook will be ignored"),
     642              :             /*- translator: first %s is a GUC, second %s contains a filename */
     643              :                     errhint("TLS init hooks are incompatible with SNI. "
     644              :                             "Set \"%s\" to \"off\" to make use of the hook "
     645              :                             "that is currently installed, or remove the hook "
     646              :                             "and use per-host passphrase commands in \"%s\".",
     647              :                             "ssl_sni", "pg_hosts.conf"));
     648            1 :             init_warned = true;
     649              :         }
     650              : 
     651              :         /*
     652              :          * Set up the password callback, if configured.
     653              :          */
     654           35 :         if (isServerStart)
     655              :         {
     656           24 :             if (host->ssl_passphrase_cmd && host->ssl_passphrase_cmd[0])
     657              :             {
     658            5 :                 SSL_CTX_set_default_passwd_cb(ctx, ssl_external_passwd_cb);
     659            5 :                 SSL_CTX_set_default_passwd_cb_userdata(ctx, host->ssl_passphrase_cmd);
     660              :             }
     661              :         }
     662              :         else
     663              :         {
     664              :             /*
     665              :              * If ssl_passphrase_reload is true then ssl_passphrase_cmd cannot
     666              :              * be NULL due to their parsing order, but just in case and to
     667              :              * self-document the code we replicate the nullness checks.
     668              :              */
     669           11 :             if (host->ssl_passphrase_reload &&
     670            4 :                 (host->ssl_passphrase_cmd && host->ssl_passphrase_cmd[0]))
     671              :             {
     672            4 :                 SSL_CTX_set_default_passwd_cb(ctx, ssl_external_passwd_cb);
     673            4 :                 SSL_CTX_set_default_passwd_cb_userdata(ctx, host->ssl_passphrase_cmd);
     674              :             }
     675              :             else
     676              :             {
     677              :                 /*
     678              :                  * If reloading and no external command is configured,
     679              :                  * override OpenSSL's default handling of passphrase-protected
     680              :                  * files, because we don't want to prompt for a passphrase in
     681              :                  * an already-running server.
     682              :                  */
     683            7 :                 SSL_CTX_set_default_passwd_cb(ctx, dummy_ssl_passwd_cb);
     684              :             }
     685              :         }
     686              :     }
     687              : 
     688              :     /*
     689              :      * Load and verify server's certificate and private key
     690              :      */
     691           75 :     if (SSL_CTX_use_certificate_chain_file(ctx, host->ssl_cert) != 1)
     692              :     {
     693            0 :         ereport(isServerStart ? FATAL : LOG,
     694              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
     695              :                  errmsg("could not load server certificate file \"%s\": %s",
     696              :                         host->ssl_cert, SSLerrmessage(ERR_get_error()))));
     697            0 :         goto error;
     698              :     }
     699              : 
     700           75 :     if (!check_ssl_key_file_permissions(host->ssl_key, isServerStart))
     701            0 :         goto error;
     702              : 
     703              : 
     704              :     /* used by the callback */
     705           75 :     ssl_is_server_start = isServerStart;
     706              : 
     707              :     /*
     708              :      * OK, try to load the private key file.
     709              :      */
     710           75 :     dummy_ssl_passwd_cb_called = false;
     711              : 
     712           75 :     if (SSL_CTX_use_PrivateKey_file(ctx,
     713           75 :                                     host->ssl_key,
     714              :                                     SSL_FILETYPE_PEM) != 1)
     715              :     {
     716            5 :         if (dummy_ssl_passwd_cb_called)
     717            2 :             ereport(isServerStart ? FATAL : LOG,
     718              :                     (errcode(ERRCODE_CONFIG_FILE_ERROR),
     719              :                      errmsg("private key file \"%s\" cannot be reloaded because it requires a passphrase",
     720              :                             host->ssl_key)));
     721              :         else
     722            3 :             ereport(isServerStart ? FATAL : LOG,
     723              :                     (errcode(ERRCODE_CONFIG_FILE_ERROR),
     724              :                      errmsg("could not load private key file \"%s\": %s",
     725              :                             host->ssl_key, SSLerrmessage(ERR_get_error()))));
     726            2 :         goto error;
     727              :     }
     728              : 
     729           70 :     if (SSL_CTX_check_private_key(ctx) != 1)
     730              :     {
     731            0 :         ereport(isServerStart ? FATAL : LOG,
     732              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
     733              :                  errmsg("check of private key failed: %s",
     734              :                         SSLerrmessage(ERR_get_error()))));
     735            0 :         goto error;
     736              :     }
     737              : 
     738              :     /*
     739              :      * Load CA store, so we can verify client certificates if needed.
     740              :      */
     741           70 :     if (host->ssl_ca && host->ssl_ca[0])
     742              :     {
     743              :         STACK_OF(X509_NAME) * root_cert_list;
     744              : 
     745           94 :         if (SSL_CTX_load_verify_locations(ctx, host->ssl_ca, NULL) != 1 ||
     746           47 :             (root_cert_list = SSL_load_client_CA_file(host->ssl_ca)) == NULL)
     747              :         {
     748            0 :             ereport(isServerStart ? FATAL : LOG,
     749              :                     (errcode(ERRCODE_CONFIG_FILE_ERROR),
     750              :                      errmsg("could not load root certificate file \"%s\": %s",
     751              :                             host->ssl_ca, SSLerrmessage(ERR_get_error()))));
     752            0 :             goto error;
     753              :         }
     754              : 
     755              :         /*
     756              :          * Tell OpenSSL to send the list of root certs we trust to clients in
     757              :          * CertificateRequests.  This lets a client with a keystore select the
     758              :          * appropriate client certificate to send to us.  Also, this ensures
     759              :          * that the SSL context will "own" the root_cert_list and remember to
     760              :          * free it when no longer needed.
     761              :          */
     762           47 :         SSL_CTX_set_client_CA_list(ctx, root_cert_list);
     763              :     }
     764              : 
     765              :     /*----------
     766              :      * Load the Certificate Revocation List (CRL).
     767              :      * http://searchsecurity.techtarget.com/sDefinition/0,,sid14_gci803160,00.html
     768              :      *----------
     769              :      */
     770           70 :     if (ssl_crl_file[0] || ssl_crl_dir[0])
     771              :     {
     772           62 :         X509_STORE *cvstore = SSL_CTX_get_cert_store(ctx);
     773              : 
     774           62 :         if (cvstore)
     775              :         {
     776              :             /* Set the flags to check against the complete CRL chain */
     777          124 :             if (X509_STORE_load_locations(cvstore,
     778           62 :                                           ssl_crl_file[0] ? ssl_crl_file : NULL,
     779           62 :                                           ssl_crl_dir[0] ? ssl_crl_dir : NULL)
     780              :                 == 1)
     781              :             {
     782           62 :                 X509_STORE_set_flags(cvstore,
     783              :                                      X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);
     784              :             }
     785            0 :             else if (ssl_crl_dir[0] == 0)
     786              :             {
     787            0 :                 ereport(isServerStart ? FATAL : LOG,
     788              :                         (errcode(ERRCODE_CONFIG_FILE_ERROR),
     789              :                          errmsg("could not load SSL certificate revocation list file \"%s\": %s",
     790              :                                 ssl_crl_file, SSLerrmessage(ERR_get_error()))));
     791            0 :                 goto error;
     792              :             }
     793            0 :             else if (ssl_crl_file[0] == 0)
     794              :             {
     795            0 :                 ereport(isServerStart ? FATAL : LOG,
     796              :                         (errcode(ERRCODE_CONFIG_FILE_ERROR),
     797              :                          errmsg("could not load SSL certificate revocation list directory \"%s\": %s",
     798              :                                 ssl_crl_dir, SSLerrmessage(ERR_get_error()))));
     799            0 :                 goto error;
     800              :             }
     801              :             else
     802              :             {
     803            0 :                 ereport(isServerStart ? FATAL : LOG,
     804              :                         (errcode(ERRCODE_CONFIG_FILE_ERROR),
     805              :                          errmsg("could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s",
     806              :                                 ssl_crl_file, ssl_crl_dir,
     807              :                                 SSLerrmessage(ERR_get_error()))));
     808            0 :                 goto error;
     809              :             }
     810              :         }
     811              :     }
     812              : 
     813           70 :     host->ssl_ctx = ctx;
     814           70 :     return true;
     815              : 
     816            2 : error:
     817            2 :     if (ctx)
     818            2 :         SSL_CTX_free(ctx);
     819            2 :     return false;
     820              : }
     821              : 
     822              : void
     823          151 : be_tls_destroy(void)
     824              : {
     825          151 :     if (SSL_context)
     826            1 :         SSL_CTX_free(SSL_context);
     827          151 :     SSL_context = NULL;
     828          151 :     ssl_loaded_verify_locations = false;
     829          151 : }
     830              : 
     831              : int
     832          170 : be_tls_open_server(Port *port)
     833              : {
     834              :     int         r;
     835              :     int         err;
     836              :     int         waitfor;
     837              :     unsigned long ecode;
     838              :     bool        give_proto_hint;
     839              :     static struct CallbackErr err_context;
     840              : 
     841              :     Assert(!port->ssl);
     842              :     Assert(!port->peer);
     843              : 
     844          170 :     if (!SSL_context)
     845              :     {
     846            0 :         ereport(COMMERROR,
     847              :                 (errcode(ERRCODE_PROTOCOL_VIOLATION),
     848              :                  errmsg("could not initialize SSL connection: SSL context not set up")));
     849            0 :         return -1;
     850              :     }
     851              : 
     852              :     /* set up debugging/info callback */
     853          170 :     SSL_CTX_set_info_callback(SSL_context, info_cb);
     854              : 
     855              :     /* enable ALPN */
     856          170 :     SSL_CTX_set_alpn_select_cb(SSL_context, alpn_cb, port);
     857              : 
     858          170 :     if (!(port->ssl = SSL_new(SSL_context)))
     859              :     {
     860            0 :         ereport(COMMERROR,
     861              :                 (errcode(ERRCODE_PROTOCOL_VIOLATION),
     862              :                  errmsg("could not initialize SSL connection: %s",
     863              :                         SSLerrmessage(ERR_get_error()))));
     864            0 :         return -1;
     865              :     }
     866          170 :     if (!ssl_set_port_bio(port))
     867              :     {
     868            0 :         ereport(COMMERROR,
     869              :                 (errcode(ERRCODE_PROTOCOL_VIOLATION),
     870              :                  errmsg("could not set SSL socket: %s",
     871              :                         SSLerrmessage(ERR_get_error()))));
     872            0 :         return -1;
     873              :     }
     874              : 
     875              :     /*
     876              :      * If the underlying TLS library supports the client hello callback we use
     877              :      * that in order to support host based configuration using the SNI TLS
     878              :      * extension.  If the user has disabled SNI via the ssl_sni GUC we still
     879              :      * make use of the callback in order to have consistent handling of
     880              :      * OpenSSL contexts, except in that case the callback will install the
     881              :      * default configuration regardless of the hostname sent by the user in
     882              :      * the handshake.
     883              :      *
     884              :      * In case the TLS library does not support the client hello callback, as
     885              :      * of this writing LibreSSL does not, we need to install the client cert
     886              :      * verification callback here (if the user configured a CA) since we
     887              :      * cannot use the OpenSSL context update functionality.
     888              :      */
     889              : #ifdef HAVE_SSL_CTX_SET_CLIENT_HELLO_CB
     890          170 :     SSL_CTX_set_client_hello_cb(SSL_context, sni_clienthello_cb, NULL);
     891              : #else
     892              :     if (SSL_hosts->default_host->ssl_ca && SSL_hosts->default_host->ssl_ca[0])
     893              :     {
     894              :         /*
     895              :          * Always ask for SSL client cert, but don't fail if it's not
     896              :          * presented.  We might fail such connections later, depending on what
     897              :          * we find in pg_hba.conf.
     898              :          */
     899              :         SSL_set_verify(port->ssl,
     900              :                        (SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE),
     901              :                        verify_cb);
     902              : 
     903              :         ssl_loaded_verify_locations = true;
     904              :     }
     905              : #endif
     906              : 
     907          170 :     err_context.cert_errdetail = NULL;
     908          170 :     SSL_set_ex_data(port->ssl, 0, &err_context);
     909              : 
     910          170 :     port->ssl_in_use = true;
     911              : 
     912          619 : aloop:
     913              : 
     914              :     /*
     915              :      * Prepare to call SSL_get_error() by clearing thread's OpenSSL error
     916              :      * queue.  In general, the current thread's error queue must be empty
     917              :      * before the TLS/SSL I/O operation is attempted, or SSL_get_error() will
     918              :      * not work reliably.  An extension may have failed to clear the
     919              :      * per-thread error queue following another call to an OpenSSL I/O
     920              :      * routine.
     921              :      */
     922          619 :     errno = 0;
     923          619 :     ERR_clear_error();
     924          619 :     r = SSL_accept(port->ssl);
     925          619 :     if (r <= 0)
     926              :     {
     927          481 :         err = SSL_get_error(port->ssl, r);
     928              : 
     929              :         /*
     930              :          * Other clients of OpenSSL in the backend may fail to call
     931              :          * ERR_get_error(), but we always do, so as to not cause problems for
     932              :          * OpenSSL clients that don't call ERR_clear_error() defensively.  Be
     933              :          * sure that this happens by calling now. SSL_get_error() relies on
     934              :          * the OpenSSL per-thread error queue being intact, so this is the
     935              :          * earliest possible point ERR_get_error() may be called.
     936              :          */
     937          481 :         ecode = ERR_get_error();
     938          481 :         switch (err)
     939              :         {
     940          449 :             case SSL_ERROR_WANT_READ:
     941              :             case SSL_ERROR_WANT_WRITE:
     942              :                 /* not allowed during connection establishment */
     943              :                 Assert(!port->noblock);
     944              : 
     945              :                 /*
     946              :                  * No need to care about timeouts/interrupts here. At this
     947              :                  * point authentication_timeout still employs
     948              :                  * StartupPacketTimeoutHandler() which directly exits.
     949              :                  */
     950          449 :                 if (err == SSL_ERROR_WANT_READ)
     951          449 :                     waitfor = WL_SOCKET_READABLE | WL_EXIT_ON_PM_DEATH;
     952              :                 else
     953            0 :                     waitfor = WL_SOCKET_WRITEABLE | WL_EXIT_ON_PM_DEATH;
     954              : 
     955          449 :                 (void) WaitLatchOrSocket(NULL, waitfor, port->sock, 0,
     956              :                                          WAIT_EVENT_SSL_OPEN_SERVER);
     957          449 :                 goto aloop;
     958            0 :             case SSL_ERROR_SYSCALL:
     959            0 :                 if (r < 0 && errno != 0)
     960            0 :                     ereport(COMMERROR,
     961              :                             (errcode_for_socket_access(),
     962              :                              errmsg("could not accept SSL connection: %m")));
     963              :                 else
     964            0 :                     ereport(COMMERROR,
     965              :                             (errcode(ERRCODE_PROTOCOL_VIOLATION),
     966              :                              errmsg("could not accept SSL connection: EOF detected")));
     967            0 :                 break;
     968           32 :             case SSL_ERROR_SSL:
     969           32 :                 switch (ERR_GET_REASON(ecode))
     970              :                 {
     971              :                         /*
     972              :                          * UNSUPPORTED_PROTOCOL, WRONG_VERSION_NUMBER, and
     973              :                          * TLSV1_ALERT_PROTOCOL_VERSION have been observed
     974              :                          * when trying to communicate with an old OpenSSL
     975              :                          * library, or when the client and server specify
     976              :                          * disjoint protocol ranges.  NO_PROTOCOLS_AVAILABLE
     977              :                          * occurs if there's a local misconfiguration (which
     978              :                          * can happen despite our checks, if openssl.cnf
     979              :                          * injects a limit we didn't account for).  It's not
     980              :                          * very clear what would make OpenSSL return the other
     981              :                          * codes listed here, but a hint about protocol
     982              :                          * versions seems like it's appropriate for all.
     983              :                          */
     984            0 :                     case SSL_R_NO_PROTOCOLS_AVAILABLE:
     985              :                     case SSL_R_UNSUPPORTED_PROTOCOL:
     986              :                     case SSL_R_BAD_PROTOCOL_VERSION_NUMBER:
     987              :                     case SSL_R_UNKNOWN_PROTOCOL:
     988              :                     case SSL_R_UNKNOWN_SSL_VERSION:
     989              :                     case SSL_R_UNSUPPORTED_SSL_VERSION:
     990              :                     case SSL_R_WRONG_SSL_VERSION:
     991              :                     case SSL_R_WRONG_VERSION_NUMBER:
     992              :                     case SSL_R_TLSV1_ALERT_PROTOCOL_VERSION:
     993              : #ifdef SSL_R_VERSION_TOO_HIGH
     994              :                     case SSL_R_VERSION_TOO_HIGH:
     995              : #endif
     996              : #ifdef SSL_R_VERSION_TOO_LOW
     997              :                     case SSL_R_VERSION_TOO_LOW:
     998              : #endif
     999            0 :                         give_proto_hint = true;
    1000            0 :                         break;
    1001           32 :                     default:
    1002           32 :                         give_proto_hint = false;
    1003           32 :                         break;
    1004              :                 }
    1005           32 :                 ereport(COMMERROR,
    1006              :                         (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1007              :                          errmsg("could not accept SSL connection: %s",
    1008              :                                 SSLerrmessage(ecode)),
    1009              :                          err_context.cert_errdetail ? errdetail_internal("%s", err_context.cert_errdetail) : 0,
    1010              :                          give_proto_hint ?
    1011              :                          errhint("This may indicate that the client does not support any SSL protocol version between %s and %s.",
    1012              :                                  ssl_min_protocol_version ?
    1013              :                                  ssl_protocol_version_to_string(ssl_min_protocol_version) :
    1014              :                                  MIN_OPENSSL_TLS_VERSION,
    1015              :                                  ssl_max_protocol_version ?
    1016              :                                  ssl_protocol_version_to_string(ssl_max_protocol_version) :
    1017              :                                  MAX_OPENSSL_TLS_VERSION) : 0));
    1018           32 :                 if (err_context.cert_errdetail)
    1019            9 :                     pfree(err_context.cert_errdetail);
    1020           32 :                 break;
    1021            0 :             case SSL_ERROR_ZERO_RETURN:
    1022            0 :                 ereport(COMMERROR,
    1023              :                         (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1024              :                          errmsg("could not accept SSL connection: EOF detected")));
    1025            0 :                 break;
    1026            0 :             default:
    1027            0 :                 ereport(COMMERROR,
    1028              :                         (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1029              :                          errmsg("unrecognized SSL error code: %d",
    1030              :                                 err)));
    1031            0 :                 break;
    1032              :         }
    1033           32 :         return -1;
    1034              :     }
    1035              : 
    1036              :     /* Get the protocol selected by ALPN */
    1037          138 :     port->alpn_used = false;
    1038              :     {
    1039              :         const unsigned char *selected;
    1040              :         unsigned int len;
    1041              : 
    1042          138 :         SSL_get0_alpn_selected(port->ssl, &selected, &len);
    1043              : 
    1044              :         /* If ALPN is used, check that we negotiated the expected protocol */
    1045          138 :         if (selected != NULL)
    1046              :         {
    1047          138 :             if (len == strlen(PG_ALPN_PROTOCOL) &&
    1048          138 :                 memcmp(selected, PG_ALPN_PROTOCOL, strlen(PG_ALPN_PROTOCOL)) == 0)
    1049              :             {
    1050          138 :                 port->alpn_used = true;
    1051              :             }
    1052              :             else
    1053              :             {
    1054              :                 /* shouldn't happen */
    1055            0 :                 ereport(COMMERROR,
    1056              :                         (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1057              :                          errmsg("received SSL connection request with unexpected ALPN protocol")));
    1058              :             }
    1059              :         }
    1060              :     }
    1061              : 
    1062              :     /* Get client certificate, if available. */
    1063          138 :     port->peer = SSL_get_peer_certificate(port->ssl);
    1064              : 
    1065              :     /* and extract the Common Name and Distinguished Name from it. */
    1066          138 :     port->peer_cn = NULL;
    1067          138 :     port->peer_dn = NULL;
    1068          138 :     port->peer_cert_valid = false;
    1069          138 :     if (port->peer != NULL)
    1070              :     {
    1071              :         int         len;
    1072           32 :         const X509_NAME *x509name = X509_get_subject_name(port->peer);
    1073              :         char       *peer_dn;
    1074           32 :         BIO        *bio = NULL;
    1075           32 :         BUF_MEM    *bio_buf = NULL;
    1076              : 
    1077           32 :         len = X509_NAME_get_text_by_NID(unconstify(X509_NAME *, x509name), NID_commonName, NULL, 0);
    1078           32 :         if (len != -1)
    1079              :         {
    1080              :             char       *peer_cn;
    1081              : 
    1082           32 :             peer_cn = MemoryContextAlloc(TopMemoryContext, len + 1);
    1083           32 :             r = X509_NAME_get_text_by_NID(unconstify(X509_NAME *, x509name), NID_commonName, peer_cn,
    1084              :                                           len + 1);
    1085           32 :             peer_cn[len] = '\0';
    1086           32 :             if (r != len)
    1087              :             {
    1088              :                 /* shouldn't happen */
    1089            0 :                 pfree(peer_cn);
    1090            0 :                 return -1;
    1091              :             }
    1092              : 
    1093              :             /*
    1094              :              * Reject embedded NULLs in certificate common name to prevent
    1095              :              * attacks like CVE-2009-4034.
    1096              :              */
    1097           32 :             if (len != strlen(peer_cn))
    1098              :             {
    1099            0 :                 ereport(COMMERROR,
    1100              :                         (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1101              :                          errmsg("SSL certificate's common name contains embedded null")));
    1102            0 :                 pfree(peer_cn);
    1103            0 :                 return -1;
    1104              :             }
    1105              : 
    1106           32 :             port->peer_cn = peer_cn;
    1107              :         }
    1108              : 
    1109           32 :         bio = BIO_new(BIO_s_mem());
    1110           32 :         if (!bio)
    1111              :         {
    1112            0 :             if (port->peer_cn != NULL)
    1113              :             {
    1114            0 :                 pfree(port->peer_cn);
    1115            0 :                 port->peer_cn = NULL;
    1116              :             }
    1117            0 :             return -1;
    1118              :         }
    1119              : 
    1120              :         /*
    1121              :          * RFC2253 is the closest thing to an accepted standard format for
    1122              :          * DNs. We have documented how to produce this format from a
    1123              :          * certificate. It uses commas instead of slashes for delimiters,
    1124              :          * which make regular expression matching a bit easier. Also note that
    1125              :          * it prints the Subject fields in reverse order.
    1126              :          */
    1127           64 :         if (X509_NAME_print_ex(bio, x509name, 0, XN_FLAG_RFC2253) == -1 ||
    1128           32 :             BIO_get_mem_ptr(bio, &bio_buf) <= 0)
    1129              :         {
    1130            0 :             BIO_free(bio);
    1131            0 :             if (port->peer_cn != NULL)
    1132              :             {
    1133            0 :                 pfree(port->peer_cn);
    1134            0 :                 port->peer_cn = NULL;
    1135              :             }
    1136            0 :             return -1;
    1137              :         }
    1138           32 :         peer_dn = MemoryContextAlloc(TopMemoryContext, bio_buf->length + 1);
    1139           32 :         memcpy(peer_dn, bio_buf->data, bio_buf->length);
    1140           32 :         len = bio_buf->length;
    1141           32 :         BIO_free(bio);
    1142           32 :         peer_dn[len] = '\0';
    1143           32 :         if (len != strlen(peer_dn))
    1144              :         {
    1145            0 :             ereport(COMMERROR,
    1146              :                     (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1147              :                      errmsg("SSL certificate's distinguished name contains embedded null")));
    1148            0 :             pfree(peer_dn);
    1149            0 :             if (port->peer_cn != NULL)
    1150              :             {
    1151            0 :                 pfree(port->peer_cn);
    1152            0 :                 port->peer_cn = NULL;
    1153              :             }
    1154            0 :             return -1;
    1155              :         }
    1156              : 
    1157           32 :         port->peer_dn = peer_dn;
    1158              : 
    1159           32 :         port->peer_cert_valid = true;
    1160              :     }
    1161              : 
    1162          138 :     return 0;
    1163              : }
    1164              : 
    1165              : void
    1166          170 : be_tls_close(Port *port)
    1167              : {
    1168          170 :     if (port->ssl)
    1169              :     {
    1170          170 :         SSL_shutdown(port->ssl);
    1171          170 :         SSL_free(port->ssl);
    1172          170 :         port->ssl = NULL;
    1173          170 :         port->ssl_in_use = false;
    1174              :     }
    1175              : 
    1176          170 :     if (port->peer)
    1177              :     {
    1178           32 :         X509_free(port->peer);
    1179           32 :         port->peer = NULL;
    1180              :     }
    1181              : 
    1182          170 :     if (port->peer_cn)
    1183              :     {
    1184           32 :         pfree(port->peer_cn);
    1185           32 :         port->peer_cn = NULL;
    1186              :     }
    1187              : 
    1188          170 :     if (port->peer_dn)
    1189              :     {
    1190           32 :         pfree(port->peer_dn);
    1191           32 :         port->peer_dn = NULL;
    1192              :     }
    1193          170 : }
    1194              : 
    1195              : ssize_t
    1196          753 : be_tls_read(Port *port, void *ptr, size_t len, int *waitfor)
    1197              : {
    1198              :     ssize_t     n;
    1199              :     int         err;
    1200              :     unsigned long ecode;
    1201              : 
    1202          753 :     errno = 0;
    1203          753 :     ERR_clear_error();
    1204          753 :     n = SSL_read(port->ssl, ptr, len);
    1205          753 :     err = SSL_get_error(port->ssl, n);
    1206          753 :     ecode = (err != SSL_ERROR_NONE || n < 0) ? ERR_get_error() : 0;
    1207          753 :     switch (err)
    1208              :     {
    1209          353 :         case SSL_ERROR_NONE:
    1210              :             /* a-ok */
    1211          353 :             break;
    1212          383 :         case SSL_ERROR_WANT_READ:
    1213          383 :             *waitfor = WL_SOCKET_READABLE;
    1214          383 :             errno = EWOULDBLOCK;
    1215          383 :             n = -1;
    1216          383 :             break;
    1217            0 :         case SSL_ERROR_WANT_WRITE:
    1218            0 :             *waitfor = WL_SOCKET_WRITEABLE;
    1219            0 :             errno = EWOULDBLOCK;
    1220            0 :             n = -1;
    1221            0 :             break;
    1222            0 :         case SSL_ERROR_SYSCALL:
    1223              :             /* leave it to caller to ereport the value of errno */
    1224            0 :             if (n != -1 || errno == 0)
    1225              :             {
    1226            0 :                 errno = ECONNRESET;
    1227            0 :                 n = -1;
    1228              :             }
    1229            0 :             break;
    1230            0 :         case SSL_ERROR_SSL:
    1231            0 :             ereport(COMMERROR,
    1232              :                     (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1233              :                      errmsg("SSL error: %s", SSLerrmessage(ecode))));
    1234            0 :             errno = ECONNRESET;
    1235            0 :             n = -1;
    1236            0 :             break;
    1237           17 :         case SSL_ERROR_ZERO_RETURN:
    1238              :             /* connection was cleanly shut down by peer */
    1239           17 :             n = 0;
    1240           17 :             break;
    1241            0 :         default:
    1242            0 :             ereport(COMMERROR,
    1243              :                     (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1244              :                      errmsg("unrecognized SSL error code: %d",
    1245              :                             err)));
    1246            0 :             errno = ECONNRESET;
    1247            0 :             n = -1;
    1248            0 :             break;
    1249              :     }
    1250              : 
    1251          753 :     return n;
    1252              : }
    1253              : 
    1254              : ssize_t
    1255          246 : be_tls_write(Port *port, const void *ptr, size_t len, int *waitfor)
    1256              : {
    1257              :     ssize_t     n;
    1258              :     int         err;
    1259              :     unsigned long ecode;
    1260              : 
    1261          246 :     errno = 0;
    1262          246 :     ERR_clear_error();
    1263          246 :     n = SSL_write(port->ssl, ptr, len);
    1264          246 :     err = SSL_get_error(port->ssl, n);
    1265          246 :     ecode = (err != SSL_ERROR_NONE || n < 0) ? ERR_get_error() : 0;
    1266          246 :     switch (err)
    1267              :     {
    1268          246 :         case SSL_ERROR_NONE:
    1269              :             /* a-ok */
    1270          246 :             break;
    1271            0 :         case SSL_ERROR_WANT_READ:
    1272            0 :             *waitfor = WL_SOCKET_READABLE;
    1273            0 :             errno = EWOULDBLOCK;
    1274            0 :             n = -1;
    1275            0 :             break;
    1276            0 :         case SSL_ERROR_WANT_WRITE:
    1277            0 :             *waitfor = WL_SOCKET_WRITEABLE;
    1278            0 :             errno = EWOULDBLOCK;
    1279            0 :             n = -1;
    1280            0 :             break;
    1281            0 :         case SSL_ERROR_SYSCALL:
    1282              : 
    1283              :             /*
    1284              :              * Leave it to caller to ereport the value of errno.  However, if
    1285              :              * errno is still zero then assume it's a read EOF situation, and
    1286              :              * report ECONNRESET.  (This seems possible because SSL_write can
    1287              :              * also do reads.)
    1288              :              */
    1289            0 :             if (n != -1 || errno == 0)
    1290              :             {
    1291            0 :                 errno = ECONNRESET;
    1292            0 :                 n = -1;
    1293              :             }
    1294            0 :             break;
    1295            0 :         case SSL_ERROR_SSL:
    1296            0 :             ereport(COMMERROR,
    1297              :                     (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1298              :                      errmsg("SSL error: %s", SSLerrmessage(ecode))));
    1299            0 :             errno = ECONNRESET;
    1300            0 :             n = -1;
    1301            0 :             break;
    1302            0 :         case SSL_ERROR_ZERO_RETURN:
    1303              : 
    1304              :             /*
    1305              :              * the SSL connection was closed, leave it to the caller to
    1306              :              * ereport it
    1307              :              */
    1308            0 :             errno = ECONNRESET;
    1309            0 :             n = -1;
    1310            0 :             break;
    1311            0 :         default:
    1312            0 :             ereport(COMMERROR,
    1313              :                     (errcode(ERRCODE_PROTOCOL_VIOLATION),
    1314              :                      errmsg("unrecognized SSL error code: %d",
    1315              :                             err)));
    1316            0 :             errno = ECONNRESET;
    1317            0 :             n = -1;
    1318            0 :             break;
    1319              :     }
    1320              : 
    1321          246 :     return n;
    1322              : }
    1323              : 
    1324              : /* ------------------------------------------------------------ */
    1325              : /*                      Internal functions                      */
    1326              : /* ------------------------------------------------------------ */
    1327              : 
    1328              : /*
    1329              :  * Private substitute BIO: this does the sending and receiving using send() and
    1330              :  * recv() instead. This is so that we can enable and disable interrupts
    1331              :  * just while calling recv(). We cannot have interrupts occurring while
    1332              :  * the bulk of OpenSSL runs, because it uses malloc() and possibly other
    1333              :  * non-reentrant libc facilities. We also need to call send() and recv()
    1334              :  * directly so it gets passed through the socket/signals layer on Win32.
    1335              :  *
    1336              :  * These functions are closely modelled on the standard socket BIO in OpenSSL;
    1337              :  * see sock_read() and sock_write() in OpenSSL's crypto/bio/bss_sock.c.
    1338              :  */
    1339              : 
    1340              : static BIO_METHOD *port_bio_method_ptr = NULL;
    1341              : 
    1342              : static int
    1343         3151 : port_bio_read(BIO *h, char *buf, int size)
    1344              : {
    1345         3151 :     int         res = 0;
    1346         3151 :     Port       *port = (Port *) BIO_get_data(h);
    1347              : 
    1348         3151 :     if (buf != NULL)
    1349              :     {
    1350         3151 :         res = secure_raw_read(port, buf, size);
    1351         3151 :         BIO_clear_retry_flags(h);
    1352         3151 :         port->last_read_was_eof = res == 0;
    1353         3151 :         if (res <= 0)
    1354              :         {
    1355              :             /* If we were interrupted, tell caller to retry */
    1356          837 :             if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
    1357              :             {
    1358          832 :                 BIO_set_retry_read(h);
    1359              :             }
    1360              :         }
    1361              :     }
    1362              : 
    1363         3151 :     return res;
    1364              : }
    1365              : 
    1366              : static int
    1367          712 : port_bio_write(BIO *h, const char *buf, int size)
    1368              : {
    1369          712 :     int         res = 0;
    1370              : 
    1371          712 :     res = secure_raw_write(((Port *) BIO_get_data(h)), buf, size);
    1372          712 :     BIO_clear_retry_flags(h);
    1373          712 :     if (res <= 0)
    1374              :     {
    1375              :         /* If we were interrupted, tell caller to retry */
    1376            0 :         if (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
    1377              :         {
    1378            0 :             BIO_set_retry_write(h);
    1379              :         }
    1380              :     }
    1381              : 
    1382          712 :     return res;
    1383              : }
    1384              : 
    1385              : static long
    1386          811 : port_bio_ctrl(BIO *h, int cmd, long num, void *ptr)
    1387              : {
    1388              :     long        res;
    1389          811 :     Port       *port = (Port *) BIO_get_data(h);
    1390              : 
    1391          811 :     switch (cmd)
    1392              :     {
    1393            5 :         case BIO_CTRL_EOF:
    1394              : 
    1395              :             /*
    1396              :              * This should not be needed. port_bio_read already has a way to
    1397              :              * signal EOF to OpenSSL. However, OpenSSL made an undocumented,
    1398              :              * backwards-incompatible change and now expects EOF via BIO_ctrl.
    1399              :              * See https://github.com/openssl/openssl/issues/8208
    1400              :              */
    1401            5 :             res = port->last_read_was_eof;
    1402            5 :             break;
    1403          466 :         case BIO_CTRL_FLUSH:
    1404              :             /* libssl expects all BIOs to support BIO_flush. */
    1405          466 :             res = 1;
    1406          466 :             break;
    1407          340 :         default:
    1408          340 :             res = 0;
    1409          340 :             break;
    1410              :     }
    1411              : 
    1412          811 :     return res;
    1413              : }
    1414              : 
    1415              : static BIO_METHOD *
    1416          170 : port_bio_method(void)
    1417              : {
    1418          170 :     if (!port_bio_method_ptr)
    1419              :     {
    1420              :         int         my_bio_index;
    1421              : 
    1422          170 :         my_bio_index = BIO_get_new_index();
    1423          170 :         if (my_bio_index == -1)
    1424            0 :             return NULL;
    1425          170 :         my_bio_index |= BIO_TYPE_SOURCE_SINK;
    1426          170 :         port_bio_method_ptr = BIO_meth_new(my_bio_index, "PostgreSQL backend socket");
    1427          170 :         if (!port_bio_method_ptr)
    1428            0 :             return NULL;
    1429          340 :         if (!BIO_meth_set_write(port_bio_method_ptr, port_bio_write) ||
    1430          340 :             !BIO_meth_set_read(port_bio_method_ptr, port_bio_read) ||
    1431          170 :             !BIO_meth_set_ctrl(port_bio_method_ptr, port_bio_ctrl))
    1432              :         {
    1433            0 :             BIO_meth_free(port_bio_method_ptr);
    1434            0 :             port_bio_method_ptr = NULL;
    1435            0 :             return NULL;
    1436              :         }
    1437              :     }
    1438          170 :     return port_bio_method_ptr;
    1439              : }
    1440              : 
    1441              : static int
    1442          170 : ssl_set_port_bio(Port *port)
    1443              : {
    1444              :     BIO        *bio;
    1445              :     BIO_METHOD *bio_method;
    1446              : 
    1447          170 :     bio_method = port_bio_method();
    1448          170 :     if (bio_method == NULL)
    1449            0 :         return 0;
    1450              : 
    1451          170 :     bio = BIO_new(bio_method);
    1452          170 :     if (bio == NULL)
    1453            0 :         return 0;
    1454              : 
    1455          170 :     BIO_set_data(bio, port);
    1456          170 :     BIO_set_init(bio, 1);
    1457              : 
    1458          170 :     SSL_set_bio(port->ssl, bio, bio);
    1459          170 :     return 1;
    1460              : }
    1461              : 
    1462              : /*
    1463              :  *  Load precomputed DH parameters.
    1464              :  *
    1465              :  *  To prevent "downgrade" attacks, we perform a number of checks
    1466              :  *  to verify that the DBA-generated DH parameters file contains
    1467              :  *  what we expect it to contain.
    1468              :  */
    1469              : static DH  *
    1470            0 : load_dh_file(char *filename, bool isServerStart)
    1471              : {
    1472              :     FILE       *fp;
    1473            0 :     DH         *dh = NULL;
    1474              :     int         codes;
    1475              : 
    1476              :     /* attempt to open file.  It's not an error if it doesn't exist. */
    1477            0 :     if ((fp = AllocateFile(filename, "r")) == NULL)
    1478              :     {
    1479            0 :         ereport(isServerStart ? FATAL : LOG,
    1480              :                 (errcode_for_file_access(),
    1481              :                  errmsg("could not open DH parameters file \"%s\": %m",
    1482              :                         filename)));
    1483            0 :         return NULL;
    1484              :     }
    1485              : 
    1486            0 :     dh = PEM_read_DHparams(fp, NULL, NULL, NULL);
    1487            0 :     FreeFile(fp);
    1488              : 
    1489            0 :     if (dh == NULL)
    1490              :     {
    1491            0 :         ereport(isServerStart ? FATAL : LOG,
    1492              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
    1493              :                  errmsg("could not load DH parameters file: %s",
    1494              :                         SSLerrmessage(ERR_get_error()))));
    1495            0 :         return NULL;
    1496              :     }
    1497              : 
    1498              :     /* make sure the DH parameters are usable */
    1499            0 :     if (DH_check(dh, &codes) == 0)
    1500              :     {
    1501            0 :         ereport(isServerStart ? FATAL : LOG,
    1502              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
    1503              :                  errmsg("invalid DH parameters: %s",
    1504              :                         SSLerrmessage(ERR_get_error()))));
    1505            0 :         DH_free(dh);
    1506            0 :         return NULL;
    1507              :     }
    1508            0 :     if (codes & DH_CHECK_P_NOT_PRIME)
    1509              :     {
    1510            0 :         ereport(isServerStart ? FATAL : LOG,
    1511              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
    1512              :                  errmsg("invalid DH parameters: p is not prime")));
    1513            0 :         DH_free(dh);
    1514            0 :         return NULL;
    1515              :     }
    1516            0 :     if ((codes & DH_NOT_SUITABLE_GENERATOR) &&
    1517            0 :         (codes & DH_CHECK_P_NOT_SAFE_PRIME))
    1518              :     {
    1519            0 :         ereport(isServerStart ? FATAL : LOG,
    1520              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
    1521              :                  errmsg("invalid DH parameters: neither suitable generator or safe prime")));
    1522            0 :         DH_free(dh);
    1523            0 :         return NULL;
    1524              :     }
    1525              : 
    1526            0 :     return dh;
    1527              : }
    1528              : 
    1529              : /*
    1530              :  *  Load hardcoded DH parameters.
    1531              :  *
    1532              :  *  If DH parameters cannot be loaded from a specified file, we can load
    1533              :  *  the hardcoded DH parameters supplied with the backend to prevent
    1534              :  *  problems.
    1535              :  */
    1536              : static DH  *
    1537           52 : load_dh_buffer(const char *buffer, size_t len)
    1538              : {
    1539              :     BIO        *bio;
    1540           52 :     DH         *dh = NULL;
    1541              : 
    1542           52 :     bio = BIO_new_mem_buf(buffer, len);
    1543           52 :     if (bio == NULL)
    1544            0 :         return NULL;
    1545           52 :     dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
    1546           52 :     if (dh == NULL)
    1547            0 :         ereport(DEBUG2,
    1548              :                 (errmsg_internal("DH load buffer: %s",
    1549              :                                  SSLerrmessage(ERR_get_error()))));
    1550           52 :     BIO_free(bio);
    1551              : 
    1552           52 :     return dh;
    1553              : }
    1554              : 
    1555              : /*
    1556              :  *  Passphrase collection callback using ssl_passphrase_command
    1557              :  */
    1558              : static int
    1559           17 : ssl_external_passwd_cb(char *buf, int size, int rwflag, void *userdata)
    1560              : {
    1561              :     /* same prompt as OpenSSL uses internally */
    1562           17 :     const char *prompt = "Enter PEM pass phrase:";
    1563           17 :     const char *cmd = userdata;
    1564              : 
    1565              :     Assert(rwflag == 0);
    1566              : 
    1567           17 :     return run_ssl_passphrase_command(cmd, prompt, ssl_is_server_start, buf, size);
    1568              : }
    1569              : 
    1570              : /*
    1571              :  * Dummy passphrase callback
    1572              :  *
    1573              :  * If OpenSSL is told to use a passphrase-protected server key, by default
    1574              :  * it will issue a prompt on /dev/tty and try to read a key from there.
    1575              :  * That's no good during a postmaster SIGHUP cycle, not to mention SSL context
    1576              :  * reload in an EXEC_BACKEND postmaster child.  So override it with this dummy
    1577              :  * function that just returns an empty passphrase, guaranteeing failure.
    1578              :  */
    1579              : static int
    1580            2 : dummy_ssl_passwd_cb(char *buf, int size, int rwflag, void *userdata)
    1581              : {
    1582              :     /* Set flag to change the error message we'll report */
    1583            2 :     dummy_ssl_passwd_cb_called = true;
    1584              :     /* And return empty string */
    1585              :     Assert(size > 0);
    1586            2 :     buf[0] = '\0';
    1587            2 :     return 0;
    1588              : }
    1589              : 
    1590              : /*
    1591              :  * Examines the provided certificate name, and if it's too long to log or
    1592              :  * contains unprintable ASCII, escapes and truncates it. The return value is
    1593              :  * always a new palloc'd string. (The input string is still modified in place,
    1594              :  * for ease of implementation.)
    1595              :  */
    1596              : static char *
    1597           18 : prepare_cert_name(char *name)
    1598              : {
    1599           18 :     size_t      namelen = strlen(name);
    1600           18 :     char       *truncated = name;
    1601              : 
    1602              :     /*
    1603              :      * Common Names are 64 chars max, so for a common case where the CN is the
    1604              :      * last field, we can still print the longest possible CN with a
    1605              :      * 7-character prefix (".../CN=[64 chars]"), for a reasonable limit of 71
    1606              :      * characters.
    1607              :      */
    1608              : #define MAXLEN 71
    1609              : 
    1610           18 :     if (namelen > MAXLEN)
    1611              :     {
    1612              :         /*
    1613              :          * Keep the end of the name, not the beginning, since the most
    1614              :          * specific field is likely to give users the most information.
    1615              :          */
    1616            1 :         truncated = name + namelen - MAXLEN;
    1617            1 :         truncated[0] = truncated[1] = truncated[2] = '.';
    1618            1 :         namelen = MAXLEN;
    1619              :     }
    1620              : 
    1621              : #undef MAXLEN
    1622              : 
    1623           18 :     return pg_clean_ascii(truncated, 0);
    1624              : }
    1625              : 
    1626              : /*
    1627              :  *  Certificate verification callback
    1628              :  *
    1629              :  *  This callback allows us to examine intermediate problems during
    1630              :  *  verification, for later logging.
    1631              :  *
    1632              :  *  This callback also allows us to override the default acceptance
    1633              :  *  criteria (e.g., accepting self-signed or expired certs), but
    1634              :  *  for now we accept the default checks.
    1635              :  */
    1636              : static int
    1637          105 : verify_cb(int ok, X509_STORE_CTX *ctx)
    1638              : {
    1639              :     int         depth;
    1640              :     int         errcode;
    1641              :     const char *errstring;
    1642              :     StringInfoData str;
    1643              :     X509       *cert;
    1644              :     SSL        *ssl;
    1645              :     struct CallbackErr *cb_err;
    1646              : 
    1647          105 :     if (ok)
    1648              :     {
    1649              :         /* Nothing to do for the successful case. */
    1650           96 :         return ok;
    1651              :     }
    1652              : 
    1653              :     /* Pull all the information we have on the verification failure. */
    1654            9 :     depth = X509_STORE_CTX_get_error_depth(ctx);
    1655            9 :     errcode = X509_STORE_CTX_get_error(ctx);
    1656            9 :     errstring = X509_verify_cert_error_string(errcode);
    1657              : 
    1658              :     /*
    1659              :      * Extract the current SSL and CallbackErr object to use for passing error
    1660              :      * detail back from the callback.
    1661              :      */
    1662            9 :     ssl = X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
    1663            9 :     cb_err = (struct CallbackErr *) SSL_get_ex_data(ssl, 0);
    1664              : 
    1665            9 :     initStringInfo(&str);
    1666            9 :     appendStringInfo(&str,
    1667            9 :                      _("Client certificate verification failed at depth %d: %s."),
    1668              :                      depth, errstring);
    1669              : 
    1670            9 :     cert = X509_STORE_CTX_get_current_cert(ctx);
    1671            9 :     if (cert)
    1672              :     {
    1673              :         char       *subject,
    1674              :                    *issuer;
    1675              :         char       *sub_prepared,
    1676              :                    *iss_prepared;
    1677              :         char       *serialno;
    1678              :         ASN1_INTEGER *sn;
    1679              :         BIGNUM     *b;
    1680              : 
    1681              :         /*
    1682              :          * Get the Subject and Issuer for logging, but don't let maliciously
    1683              :          * huge certs flood the logs, and don't reflect non-ASCII bytes into
    1684              :          * it either.
    1685              :          */
    1686            9 :         subject = X509_NAME_to_cstring(X509_get_subject_name(cert));
    1687            9 :         sub_prepared = prepare_cert_name(subject);
    1688            9 :         pfree(subject);
    1689              : 
    1690            9 :         issuer = X509_NAME_to_cstring(X509_get_issuer_name(cert));
    1691            9 :         iss_prepared = prepare_cert_name(issuer);
    1692            9 :         pfree(issuer);
    1693              : 
    1694              :         /*
    1695              :          * Pull the serial number, too, in case a Subject is still ambiguous.
    1696              :          * This mirrors be_tls_get_peer_serial().
    1697              :          */
    1698            9 :         sn = X509_get_serialNumber(cert);
    1699            9 :         b = ASN1_INTEGER_to_BN(sn, NULL);
    1700            9 :         serialno = BN_bn2dec(b);
    1701              : 
    1702            9 :         appendStringInfoChar(&str, '\n');
    1703            9 :         appendStringInfo(&str,
    1704            9 :                          _("Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"."),
    1705            0 :                          sub_prepared, serialno ? serialno : _("unknown"),
    1706              :                          iss_prepared);
    1707              : 
    1708            9 :         BN_free(b);
    1709            9 :         OPENSSL_free(serialno);
    1710            9 :         pfree(iss_prepared);
    1711            9 :         pfree(sub_prepared);
    1712              :     }
    1713              : 
    1714              :     /* Store our detail message to be logged later. */
    1715            9 :     cb_err->cert_errdetail = str.data;
    1716              : 
    1717            9 :     return ok;
    1718              : }
    1719              : 
    1720              : /*
    1721              :  *  This callback is used to copy SSL information messages
    1722              :  *  into the PostgreSQL log.
    1723              :  */
    1724              : static void
    1725         3893 : info_cb(const SSL *ssl, int type, int args)
    1726              : {
    1727              :     const char *desc;
    1728              : 
    1729         3893 :     desc = SSL_state_string_long(ssl);
    1730              : 
    1731         3893 :     switch (type)
    1732              :     {
    1733          170 :         case SSL_CB_HANDSHAKE_START:
    1734          170 :             ereport(DEBUG4,
    1735              :                     (errmsg_internal("SSL: handshake start: \"%s\"", desc)));
    1736          170 :             break;
    1737          138 :         case SSL_CB_HANDSHAKE_DONE:
    1738          138 :             ereport(DEBUG4,
    1739              :                     (errmsg_internal("SSL: handshake done: \"%s\"", desc)));
    1740          138 :             break;
    1741         2779 :         case SSL_CB_ACCEPT_LOOP:
    1742         2779 :             ereport(DEBUG4,
    1743              :                     (errmsg_internal("SSL: accept loop: \"%s\"", desc)));
    1744         2779 :             break;
    1745          619 :         case SSL_CB_ACCEPT_EXIT:
    1746          619 :             ereport(DEBUG4,
    1747              :                     (errmsg_internal("SSL: accept exit (%d): \"%s\"", args, desc)));
    1748          619 :             break;
    1749            0 :         case SSL_CB_CONNECT_LOOP:
    1750            0 :             ereport(DEBUG4,
    1751              :                     (errmsg_internal("SSL: connect loop: \"%s\"", desc)));
    1752            0 :             break;
    1753            0 :         case SSL_CB_CONNECT_EXIT:
    1754            0 :             ereport(DEBUG4,
    1755              :                     (errmsg_internal("SSL: connect exit (%d): \"%s\"", args, desc)));
    1756            0 :             break;
    1757           29 :         case SSL_CB_READ_ALERT:
    1758           29 :             ereport(DEBUG4,
    1759              :                     (errmsg_internal("SSL: read alert (0x%04x): \"%s\"", args, desc)));
    1760           29 :             break;
    1761          158 :         case SSL_CB_WRITE_ALERT:
    1762          158 :             ereport(DEBUG4,
    1763              :                     (errmsg_internal("SSL: write alert (0x%04x): \"%s\"", args, desc)));
    1764          158 :             break;
    1765              :     }
    1766         3893 : }
    1767              : 
    1768              : /* See pqcomm.h comments on OpenSSL implementation of ALPN (RFC 7301) */
    1769              : static const unsigned char alpn_protos[] = PG_ALPN_PROTOCOL_VECTOR;
    1770              : 
    1771              : /*
    1772              :  * Server callback for ALPN negotiation. We use the standard "helper" function
    1773              :  * even though currently we only accept one value.
    1774              :  */
    1775              : static int
    1776          306 : alpn_cb(SSL *ssl,
    1777              :         const unsigned char **out,
    1778              :         unsigned char *outlen,
    1779              :         const unsigned char *in,
    1780              :         unsigned int inlen,
    1781              :         void *userdata)
    1782              : {
    1783              :     /*
    1784              :      * Why does OpenSSL provide a helper function that requires a nonconst
    1785              :      * vector when the callback is declared to take a const vector? What are
    1786              :      * we to do with that?
    1787              :      */
    1788              :     int         retval;
    1789              : 
    1790              :     Assert(userdata != NULL);
    1791              :     Assert(out != NULL);
    1792              :     Assert(outlen != NULL);
    1793              :     Assert(in != NULL);
    1794              : 
    1795          306 :     retval = SSL_select_next_proto((unsigned char **) out, outlen,
    1796              :                                    alpn_protos, sizeof(alpn_protos),
    1797              :                                    in, inlen);
    1798          306 :     if (*out == NULL || *outlen > sizeof(alpn_protos) || *outlen <= 0)
    1799            0 :         return SSL_TLSEXT_ERR_NOACK;    /* can't happen */
    1800              : 
    1801          306 :     if (retval == OPENSSL_NPN_NEGOTIATED)
    1802          306 :         return SSL_TLSEXT_ERR_OK;
    1803              :     else
    1804              :     {
    1805              :         /*
    1806              :          * The client doesn't support our protocol.  Reject the connection
    1807              :          * with TLS "no_application_protocol" alert, per RFC 7301.
    1808              :          */
    1809            0 :         return SSL_TLSEXT_ERR_ALERT_FATAL;
    1810              :     }
    1811              : }
    1812              : 
    1813              : #ifdef HAVE_SSL_CTX_SET_CLIENT_HELLO_CB
    1814              : /*
    1815              :  * ssl_update_ssl
    1816              :  *
    1817              :  * Replace certificate/key and CA in an SSL object to match the, via the SNI
    1818              :  * extension, selected host configuration for the connection.  The SSL_CTX
    1819              :  * object to use should be passed in as ctx.  This function will update the
    1820              :  * SSL object in-place.
    1821              :  */
    1822              : static bool
    1823          306 : ssl_update_ssl(SSL *ssl, HostsLine *host_config)
    1824              : {
    1825          306 :     SSL_CTX    *ctx = host_config->ssl_ctx;
    1826              : 
    1827              :     X509       *cert;
    1828              :     EVP_PKEY   *key;
    1829              : 
    1830              :     STACK_OF(X509) * chain;
    1831              : 
    1832              :     Assert(ctx != NULL);
    1833              :     /*-
    1834              :      * Make use of the already-loaded certificate chain and key. At first
    1835              :      * glance, SSL_set_SSL_CTX() looks like the easiest way to do this, but
    1836              :      * beware -- it has very odd behavior:
    1837              :      *
    1838              :      *     https://github.com/openssl/openssl/issues/6109
    1839              :      */
    1840          306 :     cert = SSL_CTX_get0_certificate(ctx);
    1841          306 :     key = SSL_CTX_get0_privatekey(ctx);
    1842              : 
    1843              :     Assert(cert && key);
    1844              : 
    1845          306 :     if (!SSL_CTX_get0_chain_certs(ctx, &chain)
    1846          306 :         || !SSL_use_cert_and_key(ssl, cert, key, chain, 1 /* override */ )
    1847          306 :         || !SSL_check_private_key(ssl))
    1848              :     {
    1849              :         /*
    1850              :          * This shouldn't really be possible, since the inputs came from a
    1851              :          * SSL_CTX that was already populated by OpenSSL.
    1852              :          */
    1853            0 :         ereport(COMMERROR,
    1854              :                 errcode(ERRCODE_INTERNAL_ERROR),
    1855              :                 errmsg_internal("could not update certificate chain: %s",
    1856              :                                 SSLerrmessage(ERR_get_error())));
    1857            0 :         return false;
    1858              :     }
    1859              : 
    1860          306 :     if (host_config->ssl_ca && host_config->ssl_ca[0])
    1861              :     {
    1862              :         /*
    1863              :          * Copy the trust store and list of roots over from the SSL_CTX.
    1864              :          */
    1865          282 :         X509_STORE *ca_store = SSL_CTX_get_cert_store(ctx);
    1866              : 
    1867              :         STACK_OF(X509_NAME) * roots;
    1868              : 
    1869              :         /*
    1870              :          * The trust store appears to be the only setting that this function
    1871              :          * can't override via the (SSL *) pointer directly. Instead, share it
    1872              :          * with the active SSL_CTX (this should always be SSL_context).
    1873              :          */
    1874              :         Assert(SSL_context == SSL_get_SSL_CTX(ssl));
    1875          282 :         SSL_CTX_set1_cert_store(SSL_context, ca_store);
    1876              : 
    1877              :         /*
    1878              :          * SSL_set_client_CA_list() will take ownership of its argument, so we
    1879              :          * need to duplicate it.
    1880              :          */
    1881          282 :         if ((roots = SSL_CTX_get_client_CA_list(ctx)) == NULL
    1882          282 :             || (roots = SSL_dup_CA_list(roots)) == NULL)
    1883              :         {
    1884            0 :             ereport(COMMERROR,
    1885              :                     errcode(ERRCODE_INTERNAL_ERROR),
    1886              :                     errmsg_internal("could not duplicate SSL_CTX CA list: %s",
    1887              :                                     SSLerrmessage(ERR_get_error())));
    1888            0 :             return false;
    1889              :         }
    1890              : 
    1891          282 :         SSL_set_client_CA_list(ssl, roots);
    1892              : 
    1893              :         /*
    1894              :          * Always ask for SSL client cert, but don't fail if it's not
    1895              :          * presented.  We might fail such connections later, depending on what
    1896              :          * we find in pg_hba.conf.
    1897              :          */
    1898          282 :         SSL_set_verify(ssl,
    1899              :                        (SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE),
    1900              :                        verify_cb);
    1901              : 
    1902          282 :         ssl_loaded_verify_locations = true;
    1903              :     }
    1904              : 
    1905          306 :     return true;
    1906              : }
    1907              : 
    1908              : /*
    1909              :  * sni_clienthello_cb
    1910              :  *
    1911              :  * Callback for extracting the servername extension from the TLS handshake
    1912              :  * during ClientHello.  There is a callback in OpenSSL for the servername
    1913              :  * specifically but OpenSSL themselves advice against using it as it is more
    1914              :  * dependent on ordering for execution.
    1915              :  */
    1916              : static int
    1917          312 : sni_clienthello_cb(SSL *ssl, int *al, void *arg)
    1918              : {
    1919              :     const char *tlsext_hostname;
    1920              :     const unsigned char *tlsext;
    1921              :     size_t      left,
    1922              :                 len;
    1923          312 :     HostsLine  *install_config = NULL;
    1924              : 
    1925          312 :     if (!ssl_sni)
    1926              :     {
    1927          256 :         install_config = SSL_hosts->default_host;
    1928          256 :         goto found;
    1929              :     }
    1930              : 
    1931           56 :     if (SSL_client_hello_get0_ext(ssl, TLSEXT_TYPE_server_name, &tlsext, &left))
    1932              :     {
    1933           53 :         if (left <= 2)
    1934              :         {
    1935            0 :             *al = SSL_AD_DECODE_ERROR;
    1936            0 :             return 0;
    1937              :         }
    1938           53 :         len = (*(tlsext++) << 8);
    1939           53 :         len += *(tlsext)++;
    1940           53 :         if (len + 2 != left)
    1941              :         {
    1942            0 :             *al = SSL_AD_DECODE_ERROR;
    1943            0 :             return 0;
    1944              :         }
    1945              : 
    1946           53 :         left = len;
    1947              : 
    1948           53 :         if (left == 0 || *tlsext++ != TLSEXT_NAMETYPE_host_name)
    1949              :         {
    1950            0 :             *al = SSL_AD_DECODE_ERROR;
    1951            0 :             return 0;
    1952              :         }
    1953              : 
    1954           53 :         left--;
    1955              : 
    1956              :         /*
    1957              :          * Now we can finally pull out the byte array with the actual
    1958              :          * hostname.
    1959              :          */
    1960           53 :         if (left <= 2)
    1961              :         {
    1962            0 :             *al = SSL_AD_DECODE_ERROR;
    1963            0 :             return 0;
    1964              :         }
    1965           53 :         len = (*(tlsext++) << 8);
    1966           53 :         len += *(tlsext++);
    1967           53 :         if (len + 2 > left)
    1968              :         {
    1969            0 :             *al = SSL_AD_DECODE_ERROR;
    1970            0 :             return 0;
    1971              :         }
    1972           53 :         left = len;
    1973           53 :         tlsext_hostname = (const char *) tlsext;
    1974              : 
    1975              :         /*
    1976              :          * We have a requested hostname from the client, match against all
    1977              :          * entries in the pg_hosts configuration and attempt to find a match.
    1978              :          * Matching is done case insensitive as per RFC 952 and RFC 921.
    1979              :          */
    1980           90 :         foreach_ptr(HostsLine, host, SSL_hosts->sni)
    1981              :         {
    1982          120 :             foreach_ptr(char, hostname, host->hostnames)
    1983              :             {
    1984          141 :                 if (strlen(hostname) == len &&
    1985           65 :                     pg_strncasecmp(hostname, tlsext_hostname, len) == 0)
    1986              :                 {
    1987           38 :                     install_config = host;
    1988           38 :                     goto found;
    1989              :                 }
    1990              :             }
    1991              :         }
    1992              : 
    1993              :         /*
    1994              :          * If no host specific match was found, and there is a default config,
    1995              :          * then fall back to using that.
    1996              :          */
    1997           15 :         if (!install_config && SSL_hosts->default_host)
    1998           10 :             install_config = SSL_hosts->default_host;
    1999              :     }
    2000              : 
    2001              :     /*
    2002              :      * No hostname TLS extension in the handshake, use the default or no_sni
    2003              :      * configurations if available.
    2004              :      */
    2005              :     else
    2006              :     {
    2007            3 :         tlsext_hostname = NULL;
    2008              : 
    2009            3 :         if (SSL_hosts->no_sni)
    2010            2 :             install_config = SSL_hosts->no_sni;
    2011            1 :         else if (SSL_hosts->default_host)
    2012            0 :             install_config = SSL_hosts->default_host;
    2013              :         else
    2014              :         {
    2015              :             /*
    2016              :              * Reaching here means that we didn't get a hostname in the TLS
    2017              :              * extension and the server has been configured to not allow any
    2018              :              * connections without a specified hostname.
    2019              :              *
    2020              :              * The error message for a missing server_name should, according
    2021              :              * to RFC 8446, be missing_extension. This isn't entirely ideal
    2022              :              * since the user won't be able to tell which extension the server
    2023              :              * considered missing.  Sending unrecognized_name would be a more
    2024              :              * helpful error, but for now we stick to the RFC.
    2025              :              */
    2026            1 :             *al = SSL_AD_MISSING_EXTENSION;
    2027              : 
    2028            1 :             ereport(COMMERROR,
    2029              :                     (errcode(ERRCODE_PROTOCOL_VIOLATION),
    2030              :                      errmsg("no hostname provided in callback, and no fallback configured")));
    2031            1 :             return SSL_CLIENT_HELLO_ERROR;
    2032              :         }
    2033              :     }
    2034              : 
    2035              :     /*
    2036              :      * If we reach here without a context chosen as the session context then
    2037              :      * fail the handshake and terminate the connection.
    2038              :      */
    2039           17 :     if (install_config == NULL)
    2040              :     {
    2041            5 :         if (tlsext_hostname)
    2042            5 :             *al = SSL_AD_UNRECOGNIZED_NAME;
    2043              :         else
    2044            0 :             *al = SSL_AD_MISSING_EXTENSION;
    2045            5 :         return SSL_CLIENT_HELLO_ERROR;
    2046              :     }
    2047              : 
    2048           12 : found:
    2049          306 :     if (!ssl_update_ssl(ssl, install_config))
    2050              :     {
    2051            0 :         *al = SSL_AD_INTERNAL_ERROR;
    2052            0 :         ereport(COMMERROR,
    2053              :                 errcode(ERRCODE_PROTOCOL_VIOLATION),
    2054              :                 errmsg("failed to switch to SSL configuration for host, terminating connection"));
    2055            0 :         return SSL_CLIENT_HELLO_ERROR;
    2056              :     }
    2057              : 
    2058          306 :     return SSL_CLIENT_HELLO_SUCCESS;
    2059              : }
    2060              : #endif                          /* HAVE_SSL_CTX_SET_CLIENT_HELLO_CB */
    2061              : 
    2062              : /*
    2063              :  * Set DH parameters for generating ephemeral DH keys.  The
    2064              :  * DH parameters can take a long time to compute, so they must be
    2065              :  * precomputed.
    2066              :  *
    2067              :  * Since few sites will bother to create a parameter file, we also
    2068              :  * provide a fallback to the parameters provided by the OpenSSL
    2069              :  * project.
    2070              :  *
    2071              :  * These values can be static (once loaded or computed) since the
    2072              :  * OpenSSL library can efficiently generate random keys from the
    2073              :  * information provided.
    2074              :  */
    2075              : static bool
    2076           52 : initialize_dh(SSL_CTX *context, bool isServerStart)
    2077              : {
    2078           52 :     DH         *dh = NULL;
    2079              : 
    2080           52 :     SSL_CTX_set_options(context, SSL_OP_SINGLE_DH_USE);
    2081              : 
    2082           52 :     if (ssl_dh_params_file[0])
    2083            0 :         dh = load_dh_file(ssl_dh_params_file, isServerStart);
    2084           52 :     if (!dh)
    2085           52 :         dh = load_dh_buffer(FILE_DH2048, sizeof(FILE_DH2048));
    2086           52 :     if (!dh)
    2087              :     {
    2088            0 :         ereport(isServerStart ? FATAL : LOG,
    2089              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
    2090              :                  errmsg("DH: could not load DH parameters")));
    2091            0 :         return false;
    2092              :     }
    2093              : 
    2094           52 :     if (SSL_CTX_set_tmp_dh(context, dh) != 1)
    2095              :     {
    2096            0 :         ereport(isServerStart ? FATAL : LOG,
    2097              :                 (errcode(ERRCODE_CONFIG_FILE_ERROR),
    2098              :                  errmsg("DH: could not set DH parameters: %s",
    2099              :                         SSLerrmessage(ERR_get_error()))));
    2100            0 :         DH_free(dh);
    2101            0 :         return false;
    2102              :     }
    2103              : 
    2104           52 :     DH_free(dh);
    2105           52 :     return true;
    2106              : }
    2107              : 
    2108              : /*
    2109              :  * Set ECDH parameters for generating ephemeral Elliptic Curve DH
    2110              :  * keys.  This is much simpler than the DH parameters, as we just
    2111              :  * need to provide the name of the curve to OpenSSL.
    2112              :  */
    2113              : static bool
    2114           52 : initialize_ecdh(SSL_CTX *context, bool isServerStart)
    2115              : {
    2116           52 :     if (SSL_CTX_set1_groups_list(context, SSLECDHCurve) != 1)
    2117              :     {
    2118              :         /*
    2119              :          * OpenSSL 3.3.0 introduced proper error messages for group parsing
    2120              :          * errors, earlier versions returns "no SSL error reported" which is
    2121              :          * far from helpful. For older versions, we replace with a better
    2122              :          * error message. Injecting the error into the OpenSSL error queue
    2123              :          * need APIs from OpenSSL 3.0.
    2124              :          */
    2125            2 :         ereport(isServerStart ? FATAL : LOG,
    2126              :                 errcode(ERRCODE_CONFIG_FILE_ERROR),
    2127              :                 errmsg("could not set group names specified in ssl_groups: %s",
    2128              :                        SSLerrmessageExt(ERR_get_error(),
    2129              :                                         _("No valid groups found"))),
    2130              :                 errhint("Ensure that each group name is spelled correctly and supported by the installed version of OpenSSL."));
    2131            0 :         return false;
    2132              :     }
    2133              : 
    2134           50 :     return true;
    2135              : }
    2136              : 
    2137              : /*
    2138              :  * Obtain reason string for passed SSL errcode with replacement
    2139              :  *
    2140              :  * The error message supplied in replacement will be used in case the error
    2141              :  * code from OpenSSL is 0, else the error message from SSLerrmessage() will
    2142              :  * be returned.
    2143              :  *
    2144              :  * Not all versions of OpenSSL place an error on the queue even for failing
    2145              :  * operations, which will yield "no SSL error reported" by SSLerrmessage. This
    2146              :  * function can be used to ensure that a proper error message is displayed for
    2147              :  * versions reporting no error, while using the OpenSSL error via SSLerrmessage
    2148              :  * for versions where there is one.
    2149              :  */
    2150              : static const char *
    2151            2 : SSLerrmessageExt(unsigned long ecode, const char *replacement)
    2152              : {
    2153            2 :     if (ecode == 0)
    2154            2 :         return replacement;
    2155              :     else
    2156            0 :         return SSLerrmessage(ecode);
    2157              : }
    2158              : 
    2159              : /*
    2160              :  * Obtain reason string for passed SSL errcode
    2161              :  *
    2162              :  * ERR_get_error() is used by caller to get errcode to pass here.
    2163              :  *
    2164              :  * Some caution is needed here since ERR_reason_error_string will return NULL
    2165              :  * if it doesn't recognize the error code, or (in OpenSSL >= 3) if the code
    2166              :  * represents a system errno value.  We don't want to return NULL ever.
    2167              :  */
    2168              : static const char *
    2169           35 : SSLerrmessage(unsigned long ecode)
    2170              : {
    2171              :     const char *errreason;
    2172              :     static char errbuf[36];
    2173              : 
    2174           35 :     if (ecode == 0)
    2175            0 :         return _("no SSL error reported");
    2176           35 :     errreason = ERR_reason_error_string(ecode);
    2177           35 :     if (errreason != NULL)
    2178           35 :         return errreason;
    2179              : 
    2180              :     /*
    2181              :      * In OpenSSL 3.0.0 and later, ERR_reason_error_string does not map system
    2182              :      * errno values anymore.  (See OpenSSL source code for the explanation.)
    2183              :      * We can cover that shortcoming with this bit of code.  Older OpenSSL
    2184              :      * versions don't have the ERR_SYSTEM_ERROR macro, but that's okay because
    2185              :      * they don't have the shortcoming either.
    2186              :      */
    2187              : #ifdef ERR_SYSTEM_ERROR
    2188            0 :     if (ERR_SYSTEM_ERROR(ecode))
    2189            0 :         return strerror(ERR_GET_REASON(ecode));
    2190              : #endif
    2191              : 
    2192              :     /* No choice but to report the numeric ecode */
    2193            0 :     snprintf(errbuf, sizeof(errbuf), _("SSL error code %lu"), ecode);
    2194            0 :     return errbuf;
    2195              : }
    2196              : 
    2197              : int
    2198          220 : be_tls_get_cipher_bits(Port *port)
    2199              : {
    2200              :     int         bits;
    2201              : 
    2202          220 :     if (port->ssl)
    2203              :     {
    2204          220 :         SSL_get_cipher_bits(port->ssl, &bits);
    2205          220 :         return bits;
    2206              :     }
    2207              :     else
    2208            0 :         return 0;
    2209              : }
    2210              : 
    2211              : const char *
    2212          221 : be_tls_get_version(Port *port)
    2213              : {
    2214          221 :     if (port->ssl)
    2215          221 :         return SSL_get_version(port->ssl);
    2216              :     else
    2217            0 :         return NULL;
    2218              : }
    2219              : 
    2220              : const char *
    2221          221 : be_tls_get_cipher(Port *port)
    2222              : {
    2223          221 :     if (port->ssl)
    2224          221 :         return SSL_get_cipher(port->ssl);
    2225              :     else
    2226            0 :         return NULL;
    2227              : }
    2228              : 
    2229              : void
    2230          110 : be_tls_get_peer_subject_name(Port *port, char *ptr, size_t len)
    2231              : {
    2232          110 :     if (port->peer)
    2233           30 :         strlcpy(ptr, X509_NAME_to_cstring(X509_get_subject_name(port->peer)), len);
    2234              :     else
    2235           80 :         ptr[0] = '\0';
    2236          110 : }
    2237              : 
    2238              : void
    2239          111 : be_tls_get_peer_issuer_name(Port *port, char *ptr, size_t len)
    2240              : {
    2241          111 :     if (port->peer)
    2242           31 :         strlcpy(ptr, X509_NAME_to_cstring(X509_get_issuer_name(port->peer)), len);
    2243              :     else
    2244           80 :         ptr[0] = '\0';
    2245          111 : }
    2246              : 
    2247              : void
    2248          111 : be_tls_get_peer_serial(Port *port, char *ptr, size_t len)
    2249              : {
    2250          111 :     if (port->peer)
    2251              :     {
    2252              :         ASN1_INTEGER *serial;
    2253              :         BIGNUM     *b;
    2254              :         char       *decimal;
    2255              : 
    2256           31 :         serial = X509_get_serialNumber(port->peer);
    2257           31 :         b = ASN1_INTEGER_to_BN(serial, NULL);
    2258           31 :         decimal = BN_bn2dec(b);
    2259              : 
    2260           31 :         BN_free(b);
    2261           31 :         strlcpy(ptr, decimal, len);
    2262           31 :         OPENSSL_free(decimal);
    2263              :     }
    2264              :     else
    2265           80 :         ptr[0] = '\0';
    2266          111 : }
    2267              : 
    2268              : char *
    2269            4 : be_tls_get_certificate_hash(Port *port, size_t *len)
    2270              : {
    2271              :     X509       *server_cert;
    2272              :     char       *cert_hash;
    2273            4 :     const EVP_MD *algo_type = NULL;
    2274              :     unsigned char hash[EVP_MAX_MD_SIZE];    /* size for SHA-512 */
    2275              :     unsigned int hash_size;
    2276              :     int         algo_nid;
    2277              : 
    2278            4 :     *len = 0;
    2279            4 :     server_cert = SSL_get_certificate(port->ssl);
    2280            4 :     if (server_cert == NULL)
    2281            0 :         return NULL;
    2282              : 
    2283              :     /*
    2284              :      * Get the signature algorithm of the certificate to determine the hash
    2285              :      * algorithm to use for the result.  Prefer X509_get_signature_info(),
    2286              :      * introduced in OpenSSL 1.1.1, which can handle RSA-PSS signatures.
    2287              :      */
    2288              : #if HAVE_X509_GET_SIGNATURE_INFO
    2289            4 :     if (!X509_get_signature_info(server_cert, &algo_nid, NULL, NULL, NULL))
    2290              : #else
    2291              :     if (!OBJ_find_sigid_algs(X509_get_signature_nid(server_cert),
    2292              :                              &algo_nid, NULL))
    2293              : #endif
    2294            0 :         elog(ERROR, "could not determine server certificate signature algorithm");
    2295              : 
    2296              :     /*
    2297              :      * The TLS server's certificate bytes need to be hashed with SHA-256 if
    2298              :      * its signature algorithm is MD5 or SHA-1 as per RFC 5929
    2299              :      * (https://tools.ietf.org/html/rfc5929#section-4.1).  If something else
    2300              :      * is used, the same hash as the signature algorithm is used.
    2301              :      */
    2302            4 :     switch (algo_nid)
    2303              :     {
    2304            0 :         case NID_md5:
    2305              :         case NID_sha1:
    2306            0 :             algo_type = EVP_sha256();
    2307            0 :             break;
    2308            4 :         default:
    2309            4 :             algo_type = EVP_get_digestbynid(algo_nid);
    2310            4 :             if (algo_type == NULL)
    2311            0 :                 elog(ERROR, "could not find digest for NID %s",
    2312              :                      OBJ_nid2sn(algo_nid));
    2313            4 :             break;
    2314              :     }
    2315              : 
    2316              :     /* generate and save the certificate hash */
    2317            4 :     if (!X509_digest(server_cert, algo_type, hash, &hash_size))
    2318            0 :         elog(ERROR, "could not generate server certificate hash");
    2319              : 
    2320            4 :     cert_hash = palloc(hash_size);
    2321            4 :     memcpy(cert_hash, hash, hash_size);
    2322            4 :     *len = hash_size;
    2323              : 
    2324            4 :     return cert_hash;
    2325              : }
    2326              : 
    2327              : /*
    2328              :  * Convert an X509 subject name to a cstring.
    2329              :  *
    2330              :  */
    2331              : static char *
    2332           79 : X509_NAME_to_cstring(const X509_NAME *name)
    2333              : {
    2334           79 :     BIO        *membuf = BIO_new(BIO_s_mem());
    2335              :     int         i,
    2336              :                 nid,
    2337           79 :                 count = X509_NAME_entry_count(name);
    2338              :     const X509_NAME_ENTRY *e;
    2339              :     const ASN1_STRING *v;
    2340              :     const char *field_name;
    2341              :     size_t      size;
    2342              :     char        nullterm;
    2343              :     char       *sp;
    2344              :     char       *dp;
    2345              :     char       *result;
    2346              : 
    2347           79 :     if (membuf == NULL)
    2348            0 :         ereport(ERROR,
    2349              :                 (errcode(ERRCODE_OUT_OF_MEMORY),
    2350              :                  errmsg("could not create BIO")));
    2351              : 
    2352           79 :     (void) BIO_set_close(membuf, BIO_CLOSE);
    2353          169 :     for (i = 0; i < count; i++)
    2354              :     {
    2355           90 :         e = X509_NAME_get_entry(name, i);
    2356           90 :         nid = OBJ_obj2nid(X509_NAME_ENTRY_get_object(e));
    2357           90 :         if (nid == NID_undef)
    2358            0 :             ereport(ERROR,
    2359              :                     (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
    2360              :                      errmsg("could not get NID for ASN1_OBJECT object")));
    2361           90 :         v = X509_NAME_ENTRY_get_data(e);
    2362           90 :         field_name = OBJ_nid2sn(nid);
    2363           90 :         if (field_name == NULL)
    2364            0 :             field_name = OBJ_nid2ln(nid);
    2365           90 :         if (field_name == NULL)
    2366            0 :             ereport(ERROR,
    2367              :                     (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
    2368              :                      errmsg("could not convert NID %d to an ASN1_OBJECT structure", nid)));
    2369           90 :         BIO_printf(membuf, "/%s=", field_name);
    2370           90 :         ASN1_STRING_print_ex(membuf, v,
    2371              :                              ((ASN1_STRFLGS_RFC2253 & ~ASN1_STRFLGS_ESC_MSB)
    2372              :                               | ASN1_STRFLGS_UTF8_CONVERT));
    2373              :     }
    2374              : 
    2375              :     /* ensure null termination of the BIO's content */
    2376           79 :     nullterm = '\0';
    2377           79 :     BIO_write(membuf, &nullterm, 1);
    2378           79 :     size = BIO_get_mem_data(membuf, &sp);
    2379           79 :     dp = pg_any_to_server(sp, size - 1, PG_UTF8);
    2380              : 
    2381           79 :     result = pstrdup(dp);
    2382           79 :     if (dp != sp)
    2383            0 :         pfree(dp);
    2384           79 :     if (BIO_free(membuf) != 1)
    2385            0 :         elog(ERROR, "could not free OpenSSL BIO structure");
    2386              : 
    2387           79 :     return result;
    2388              : }
    2389              : 
    2390              : /*
    2391              :  * Convert TLS protocol version GUC enum to OpenSSL values
    2392              :  *
    2393              :  * This is a straightforward one-to-one mapping, but doing it this way makes
    2394              :  * the definitions of ssl_min_protocol_version and ssl_max_protocol_version
    2395              :  * independent of OpenSSL availability and version.
    2396              :  *
    2397              :  * If a version is passed that is not supported by the current OpenSSL
    2398              :  * version, then we return -1.  If a nonnegative value is returned,
    2399              :  * subsequent code can assume it's working with a supported version.
    2400              :  *
    2401              :  * Note: this is rather similar to libpq's routine in fe-secure-openssl.c,
    2402              :  * so make sure to update both routines if changing this one.
    2403              :  */
    2404              : static int
    2405           54 : ssl_protocol_version_to_openssl(int v)
    2406              : {
    2407           54 :     switch (v)
    2408              :     {
    2409            0 :         case PG_TLS_ANY:
    2410            0 :             return 0;
    2411            0 :         case PG_TLS1_VERSION:
    2412            0 :             return TLS1_VERSION;
    2413            1 :         case PG_TLS1_1_VERSION:
    2414              : #ifdef TLS1_1_VERSION
    2415            1 :             return TLS1_1_VERSION;
    2416              : #else
    2417              :             break;
    2418              : #endif
    2419           53 :         case PG_TLS1_2_VERSION:
    2420              : #ifdef TLS1_2_VERSION
    2421           53 :             return TLS1_2_VERSION;
    2422              : #else
    2423              :             break;
    2424              : #endif
    2425            0 :         case PG_TLS1_3_VERSION:
    2426              : #ifdef TLS1_3_VERSION
    2427            0 :             return TLS1_3_VERSION;
    2428              : #else
    2429              :             break;
    2430              : #endif
    2431              :     }
    2432              : 
    2433            0 :     return -1;
    2434              : }
    2435              : 
    2436              : /*
    2437              :  * Likewise provide a mapping to strings.
    2438              :  */
    2439              : static const char *
    2440            0 : ssl_protocol_version_to_string(int v)
    2441              : {
    2442            0 :     switch (v)
    2443              :     {
    2444            0 :         case PG_TLS_ANY:
    2445            0 :             return "any";
    2446            0 :         case PG_TLS1_VERSION:
    2447            0 :             return "TLSv1";
    2448            0 :         case PG_TLS1_1_VERSION:
    2449            0 :             return "TLSv1.1";
    2450            0 :         case PG_TLS1_2_VERSION:
    2451            0 :             return "TLSv1.2";
    2452            0 :         case PG_TLS1_3_VERSION:
    2453            0 :             return "TLSv1.3";
    2454              :     }
    2455              : 
    2456            0 :     return "(unrecognized)";
    2457              : }
    2458              : 
    2459              : static uint32
    2460           29 : host_cache_pointer(const char *key)
    2461              : {
    2462              :     uint32      hash;
    2463           29 :     char       *lkey = pstrdup(key);
    2464           29 :     int         len = strlen(key);
    2465              : 
    2466          336 :     for (int i = 0; i < len; i++)
    2467          307 :         lkey[i] = pg_tolower(lkey[i]);
    2468              : 
    2469           29 :     hash = string_hash((const void *) lkey, len);
    2470           29 :     pfree(lkey);
    2471           29 :     return hash;
    2472              : }
    2473              : 
    2474              : static void
    2475           37 : default_openssl_tls_init(SSL_CTX *context, bool isServerStart)
    2476              : {
    2477           37 :     if (isServerStart)
    2478              :     {
    2479           33 :         if (ssl_passphrase_command[0])
    2480              :         {
    2481            7 :             SSL_CTX_set_default_passwd_cb(context, ssl_external_passwd_cb);
    2482            7 :             SSL_CTX_set_default_passwd_cb_userdata(context, ssl_passphrase_command);
    2483              :         }
    2484              :     }
    2485              :     else
    2486              :     {
    2487            4 :         if (ssl_passphrase_command[0] && ssl_passphrase_command_supports_reload)
    2488              :         {
    2489            1 :             SSL_CTX_set_default_passwd_cb(context, ssl_external_passwd_cb);
    2490            1 :             SSL_CTX_set_default_passwd_cb_userdata(context, ssl_passphrase_command);
    2491              :         }
    2492              :         else
    2493              : 
    2494              :             /*
    2495              :              * If reloading and no external command is configured, override
    2496              :              * OpenSSL's default handling of passphrase-protected files,
    2497              :              * because we don't want to prompt for a passphrase in an
    2498              :              * already-running server.
    2499              :              */
    2500            3 :             SSL_CTX_set_default_passwd_cb(context, dummy_ssl_passwd_cb);
    2501              :     }
    2502           37 : }
        

Generated by: LCOV version 2.0-1