52#define PQ_GSS_MAX_PACKET_SIZE 16384
60#define PQ_GSS_AUTH_BUFFER_SIZE 65536
107 gss_buffer_desc
input,
109 size_t bytes_to_encrypt;
110 size_t bytes_encrypted;
111 gss_ctx_id_t gctx =
port->gss->ctx;
131 elog(
COMMERROR,
"GSSAPI caller failed to retransmit all data needing to be retried");
183 if (!bytes_to_encrypt)
194 input.length = bytes_to_encrypt;
196 input.value = (
char *) ptr + bytes_encrypted;
205 major = gss_wrap(&minor, gctx, 1, GSS_C_QOP_DEFAULT,
207 if (major != GSS_S_COMPLETE)
216 (
errmsg(
"outgoing GSSAPI message would not use confidentiality")));
223 (
errmsg(
"server tried to send oversize GSSAPI packet (%zu > %zu)",
230 bytes_encrypted +=
input.length;
231 bytes_to_encrypt -=
input.length;
243 gss_release_buffer(&minor, &
output);
253 return bytes_encrypted;
274 gss_buffer_desc
input,
277 size_t bytes_returned = 0;
278 gss_ctx_id_t gctx =
port->gss->ctx;
286 while (bytes_returned <
len)
294 size_t bytes_to_copy =
Min(bytes_in_buffer,
len - bytes_returned);
302 bytes_returned += bytes_to_copy;
325 Assert(bytes_returned == 0);
359 (
errmsg(
"oversize GSSAPI packet sent by the client (%zu > %zu)",
360 (
size_t)
input.length,
394 major = gss_unwrap(&minor, gctx, &
input, &
output, &conf_state, NULL);
395 if (major != GSS_S_COMPLETE)
404 (
errmsg(
"incoming GSSAPI message did not use confidentiality")));
416 gss_release_buffer(&minor, &
output);
419 return bytes_returned;
462 port->sock, 0, WAIT_EVENT_GSS_OPEN_SERVER);
505 bool complete_next =
false;
508 gss_cred_id_t delegated_creds;
515 port->gss = (pg_gssinfo *)
518 delegated_creds = GSS_C_NO_CREDENTIAL;
519 port->gss->delegated_creds =
false;
536 (
errcode(ERRCODE_OUT_OF_MEMORY),
537 errmsg(
"out of memory")));
552 (
errcode(ERRCODE_OUT_OF_MEMORY),
553 errmsg(
"could not set environment: %m")));
560 gss_buffer_desc
input,
561 output = GSS_C_EMPTY_BUFFER;
588 (
errmsg(
"oversize GSSAPI packet sent by the client (%zu > %zu)",
589 (
size_t)
input.length,
605 major = gss_accept_sec_context(&minor, &
port->gss->ctx,
606 GSS_C_NO_CREDENTIAL, &
input,
607 GSS_C_NO_CHANNEL_BINDINGS,
611 if (GSS_ERROR(major))
615 gss_release_buffer(&minor, &
output);
618 else if (!(major & GSS_S_CONTINUE_NEEDED))
624 complete_next =
true;
627 if (delegated_creds != GSS_C_NO_CREDENTIAL)
630 port->gss->delegated_creds =
true;
647 (
errmsg(
"server tried to send oversize GSSAPI packet (%zu > %zu)",
650 gss_release_buffer(&minor, &
output);
674 gss_release_buffer(&minor, &
output);
683 port->sock, 0, WAIT_EVENT_GSS_OPEN_SERVER);
693 gss_release_buffer(&minor, &
output);
716 (
errcode(ERRCODE_OUT_OF_MEMORY),
717 errmsg(
"out of memory")));
725 major = gss_wrap_size_limit(&minor,
port->gss->ctx, 1, GSS_C_QOP_DEFAULT,
729 if (GSS_ERROR(major))
735 port->gss->enc =
true;
749 return port->gss->auth;
761 return port->gss->enc;
774 return port->gss->princ;
787 return port->gss->delegated_creds;
char * pg_krb_server_keyfile
bool pg_gss_accept_delegation
void pg_store_delegated_credential(gss_cred_id_t cred)
void pg_GSS_error(const char *errmsg, OM_uint32 maj_stat, OM_uint32 min_stat)
static int PqGSSRecvLength
static int PqGSSResultLength
#define PQ_GSS_AUTH_BUFFER_SIZE
static char * PqGSSSendBuffer
ssize_t be_gssapi_write(Port *port, const void *ptr, size_t len)
bool be_gssapi_get_auth(Port *port)
static int PqGSSSendConsumed
ssize_t be_gssapi_read(Port *port, void *ptr, size_t len)
static ssize_t read_or_wait(Port *port, ssize_t len)
ssize_t secure_open_gssapi(Port *port)
static char * PqGSSRecvBuffer
static int PqGSSResultNext
static uint32 PqGSSMaxPktSize
bool be_gssapi_get_enc(Port *port)
static int PqGSSSendLength
static char * PqGSSResultBuffer
#define PQ_GSS_MAX_PACKET_SIZE
const char * be_gssapi_get_princ(Port *port)
bool be_gssapi_get_delegation(Port *port)
ssize_t secure_raw_read(Port *port, void *ptr, size_t len)
ssize_t secure_raw_write(Port *port, const void *ptr, size_t len)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Assert(PointerIsAligned(start, uint64))
#define INJECTION_POINT(name, arg)
int WaitLatchOrSocket(Latch *latch, int wakeEvents, pgsocket sock, long timeout, uint32 wait_event_info)
void * MemoryContextAllocZero(MemoryContext context, Size size)
MemoryContext TopMemoryContext
#define WL_SOCKET_READABLE
#define WL_EXIT_ON_PM_DEATH
#define WL_SOCKET_WRITEABLE