xref: /openbmc/linux/net/sunrpc/auth_null.c (revision 35e77d21)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * linux/net/sunrpc/auth_null.c
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * AUTH_NULL authentication. Really :-)
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #include <linux/types.h>
111da177e4SLinus Torvalds #include <linux/module.h>
121da177e4SLinus Torvalds #include <linux/sunrpc/clnt.h>
131da177e4SLinus Torvalds 
14f895b252SJeff Layton #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
151da177e4SLinus Torvalds # define RPCDBG_FACILITY	RPCDBG_AUTH
161da177e4SLinus Torvalds #endif
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds static struct rpc_auth null_auth;
191da177e4SLinus Torvalds static struct rpc_cred null_cred;
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds static struct rpc_auth *
nul_create(const struct rpc_auth_create_args * args,struct rpc_clnt * clnt)2282b98ca5SSargun Dhillon nul_create(const struct rpc_auth_create_args *args, struct rpc_clnt *clnt)
231da177e4SLinus Torvalds {
24331bc71cSTrond Myklebust 	refcount_inc(&null_auth.au_count);
251da177e4SLinus Torvalds 	return &null_auth;
261da177e4SLinus Torvalds }
271da177e4SLinus Torvalds 
281da177e4SLinus Torvalds static void
nul_destroy(struct rpc_auth * auth)291da177e4SLinus Torvalds nul_destroy(struct rpc_auth *auth)
301da177e4SLinus Torvalds {
311da177e4SLinus Torvalds }
321da177e4SLinus Torvalds 
331da177e4SLinus Torvalds /*
341da177e4SLinus Torvalds  * Lookup NULL creds for current process
351da177e4SLinus Torvalds  */
361da177e4SLinus Torvalds static struct rpc_cred *
nul_lookup_cred(struct rpc_auth * auth,struct auth_cred * acred,int flags)371da177e4SLinus Torvalds nul_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
381da177e4SLinus Torvalds {
391da177e4SLinus Torvalds 	return get_rpccred(&null_cred);
401da177e4SLinus Torvalds }
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds /*
431da177e4SLinus Torvalds  * Destroy cred handle.
441da177e4SLinus Torvalds  */
451da177e4SLinus Torvalds static void
nul_destroy_cred(struct rpc_cred * cred)461da177e4SLinus Torvalds nul_destroy_cred(struct rpc_cred *cred)
471da177e4SLinus Torvalds {
481da177e4SLinus Torvalds }
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds /*
511da177e4SLinus Torvalds  * Match cred handle against current process
521da177e4SLinus Torvalds  */
531da177e4SLinus Torvalds static int
nul_match(struct auth_cred * acred,struct rpc_cred * cred,int taskflags)541da177e4SLinus Torvalds nul_match(struct auth_cred *acred, struct rpc_cred *cred, int taskflags)
551da177e4SLinus Torvalds {
561da177e4SLinus Torvalds 	return 1;
571da177e4SLinus Torvalds }
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds /*
601da177e4SLinus Torvalds  * Marshal credential.
611da177e4SLinus Torvalds  */
62e8680a24SChuck Lever static int
nul_marshal(struct rpc_task * task,struct xdr_stream * xdr)63e8680a24SChuck Lever nul_marshal(struct rpc_task *task, struct xdr_stream *xdr)
641da177e4SLinus Torvalds {
65e8680a24SChuck Lever 	__be32 *p;
661da177e4SLinus Torvalds 
67e8680a24SChuck Lever 	p = xdr_reserve_space(xdr, 4 * sizeof(*p));
68e8680a24SChuck Lever 	if (!p)
69e8680a24SChuck Lever 		return -EMSGSIZE;
70e8680a24SChuck Lever 	/* Credential */
71e8680a24SChuck Lever 	*p++ = rpc_auth_null;
72e8680a24SChuck Lever 	*p++ = xdr_zero;
73e8680a24SChuck Lever 	/* Verifier */
74e8680a24SChuck Lever 	*p++ = rpc_auth_null;
75e8680a24SChuck Lever 	*p   = xdr_zero;
76e8680a24SChuck Lever 	return 0;
771da177e4SLinus Torvalds }
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds /*
801da177e4SLinus Torvalds  * Refresh credential. This is a no-op for AUTH_NULL
811da177e4SLinus Torvalds  */
821da177e4SLinus Torvalds static int
nul_refresh(struct rpc_task * task)831da177e4SLinus Torvalds nul_refresh(struct rpc_task *task)
841da177e4SLinus Torvalds {
85a17c2153STrond Myklebust 	set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_rqstp->rq_cred->cr_flags);
861da177e4SLinus Torvalds 	return 0;
871da177e4SLinus Torvalds }
881da177e4SLinus Torvalds 
89a0584ee9SChuck Lever static int
nul_validate(struct rpc_task * task,struct xdr_stream * xdr)90a0584ee9SChuck Lever nul_validate(struct rpc_task *task, struct xdr_stream *xdr)
911da177e4SLinus Torvalds {
92a0584ee9SChuck Lever 	__be32 *p;
931da177e4SLinus Torvalds 
94a0584ee9SChuck Lever 	p = xdr_inline_decode(xdr, 2 * sizeof(*p));
95a0584ee9SChuck Lever 	if (!p)
96a0584ee9SChuck Lever 		return -EIO;
97a0584ee9SChuck Lever 	if (*p++ != rpc_auth_null)
98a0584ee9SChuck Lever 		return -EIO;
99a0584ee9SChuck Lever 	if (*p != xdr_zero)
100a0584ee9SChuck Lever 		return -EIO;
101a0584ee9SChuck Lever 	return 0;
1021da177e4SLinus Torvalds }
1031da177e4SLinus Torvalds 
104f1c0a861STrond Myklebust const struct rpc_authops authnull_ops = {
1051da177e4SLinus Torvalds 	.owner		= THIS_MODULE,
1061da177e4SLinus Torvalds 	.au_flavor	= RPC_AUTH_NULL,
1071da177e4SLinus Torvalds 	.au_name	= "NULL",
1081da177e4SLinus Torvalds 	.create		= nul_create,
1091da177e4SLinus Torvalds 	.destroy	= nul_destroy,
1101da177e4SLinus Torvalds 	.lookup_cred	= nul_lookup_cred,
1111da177e4SLinus Torvalds };
1121da177e4SLinus Torvalds 
1131da177e4SLinus Torvalds static
1141da177e4SLinus Torvalds struct rpc_auth null_auth = {
1154500632fSChuck Lever 	.au_cslack	= NUL_CALLSLACK,
1164500632fSChuck Lever 	.au_rslack	= NUL_REPLYSLACK,
117a00275baSChuck Lever 	.au_verfsize	= NUL_REPLYSLACK,
11835e77d21SChuck Lever 	.au_ralign	= NUL_REPLYSLACK,
1191da177e4SLinus Torvalds 	.au_ops		= &authnull_ops,
12081039f1fSTrond Myklebust 	.au_flavor	= RPC_AUTH_NULL,
121331bc71cSTrond Myklebust 	.au_count	= REFCOUNT_INIT(1),
1221da177e4SLinus Torvalds };
1231da177e4SLinus Torvalds 
1241da177e4SLinus Torvalds static
125f1c0a861STrond Myklebust const struct rpc_credops null_credops = {
1261da177e4SLinus Torvalds 	.cr_name	= "AUTH_NULL",
1271da177e4SLinus Torvalds 	.crdestroy	= nul_destroy_cred,
1281da177e4SLinus Torvalds 	.crmatch	= nul_match,
1291da177e4SLinus Torvalds 	.crmarshal	= nul_marshal,
130e8680a24SChuck Lever 	.crwrap_req	= rpcauth_wrap_req_encode,
1311da177e4SLinus Torvalds 	.crrefresh	= nul_refresh,
1321da177e4SLinus Torvalds 	.crvalidate	= nul_validate,
133a0584ee9SChuck Lever 	.crunwrap_resp	= rpcauth_unwrap_resp_decode,
1341da177e4SLinus Torvalds };
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds static
1371da177e4SLinus Torvalds struct rpc_cred null_cred = {
138e092bdcdSTrond Myklebust 	.cr_lru		= LIST_HEAD_INIT(null_cred.cr_lru),
1394a8c1344STrond Myklebust 	.cr_auth	= &null_auth,
1401da177e4SLinus Torvalds 	.cr_ops		= &null_credops,
14179b18181STrond Myklebust 	.cr_count	= REFCOUNT_INIT(2),
142fc432dd9STrond Myklebust 	.cr_flags	= 1UL << RPCAUTH_CRED_UPTODATE,
1431da177e4SLinus Torvalds };
144