1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 21da177e4SLinus Torvalds /* 3f30c2269SUwe Zeisberger * linux/include/linux/sunrpc/gss_api.h 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Somewhat simplified version of the gss api. 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * Dug Song <dugsong@monkey.org> 81da177e4SLinus Torvalds * Andy Adamson <andros@umich.edu> 91da177e4SLinus Torvalds * Bruce Fields <bfields@umich.edu> 101da177e4SLinus Torvalds * Copyright (c) 2000 The Regents of the University of Michigan 111da177e4SLinus Torvalds */ 121da177e4SLinus Torvalds 131da177e4SLinus Torvalds #ifndef _LINUX_SUNRPC_GSS_API_H 141da177e4SLinus Torvalds #define _LINUX_SUNRPC_GSS_API_H 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds #include <linux/sunrpc/xdr.h> 176a1a1e34SChuck Lever #include <linux/sunrpc/msg_prot.h> 181da177e4SLinus Torvalds #include <linux/uio.h> 191da177e4SLinus Torvalds 201da177e4SLinus Torvalds /* The mechanism-independent gss-api context: */ 211da177e4SLinus Torvalds struct gss_ctx { 221da177e4SLinus Torvalds struct gss_api_mech *mech_type; 231da177e4SLinus Torvalds void *internal_ctx_id; 24a7e429a6SChuck Lever unsigned int slack, align; 251da177e4SLinus Torvalds }; 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds #define GSS_C_NO_BUFFER ((struct xdr_netobj) 0) 281da177e4SLinus Torvalds #define GSS_C_NO_CONTEXT ((struct gss_ctx *) 0) 2983523d08SChuck Lever #define GSS_C_QOP_DEFAULT (0) 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds /*XXX arbitrary length - is this set somewhere? */ 321da177e4SLinus Torvalds #define GSS_OID_MAX_LEN 32 33fb15b26fSChuck Lever struct rpcsec_gss_oid { 34fb15b26fSChuck Lever unsigned int len; 35fb15b26fSChuck Lever u8 data[GSS_OID_MAX_LEN]; 36fb15b26fSChuck Lever }; 37fb15b26fSChuck Lever 38fb15b26fSChuck Lever /* From RFC 3530 */ 39fb15b26fSChuck Lever struct rpcsec_gss_info { 40fb15b26fSChuck Lever struct rpcsec_gss_oid oid; 41fb15b26fSChuck Lever u32 qop; 42fb15b26fSChuck Lever u32 service; 43fb15b26fSChuck Lever }; 441da177e4SLinus Torvalds 451da177e4SLinus Torvalds /* gss-api prototypes; note that these are somewhat simplified versions of 461da177e4SLinus Torvalds * the prototypes specified in RFC 2744. */ 471da177e4SLinus Torvalds int gss_import_sec_context( 481da177e4SLinus Torvalds const void* input_token, 491da177e4SLinus Torvalds size_t bufsize, 501da177e4SLinus Torvalds struct gss_api_mech *mech, 511f4c86c0STrond Myklebust struct gss_ctx **ctx_id, 5252879b46SArnd Bergmann time64_t *endtime, 531f4c86c0STrond Myklebust gfp_t gfp_mask); 541da177e4SLinus Torvalds u32 gss_get_mic( 551da177e4SLinus Torvalds struct gss_ctx *ctx_id, 561da177e4SLinus Torvalds struct xdr_buf *message, 571da177e4SLinus Torvalds struct xdr_netobj *mic_token); 581da177e4SLinus Torvalds u32 gss_verify_mic( 591da177e4SLinus Torvalds struct gss_ctx *ctx_id, 601da177e4SLinus Torvalds struct xdr_buf *message, 6100fd6e14SJ. Bruce Fields struct xdr_netobj *mic_token); 62293f1eb5SJ. Bruce Fields u32 gss_wrap( 63293f1eb5SJ. Bruce Fields struct gss_ctx *ctx_id, 64293f1eb5SJ. Bruce Fields int offset, 65293f1eb5SJ. Bruce Fields struct xdr_buf *outbuf, 66293f1eb5SJ. Bruce Fields struct page **inpages); 67293f1eb5SJ. Bruce Fields u32 gss_unwrap( 68293f1eb5SJ. Bruce Fields struct gss_ctx *ctx_id, 69293f1eb5SJ. Bruce Fields int offset, 7031c9590aSChuck Lever int len, 71293f1eb5SJ. Bruce Fields struct xdr_buf *inbuf); 721da177e4SLinus Torvalds u32 gss_delete_sec_context( 731da177e4SLinus Torvalds struct gss_ctx **ctx_id); 741da177e4SLinus Torvalds 7583523d08SChuck Lever rpc_authflavor_t gss_svc_to_pseudoflavor(struct gss_api_mech *, u32 qop, 7683523d08SChuck Lever u32 service); 771da177e4SLinus Torvalds u32 gss_pseudoflavor_to_service(struct gss_api_mech *, u32 pseudoflavor); 7865b80179SChuck Lever bool gss_pseudoflavor_to_datatouch(struct gss_api_mech *, u32 pseudoflavor); 791da177e4SLinus Torvalds char *gss_service_to_auth_domain_name(struct gss_api_mech *, u32 service); 801da177e4SLinus Torvalds 811da177e4SLinus Torvalds struct pf_desc { 821da177e4SLinus Torvalds u32 pseudoflavor; 8383523d08SChuck Lever u32 qop; 841da177e4SLinus Torvalds u32 service; 851da177e4SLinus Torvalds char *name; 861da177e4SLinus Torvalds char *auth_domain_name; 8724c5efe4SNeilBrown struct auth_domain *domain; 8865b80179SChuck Lever bool datatouch; 891da177e4SLinus Torvalds }; 901da177e4SLinus Torvalds 911da177e4SLinus Torvalds /* Different mechanisms (e.g., krb5 or spkm3) may implement gss-api, and 921da177e4SLinus Torvalds * mechanisms may be dynamically registered or unregistered by modules. */ 931da177e4SLinus Torvalds 941da177e4SLinus Torvalds /* Each mechanism is described by the following struct: */ 951da177e4SLinus Torvalds struct gss_api_mech { 961da177e4SLinus Torvalds struct list_head gm_list; 971da177e4SLinus Torvalds struct module *gm_owner; 98fb15b26fSChuck Lever struct rpcsec_gss_oid gm_oid; 991da177e4SLinus Torvalds char *gm_name; 100f1c0a861STrond Myklebust const struct gss_api_ops *gm_ops; 1011da177e4SLinus Torvalds /* pseudoflavors supported by this mechanism: */ 1021da177e4SLinus Torvalds int gm_pf_num; 1031da177e4SLinus Torvalds struct pf_desc * gm_pfs; 104683ac665STrond Myklebust /* Should the following be a callback operation instead? */ 105683ac665STrond Myklebust const char *gm_upcall_enctypes; 1061da177e4SLinus Torvalds }; 1071da177e4SLinus Torvalds 1081da177e4SLinus Torvalds /* and must provide the following operations: */ 1091da177e4SLinus Torvalds struct gss_api_ops { 1101da177e4SLinus Torvalds int (*gss_import_sec_context)( 1111da177e4SLinus Torvalds const void *input_token, 1121da177e4SLinus Torvalds size_t bufsize, 1131f4c86c0STrond Myklebust struct gss_ctx *ctx_id, 11452879b46SArnd Bergmann time64_t *endtime, 1151f4c86c0STrond Myklebust gfp_t gfp_mask); 1161da177e4SLinus Torvalds u32 (*gss_get_mic)( 1171da177e4SLinus Torvalds struct gss_ctx *ctx_id, 1181da177e4SLinus Torvalds struct xdr_buf *message, 1191da177e4SLinus Torvalds struct xdr_netobj *mic_token); 1201da177e4SLinus Torvalds u32 (*gss_verify_mic)( 1211da177e4SLinus Torvalds struct gss_ctx *ctx_id, 1221da177e4SLinus Torvalds struct xdr_buf *message, 12300fd6e14SJ. Bruce Fields struct xdr_netobj *mic_token); 124293f1eb5SJ. Bruce Fields u32 (*gss_wrap)( 125293f1eb5SJ. Bruce Fields struct gss_ctx *ctx_id, 126293f1eb5SJ. Bruce Fields int offset, 127293f1eb5SJ. Bruce Fields struct xdr_buf *outbuf, 128293f1eb5SJ. Bruce Fields struct page **inpages); 129293f1eb5SJ. Bruce Fields u32 (*gss_unwrap)( 130293f1eb5SJ. Bruce Fields struct gss_ctx *ctx_id, 131293f1eb5SJ. Bruce Fields int offset, 13231c9590aSChuck Lever int len, 133293f1eb5SJ. Bruce Fields struct xdr_buf *buf); 1341da177e4SLinus Torvalds void (*gss_delete_sec_context)( 1351da177e4SLinus Torvalds void *internal_ctx_id); 1361da177e4SLinus Torvalds }; 1371da177e4SLinus Torvalds 1381da177e4SLinus Torvalds int gss_mech_register(struct gss_api_mech *); 1391da177e4SLinus Torvalds void gss_mech_unregister(struct gss_api_mech *); 1401da177e4SLinus Torvalds 1411da177e4SLinus Torvalds /* returns a mechanism descriptor given an OID, and increments the mechanism's 1421da177e4SLinus Torvalds * reference count. */ 143b1df7637SJ. Bruce Fields struct gss_api_mech * gss_mech_get_by_OID(struct rpcsec_gss_oid *); 144b1df7637SJ. Bruce Fields 1459568c5e9SChuck Lever /* Given a GSS security tuple, look up a pseudoflavor */ 1469568c5e9SChuck Lever rpc_authflavor_t gss_mech_info2flavor(struct rpcsec_gss_info *); 1471da177e4SLinus Torvalds 148a77c806fSChuck Lever /* Given a pseudoflavor, look up a GSS security tuple */ 149a77c806fSChuck Lever int gss_mech_flavor2info(rpc_authflavor_t, struct rpcsec_gss_info *); 1501da177e4SLinus Torvalds 1511da177e4SLinus Torvalds /* Returns a reference to a mechanism, given a name like "krb5" etc. */ 1521da177e4SLinus Torvalds struct gss_api_mech *gss_mech_get_by_name(const char *); 1531da177e4SLinus Torvalds 1541da177e4SLinus Torvalds /* Similar, but get by pseudoflavor. */ 1551da177e4SLinus Torvalds struct gss_api_mech *gss_mech_get_by_pseudoflavor(u32); 1561da177e4SLinus Torvalds 1570dc1531aSJ. Bruce Fields struct gss_api_mech * gss_mech_get(struct gss_api_mech *); 1580dc1531aSJ. Bruce Fields 159d6e05edcSAndreas Mohr /* For every successful gss_mech_get or gss_mech_get_by_* call there must be a 1601da177e4SLinus Torvalds * corresponding call to gss_mech_put. */ 1611da177e4SLinus Torvalds void gss_mech_put(struct gss_api_mech *); 1621da177e4SLinus Torvalds 1631da177e4SLinus Torvalds #endif /* _LINUX_SUNRPC_GSS_API_H */ 1641da177e4SLinus Torvalds 165