xref: /OK3568_Linux_fs/kernel/net/sunrpc/auth_null.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * linux/net/sunrpc/auth_null.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * AUTH_NULL authentication. Really :-)
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/types.h>
11*4882a593Smuzhiyun #include <linux/module.h>
12*4882a593Smuzhiyun #include <linux/sunrpc/clnt.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
15*4882a593Smuzhiyun # define RPCDBG_FACILITY	RPCDBG_AUTH
16*4882a593Smuzhiyun #endif
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun static struct rpc_auth null_auth;
19*4882a593Smuzhiyun static struct rpc_cred null_cred;
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun static struct rpc_auth *
nul_create(const struct rpc_auth_create_args * args,struct rpc_clnt * clnt)22*4882a593Smuzhiyun nul_create(const struct rpc_auth_create_args *args, struct rpc_clnt *clnt)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun 	refcount_inc(&null_auth.au_count);
25*4882a593Smuzhiyun 	return &null_auth;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun static void
nul_destroy(struct rpc_auth * auth)29*4882a593Smuzhiyun nul_destroy(struct rpc_auth *auth)
30*4882a593Smuzhiyun {
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun /*
34*4882a593Smuzhiyun  * Lookup NULL creds for current process
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun static struct rpc_cred *
nul_lookup_cred(struct rpc_auth * auth,struct auth_cred * acred,int flags)37*4882a593Smuzhiyun nul_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	return get_rpccred(&null_cred);
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /*
43*4882a593Smuzhiyun  * Destroy cred handle.
44*4882a593Smuzhiyun  */
45*4882a593Smuzhiyun static void
nul_destroy_cred(struct rpc_cred * cred)46*4882a593Smuzhiyun nul_destroy_cred(struct rpc_cred *cred)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun /*
51*4882a593Smuzhiyun  * Match cred handle against current process
52*4882a593Smuzhiyun  */
53*4882a593Smuzhiyun static int
nul_match(struct auth_cred * acred,struct rpc_cred * cred,int taskflags)54*4882a593Smuzhiyun nul_match(struct auth_cred *acred, struct rpc_cred *cred, int taskflags)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun 	return 1;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /*
60*4882a593Smuzhiyun  * Marshal credential.
61*4882a593Smuzhiyun  */
62*4882a593Smuzhiyun static int
nul_marshal(struct rpc_task * task,struct xdr_stream * xdr)63*4882a593Smuzhiyun nul_marshal(struct rpc_task *task, struct xdr_stream *xdr)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun 	__be32 *p;
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	p = xdr_reserve_space(xdr, 4 * sizeof(*p));
68*4882a593Smuzhiyun 	if (!p)
69*4882a593Smuzhiyun 		return -EMSGSIZE;
70*4882a593Smuzhiyun 	/* Credential */
71*4882a593Smuzhiyun 	*p++ = rpc_auth_null;
72*4882a593Smuzhiyun 	*p++ = xdr_zero;
73*4882a593Smuzhiyun 	/* Verifier */
74*4882a593Smuzhiyun 	*p++ = rpc_auth_null;
75*4882a593Smuzhiyun 	*p   = xdr_zero;
76*4882a593Smuzhiyun 	return 0;
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /*
80*4882a593Smuzhiyun  * Refresh credential. This is a no-op for AUTH_NULL
81*4882a593Smuzhiyun  */
82*4882a593Smuzhiyun static int
nul_refresh(struct rpc_task * task)83*4882a593Smuzhiyun nul_refresh(struct rpc_task *task)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_rqstp->rq_cred->cr_flags);
86*4882a593Smuzhiyun 	return 0;
87*4882a593Smuzhiyun }
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun static int
nul_validate(struct rpc_task * task,struct xdr_stream * xdr)90*4882a593Smuzhiyun nul_validate(struct rpc_task *task, struct xdr_stream *xdr)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun 	__be32 *p;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	p = xdr_inline_decode(xdr, 2 * sizeof(*p));
95*4882a593Smuzhiyun 	if (!p)
96*4882a593Smuzhiyun 		return -EIO;
97*4882a593Smuzhiyun 	if (*p++ != rpc_auth_null)
98*4882a593Smuzhiyun 		return -EIO;
99*4882a593Smuzhiyun 	if (*p != xdr_zero)
100*4882a593Smuzhiyun 		return -EIO;
101*4882a593Smuzhiyun 	return 0;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun const struct rpc_authops authnull_ops = {
105*4882a593Smuzhiyun 	.owner		= THIS_MODULE,
106*4882a593Smuzhiyun 	.au_flavor	= RPC_AUTH_NULL,
107*4882a593Smuzhiyun 	.au_name	= "NULL",
108*4882a593Smuzhiyun 	.create		= nul_create,
109*4882a593Smuzhiyun 	.destroy	= nul_destroy,
110*4882a593Smuzhiyun 	.lookup_cred	= nul_lookup_cred,
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun static
114*4882a593Smuzhiyun struct rpc_auth null_auth = {
115*4882a593Smuzhiyun 	.au_cslack	= NUL_CALLSLACK,
116*4882a593Smuzhiyun 	.au_rslack	= NUL_REPLYSLACK,
117*4882a593Smuzhiyun 	.au_verfsize	= NUL_REPLYSLACK,
118*4882a593Smuzhiyun 	.au_ralign	= NUL_REPLYSLACK,
119*4882a593Smuzhiyun 	.au_ops		= &authnull_ops,
120*4882a593Smuzhiyun 	.au_flavor	= RPC_AUTH_NULL,
121*4882a593Smuzhiyun 	.au_count	= REFCOUNT_INIT(1),
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun static
125*4882a593Smuzhiyun const struct rpc_credops null_credops = {
126*4882a593Smuzhiyun 	.cr_name	= "AUTH_NULL",
127*4882a593Smuzhiyun 	.crdestroy	= nul_destroy_cred,
128*4882a593Smuzhiyun 	.crmatch	= nul_match,
129*4882a593Smuzhiyun 	.crmarshal	= nul_marshal,
130*4882a593Smuzhiyun 	.crwrap_req	= rpcauth_wrap_req_encode,
131*4882a593Smuzhiyun 	.crrefresh	= nul_refresh,
132*4882a593Smuzhiyun 	.crvalidate	= nul_validate,
133*4882a593Smuzhiyun 	.crunwrap_resp	= rpcauth_unwrap_resp_decode,
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun static
137*4882a593Smuzhiyun struct rpc_cred null_cred = {
138*4882a593Smuzhiyun 	.cr_lru		= LIST_HEAD_INIT(null_cred.cr_lru),
139*4882a593Smuzhiyun 	.cr_auth	= &null_auth,
140*4882a593Smuzhiyun 	.cr_ops		= &null_credops,
141*4882a593Smuzhiyun 	.cr_count	= REFCOUNT_INIT(2),
142*4882a593Smuzhiyun 	.cr_flags	= 1UL << RPCAUTH_CRED_UPTODATE,
143*4882a593Smuzhiyun };
144