xref: /openbmc/linux/net/ceph/auth_none.c (revision f01d5cb24ea92494f9e093e6ee411364a686be99)
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 }
203d14c5d2SYehuda Sadeh 
213d14c5d2SYehuda Sadeh static void destroy(struct ceph_auth_client *ac)
223d14c5d2SYehuda Sadeh {
233d14c5d2SYehuda Sadeh 	kfree(ac->private);
243d14c5d2SYehuda Sadeh 	ac->private = NULL;
253d14c5d2SYehuda Sadeh }
263d14c5d2SYehuda Sadeh 
273d14c5d2SYehuda Sadeh static int is_authenticated(struct ceph_auth_client *ac)
283d14c5d2SYehuda Sadeh {
293d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi = ac->private;
303d14c5d2SYehuda Sadeh 
313d14c5d2SYehuda Sadeh 	return !xi->starting;
323d14c5d2SYehuda Sadeh }
333d14c5d2SYehuda Sadeh 
343d14c5d2SYehuda Sadeh static int should_authenticate(struct ceph_auth_client *ac)
353d14c5d2SYehuda Sadeh {
363d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi = ac->private;
373d14c5d2SYehuda Sadeh 
383d14c5d2SYehuda Sadeh 	return xi->starting;
393d14c5d2SYehuda Sadeh }
403d14c5d2SYehuda Sadeh 
416c1ea260SIlya Dryomov static int ceph_auth_none_build_authorizer(struct ceph_auth_client *ac,
426c1ea260SIlya Dryomov 					   struct ceph_none_authorizer *au)
436c1ea260SIlya Dryomov {
446c1ea260SIlya Dryomov 	void *p = au->buf;
456c1ea260SIlya Dryomov 	void *const end = p + sizeof(au->buf);
466c1ea260SIlya Dryomov 	int ret;
476c1ea260SIlya Dryomov 
486c1ea260SIlya Dryomov 	ceph_encode_8_safe(&p, end, 1, e_range);
49*f01d5cb2SIlya Dryomov 	ret = ceph_auth_entity_name_encode(ac->name, &p, end);
506c1ea260SIlya Dryomov 	if (ret < 0)
516c1ea260SIlya Dryomov 		return ret;
526c1ea260SIlya Dryomov 
536c1ea260SIlya Dryomov 	ceph_encode_64_safe(&p, end, ac->global_id, e_range);
546c1ea260SIlya Dryomov 	au->buf_len = p - (void *)au->buf;
556c1ea260SIlya Dryomov 	dout("%s built authorizer len %d\n", __func__, au->buf_len);
566c1ea260SIlya Dryomov 	return 0;
576c1ea260SIlya Dryomov 
586c1ea260SIlya Dryomov e_range:
596c1ea260SIlya Dryomov 	return -ERANGE;
606c1ea260SIlya Dryomov }
616c1ea260SIlya Dryomov 
622cb33cacSTyler Hicks static int build_request(struct ceph_auth_client *ac, void *buf, void *end)
632cb33cacSTyler Hicks {
642cb33cacSTyler Hicks 	return 0;
652cb33cacSTyler Hicks }
662cb33cacSTyler Hicks 
673d14c5d2SYehuda Sadeh /*
683d14c5d2SYehuda Sadeh  * the generic auth code decode the global_id, and we carry no actual
693d14c5d2SYehuda Sadeh  * authenticate state, so nothing happens here.
703d14c5d2SYehuda Sadeh  */
713d14c5d2SYehuda Sadeh static int handle_reply(struct ceph_auth_client *ac, int result,
723d14c5d2SYehuda Sadeh 			void *buf, void *end)
733d14c5d2SYehuda Sadeh {
743d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi = ac->private;
753d14c5d2SYehuda Sadeh 
763d14c5d2SYehuda Sadeh 	xi->starting = false;
773d14c5d2SYehuda Sadeh 	return result;
783d14c5d2SYehuda Sadeh }
793d14c5d2SYehuda Sadeh 
806c1ea260SIlya Dryomov static void ceph_auth_none_destroy_authorizer(struct ceph_authorizer *a)
816c1ea260SIlya Dryomov {
826c1ea260SIlya Dryomov 	kfree(a);
836c1ea260SIlya Dryomov }
846c1ea260SIlya Dryomov 
853d14c5d2SYehuda Sadeh /*
866c1ea260SIlya Dryomov  * build an 'authorizer' with our entity_name and global_id.  it is
876c1ea260SIlya Dryomov  * identical for all services we connect to.
883d14c5d2SYehuda Sadeh  */
893d14c5d2SYehuda Sadeh static int ceph_auth_none_create_authorizer(
903d14c5d2SYehuda Sadeh 	struct ceph_auth_client *ac, int peer_type,
9174f1869fSAlex Elder 	struct ceph_auth_handshake *auth)
923d14c5d2SYehuda Sadeh {
936c1ea260SIlya Dryomov 	struct ceph_none_authorizer *au;
943d14c5d2SYehuda Sadeh 	int ret;
953d14c5d2SYehuda Sadeh 
966c1ea260SIlya Dryomov 	au = kmalloc(sizeof(*au), GFP_NOFS);
976c1ea260SIlya Dryomov 	if (!au)
986c1ea260SIlya Dryomov 		return -ENOMEM;
996c1ea260SIlya Dryomov 
1006c1ea260SIlya Dryomov 	au->base.destroy = ceph_auth_none_destroy_authorizer;
1016c1ea260SIlya Dryomov 
1026c1ea260SIlya Dryomov 	ret = ceph_auth_none_build_authorizer(ac, au);
1036c1ea260SIlya Dryomov 	if (ret) {
1046c1ea260SIlya Dryomov 		kfree(au);
1056c1ea260SIlya Dryomov 		return ret;
1063d14c5d2SYehuda Sadeh 	}
1073d14c5d2SYehuda Sadeh 
10874f1869fSAlex Elder 	auth->authorizer = (struct ceph_authorizer *) au;
10974f1869fSAlex Elder 	auth->authorizer_buf = au->buf;
11074f1869fSAlex Elder 	auth->authorizer_buf_len = au->buf_len;
11174f1869fSAlex Elder 	auth->authorizer_reply_buf = au->reply_buf;
11274f1869fSAlex Elder 	auth->authorizer_reply_buf_len = sizeof (au->reply_buf);
11374f1869fSAlex Elder 
1143d14c5d2SYehuda Sadeh 	return 0;
1153d14c5d2SYehuda Sadeh }
1163d14c5d2SYehuda Sadeh 
1173d14c5d2SYehuda Sadeh static const struct ceph_auth_client_ops ceph_auth_none_ops = {
1183d14c5d2SYehuda Sadeh 	.name = "none",
1193d14c5d2SYehuda Sadeh 	.reset = reset,
1203d14c5d2SYehuda Sadeh 	.destroy = destroy,
1213d14c5d2SYehuda Sadeh 	.is_authenticated = is_authenticated,
1223d14c5d2SYehuda Sadeh 	.should_authenticate = should_authenticate,
1232cb33cacSTyler Hicks 	.build_request = build_request,
1243d14c5d2SYehuda Sadeh 	.handle_reply = handle_reply,
1253d14c5d2SYehuda Sadeh 	.create_authorizer = ceph_auth_none_create_authorizer,
1263d14c5d2SYehuda Sadeh };
1273d14c5d2SYehuda Sadeh 
1283d14c5d2SYehuda Sadeh int ceph_auth_none_init(struct ceph_auth_client *ac)
1293d14c5d2SYehuda Sadeh {
1303d14c5d2SYehuda Sadeh 	struct ceph_auth_none_info *xi;
1313d14c5d2SYehuda Sadeh 
1323d14c5d2SYehuda Sadeh 	dout("ceph_auth_none_init %p\n", ac);
1333d14c5d2SYehuda Sadeh 	xi = kzalloc(sizeof(*xi), GFP_NOFS);
1343d14c5d2SYehuda Sadeh 	if (!xi)
1353d14c5d2SYehuda Sadeh 		return -ENOMEM;
1363d14c5d2SYehuda Sadeh 
1373d14c5d2SYehuda Sadeh 	xi->starting = true;
1383d14c5d2SYehuda Sadeh 
1393d14c5d2SYehuda Sadeh 	ac->protocol = CEPH_AUTH_NONE;
1403d14c5d2SYehuda Sadeh 	ac->private = xi;
1413d14c5d2SYehuda Sadeh 	ac->ops = &ceph_auth_none_ops;
1423d14c5d2SYehuda Sadeh 	return 0;
1433d14c5d2SYehuda Sadeh }
1443d14c5d2SYehuda Sadeh 
145