_gsskrb5_verify_mic,
_gsskrb5_wrap,
_gsskrb5_unwrap,
- NULL,
- NULL,
+ _gsskrb5_wrap_ex,
+ _gsskrb5_unwrap_ex,
_gsskrb5_display_status,
_gsskrb5_indicate_mechs,
_gsskrb5_compare_name,
int * /*conf_state*/,
gss_qop_t * qop_state );
+OM_uint32
+_gsskrb5_unwrap_ex (
+ OM_uint32 * /*minor_status*/,
+ const gss_ctx_id_t /*context_handle*/,
+ const gss_buffer_t /*token_header_buffer*/,
+ const gss_buffer_t /*associated_data_buffer*/,
+ gss_buffer_t /*message_buffer*/,
+ int * /*conf_state*/,
+ gss_qop_t * qop_state );
+
OM_uint32
_gsskrb5_verify (
OM_uint32 * /*minor_status*/,
int * /*conf_state*/,
gss_buffer_t output_message_buffer );
+OM_uint32 _gsskrb5_wrap_ex (
+ OM_uint32 * /*minor_status*/,
+ const gss_ctx_id_t /*context_handle*/,
+ int /*conf_req_flag*/,
+ gss_qop_t /*qop_req*/,
+ const gss_buffer_t /*associated_data_buffer*/,
+ gss_buffer_t /*message_buffer*/,
+ gss_buffer_t /*output_token_buffer*/,
+ int * conf_state );
+
OM_uint32
_gsskrb5_wrap_size_limit (
OM_uint32 * /*minor_status*/,
krb5_free_keyblock (context, key);
return ret;
}
+
+OM_uint32 _gsskrb5_unwrap_ex
+ (OM_uint32 * minor_status,
+ const gss_ctx_id_t context_handle,
+ const gss_buffer_t token_header_buffer,
+ const gss_buffer_t associated_data_buffer,
+ gss_buffer_t message_buffer,
+ int * conf_state,
+ gss_qop_t * qop_state
+ )
+{
+ int no_ex = 1;
+
+ if (no_ex) {
+ OM_uint32 major_status, minor;
+ gss_buffer_desc unwrap_buffer;
+ gss_buffer_desc output_buffer;
+
+ unwrap_buffer.length = token_header_buffer->length +
+ message_buffer->length;
+ unwrap_buffer.value = malloc(unwrap_buffer.length);
+ if (unwrap_buffer.value == NULL) {
+ *minor_status = ENOMEM;
+ return GSS_S_FAILURE;
+ }
+ memcpy(unwrap_buffer.value, token_header_buffer->value,
+ token_header_buffer->length);
+ memcpy((u_char *)unwrap_buffer.value + token_header_buffer->length,
+ message_buffer->value,
+ message_buffer->length);
+
+ major_status = _gsskrb5_unwrap(minor_status,
+ context_handle,
+ &unwrap_buffer,
+ &output_buffer,
+ conf_state,
+ qop_state);
+ if (major_status != GSS_S_COMPLETE) {
+ gss_release_buffer(&minor, &unwrap_buffer);
+ return major_status;
+ }
+
+ if (output_buffer.length != message_buffer->length) {
+ gss_release_buffer(&minor, &unwrap_buffer);
+ gss_release_buffer(&minor, &output_buffer);
+ *minor_status = EINVAL;
+ return GSS_S_FAILURE;
+ }
+
+ memcpy(message_buffer->value,
+ output_buffer.value,
+ output_buffer.length);
+
+ gss_release_buffer(&minor, &unwrap_buffer);
+ gss_release_buffer(&minor, &output_buffer);
+
+ return major_status;
+ }
+
+ *minor_status = EINVAL;
+ return GSS_S_FAILURE;
+}
krb5_free_keyblock (context, key);
return ret;
}
+
+OM_uint32 _gsskrb5_wrap_ex
+ (OM_uint32 * minor_status,
+ const gss_ctx_id_t context_handle,
+ int conf_req_flag,
+ gss_qop_t qop_req,
+ const gss_buffer_t associated_data_buffer,
+ gss_buffer_t message_buffer,
+ gss_buffer_t output_token_buffer,
+ int * conf_state
+ )
+{
+ int no_ex = 1;
+
+ if (no_ex) {
+ OM_uint32 major_status, minor;
+ gss_buffer_desc wrap_buffer;
+ OM_uint32 token_header_size;
+
+ major_status = _gsskrb5_wrap(minor_status,
+ context_handle,
+ conf_req_flag,
+ qop_req,
+ message_buffer,
+ conf_state,
+ &wrap_buffer);
+ if (major_status != GSS_S_COMPLETE) {
+ return major_status;
+ }
+
+ token_header_size = wrap_buffer.length - message_buffer->length;
+
+ memcpy(message_buffer->value,
+ (u_char *)wrap_buffer.value + token_header_size,
+ message_buffer->length);
+
+ output_token_buffer->length = token_header_size;
+ output_token_buffer->value = realloc(wrap_buffer.value, token_header_size);
+ if (output_token_buffer->value == NULL) {
+ gss_release_buffer(&minor, &wrap_buffer);
+ *minor_status = ENOMEM;
+ return GSS_S_FAILURE;
+ }
+
+ return major_status;
+ }
+
+ *minor_status = EINVAL;
+ return GSS_S_FAILURE;
+}