11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/net/sunrpc/auth_null.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * AUTH_NULL authentication. Really :-)
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de>
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/types.h>
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sunrpc/clnt.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef RPC_DEBUG
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds# define RPCDBG_FACILITY	RPCDBG_AUTH
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct rpc_auth null_auth;
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct rpc_cred null_cred;
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct rpc_auth *
21c2190661039b3817b4cc1cbfea620b3f7dbe5cd8Trond Myklebustnul_create(struct rpc_auth_create_args *args, struct rpc_clnt *clnt)
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_inc(&null_auth.au_count);
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return &null_auth;
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnul_destroy(struct rpc_auth *auth)
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Lookup NULL creds for current process
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct rpc_cred *
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnul_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
38bd95608053b7f7813351b0defc0e3e7ef8cf2803NeilBrown	if (flags & RPCAUTH_LOOKUP_RCU)
39bd95608053b7f7813351b0defc0e3e7ef8cf2803NeilBrown		return &null_cred;
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return get_rpccred(&null_cred);
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Destroy cred handle.
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnul_destroy_cred(struct rpc_cred *cred)
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Match cred handle against current process
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnul_match(struct auth_cred *acred, struct rpc_cred *cred, int taskflags)
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Marshal credential.
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
63d8ed029d6000ba2e2908d9286409e4833c091b4cAlexey Dobriyanstatic __be32 *
64d8ed029d6000ba2e2908d9286409e4833c091b4cAlexey Dobriyannul_marshal(struct rpc_task *task, __be32 *p)
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*p++ = htonl(RPC_AUTH_NULL);
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*p++ = 0;
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*p++ = htonl(RPC_AUTH_NULL);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*p++ = 0;
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return p;
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Refresh credential. This is a no-op for AUTH_NULL
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsnul_refresh(struct rpc_task *task)
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
80a17c2153d2e271b0cbacae9bed83b0eaa41db7e1Trond Myklebust	set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_rqstp->rq_cred->cr_flags);
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
84d8ed029d6000ba2e2908d9286409e4833c091b4cAlexey Dobriyanstatic __be32 *
85d8ed029d6000ba2e2908d9286409e4833c091b4cAlexey Dobriyannul_validate(struct rpc_task *task, __be32 *p)
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	rpc_authflavor_t	flavor;
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32			size;
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	flavor = ntohl(*p++);
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (flavor != RPC_AUTH_NULL) {
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("RPC: bad verf flavor: %u\n", flavor);
9335fa5f7b35ca2076d594b2670a32d66dd3ae9eecAndy Adamson		return ERR_PTR(-EIO);
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size = ntohl(*p++);
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (size != 0) {
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("RPC: bad verf size: %u\n", size);
9935fa5f7b35ca2076d594b2670a32d66dd3ae9eecAndy Adamson		return ERR_PTR(-EIO);
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return p;
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
105f1c0a8615090359d57e096157feb9f900cbb233cTrond Myklebustconst struct rpc_authops authnull_ops = {
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.owner		= THIS_MODULE,
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.au_flavor	= RPC_AUTH_NULL,
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.au_name	= "NULL",
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.create		= nul_create,
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.destroy	= nul_destroy,
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.lookup_cred	= nul_lookup_cred,
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct rpc_auth null_auth = {
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.au_cslack	= 4,
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.au_rslack	= 2,
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.au_ops		= &authnull_ops,
11981039f1f204a0fd2952112a240284e114f1a25e6Trond Myklebust	.au_flavor	= RPC_AUTH_NULL,
12081039f1f204a0fd2952112a240284e114f1a25e6Trond Myklebust	.au_count	= ATOMIC_INIT(0),
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic
124f1c0a8615090359d57e096157feb9f900cbb233cTrond Myklebustconst struct rpc_credops null_credops = {
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.cr_name	= "AUTH_NULL",
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.crdestroy	= nul_destroy_cred,
1275c691044ecbca04dd558fca4c754121689fe1b34Trond Myklebust	.crbind		= rpcauth_generic_bind_cred,
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.crmatch	= nul_match,
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.crmarshal	= nul_marshal,
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.crrefresh	= nul_refresh,
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.crvalidate	= nul_validate,
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct rpc_cred null_cred = {
136e092bdcd939416ef911090890096fe07d0281a5eTrond Myklebust	.cr_lru		= LIST_HEAD_INIT(null_cred.cr_lru),
1374a8c1344dccb848dbcf0edabc8b5c51a8ecf2808Trond Myklebust	.cr_auth	= &null_auth,
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.cr_ops		= &null_credops,
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.cr_count	= ATOMIC_INIT(1),
140fc432dd90760a629c57026e57f65ff80a1a31d2fTrond Myklebust	.cr_flags	= 1UL << RPCAUTH_CRED_UPTODATE,
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef RPC_DEBUG
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.cr_magic	= RPCAUTH_CRED_MAGIC,
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
145