1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27/*
28 * auth_none.c implements routines used to pass "null" credentials
29 * and "null" verifiers in kernel RPC.
30 */
31
32#include <rpc/auth.h>
33
34/*
35 * Null authenticator operations vector
36 */
37static void	authnone_nextverf(AUTH *);
38static bool_t	authnone_marshal(AUTH *, XDR *, struct cred *);
39static bool_t	authnone_validate(AUTH *, struct opaque_auth *);
40static bool_t	authnone_refresh(AUTH *, struct rpc_msg *, cred_t *);
41static void	authnone_destroy(AUTH *);
42
43static struct auth_ops auth_none_ops = {
44	authnone_nextverf,
45	authnone_marshal,
46	authnone_validate,
47	authnone_refresh,
48	authnone_destroy,
49	authany_wrap,
50	authany_unwrap
51};
52
53/*
54 * Create a kernel null style authenticator.
55 * Returns an auth handle.
56 */
57AUTH *
58authnone_create(void)
59{
60	/*
61	 * Allocate and set up auth handle
62	 */
63	return (kmem_cache_alloc(authnone_cache, KM_SLEEP));
64}
65
66/*
67 *  The constructor of the authnone_cache.
68 */
69/* ARGSUSED */
70int
71authnone_init(void *buf, void *cdrarg, int kmflags)
72{
73	AUTH *auth = (AUTH *)buf;
74
75	auth->ah_ops = &auth_none_ops;
76
77	/*
78	 * Flavor of RPC message's credential and verifier should be set to
79	 * AUTH_NONE. Opaque data associated with AUTH_NONE is undefined.
80	 * The length of the opaque data should be zero.
81	 *	oa_flavor = AUTH_NONE
82	 *	oa_base = NULL
83	 *	oa_length = 0
84	 */
85	auth->ah_cred = auth->ah_verf = _null_auth;
86
87	return (0);
88}
89
90/*
91 * authnone operations
92 */
93/* ARGSUSED */
94static void
95authnone_nextverf(AUTH *auth)
96{
97	/* no action necessary */
98}
99
100/* ARGSUSED */
101static bool_t
102authnone_marshal(AUTH *auth, XDR *xdrs, struct cred *cr)
103{
104	int32_t	*ptr;
105
106	/*
107	 * auth_none has no opaque data. Encode auth_none
108	 * value with 0 len data for both cred and verf.
109	 * We first try a fast path to complete this operation.
110	 */
111	ptr = XDR_INLINE(xdrs, 4 + 4 + 4 + 4);
112	if (ptr) {
113		IXDR_PUT_INT32(ptr, AUTH_NONE);
114		IXDR_PUT_INT32(ptr, 0);
115		IXDR_PUT_INT32(ptr, AUTH_NONE);
116		IXDR_PUT_INT32(ptr, 0);
117		return (TRUE);
118	}
119
120	/*
121	 * serialize AUTH_NONE credential and AUTH_NONE verifier
122	 */
123	if ((xdr_opaque_auth(xdrs, &(auth->ah_cred))) &&
124	    (xdr_opaque_auth(xdrs, &(auth->ah_verf))))
125		return (TRUE);
126	else
127		return (FALSE);
128}
129
130/* ARGSUSED */
131static bool_t
132authnone_validate(AUTH *auth, struct opaque_auth *verf)
133{
134	return (TRUE);
135}
136
137/* ARGSUSED */
138static bool_t
139authnone_refresh(AUTH *auth, struct rpc_msg *msg, cred_t *cr)
140{
141	return (FALSE);
142}
143
144static void
145authnone_destroy(AUTH *auth)
146{
147	kmem_cache_free(authnone_cache, auth);
148}
149