162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * GSS Proxy upcall module
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2012 Simo Sorce <simo@redhat.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _LINUX_GSS_RPC_XDR_H
962306a36Sopenharmony_ci#define _LINUX_GSS_RPC_XDR_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/sunrpc/xdr.h>
1262306a36Sopenharmony_ci#include <linux/sunrpc/clnt.h>
1362306a36Sopenharmony_ci#include <linux/sunrpc/xprtsock.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
1662306a36Sopenharmony_ci# define RPCDBG_FACILITY	RPCDBG_AUTH
1762306a36Sopenharmony_ci#endif
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define LUCID_OPTION "exported_context_type"
2062306a36Sopenharmony_ci#define LUCID_VALUE  "linux_lucid_v1"
2162306a36Sopenharmony_ci#define CREDS_OPTION "exported_creds_type"
2262306a36Sopenharmony_ci#define CREDS_VALUE  "linux_creds_v1"
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_citypedef struct xdr_netobj gssx_buffer;
2562306a36Sopenharmony_citypedef struct xdr_netobj utf8string;
2662306a36Sopenharmony_citypedef struct xdr_netobj gssx_OID;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cienum gssx_cred_usage {
2962306a36Sopenharmony_ci	GSSX_C_INITIATE = 1,
3062306a36Sopenharmony_ci	GSSX_C_ACCEPT = 2,
3162306a36Sopenharmony_ci	GSSX_C_BOTH = 3,
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct gssx_option {
3562306a36Sopenharmony_ci	gssx_buffer option;
3662306a36Sopenharmony_ci	gssx_buffer value;
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct gssx_option_array {
4062306a36Sopenharmony_ci	u32 count;
4162306a36Sopenharmony_ci	struct gssx_option *data;
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct gssx_status {
4562306a36Sopenharmony_ci	u64 major_status;
4662306a36Sopenharmony_ci	gssx_OID mech;
4762306a36Sopenharmony_ci	u64 minor_status;
4862306a36Sopenharmony_ci	utf8string major_status_string;
4962306a36Sopenharmony_ci	utf8string minor_status_string;
5062306a36Sopenharmony_ci	gssx_buffer server_ctx;
5162306a36Sopenharmony_ci	struct gssx_option_array options;
5262306a36Sopenharmony_ci};
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistruct gssx_call_ctx {
5562306a36Sopenharmony_ci	utf8string locale;
5662306a36Sopenharmony_ci	gssx_buffer server_ctx;
5762306a36Sopenharmony_ci	struct gssx_option_array options;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct gssx_name_attr {
6162306a36Sopenharmony_ci	gssx_buffer attr;
6262306a36Sopenharmony_ci	gssx_buffer value;
6362306a36Sopenharmony_ci	struct gssx_option_array extensions;
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct gssx_name_attr_array {
6762306a36Sopenharmony_ci	u32 count;
6862306a36Sopenharmony_ci	struct gssx_name_attr *data;
6962306a36Sopenharmony_ci};
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_cistruct gssx_name {
7262306a36Sopenharmony_ci	gssx_buffer display_name;
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_citypedef struct gssx_name gssx_name;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistruct gssx_cred_element {
7762306a36Sopenharmony_ci	gssx_name MN;
7862306a36Sopenharmony_ci	gssx_OID mech;
7962306a36Sopenharmony_ci	u32 cred_usage;
8062306a36Sopenharmony_ci	u64 initiator_time_rec;
8162306a36Sopenharmony_ci	u64 acceptor_time_rec;
8262306a36Sopenharmony_ci	struct gssx_option_array options;
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cistruct gssx_cred_element_array {
8662306a36Sopenharmony_ci	u32 count;
8762306a36Sopenharmony_ci	struct gssx_cred_element *data;
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistruct gssx_cred {
9162306a36Sopenharmony_ci	gssx_name desired_name;
9262306a36Sopenharmony_ci	struct gssx_cred_element_array elements;
9362306a36Sopenharmony_ci	gssx_buffer cred_handle_reference;
9462306a36Sopenharmony_ci	u32 needs_release;
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistruct gssx_ctx {
9862306a36Sopenharmony_ci	gssx_buffer exported_context_token;
9962306a36Sopenharmony_ci	gssx_buffer state;
10062306a36Sopenharmony_ci	u32 need_release;
10162306a36Sopenharmony_ci	gssx_OID mech;
10262306a36Sopenharmony_ci	gssx_name src_name;
10362306a36Sopenharmony_ci	gssx_name targ_name;
10462306a36Sopenharmony_ci	u64 lifetime;
10562306a36Sopenharmony_ci	u64 ctx_flags;
10662306a36Sopenharmony_ci	u32 locally_initiated;
10762306a36Sopenharmony_ci	u32 open;
10862306a36Sopenharmony_ci	struct gssx_option_array options;
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistruct gssx_cb {
11262306a36Sopenharmony_ci	u64 initiator_addrtype;
11362306a36Sopenharmony_ci	gssx_buffer initiator_address;
11462306a36Sopenharmony_ci	u64 acceptor_addrtype;
11562306a36Sopenharmony_ci	gssx_buffer acceptor_address;
11662306a36Sopenharmony_ci	gssx_buffer application_data;
11762306a36Sopenharmony_ci};
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci/* This structure is not defined in the protocol.
12162306a36Sopenharmony_ci * It is used in the kernel to carry around a big buffer
12262306a36Sopenharmony_ci * as a set of pages */
12362306a36Sopenharmony_cistruct gssp_in_token {
12462306a36Sopenharmony_ci	struct page **pages;	/* Array of contiguous pages */
12562306a36Sopenharmony_ci	unsigned int page_base;	/* Start of page data */
12662306a36Sopenharmony_ci	unsigned int page_len;	/* Length of page data */
12762306a36Sopenharmony_ci};
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_cistruct gssx_arg_accept_sec_context {
13062306a36Sopenharmony_ci	struct gssx_call_ctx call_ctx;
13162306a36Sopenharmony_ci	struct gssx_ctx *context_handle;
13262306a36Sopenharmony_ci	struct gssx_cred *cred_handle;
13362306a36Sopenharmony_ci	struct gssp_in_token input_token;
13462306a36Sopenharmony_ci	struct gssx_cb *input_cb;
13562306a36Sopenharmony_ci	u32 ret_deleg_cred;
13662306a36Sopenharmony_ci	struct gssx_option_array options;
13762306a36Sopenharmony_ci	struct page **pages;
13862306a36Sopenharmony_ci	unsigned int npages;
13962306a36Sopenharmony_ci};
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_cistruct gssx_res_accept_sec_context {
14262306a36Sopenharmony_ci	struct gssx_status status;
14362306a36Sopenharmony_ci	struct gssx_ctx *context_handle;
14462306a36Sopenharmony_ci	gssx_buffer *output_token;
14562306a36Sopenharmony_ci	/* struct gssx_cred *delegated_cred_handle; not used in kernel */
14662306a36Sopenharmony_ci	struct gssx_option_array options;
14762306a36Sopenharmony_ci};
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci#define gssx_enc_indicate_mechs NULL
15262306a36Sopenharmony_ci#define gssx_dec_indicate_mechs NULL
15362306a36Sopenharmony_ci#define gssx_enc_get_call_context NULL
15462306a36Sopenharmony_ci#define gssx_dec_get_call_context NULL
15562306a36Sopenharmony_ci#define gssx_enc_import_and_canon_name NULL
15662306a36Sopenharmony_ci#define gssx_dec_import_and_canon_name NULL
15762306a36Sopenharmony_ci#define gssx_enc_export_cred NULL
15862306a36Sopenharmony_ci#define gssx_dec_export_cred NULL
15962306a36Sopenharmony_ci#define gssx_enc_import_cred NULL
16062306a36Sopenharmony_ci#define gssx_dec_import_cred NULL
16162306a36Sopenharmony_ci#define gssx_enc_acquire_cred NULL
16262306a36Sopenharmony_ci#define gssx_dec_acquire_cred NULL
16362306a36Sopenharmony_ci#define gssx_enc_store_cred NULL
16462306a36Sopenharmony_ci#define gssx_dec_store_cred NULL
16562306a36Sopenharmony_ci#define gssx_enc_init_sec_context NULL
16662306a36Sopenharmony_ci#define gssx_dec_init_sec_context NULL
16762306a36Sopenharmony_civoid gssx_enc_accept_sec_context(struct rpc_rqst *req,
16862306a36Sopenharmony_ci				 struct xdr_stream *xdr,
16962306a36Sopenharmony_ci				 const void *data);
17062306a36Sopenharmony_ciint gssx_dec_accept_sec_context(struct rpc_rqst *rqstp,
17162306a36Sopenharmony_ci				struct xdr_stream *xdr,
17262306a36Sopenharmony_ci				void *data);
17362306a36Sopenharmony_ci#define gssx_enc_release_handle NULL
17462306a36Sopenharmony_ci#define gssx_dec_release_handle NULL
17562306a36Sopenharmony_ci#define gssx_enc_get_mic NULL
17662306a36Sopenharmony_ci#define gssx_dec_get_mic NULL
17762306a36Sopenharmony_ci#define gssx_enc_verify NULL
17862306a36Sopenharmony_ci#define gssx_dec_verify NULL
17962306a36Sopenharmony_ci#define gssx_enc_wrap NULL
18062306a36Sopenharmony_ci#define gssx_dec_wrap NULL
18162306a36Sopenharmony_ci#define gssx_enc_unwrap NULL
18262306a36Sopenharmony_ci#define gssx_dec_unwrap NULL
18362306a36Sopenharmony_ci#define gssx_enc_wrap_size_limit NULL
18462306a36Sopenharmony_ci#define gssx_dec_wrap_size_limit NULL
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci/* non implemented calls are set to 0 size */
18762306a36Sopenharmony_ci#define GSSX_ARG_indicate_mechs_sz 0
18862306a36Sopenharmony_ci#define GSSX_RES_indicate_mechs_sz 0
18962306a36Sopenharmony_ci#define GSSX_ARG_get_call_context_sz 0
19062306a36Sopenharmony_ci#define GSSX_RES_get_call_context_sz 0
19162306a36Sopenharmony_ci#define GSSX_ARG_import_and_canon_name_sz 0
19262306a36Sopenharmony_ci#define GSSX_RES_import_and_canon_name_sz 0
19362306a36Sopenharmony_ci#define GSSX_ARG_export_cred_sz 0
19462306a36Sopenharmony_ci#define GSSX_RES_export_cred_sz 0
19562306a36Sopenharmony_ci#define GSSX_ARG_import_cred_sz 0
19662306a36Sopenharmony_ci#define GSSX_RES_import_cred_sz 0
19762306a36Sopenharmony_ci#define GSSX_ARG_acquire_cred_sz 0
19862306a36Sopenharmony_ci#define GSSX_RES_acquire_cred_sz 0
19962306a36Sopenharmony_ci#define GSSX_ARG_store_cred_sz 0
20062306a36Sopenharmony_ci#define GSSX_RES_store_cred_sz 0
20162306a36Sopenharmony_ci#define GSSX_ARG_init_sec_context_sz 0
20262306a36Sopenharmony_ci#define GSSX_RES_init_sec_context_sz 0
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci#define GSSX_default_in_call_ctx_sz (4 + 4 + 4 + \
20562306a36Sopenharmony_ci			8 + sizeof(LUCID_OPTION) + sizeof(LUCID_VALUE) + \
20662306a36Sopenharmony_ci			8 + sizeof(CREDS_OPTION) + sizeof(CREDS_VALUE))
20762306a36Sopenharmony_ci#define GSSX_default_in_ctx_hndl_sz (4 + 4+8 + 4 + 4 + 6*4 + 6*4 + 8 + 8 + \
20862306a36Sopenharmony_ci					4 + 4 + 4)
20962306a36Sopenharmony_ci#define GSSX_default_in_cred_sz 4 /* we send in no cred_handle */
21062306a36Sopenharmony_ci#define GSSX_default_in_token_sz 4 /* does *not* include token data */
21162306a36Sopenharmony_ci#define GSSX_default_in_cb_sz 4 /* we do not use channel bindings */
21262306a36Sopenharmony_ci#define GSSX_ARG_accept_sec_context_sz (GSSX_default_in_call_ctx_sz + \
21362306a36Sopenharmony_ci					GSSX_default_in_ctx_hndl_sz + \
21462306a36Sopenharmony_ci					GSSX_default_in_cred_sz + \
21562306a36Sopenharmony_ci					GSSX_default_in_token_sz + \
21662306a36Sopenharmony_ci					GSSX_default_in_cb_sz + \
21762306a36Sopenharmony_ci					4 /* no deleg creds boolean */ + \
21862306a36Sopenharmony_ci					4) /* empty options */
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci/* somewhat arbitrary numbers but large enough (we ignore some of the data
22162306a36Sopenharmony_ci * sent down, but it is part of the protocol so we need enough space to take
22262306a36Sopenharmony_ci * it in) */
22362306a36Sopenharmony_ci#define GSSX_default_status_sz 8 + 24 + 8 + 256 + 256 + 16 + 4
22462306a36Sopenharmony_ci#define GSSX_max_output_handle_sz 128
22562306a36Sopenharmony_ci#define GSSX_max_oid_sz 16
22662306a36Sopenharmony_ci#define GSSX_max_princ_sz 256
22762306a36Sopenharmony_ci#define GSSX_default_ctx_sz (GSSX_max_output_handle_sz + \
22862306a36Sopenharmony_ci			     16 + 4 + GSSX_max_oid_sz + \
22962306a36Sopenharmony_ci			     2 * GSSX_max_princ_sz + \
23062306a36Sopenharmony_ci			     8 + 8 + 4 + 4 + 4)
23162306a36Sopenharmony_ci#define GSSX_max_output_token_sz 1024
23262306a36Sopenharmony_ci/* grouplist not included; we allocate separate pages for that: */
23362306a36Sopenharmony_ci#define GSSX_max_creds_sz (4 + 4 + 4 /* + NGROUPS_MAX*4 */)
23462306a36Sopenharmony_ci#define GSSX_RES_accept_sec_context_sz (GSSX_default_status_sz + \
23562306a36Sopenharmony_ci					GSSX_default_ctx_sz + \
23662306a36Sopenharmony_ci					GSSX_max_output_token_sz + \
23762306a36Sopenharmony_ci					4 + GSSX_max_creds_sz)
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci#define GSSX_ARG_release_handle_sz 0
24062306a36Sopenharmony_ci#define GSSX_RES_release_handle_sz 0
24162306a36Sopenharmony_ci#define GSSX_ARG_get_mic_sz 0
24262306a36Sopenharmony_ci#define GSSX_RES_get_mic_sz 0
24362306a36Sopenharmony_ci#define GSSX_ARG_verify_sz 0
24462306a36Sopenharmony_ci#define GSSX_RES_verify_sz 0
24562306a36Sopenharmony_ci#define GSSX_ARG_wrap_sz 0
24662306a36Sopenharmony_ci#define GSSX_RES_wrap_sz 0
24762306a36Sopenharmony_ci#define GSSX_ARG_unwrap_sz 0
24862306a36Sopenharmony_ci#define GSSX_RES_unwrap_sz 0
24962306a36Sopenharmony_ci#define GSSX_ARG_wrap_size_limit_sz 0
25062306a36Sopenharmony_ci#define GSSX_RES_wrap_size_limit_sz 0
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci#endif /* _LINUX_GSS_RPC_XDR_H */
253