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_SEND_BUFFER_SIZE 16384
54 #define PQ_GSS_RECV_BUFFER_SIZE 16384
61 #define PqGSSSendBuffer (conn->gss_SendBuffer)
62 #define PqGSSSendLength (conn->gss_SendLength)
63 #define PqGSSSendNext (conn->gss_SendNext)
64 #define PqGSSSendConsumed (conn->gss_SendConsumed)
65 #define PqGSSRecvBuffer (conn->gss_RecvBuffer)
66 #define PqGSSRecvLength (conn->gss_RecvLength)
67 #define PqGSSResultBuffer (conn->gss_ResultBuffer)
68 #define PqGSSResultLength (conn->gss_ResultLength)
69 #define PqGSSResultNext (conn->gss_ResultNext)
70 #define PqGSSMaxPktSize (conn->gss_MaxPktSize)
90 gss_buffer_desc
input,
91 output = GSS_C_EMPTY_BUFFER;
93 size_t bytes_sent = 0;
94 size_t bytes_to_encrypt;
95 size_t bytes_encrypted;
96 gss_ctx_id_t gctx =
conn->gctx;
110 "GSSAPI caller failed to retransmit all data needing to be retried\n");
159 if (retval != amount)
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);
240 Assert(bytes_sent == bytes_encrypted);
247 gss_release_buffer(&minor, &
output);
267 gss_buffer_desc
input = GSS_C_EMPTY_BUFFER,
268 output = GSS_C_EMPTY_BUFFER;
270 size_t bytes_returned = 0;
271 gss_ctx_id_t gctx =
conn->gctx;
279 while (bytes_returned <
len)
287 size_t bytes_to_copy =
Min(bytes_in_buffer,
len - bytes_returned);
295 bytes_returned += bytes_to_copy;
318 Assert(bytes_returned == 0);
352 (
size_t)
input.length,
387 major = gss_unwrap(&minor, gctx, &
input, &
output, &conf_state, NULL);
388 if (major != GSS_S_COMPLETE)
412 gss_release_buffer(&minor, &
output);
415 ret = bytes_returned;
420 gss_release_buffer(&minor, &
output);
483 gss_buffer_desc
input = GSS_C_EMPTY_BUFFER,
484 output = GSS_C_EMPTY_BUFFER;
593 (
size_t)
input.length,
628 major = gss_init_sec_context(&minor,
conn->gcred, &
conn->gctx,
629 conn->gtarg_nam, GSS_C_NO_OID,
636 if (GSS_ERROR(major))
652 gss_release_cred(&minor, &
conn->gcred);
653 conn->gcred = GSS_C_NO_CREDENTIAL;
654 gss_release_buffer(&minor, &
output);
660 major = gss_wrap_size_limit(&minor,
conn->gctx, 1, GSS_C_QOP_DEFAULT,
664 if (GSS_ERROR(major))
679 gss_release_buffer(&minor, &
output);
695 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)
int pqReadReady(PGconn *conn)
void libpq_append_conn_error(PGconn *conn, const char *fmt,...)
#define PqGSSResultLength
ssize_t pg_GSS_read(PGconn *conn, void *ptr, size_t len)
#define PQ_GSS_RECV_BUFFER_SIZE
ssize_t pg_GSS_write(PGconn *conn, const void *ptr, size_t len)
#define PqGSSSendConsumed
int PQgssEncInUse(PGconn *conn)
#define GSS_REQUIRED_FLAGS
PostgresPollingStatusType pqsecure_open_gss(PGconn *conn)
#define PQ_GSS_SEND_BUFFER_SIZE
static PostgresPollingStatusType gss_read(PGconn *conn, void *recv_buffer, size_t length, ssize_t *ret)
void * PQgetgssctx(PGconn *conn)
#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)
PostgresPollingStatusType
Assert(fmt[strlen(fmt) - 1] !='\n')
void appendPQExpBuffer(PQExpBuffer str, const char *fmt,...)
void appendPQExpBufferStr(PQExpBuffer str, const char *data)
PQExpBufferData errorMessage