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 41*6c1ea260SIlya Dryomov static int ceph_auth_none_build_authorizer(struct ceph_auth_client *ac, 42*6c1ea260SIlya Dryomov struct ceph_none_authorizer *au) 43*6c1ea260SIlya Dryomov { 44*6c1ea260SIlya Dryomov void *p = au->buf; 45*6c1ea260SIlya Dryomov void *const end = p + sizeof(au->buf); 46*6c1ea260SIlya Dryomov int ret; 47*6c1ea260SIlya Dryomov 48*6c1ea260SIlya Dryomov ceph_encode_8_safe(&p, end, 1, e_range); 49*6c1ea260SIlya Dryomov ret = ceph_entity_name_encode(ac->name, &p, end); 50*6c1ea260SIlya Dryomov if (ret < 0) 51*6c1ea260SIlya Dryomov return ret; 52*6c1ea260SIlya Dryomov 53*6c1ea260SIlya Dryomov ceph_encode_64_safe(&p, end, ac->global_id, e_range); 54*6c1ea260SIlya Dryomov au->buf_len = p - (void *)au->buf; 55*6c1ea260SIlya Dryomov dout("%s built authorizer len %d\n", __func__, au->buf_len); 56*6c1ea260SIlya Dryomov return 0; 57*6c1ea260SIlya Dryomov 58*6c1ea260SIlya Dryomov e_range: 59*6c1ea260SIlya Dryomov return -ERANGE; 60*6c1ea260SIlya Dryomov } 61*6c1ea260SIlya 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 80*6c1ea260SIlya Dryomov static void ceph_auth_none_destroy_authorizer(struct ceph_authorizer *a) 81*6c1ea260SIlya Dryomov { 82*6c1ea260SIlya Dryomov kfree(a); 83*6c1ea260SIlya Dryomov } 84*6c1ea260SIlya Dryomov 853d14c5d2SYehuda Sadeh /* 86*6c1ea260SIlya Dryomov * build an 'authorizer' with our entity_name and global_id. it is 87*6c1ea260SIlya 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 { 93*6c1ea260SIlya Dryomov struct ceph_none_authorizer *au; 943d14c5d2SYehuda Sadeh int ret; 953d14c5d2SYehuda Sadeh 96*6c1ea260SIlya Dryomov au = kmalloc(sizeof(*au), GFP_NOFS); 97*6c1ea260SIlya Dryomov if (!au) 98*6c1ea260SIlya Dryomov return -ENOMEM; 99*6c1ea260SIlya Dryomov 100*6c1ea260SIlya Dryomov au->base.destroy = ceph_auth_none_destroy_authorizer; 101*6c1ea260SIlya Dryomov 102*6c1ea260SIlya Dryomov ret = ceph_auth_none_build_authorizer(ac, au); 103*6c1ea260SIlya Dryomov if (ret) { 104*6c1ea260SIlya Dryomov kfree(au); 105*6c1ea260SIlya 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