xref: /openbmc/linux/net/ceph/auth_none.c (revision 2cb33cac)
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 
422cb33cacSTyler Hicks static int build_request(struct ceph_auth_client *ac, void *buf, void *end)
432cb33cacSTyler Hicks {
442cb33cacSTyler Hicks 	return 0;
452cb33cacSTyler Hicks }
462cb33cacSTyler Hicks 
473d14c5d2SYehuda Sadeh /*
483d14c5d2SYehuda Sadeh  * the generic auth code decode the global_id, and we carry no actual
493d14c5d2SYehuda Sadeh  * authenticate state, so nothing happens here.
503d14c5d2SYehuda Sadeh  */
513d14c5d2SYehuda Sadeh static int handle_reply(struct ceph_auth_client *ac, int result,
523d14c5d2SYehuda Sadeh 			void *buf, void *end)
533d14c5d2SYehuda Sadeh {
543d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi = ac->private;
553d14c5d2SYehuda Sadeh 
563d14c5d2SYehuda Sadeh 	xi->starting = false;
573d14c5d2SYehuda Sadeh 	return result;
583d14c5d2SYehuda Sadeh }
593d14c5d2SYehuda Sadeh 
603d14c5d2SYehuda Sadeh /*
613d14c5d2SYehuda Sadeh  * build an 'authorizer' with our entity_name and global_id.  we can
623d14c5d2SYehuda Sadeh  * reuse a single static copy since it is identical for all services
633d14c5d2SYehuda Sadeh  * we connect to.
643d14c5d2SYehuda Sadeh  */
653d14c5d2SYehuda Sadeh static int ceph_auth_none_create_authorizer(
663d14c5d2SYehuda Sadeh 	struct ceph_auth_client *ac, int peer_type,
6774f1869fSAlex Elder 	struct ceph_auth_handshake *auth)
683d14c5d2SYehuda Sadeh {
693d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *ai = ac->private;
703d14c5d2SYehuda Sadeh 	struct ceph_none_authorizer *au = &ai->au;
713d14c5d2SYehuda Sadeh 	void *p, *end;
723d14c5d2SYehuda Sadeh 	int ret;
733d14c5d2SYehuda Sadeh 
743d14c5d2SYehuda Sadeh 	if (!ai->built_authorizer) {
753d14c5d2SYehuda Sadeh 		p = au->buf;
763d14c5d2SYehuda Sadeh 		end = p + sizeof(au->buf);
773d14c5d2SYehuda Sadeh 		ceph_encode_8(&p, 1);
783d14c5d2SYehuda Sadeh 		ret = ceph_entity_name_encode(ac->name, &p, end - 8);
793d14c5d2SYehuda Sadeh 		if (ret < 0)
803d14c5d2SYehuda Sadeh 			goto bad;
813d14c5d2SYehuda Sadeh 		ceph_decode_need(&p, end, sizeof(u64), bad2);
823d14c5d2SYehuda Sadeh 		ceph_encode_64(&p, ac->global_id);
833d14c5d2SYehuda Sadeh 		au->buf_len = p - (void *)au->buf;
843d14c5d2SYehuda Sadeh 		ai->built_authorizer = true;
853d14c5d2SYehuda Sadeh 		dout("built authorizer len %d\n", au->buf_len);
863d14c5d2SYehuda Sadeh 	}
873d14c5d2SYehuda Sadeh 
8874f1869fSAlex Elder 	auth->authorizer = (struct ceph_authorizer *) au;
8974f1869fSAlex Elder 	auth->authorizer_buf = au->buf;
9074f1869fSAlex Elder 	auth->authorizer_buf_len = au->buf_len;
9174f1869fSAlex Elder 	auth->authorizer_reply_buf = au->reply_buf;
9274f1869fSAlex Elder 	auth->authorizer_reply_buf_len = sizeof (au->reply_buf);
9374f1869fSAlex Elder 
943d14c5d2SYehuda Sadeh 	return 0;
953d14c5d2SYehuda Sadeh 
963d14c5d2SYehuda Sadeh bad2:
973d14c5d2SYehuda Sadeh 	ret = -ERANGE;
983d14c5d2SYehuda Sadeh bad:
993d14c5d2SYehuda Sadeh 	return ret;
1003d14c5d2SYehuda Sadeh }
1013d14c5d2SYehuda Sadeh 
1023d14c5d2SYehuda Sadeh static void ceph_auth_none_destroy_authorizer(struct ceph_auth_client *ac,
1033d14c5d2SYehuda Sadeh 				      struct ceph_authorizer *a)
1043d14c5d2SYehuda Sadeh {
1053d14c5d2SYehuda Sadeh 	/* nothing to do */
1063d14c5d2SYehuda Sadeh }
1073d14c5d2SYehuda Sadeh 
1083d14c5d2SYehuda Sadeh static const struct ceph_auth_client_ops ceph_auth_none_ops = {
1093d14c5d2SYehuda Sadeh 	.name = "none",
1103d14c5d2SYehuda Sadeh 	.reset = reset,
1113d14c5d2SYehuda Sadeh 	.destroy = destroy,
1123d14c5d2SYehuda Sadeh 	.is_authenticated = is_authenticated,
1133d14c5d2SYehuda Sadeh 	.should_authenticate = should_authenticate,
1142cb33cacSTyler Hicks 	.build_request = build_request,
1153d14c5d2SYehuda Sadeh 	.handle_reply = handle_reply,
1163d14c5d2SYehuda Sadeh 	.create_authorizer = ceph_auth_none_create_authorizer,
1173d14c5d2SYehuda Sadeh 	.destroy_authorizer = ceph_auth_none_destroy_authorizer,
1183d14c5d2SYehuda Sadeh };
1193d14c5d2SYehuda Sadeh 
1203d14c5d2SYehuda Sadeh int ceph_auth_none_init(struct ceph_auth_client *ac)
1213d14c5d2SYehuda Sadeh {
1223d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi;
1233d14c5d2SYehuda Sadeh 
1243d14c5d2SYehuda Sadeh 	dout("ceph_auth_none_init %p\n", ac);
1253d14c5d2SYehuda Sadeh 	xi = kzalloc(sizeof(*xi), GFP_NOFS);
1263d14c5d2SYehuda Sadeh 	if (!xi)
1273d14c5d2SYehuda Sadeh 		return -ENOMEM;
1283d14c5d2SYehuda Sadeh 
1293d14c5d2SYehuda Sadeh 	xi->starting = true;
1303d14c5d2SYehuda Sadeh 	xi->built_authorizer = false;
1313d14c5d2SYehuda Sadeh 
1323d14c5d2SYehuda Sadeh 	ac->protocol = CEPH_AUTH_NONE;
1333d14c5d2SYehuda Sadeh 	ac->private = xi;
1343d14c5d2SYehuda Sadeh 	ac->ops = &ceph_auth_none_ops;
1353d14c5d2SYehuda Sadeh 	return 0;
1363d14c5d2SYehuda Sadeh }
1373d14c5d2SYehuda Sadeh 
138