Blame src/mechglue/gpp_priv_integ.c

Packit Service 9f2c4a
/* Copyright (C) 2012 the GSS-PROXY contributors, see COPYING for license */
Packit Service 9f2c4a
Packit Service 9f2c4a
#include "gss_plugin.h"
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_wrap(OM_uint32 *minor_status,
Packit Service 9f2c4a
                    gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                    int conf_req_flag,
Packit Service 9f2c4a
                    gss_qop_t qop_req,
Packit Service 9f2c4a
                    gss_buffer_t input_message_buffer,
Packit Service 9f2c4a
                    int *conf_state,
Packit Service 9f2c4a
                    gss_buffer_t output_message_buffer)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_wrap(minor_status, ctx_handle->local,
Packit Service 9f2c4a
                    conf_req_flag, qop_req,
Packit Service 9f2c4a
                    input_message_buffer, conf_state,
Packit Service 9f2c4a
                    output_message_buffer);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_wrap_size_limit(OM_uint32 *minor_status,
Packit Service 9f2c4a
                               gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                               int conf_req_flag,
Packit Service 9f2c4a
                               gss_qop_t qop_req,
Packit Service 9f2c4a
                               OM_uint32 req_output_size,
Packit Service 9f2c4a
                               OM_uint32 *max_input_size)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_wrap_size_limit(minor_status, ctx_handle->local,
Packit Service 9f2c4a
                               conf_req_flag, qop_req,
Packit Service 9f2c4a
                               req_output_size, max_input_size);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_wrap_iov(OM_uint32 *minor_status,
Packit Service 9f2c4a
                        gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                        int conf_req_flag,
Packit Service 9f2c4a
                        gss_qop_t qop_req,
Packit Service 9f2c4a
                        int *conf_state,
Packit Service 9f2c4a
                        gss_iov_buffer_desc *iov,
Packit Service 9f2c4a
                        int iov_count)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_wrap_iov(minor_status, ctx_handle->local,
Packit Service 9f2c4a
                        conf_req_flag, qop_req, conf_state,
Packit Service 9f2c4a
                        iov, iov_count);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_wrap_iov_length(OM_uint32 *minor_status,
Packit Service 9f2c4a
                               gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                               int conf_req_flag,
Packit Service 9f2c4a
                               gss_qop_t qop_req,
Packit Service 9f2c4a
                               int *conf_state,
Packit Service 9f2c4a
                               gss_iov_buffer_desc *iov,
Packit Service 9f2c4a
                               int iov_count)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_wrap_iov_length(minor_status, ctx_handle->local,
Packit Service 9f2c4a
                               conf_req_flag, qop_req, conf_state,
Packit Service 9f2c4a
                               iov, iov_count);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_wrap_aead(OM_uint32 *minor_status,
Packit Service 9f2c4a
	                 gss_ctx_id_t context_handle,
Packit Service 9f2c4a
	                 int conf_req_flag,
Packit Service 9f2c4a
	                 gss_qop_t qop_req,
Packit Service 9f2c4a
	                 gss_buffer_t input_assoc_buffer,
Packit Service 9f2c4a
	                 gss_buffer_t input_payload_buffer,
Packit Service 9f2c4a
	                 int *conf_state,
Packit Service 9f2c4a
	                 gss_buffer_t output_message_buffer)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_wrap_aead(minor_status, ctx_handle->local,
Packit Service 9f2c4a
                         conf_req_flag, qop_req,
Packit Service 9f2c4a
                         input_assoc_buffer, input_payload_buffer,
Packit Service 9f2c4a
                         conf_state, output_message_buffer);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_unwrap(OM_uint32 *minor_status,
Packit Service 9f2c4a
                      gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                      gss_buffer_t input_message_buffer,
Packit Service 9f2c4a
                      gss_buffer_t output_message_buffer,
Packit Service 9f2c4a
                      int *conf_state,
Packit Service 9f2c4a
                      gss_qop_t *qop_state)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_unwrap(minor_status, ctx_handle->local,
Packit Service 9f2c4a
                      input_message_buffer, output_message_buffer,
Packit Service 9f2c4a
                      conf_state, qop_state);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_unwrap_iov(OM_uint32 *minor_status,
Packit Service 9f2c4a
                          gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                          int *conf_state,
Packit Service 9f2c4a
                          gss_qop_t *qop_state,
Packit Service 9f2c4a
                          gss_iov_buffer_desc *iov,
Packit Service 9f2c4a
                          int iov_count)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_unwrap_iov(minor_status, ctx_handle->local,
Packit Service 9f2c4a
                          conf_state, qop_state, iov, iov_count);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_unwrap_aead(OM_uint32 *minor_status,
Packit Service 9f2c4a
                           gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                           gss_buffer_t input_message_buffer,
Packit Service 9f2c4a
                           gss_buffer_t input_assoc_buffer,
Packit Service 9f2c4a
                           gss_buffer_t output_payload_buffer,
Packit Service 9f2c4a
                           int *conf_state,
Packit Service 9f2c4a
                           gss_qop_t *qop_state)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_unwrap_aead(minor_status, ctx_handle->local,
Packit Service 9f2c4a
                           input_message_buffer, input_assoc_buffer,
Packit Service 9f2c4a
                           output_payload_buffer,
Packit Service 9f2c4a
                           conf_state, qop_state);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_get_mic(OM_uint32 *minor_status,
Packit Service 9f2c4a
                       gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                       gss_qop_t qop_req,
Packit Service 9f2c4a
                       gss_buffer_t message_buffer,
Packit Service 9f2c4a
                       gss_buffer_t message_token)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_get_mic(minor_status,
Packit Service 9f2c4a
                       ctx_handle->local,
Packit Service 9f2c4a
                       qop_req,
Packit Service 9f2c4a
                       message_buffer,
Packit Service 9f2c4a
                       message_token);
Packit Service 9f2c4a
}
Packit Service 9f2c4a
Packit Service 9f2c4a
OM_uint32 gssi_verify_mic(OM_uint32 *minor_status,
Packit Service 9f2c4a
                          gss_ctx_id_t context_handle,
Packit Service 9f2c4a
                          gss_buffer_t message_buffer,
Packit Service 9f2c4a
                          gss_buffer_t message_token,
Packit Service 9f2c4a
                          gss_qop_t *qop_state)
Packit Service 9f2c4a
{
Packit Service 9f2c4a
    struct gpp_context_handle *ctx_handle;
Packit Service 9f2c4a
    OM_uint32 maj, min;
Packit Service 9f2c4a
Packit Service 9f2c4a
    GSSI_TRACE();
Packit Service 9f2c4a
Packit Service 9f2c4a
    ctx_handle = (struct gpp_context_handle *)context_handle;
Packit Service 9f2c4a
    if (!ctx_handle) {
Packit Service 9f2c4a
        return GSS_S_CALL_INACCESSIBLE_READ;
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    /* for now we do encryption only locally and only for specific known
Packit Service 9f2c4a
     * mechanisms for which we can export/import the context */
Packit Service 9f2c4a
    if (ctx_handle->remote && !ctx_handle->local) {
Packit Service 9f2c4a
        maj = gpp_remote_to_local_ctx(&min, &ctx_handle->remote,
Packit Service 9f2c4a
                                            &ctx_handle->local);
Packit Service 9f2c4a
        if (maj != GSS_S_COMPLETE) {
Packit Service 9f2c4a
            *minor_status = gpp_map_error(min);
Packit Service 9f2c4a
            return maj;
Packit Service 9f2c4a
        }
Packit Service 9f2c4a
    }
Packit Service 9f2c4a
Packit Service 9f2c4a
    return gss_verify_mic(minor_status,
Packit Service 9f2c4a
                          ctx_handle->local,
Packit Service 9f2c4a
                          message_buffer,
Packit Service 9f2c4a
                          message_token,
Packit Service 9f2c4a
                          qop_state);
Packit Service 9f2c4a
}