Viewing: gss_null_mech.c
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2013, 2015, Trustees of Indiana University
*
* Copyright (c) 2014, Intel Corporation.
*
* Author: Jeremy Filizetti <jfilizet@iu.edu>
* Author: Andrew Korty <ajk@iu.edu>
*/
#define DEBUG_SUBSYSTEM S_SEC
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/crypto.h>
#include <linux/mutex.h>
#include <obd.h>
#include <obd_class.h>
#include <obd_support.h>
#include "gss_err.h"
#include "gss_internal.h"
#include "gss_api.h"
#include "gss_asn1.h"
struct null_ctx {
__u64 nc_token;
};
static
__u32 gss_import_sec_context_null(rawobj_t *inbuf, struct gss_ctx *gss_context)
{
struct null_ctx *null_context;
if (inbuf == NULL || inbuf->data == NULL ||
inbuf->len != sizeof(*null_context)) {
CDEBUG(D_SEC, "Invalid input buffer for null context\n");
return GSS_S_FAILURE;
}
OBD_ALLOC_PTR(null_context);
if (null_context == NULL)
return GSS_S_FAILURE;
memcpy(&null_context->nc_token, inbuf->data, inbuf->len);
gss_context->internal_ctx_id = null_context;
CDEBUG(D_SEC, "successfully imported null context\n");
return GSS_S_COMPLETE;
}
static
__u32 gss_copy_reverse_context_null(struct gss_ctx *gss_context_old,
struct gss_ctx *gss_context_new)
{
struct null_ctx *null_context_old;
struct null_ctx *null_context_new;
OBD_ALLOC_PTR(null_context_new);
if (null_context_new == NULL)
return GSS_S_FAILURE;
null_context_old = gss_context_old->internal_ctx_id;
memcpy(null_context_new, null_context_old, sizeof(*null_context_new));
gss_context_new->internal_ctx_id = null_context_new;
CDEBUG(D_SEC, "successfully copied reverse null context\n");
return GSS_S_COMPLETE;
}
static
__u32 gss_inquire_context_null(struct gss_ctx *gss_context,
time64_t *endtime)
{
/* quick timeout for testing purposes */
*endtime = ktime_get_real_seconds() + 60;
return GSS_S_COMPLETE;
}
static
__u32 gss_wrap_null(struct gss_ctx *gss_context, rawobj_t *gss_header,
rawobj_t *message, int message_buffer_length,
rawobj_t *token)
{
return GSS_S_COMPLETE;
}
static
__u32 gss_unwrap_null(struct gss_ctx *gss_context, rawobj_t *gss_header,
rawobj_t *token, rawobj_t *message)
{
return GSS_S_COMPLETE;
}
static
__u32 gss_prep_bulk_null(struct gss_ctx *gss_context,
struct ptlrpc_bulk_desc *desc)
{
return GSS_S_COMPLETE;
}
static
__u32 gss_wrap_bulk_null(struct gss_ctx *gss_context,
struct ptlrpc_bulk_desc *desc, rawobj_t *token,
int adj_nob)
{
return GSS_S_COMPLETE;
}
static
__u32 gss_unwrap_bulk_null(struct gss_ctx *gss_context,
struct ptlrpc_bulk_desc *desc,
rawobj_t *token, int adj_nob)
{
return GSS_S_COMPLETE;
}
static
void gss_delete_sec_context_null(void *internal_context)
{
struct null_ctx *null_context = internal_context;
OBD_FREE_PTR(null_context);
}
static
int gss_display_null(struct gss_ctx *gss_context, char *buf, int bufsize)
{
return scnprintf(buf, bufsize, "null");
}
static
__u32 gss_get_mic_null(struct gss_ctx *gss_context, int message_count,
rawobj_t *messages, int iov_count, struct bio_vec *iovs,
rawobj_t *token)
{
return GSS_S_COMPLETE;
}
static
__u32 gss_verify_mic_null(struct gss_ctx *gss_context, int message_count,
rawobj_t *messages, int iov_count,
struct bio_vec *iovs,
rawobj_t *token)
{
return GSS_S_COMPLETE;
}
static struct gss_api_ops gss_null_ops = {
.gss_import_sec_context = gss_import_sec_context_null,
.gss_copy_reverse_context = gss_copy_reverse_context_null,
.gss_inquire_context = gss_inquire_context_null,
.gss_get_mic = gss_get_mic_null,
.gss_verify_mic = gss_verify_mic_null,
.gss_wrap = gss_wrap_null,
.gss_unwrap = gss_unwrap_null,
.gss_prep_bulk = gss_prep_bulk_null,
.gss_wrap_bulk = gss_wrap_bulk_null,
.gss_unwrap_bulk = gss_unwrap_bulk_null,
.gss_delete_sec_context = gss_delete_sec_context_null,
.gss_display = gss_display_null,
};
static struct subflavor_desc gss_null_sfs[] = {
{
.sf_subflavor = SPTLRPC_SUBFLVR_GSSNULL,
.sf_qop = 0,
.sf_service = SPTLRPC_SVC_NULL,
.sf_name = "gssnull"
},
};
static struct gss_api_mech gss_null_mech = {
/* .gm_owner uses default NULL value for THIS_MODULE */
.gm_name = "gssnull",
.gm_oid = (rawobj_t) {
12,
"\053\006\001\004\001\311\146\215\126\001\000\000"
},
.gm_ops = &gss_null_ops,
.gm_sf_num = 1,
.gm_sfs = gss_null_sfs,
};
int __init init_null_module(void)
{
int status;
status = lgss_mech_register(&gss_null_mech);
if (status)
CERROR("Failed to register null gss mechanism!\n");
return status;
}
void cleanup_null_module(void)
{
lgss_mech_unregister(&gss_null_mech);
}