From: Andy Adamson Date: Fri, 18 May 2007 16:52:39 -0400 SUNRPC: Add a helper function to convert a GSS triple into pseudoflavor Helper function for OP_SECINFO. Return the pseudoflavor for a supported security mechanism OID, qop, and service. Return RPC_AUTH_MAXFLAVOR upon failure. Signed-off-by: Andy Adamson Signed-off-by: Trond Myklebust --- include/linux/sunrpc/gss_api.h | 1 + net/sunrpc/auth_gss/gss_mech_switch.c | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-) diff --git a/include/linux/sunrpc/gss_api.h b/include/linux/sunrpc/gss_api.h index 5eca9e4..ac71e2b 100644 --- a/include/linux/sunrpc/gss_api.h +++ b/include/linux/sunrpc/gss_api.h @@ -60,6 +60,7 @@ u32 gss_delete_sec_context( u32 gss_pseudoflavor_to_service(struct gss_api_mech *, u32 pseudoflavor); char *gss_service_to_auth_domain_name(struct gss_api_mech *, u32 service); +u32 gss_triple_to_pseudoflavor(u32 oidlen, char *oiddata, u32 qop, u32 service); struct pf_desc { u32 pseudoflavor; diff --git a/net/sunrpc/auth_gss/gss_mech_switch.c b/net/sunrpc/auth_gss/gss_mech_switch.c index 2687251..b1eebba 100644 --- a/net/sunrpc/auth_gss/gss_mech_switch.c +++ b/net/sunrpc/auth_gss/gss_mech_switch.c @@ -194,6 +194,44 @@ gss_mech_get_by_pseudoflavor(u32 pseudoflavor) EXPORT_SYMBOL(gss_mech_get_by_pseudoflavor); u32 +gss_triple_to_pseudoflavor(u32 oid_len, char *oid_data, u32 qop, u32 service) +{ + struct gss_api_mech *pos, *gm = NULL; + struct xdr_netobj oid = { + .len = oid_len, + .data = oid_data, + }; + u32 pseudoflavor = RPC_AUTH_MAXFLAVOR; + int i; + + /* Only support default QOP */ + if (qop != 0) + goto out; + + spin_lock(®istered_mechs_lock); + list_for_each_entry(pos, ®istered_mechs, gm_list) { + if (g_OID_equal(&oid, &pos->gm_oid)) { + gm = pos; + break; + } + } + if (!gm) + goto out_locked; + + for (i = 0; i < gm->gm_pf_num; i++) { + if (service == gm->gm_pfs[i].service) { + pseudoflavor = gm->gm_pfs[i].pseudoflavor; + break; + } + } +out_locked: + spin_unlock(®istered_mechs_lock); +out: + return pseudoflavor; +} +EXPORT_SYMBOL(gss_triple_to_pseudoflavor); + +u32 gss_pseudoflavor_to_service(struct gss_api_mech *gm, u32 pseudoflavor) { int i;