gss_ctx_id_t *context_handle,
gss_buffer_t output_token)
{
+ OM_uint32 major;
+
if (output_token != GSS_C_NO_BUFFER) {
output_token->length = 0;
output_token->value = NULL;
return GSS_S_COMPLETE;
}
- /* Delete context token? */
+ if (output_token != GSS_C_NO_BUFFER) {
+ gss_iov_buffer_desc iov[2];
+
+ iov[0].type = GSS_IOV_BUFFER_TYPE_DATA;
+ iov[0].buffer.value = NULL;
+ iov[0].buffer.length = 0;
+
+ iov[1].type = GSS_IOV_BUFFER_TYPE_HEADER | GSS_IOV_BUFFER_FLAG_ALLOCATE;
+ iov[1].buffer.value = NULL;
+ iov[1].buffer.length = 0;
+
+ major = gssEapWrapOrGetMIC(minor, *context_handle, FALSE, FALSE,
+ iov, 2, TOK_TYPE_DELETE_CONTEXT);
+ if (GSS_ERROR(major))
+ return major;
+ }
return gssEapReleaseContext(minor, context_handle);
}
gss_buffer_t display_name)
{
*minor = 0;
+
display_name->length = 0;
- display_name->buffer = NULL;
+ display_name->value = NULL;
+
return GSS_S_UNAVAILABLE;
}
gss_ctx_id_t ctx,
gss_buffer_t token_buffer)
{
- GSSEAP_NOT_IMPLEMENTED;
+ OM_uint32 major;
+ gss_iov_buffer_desc iov[1];
+
+ if (!CTX_IS_ESTABLISHED(ctx)) {
+ return GSS_S_NO_CONTEXT;
+ }
+
+ iov[0].type = GSS_IOV_BUFFER_TYPE_HEADER;
+ iov[0].buffer = *token_buffer;
+
+ major = gssEapUnwrapOrVerifyMIC(minor, ctx, NULL, NULL,
+ iov, 1, TOK_TYPE_DELETE_CONTEXT);
+ if (GSS_ERROR(major))
+ return major;
+
+ return gssEapReleaseContext(minor, &ctx);
}
return GSS_S_BAD_SIG;
}
code = sequenceCheck(&ctx->seqState, seqnum);
- } else if (toktype == TOK_TYPE_DELETE) {
- if (load_uint16_be(ptr) != TOK_TYPE_DELETE)
+ } else if (toktype == TOK_TYPE_DELETE_CONTEXT) {
+ if (load_uint16_be(ptr) != TOK_TYPE_DELETE_CONTEXT)
goto defective;
goto verify_mic_1;
} else {
TOK_TYPE_NONE = 0x0000,
TOK_TYPE_EAP_RESP = 0x0601,
TOK_TYPE_EAP_REQ = 0x0602,
- TOK_TYPE_GSS_CB = 0x0603,
+ TOK_TYPE_GSS_CHANNEL_BINDINGS = 0x0603,
TOK_TYPE_MIC = 0x0404,
TOK_TYPE_WRAP = 0x0504,
TOK_TYPE_EXPORT_NAME = 0x0401,
TOK_TYPE_EXPORT_NAME_COMPOSITE = 0x0402,
- TOK_TYPE_DELETE = 0x0405,
+ TOK_TYPE_DELETE_CONTEXT = 0x0405,
};
size_t