xref: /openbmc/linux/net/ceph/auth_none.c (revision 74f1869f)
13d14c5d2SYehuda Sadeh 
23d14c5d2SYehuda Sadeh #include <linux/ceph/ceph_debug.h>
33d14c5d2SYehuda Sadeh 
43d14c5d2SYehuda Sadeh #include <linux/err.h>
53d14c5d2SYehuda Sadeh #include <linux/module.h>
63d14c5d2SYehuda Sadeh #include <linux/random.h>
73d14c5d2SYehuda Sadeh #include <linux/slab.h>
83d14c5d2SYehuda Sadeh 
93d14c5d2SYehuda Sadeh #include <linux/ceph/decode.h>
103d14c5d2SYehuda Sadeh #include <linux/ceph/auth.h>
113d14c5d2SYehuda Sadeh 
123d14c5d2SYehuda Sadeh #include "auth_none.h"
133d14c5d2SYehuda Sadeh 
143d14c5d2SYehuda Sadeh static void reset(struct ceph_auth_client *ac)
153d14c5d2SYehuda Sadeh {
163d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi = ac->private;
173d14c5d2SYehuda Sadeh 
183d14c5d2SYehuda Sadeh 	xi->starting = true;
193d14c5d2SYehuda Sadeh 	xi->built_authorizer = false;
203d14c5d2SYehuda Sadeh }
213d14c5d2SYehuda Sadeh 
223d14c5d2SYehuda Sadeh static void destroy(struct ceph_auth_client *ac)
233d14c5d2SYehuda Sadeh {
243d14c5d2SYehuda Sadeh 	kfree(ac->private);
253d14c5d2SYehuda Sadeh 	ac->private = NULL;
263d14c5d2SYehuda Sadeh }
273d14c5d2SYehuda Sadeh 
283d14c5d2SYehuda Sadeh static int is_authenticated(struct ceph_auth_client *ac)
293d14c5d2SYehuda Sadeh {
303d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi = ac->private;
313d14c5d2SYehuda Sadeh 
323d14c5d2SYehuda Sadeh 	return !xi->starting;
333d14c5d2SYehuda Sadeh }
343d14c5d2SYehuda Sadeh 
353d14c5d2SYehuda Sadeh static int should_authenticate(struct ceph_auth_client *ac)
363d14c5d2SYehuda Sadeh {
373d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi = ac->private;
383d14c5d2SYehuda Sadeh 
393d14c5d2SYehuda Sadeh 	return xi->starting;
403d14c5d2SYehuda Sadeh }
413d14c5d2SYehuda Sadeh 
423d14c5d2SYehuda Sadeh /*
433d14c5d2SYehuda Sadeh  * the generic auth code decode the global_id, and we carry no actual
443d14c5d2SYehuda Sadeh  * authenticate state, so nothing happens here.
453d14c5d2SYehuda Sadeh  */
463d14c5d2SYehuda Sadeh static int handle_reply(struct ceph_auth_client *ac, int result,
473d14c5d2SYehuda Sadeh 			void *buf, void *end)
483d14c5d2SYehuda Sadeh {
493d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi = ac->private;
503d14c5d2SYehuda Sadeh 
513d14c5d2SYehuda Sadeh 	xi->starting = false;
523d14c5d2SYehuda Sadeh 	return result;
533d14c5d2SYehuda Sadeh }
543d14c5d2SYehuda Sadeh 
553d14c5d2SYehuda Sadeh /*
563d14c5d2SYehuda Sadeh  * build an 'authorizer' with our entity_name and global_id.  we can
573d14c5d2SYehuda Sadeh  * reuse a single static copy since it is identical for all services
583d14c5d2SYehuda Sadeh  * we connect to.
593d14c5d2SYehuda Sadeh  */
603d14c5d2SYehuda Sadeh static int ceph_auth_none_create_authorizer(
613d14c5d2SYehuda Sadeh 	struct ceph_auth_client *ac, int peer_type,
6274f1869fSAlex Elder 	struct ceph_auth_handshake *auth)
633d14c5d2SYehuda Sadeh {
643d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *ai = ac->private;
653d14c5d2SYehuda Sadeh 	struct ceph_none_authorizer *au = &ai->au;
663d14c5d2SYehuda Sadeh 	void *p, *end;
673d14c5d2SYehuda Sadeh 	int ret;
683d14c5d2SYehuda Sadeh 
693d14c5d2SYehuda Sadeh 	if (!ai->built_authorizer) {
703d14c5d2SYehuda Sadeh 		p = au->buf;
713d14c5d2SYehuda Sadeh 		end = p + sizeof(au->buf);
723d14c5d2SYehuda Sadeh 		ceph_encode_8(&p, 1);
733d14c5d2SYehuda Sadeh 		ret = ceph_entity_name_encode(ac->name, &p, end - 8);
743d14c5d2SYehuda Sadeh 		if (ret < 0)
753d14c5d2SYehuda Sadeh 			goto bad;
763d14c5d2SYehuda Sadeh 		ceph_decode_need(&p, end, sizeof(u64), bad2);
773d14c5d2SYehuda Sadeh 		ceph_encode_64(&p, ac->global_id);
783d14c5d2SYehuda Sadeh 		au->buf_len = p - (void *)au->buf;
793d14c5d2SYehuda Sadeh 		ai->built_authorizer = true;
803d14c5d2SYehuda Sadeh 		dout("built authorizer len %d\n", au->buf_len);
813d14c5d2SYehuda Sadeh 	}
823d14c5d2SYehuda Sadeh 
8374f1869fSAlex Elder 	auth->authorizer = (struct ceph_authorizer *) au;
8474f1869fSAlex Elder 	auth->authorizer_buf = au->buf;
8574f1869fSAlex Elder 	auth->authorizer_buf_len = au->buf_len;
8674f1869fSAlex Elder 	auth->authorizer_reply_buf = au->reply_buf;
8774f1869fSAlex Elder 	auth->authorizer_reply_buf_len = sizeof (au->reply_buf);
8874f1869fSAlex Elder 
893d14c5d2SYehuda Sadeh 	return 0;
903d14c5d2SYehuda Sadeh 
913d14c5d2SYehuda Sadeh bad2:
923d14c5d2SYehuda Sadeh 	ret = -ERANGE;
933d14c5d2SYehuda Sadeh bad:
943d14c5d2SYehuda Sadeh 	return ret;
953d14c5d2SYehuda Sadeh }
963d14c5d2SYehuda Sadeh 
973d14c5d2SYehuda Sadeh static void ceph_auth_none_destroy_authorizer(struct ceph_auth_client *ac,
983d14c5d2SYehuda Sadeh 				      struct ceph_authorizer *a)
993d14c5d2SYehuda Sadeh {
1003d14c5d2SYehuda Sadeh 	/* nothing to do */
1013d14c5d2SYehuda Sadeh }
1023d14c5d2SYehuda Sadeh 
1033d14c5d2SYehuda Sadeh static const struct ceph_auth_client_ops ceph_auth_none_ops = {
1043d14c5d2SYehuda Sadeh 	.name = "none",
1053d14c5d2SYehuda Sadeh 	.reset = reset,
1063d14c5d2SYehuda Sadeh 	.destroy = destroy,
1073d14c5d2SYehuda Sadeh 	.is_authenticated = is_authenticated,
1083d14c5d2SYehuda Sadeh 	.should_authenticate = should_authenticate,
1093d14c5d2SYehuda Sadeh 	.handle_reply = handle_reply,
1103d14c5d2SYehuda Sadeh 	.create_authorizer = ceph_auth_none_create_authorizer,
1113d14c5d2SYehuda Sadeh 	.destroy_authorizer = ceph_auth_none_destroy_authorizer,
1123d14c5d2SYehuda Sadeh };
1133d14c5d2SYehuda Sadeh 
1143d14c5d2SYehuda Sadeh int ceph_auth_none_init(struct ceph_auth_client *ac)
1153d14c5d2SYehuda Sadeh {
1163d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi;
1173d14c5d2SYehuda Sadeh 
1183d14c5d2SYehuda Sadeh 	dout("ceph_auth_none_init %p\n", ac);
1193d14c5d2SYehuda Sadeh 	xi = kzalloc(sizeof(*xi), GFP_NOFS);
1203d14c5d2SYehuda Sadeh 	if (!xi)
1213d14c5d2SYehuda Sadeh 		return -ENOMEM;
1223d14c5d2SYehuda Sadeh 
1233d14c5d2SYehuda Sadeh 	xi->starting = true;
1243d14c5d2SYehuda Sadeh 	xi->built_authorizer = false;
1253d14c5d2SYehuda Sadeh 
1263d14c5d2SYehuda Sadeh 	ac->protocol = CEPH_AUTH_NONE;
1273d14c5d2SYehuda Sadeh 	ac->private = xi;
1283d14c5d2SYehuda Sadeh 	ac->ops = &ceph_auth_none_ops;
1293d14c5d2SYehuda Sadeh 	return 0;
1303d14c5d2SYehuda Sadeh }
1313d14c5d2SYehuda Sadeh 
132