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,
118*35e77d21SChuck 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