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