18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/net/sunrpc/auth_null.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * AUTH_NULL authentication. Really :-) 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 1996, Olaf Kirch <okir@monad.swb.de> 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/types.h> 118c2ecf20Sopenharmony_ci#include <linux/module.h> 128c2ecf20Sopenharmony_ci#include <linux/sunrpc/clnt.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 158c2ecf20Sopenharmony_ci# define RPCDBG_FACILITY RPCDBG_AUTH 168c2ecf20Sopenharmony_ci#endif 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistatic struct rpc_auth null_auth; 198c2ecf20Sopenharmony_cistatic struct rpc_cred null_cred; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistatic struct rpc_auth * 228c2ecf20Sopenharmony_cinul_create(const struct rpc_auth_create_args *args, struct rpc_clnt *clnt) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci refcount_inc(&null_auth.au_count); 258c2ecf20Sopenharmony_ci return &null_auth; 268c2ecf20Sopenharmony_ci} 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistatic void 298c2ecf20Sopenharmony_cinul_destroy(struct rpc_auth *auth) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci} 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci/* 348c2ecf20Sopenharmony_ci * Lookup NULL creds for current process 358c2ecf20Sopenharmony_ci */ 368c2ecf20Sopenharmony_cistatic struct rpc_cred * 378c2ecf20Sopenharmony_cinul_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags) 388c2ecf20Sopenharmony_ci{ 398c2ecf20Sopenharmony_ci return get_rpccred(&null_cred); 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci/* 438c2ecf20Sopenharmony_ci * Destroy cred handle. 448c2ecf20Sopenharmony_ci */ 458c2ecf20Sopenharmony_cistatic void 468c2ecf20Sopenharmony_cinul_destroy_cred(struct rpc_cred *cred) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci/* 518c2ecf20Sopenharmony_ci * Match cred handle against current process 528c2ecf20Sopenharmony_ci */ 538c2ecf20Sopenharmony_cistatic int 548c2ecf20Sopenharmony_cinul_match(struct auth_cred *acred, struct rpc_cred *cred, int taskflags) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci return 1; 578c2ecf20Sopenharmony_ci} 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci/* 608c2ecf20Sopenharmony_ci * Marshal credential. 618c2ecf20Sopenharmony_ci */ 628c2ecf20Sopenharmony_cistatic int 638c2ecf20Sopenharmony_cinul_marshal(struct rpc_task *task, struct xdr_stream *xdr) 648c2ecf20Sopenharmony_ci{ 658c2ecf20Sopenharmony_ci __be32 *p; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci p = xdr_reserve_space(xdr, 4 * sizeof(*p)); 688c2ecf20Sopenharmony_ci if (!p) 698c2ecf20Sopenharmony_ci return -EMSGSIZE; 708c2ecf20Sopenharmony_ci /* Credential */ 718c2ecf20Sopenharmony_ci *p++ = rpc_auth_null; 728c2ecf20Sopenharmony_ci *p++ = xdr_zero; 738c2ecf20Sopenharmony_ci /* Verifier */ 748c2ecf20Sopenharmony_ci *p++ = rpc_auth_null; 758c2ecf20Sopenharmony_ci *p = xdr_zero; 768c2ecf20Sopenharmony_ci return 0; 778c2ecf20Sopenharmony_ci} 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci/* 808c2ecf20Sopenharmony_ci * Refresh credential. This is a no-op for AUTH_NULL 818c2ecf20Sopenharmony_ci */ 828c2ecf20Sopenharmony_cistatic int 838c2ecf20Sopenharmony_cinul_refresh(struct rpc_task *task) 848c2ecf20Sopenharmony_ci{ 858c2ecf20Sopenharmony_ci set_bit(RPCAUTH_CRED_UPTODATE, &task->tk_rqstp->rq_cred->cr_flags); 868c2ecf20Sopenharmony_ci return 0; 878c2ecf20Sopenharmony_ci} 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_cistatic int 908c2ecf20Sopenharmony_cinul_validate(struct rpc_task *task, struct xdr_stream *xdr) 918c2ecf20Sopenharmony_ci{ 928c2ecf20Sopenharmony_ci __be32 *p; 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci p = xdr_inline_decode(xdr, 2 * sizeof(*p)); 958c2ecf20Sopenharmony_ci if (!p) 968c2ecf20Sopenharmony_ci return -EIO; 978c2ecf20Sopenharmony_ci if (*p++ != rpc_auth_null) 988c2ecf20Sopenharmony_ci return -EIO; 998c2ecf20Sopenharmony_ci if (*p != xdr_zero) 1008c2ecf20Sopenharmony_ci return -EIO; 1018c2ecf20Sopenharmony_ci return 0; 1028c2ecf20Sopenharmony_ci} 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ciconst struct rpc_authops authnull_ops = { 1058c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 1068c2ecf20Sopenharmony_ci .au_flavor = RPC_AUTH_NULL, 1078c2ecf20Sopenharmony_ci .au_name = "NULL", 1088c2ecf20Sopenharmony_ci .create = nul_create, 1098c2ecf20Sopenharmony_ci .destroy = nul_destroy, 1108c2ecf20Sopenharmony_ci .lookup_cred = nul_lookup_cred, 1118c2ecf20Sopenharmony_ci}; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cistatic 1148c2ecf20Sopenharmony_cistruct rpc_auth null_auth = { 1158c2ecf20Sopenharmony_ci .au_cslack = NUL_CALLSLACK, 1168c2ecf20Sopenharmony_ci .au_rslack = NUL_REPLYSLACK, 1178c2ecf20Sopenharmony_ci .au_verfsize = NUL_REPLYSLACK, 1188c2ecf20Sopenharmony_ci .au_ralign = NUL_REPLYSLACK, 1198c2ecf20Sopenharmony_ci .au_ops = &authnull_ops, 1208c2ecf20Sopenharmony_ci .au_flavor = RPC_AUTH_NULL, 1218c2ecf20Sopenharmony_ci .au_count = REFCOUNT_INIT(1), 1228c2ecf20Sopenharmony_ci}; 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_cistatic 1258c2ecf20Sopenharmony_ciconst struct rpc_credops null_credops = { 1268c2ecf20Sopenharmony_ci .cr_name = "AUTH_NULL", 1278c2ecf20Sopenharmony_ci .crdestroy = nul_destroy_cred, 1288c2ecf20Sopenharmony_ci .crmatch = nul_match, 1298c2ecf20Sopenharmony_ci .crmarshal = nul_marshal, 1308c2ecf20Sopenharmony_ci .crwrap_req = rpcauth_wrap_req_encode, 1318c2ecf20Sopenharmony_ci .crrefresh = nul_refresh, 1328c2ecf20Sopenharmony_ci .crvalidate = nul_validate, 1338c2ecf20Sopenharmony_ci .crunwrap_resp = rpcauth_unwrap_resp_decode, 1348c2ecf20Sopenharmony_ci}; 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_cistatic 1378c2ecf20Sopenharmony_cistruct rpc_cred null_cred = { 1388c2ecf20Sopenharmony_ci .cr_lru = LIST_HEAD_INIT(null_cred.cr_lru), 1398c2ecf20Sopenharmony_ci .cr_auth = &null_auth, 1408c2ecf20Sopenharmony_ci .cr_ops = &null_credops, 1418c2ecf20Sopenharmony_ci .cr_count = REFCOUNT_INIT(2), 1428c2ecf20Sopenharmony_ci .cr_flags = 1UL << RPCAUTH_CRED_UPTODATE, 1438c2ecf20Sopenharmony_ci}; 144