67 OM_uint32 maj_stat = 0;
68 OM_uint32 min_stat = 0;
69 OM_uint32 msg_ctx = 0;
70 gss_buffer_desc status_string = { 0 };
71 char buf_maj[512] = { 0 };
72 char buf_min[512] = { 0 };
76 maj_stat = gss_display_status(&min_stat, err_maj, GSS_C_GSS_CODE,
77 GSS_C_NO_OID, &msg_ctx, &status_string);
78 if (GSS_ERROR(maj_stat))
80 size_t status_len = status_string.length;
81 if (status_len >=
sizeof(buf_maj))
82 status_len =
sizeof(buf_maj) - 1;
83 strncpy(buf_maj, (
char *) status_string.value, status_len);
84 buf_maj[status_len] =
'\0';
85 gss_release_buffer(&min_stat, &status_string);
87 maj_stat = gss_display_status(&min_stat, err_min, GSS_C_MECH_CODE,
88 GSS_C_NULL_OID, &msg_ctx, &status_string);
89 if (!GSS_ERROR(maj_stat))
91 status_len = status_string.length;
92 if (status_len >=
sizeof(buf_min))
93 status_len =
sizeof(buf_min) - 1;
94 strncpy(buf_min, (
char *) status_string.value, status_len);
95 buf_min[status_len] =
'\0';
96 gss_release_buffer(&min_stat, &status_string);
98 }
while (!GSS_ERROR(maj_stat) && (msg_ctx != 0));
108 gss_buffer_desc request_buf = { 0 };
109 gss_buffer_desc send_token = { 0 };
110 gss_buffer_t sec_token = NULL;
111 gss_name_t target_name = NULL;
112 gss_ctx_id_t context = NULL;
113 gss_OID mech_name = NULL;
114 char server_conf_flags;
115 gss_qop_t quality = 0;
117 OM_uint32 maj_stat = 0;
118 OM_uint32 min_stat = 0;
119 unsigned long buf_size = 0;
134 request_buf.value = buf1->
data;
135 request_buf.length =
buf_len(buf1);
138 maj_stat = gss_import_name(&min_stat, &request_buf, gss_nt_service_name, &target_name);
139 if (maj_stat != GSS_S_COMPLETE)
145 else if (c_debug_level >= 2)
147 gss_display_name(&min_stat, target_name, &request_buf, &mech_name);
149 gss_release_buffer(&min_stat, &request_buf);
152 sec_token = GSS_C_NO_BUFFER;
153 context = GSS_C_NO_CONTEXT;
156 maj_stat = gss_init_sec_context(&min_stat, GSS_C_NO_CREDENTIAL, &context, target_name,
157 GSS_C_NO_OID, GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG,
158 0, GSS_C_NO_CHANNEL_BINDINGS, sec_token, NULL,
159 &send_token, (
unsigned int *) &cflags, NULL);
160 if ((maj_stat != GSS_S_COMPLETE) && (maj_stat != GSS_S_CONTINUE_NEEDED))
164 gss_release_name(&min_stat, &target_name);
185 gss_release_name(&min_stat, &target_name);
192 gss_release_buffer(&min_stat, &send_token);
196 while (maj_stat == GSS_S_CONTINUE_NEEDED)
207 gss_release_name(&min_stat, &target_name);
214 gss_release_name(&min_stat, &target_name);
217 request_buf.value = buf2->
data;
218 request_buf.length =
buf_len(buf2);
219 sec_token = &request_buf;
222 maj_stat = gss_init_sec_context(&min_stat, GSS_C_NO_CREDENTIAL, &context, target_name,
223 GSS_C_NO_OID, GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG,
224 0, GSS_C_NO_CHANNEL_BINDINGS, sec_token, NULL,
225 &send_token, (
unsigned int *) &cflags, NULL);
226 if ((maj_stat != GSS_S_COMPLETE) && (maj_stat != GSS_S_CONTINUE_NEEDED))
230 gss_release_name(&min_stat, &target_name);
235 gss_release_buffer(&min_stat, &send_token);
240 gss_release_name(&min_stat, &target_name);
258 request_buf.value = buf2->
data;
259 request_buf.length =
buf_len(buf2);
261 maj_stat = gss_unwrap(&min_stat, context, &request_buf, &send_token, &cflags, &quality);
262 if (maj_stat != GSS_S_COMPLETE)
266 gss_release_buffer(&min_stat, &send_token);
274 if (send_token.length < 4)
278 gss_release_buffer(&min_stat, &send_token);
283 server_conf_flags = ((
char *) send_token.value)[0];
287 gss_release_buffer(&min_stat, &send_token);
292 ((
char *) send_token.value)[0] =
'\0';
293 buf_size = ntohl(*((uint32_t *) send_token.value));
294 gss_release_buffer(&min_stat, &send_token);
302 buf_size = htonl(buf_size);
308 request_buf.value = buf1->
data;
309 request_buf.length =
buf_len(buf1);
310 maj_stat = gss_wrap(&min_stat, context, 0, GSS_C_QOP_DEFAULT, &request_buf,
311 &cflags, &send_token);
312 if (maj_stat != GSS_S_COMPLETE)
337 maj_stat = gss_delete_sec_context(&min_stat, &context, &send_token);
338 if (maj_stat != GSS_S_COMPLETE)
345 gss_release_buffer(&min_stat, &send_token);
364 mutt_error(
_(
"%s authentication failed"),
"GSSAPI");