summaryrefslogtreecommitdiffstats
path: root/src/gss_sec_ctx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gss_sec_ctx.c')
-rw-r--r--src/gss_sec_ctx.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/gss_sec_ctx.c b/src/gss_sec_ctx.c
index 855aa9f..2290cb9 100644
--- a/src/gss_sec_ctx.c
+++ b/src/gss_sec_ctx.c
@@ -1235,3 +1235,51 @@ uint32_t gssntlm_inquire_context(uint32_t *minor_status,
return GSS_S_COMPLETE;
}
+
+gss_OID_desc set_seq_num_oid = {
+ GSS_NTLMSSP_SET_SEQ_NUM_OID_LENGTH,
+ GSS_NTLMSSP_SET_SEQ_NUM_OID_STRING
+};
+
+uint32_t gssntlm_set_sec_context_option(uint32_t *minor_status,
+ gss_ctx_id_t *context_handle,
+ const gss_OID desired_object,
+ const gss_buffer_t value)
+{
+ struct gssntlm_ctx *ctx;
+
+ if (minor_status == NULL) {
+ return GSS_S_CALL_INACCESSIBLE_WRITE;
+ }
+ if (context_handle == NULL || *context_handle == NULL) {
+ return GSS_S_CALL_INACCESSIBLE_READ;
+ }
+ if (desired_object == GSS_C_NO_OID) {
+ return GSS_S_CALL_INACCESSIBLE_READ;
+ }
+
+ ctx = (struct gssntlm_ctx *)*context_handle;
+
+ *minor_status = 0;
+
+ /* set seq num */
+ if (gss_oid_equal(desired_object, &set_seq_num_oid)) {
+ if (ctx->gss_flags & GSS_C_DATAGRAM_FLAG) {
+
+ if (value->length != 4) {
+ *minor_status = EINVAL;
+ return GSS_S_FAILURE;
+ }
+
+ memcpy(&ctx->recv.seq_num, value->value, value->length);
+ ctx->send.seq_num = ctx->recv.seq_num;
+ return GSS_S_COMPLETE;
+ } else {
+ *minor_status = EACCES;
+ return GSS_S_UNAUTHORIZED;
+ }
+ }
+
+ *minor_status = EINVAL;
+ return GSS_S_UNAVAILABLE;
+}