0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef _LINUX_SUNRPC_GSS_API_H
0014 #define _LINUX_SUNRPC_GSS_API_H
0015
0016 #include <linux/sunrpc/xdr.h>
0017 #include <linux/sunrpc/msg_prot.h>
0018 #include <linux/uio.h>
0019
0020
0021 struct gss_ctx {
0022 struct gss_api_mech *mech_type;
0023 void *internal_ctx_id;
0024 unsigned int slack, align;
0025 };
0026
0027 #define GSS_C_NO_BUFFER ((struct xdr_netobj) 0)
0028 #define GSS_C_NO_CONTEXT ((struct gss_ctx *) 0)
0029 #define GSS_C_QOP_DEFAULT (0)
0030
0031
0032 #define GSS_OID_MAX_LEN 32
0033 struct rpcsec_gss_oid {
0034 unsigned int len;
0035 u8 data[GSS_OID_MAX_LEN];
0036 };
0037
0038
0039 struct rpcsec_gss_info {
0040 struct rpcsec_gss_oid oid;
0041 u32 qop;
0042 u32 service;
0043 };
0044
0045
0046
0047 int gss_import_sec_context(
0048 const void* input_token,
0049 size_t bufsize,
0050 struct gss_api_mech *mech,
0051 struct gss_ctx **ctx_id,
0052 time64_t *endtime,
0053 gfp_t gfp_mask);
0054 u32 gss_get_mic(
0055 struct gss_ctx *ctx_id,
0056 struct xdr_buf *message,
0057 struct xdr_netobj *mic_token);
0058 u32 gss_verify_mic(
0059 struct gss_ctx *ctx_id,
0060 struct xdr_buf *message,
0061 struct xdr_netobj *mic_token);
0062 u32 gss_wrap(
0063 struct gss_ctx *ctx_id,
0064 int offset,
0065 struct xdr_buf *outbuf,
0066 struct page **inpages);
0067 u32 gss_unwrap(
0068 struct gss_ctx *ctx_id,
0069 int offset,
0070 int len,
0071 struct xdr_buf *inbuf);
0072 u32 gss_delete_sec_context(
0073 struct gss_ctx **ctx_id);
0074
0075 rpc_authflavor_t gss_svc_to_pseudoflavor(struct gss_api_mech *, u32 qop,
0076 u32 service);
0077 u32 gss_pseudoflavor_to_service(struct gss_api_mech *, u32 pseudoflavor);
0078 bool gss_pseudoflavor_to_datatouch(struct gss_api_mech *, u32 pseudoflavor);
0079 char *gss_service_to_auth_domain_name(struct gss_api_mech *, u32 service);
0080
0081 struct pf_desc {
0082 u32 pseudoflavor;
0083 u32 qop;
0084 u32 service;
0085 char *name;
0086 char *auth_domain_name;
0087 struct auth_domain *domain;
0088 bool datatouch;
0089 };
0090
0091
0092
0093
0094
0095 struct gss_api_mech {
0096 struct list_head gm_list;
0097 struct module *gm_owner;
0098 struct rpcsec_gss_oid gm_oid;
0099 char *gm_name;
0100 const struct gss_api_ops *gm_ops;
0101
0102 int gm_pf_num;
0103 struct pf_desc * gm_pfs;
0104
0105 const char *gm_upcall_enctypes;
0106 };
0107
0108
0109 struct gss_api_ops {
0110 int (*gss_import_sec_context)(
0111 const void *input_token,
0112 size_t bufsize,
0113 struct gss_ctx *ctx_id,
0114 time64_t *endtime,
0115 gfp_t gfp_mask);
0116 u32 (*gss_get_mic)(
0117 struct gss_ctx *ctx_id,
0118 struct xdr_buf *message,
0119 struct xdr_netobj *mic_token);
0120 u32 (*gss_verify_mic)(
0121 struct gss_ctx *ctx_id,
0122 struct xdr_buf *message,
0123 struct xdr_netobj *mic_token);
0124 u32 (*gss_wrap)(
0125 struct gss_ctx *ctx_id,
0126 int offset,
0127 struct xdr_buf *outbuf,
0128 struct page **inpages);
0129 u32 (*gss_unwrap)(
0130 struct gss_ctx *ctx_id,
0131 int offset,
0132 int len,
0133 struct xdr_buf *buf);
0134 void (*gss_delete_sec_context)(
0135 void *internal_ctx_id);
0136 };
0137
0138 int gss_mech_register(struct gss_api_mech *);
0139 void gss_mech_unregister(struct gss_api_mech *);
0140
0141
0142
0143 struct gss_api_mech * gss_mech_get_by_OID(struct rpcsec_gss_oid *);
0144
0145
0146 rpc_authflavor_t gss_mech_info2flavor(struct rpcsec_gss_info *);
0147
0148
0149 int gss_mech_flavor2info(rpc_authflavor_t, struct rpcsec_gss_info *);
0150
0151
0152 struct gss_api_mech *gss_mech_get_by_name(const char *);
0153
0154
0155 struct gss_api_mech *gss_mech_get_by_pseudoflavor(u32);
0156
0157 struct gss_api_mech * gss_mech_get(struct gss_api_mech *);
0158
0159
0160
0161 void gss_mech_put(struct gss_api_mech *);
0162
0163 #endif
0164