26#define GSS_REQUIRED_FLAGS GSS_C_MUTUAL_FLAG | GSS_C_REPLAY_FLAG | \
27 GSS_C_SEQUENCE_FLAG | GSS_C_CONF_FLAG | GSS_C_INTEG_FLAG
53#define PQ_GSS_MAX_PACKET_SIZE 16384
61#define PQ_GSS_AUTH_BUFFER_SIZE 65536
68#define PqGSSSendBuffer (conn->gss_SendBuffer)
69#define PqGSSSendLength (conn->gss_SendLength)
70#define PqGSSSendNext (conn->gss_SendNext)
71#define PqGSSSendConsumed (conn->gss_SendConsumed)
72#define PqGSSRecvBuffer (conn->gss_RecvBuffer)
73#define PqGSSRecvLength (conn->gss_RecvLength)
74#define PqGSSResultBuffer (conn->gss_ResultBuffer)
75#define PqGSSResultLength (conn->gss_ResultLength)
76#define PqGSSResultNext (conn->gss_ResultNext)
77#define PqGSSMaxPktSize (conn->gss_MaxPktSize)
97 gss_buffer_desc
input,
98 output = GSS_C_EMPTY_BUFFER;
100 size_t bytes_to_encrypt;
101 size_t bytes_encrypted;
102 gss_ctx_id_t gctx =
conn->gctx;
123 "GSSAPI caller failed to retransmit all data needing to be retried\n");
175 if (!bytes_to_encrypt)
186 input.length = bytes_to_encrypt;
188 input.value = (
char *) ptr + bytes_encrypted;
197 major = gss_wrap(&minor, gctx, 1, GSS_C_QOP_DEFAULT,
199 if (major != GSS_S_COMPLETE)
222 bytes_encrypted +=
input.length;
223 bytes_to_encrypt -=
input.length;
235 gss_release_buffer(&minor, &
output);
245 ret = bytes_encrypted;
250 gss_release_buffer(&minor, &
output);
270 gss_buffer_desc
input = GSS_C_EMPTY_BUFFER,
271 output = GSS_C_EMPTY_BUFFER;
273 size_t bytes_returned = 0;
274 gss_ctx_id_t gctx =
conn->gctx;
282 while (bytes_returned <
len)
290 size_t bytes_to_copy =
Min(bytes_in_buffer,
len - bytes_returned);
298 bytes_returned += bytes_to_copy;
321 Assert(bytes_returned == 0);
355 (
size_t)
input.length,
390 major = gss_unwrap(&minor, gctx, &
input, &
output, &conf_state, NULL);
391 if (major != GSS_S_COMPLETE)
415 gss_release_buffer(&minor, &
output);
418 ret = bytes_returned;
423 gss_release_buffer(&minor, &
output);
489 gss_buffer_desc
input = GSS_C_EMPTY_BUFFER,
490 output = GSS_C_EMPTY_BUFFER;
603 (
size_t)
input.length,
637 if (
conn->gcred == GSS_C_NO_CREDENTIAL)
647 if (
conn->gcred != GSS_C_NO_CREDENTIAL)
648 gss_flags |= GSS_C_DELEG_FLAG;
655 major = gss_init_sec_context(&minor,
conn->gcred, &
conn->gctx,
656 conn->gtarg_nam, GSS_C_NO_OID,
657 gss_flags, 0, 0, &
input, NULL,
663 if (GSS_ERROR(major))
680 gss_release_cred(&minor, &
conn->gcred);
681 conn->gcred = GSS_C_NO_CREDENTIAL;
682 gss_release_buffer(&minor, &
output);
709 major = gss_wrap_size_limit(&minor,
conn->gctx, 1, GSS_C_QOP_DEFAULT,
713 if (GSS_ERROR(major))
729 gss_release_buffer(&minor, &
output);
745 gss_release_buffer(&minor, &
output);
void pg_GSS_error(const char *errmsg, OM_uint32 maj_stat, OM_uint32 min_stat)
static void cleanup(void)
int pg_GSS_load_servicename(PGconn *conn)
bool pg_GSS_have_cred_cache(gss_cred_id_t *cred_out)
int pqReadReady(PGconn *conn)
#define PqGSSResultLength
#define PQ_GSS_AUTH_BUFFER_SIZE
ssize_t pg_GSS_read(PGconn *conn, void *ptr, size_t len)
ssize_t pg_GSS_write(PGconn *conn, const void *ptr, size_t len)
void * PQgetgssctx(PGconn *conn)
#define PqGSSSendConsumed
int PQgssEncInUse(PGconn *conn)
#define GSS_REQUIRED_FLAGS
PostgresPollingStatusType pqsecure_open_gss(PGconn *conn)
static PostgresPollingStatusType gss_read(PGconn *conn, void *recv_buffer, size_t length, ssize_t *ret)
#define PQ_GSS_MAX_PACKET_SIZE
#define PqGSSResultBuffer
ssize_t pqsecure_raw_read(PGconn *conn, void *ptr, size_t len)
ssize_t pqsecure_raw_write(PGconn *conn, const void *ptr, size_t len)
Assert(PointerIsAligned(start, uint64))
PostgresPollingStatusType
#define SOCK_ERRNO_SET(e)
void libpq_append_conn_error(PGconn *conn, const char *fmt,...)
void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...)
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
PQExpBufferData errorMessage