1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <linux/ceph/ceph_debug.h> 4 5 #include <linux/err.h> 6 #include <linux/module.h> 7 #include <linux/random.h> 8 #include <linux/slab.h> 9 10 #include <linux/ceph/decode.h> 11 #include <linux/ceph/auth.h> 12 13 #include "auth_none.h" 14 15 static void reset(struct ceph_auth_client *ac) 16 { 17 struct ceph_auth_none_info *xi = ac->private; 18 19 xi->starting = true; 20 } 21 22 static void destroy(struct ceph_auth_client *ac) 23 { 24 kfree(ac->private); 25 ac->private = NULL; 26 } 27 28 static int is_authenticated(struct ceph_auth_client *ac) 29 { 30 struct ceph_auth_none_info *xi = ac->private; 31 32 return !xi->starting; 33 } 34 35 static int should_authenticate(struct ceph_auth_client *ac) 36 { 37 struct ceph_auth_none_info *xi = ac->private; 38 39 return xi->starting; 40 } 41 42 static int ceph_auth_none_build_authorizer(struct ceph_auth_client *ac, 43 struct ceph_none_authorizer *au) 44 { 45 void *p = au->buf; 46 void *const end = p + sizeof(au->buf); 47 int ret; 48 49 ceph_encode_8_safe(&p, end, 1, e_range); 50 ret = ceph_auth_entity_name_encode(ac->name, &p, end); 51 if (ret < 0) 52 return ret; 53 54 ceph_encode_64_safe(&p, end, ac->global_id, e_range); 55 au->buf_len = p - (void *)au->buf; 56 dout("%s built authorizer len %d\n", __func__, au->buf_len); 57 return 0; 58 59 e_range: 60 return -ERANGE; 61 } 62 63 static int build_request(struct ceph_auth_client *ac, void *buf, void *end) 64 { 65 return 0; 66 } 67 68 /* 69 * the generic auth code decode the global_id, and we carry no actual 70 * authenticate state, so nothing happens here. 71 */ 72 static int handle_reply(struct ceph_auth_client *ac, int result, 73 void *buf, void *end, u8 *session_key, 74 int *session_key_len, u8 *con_secret, 75 int *con_secret_len) 76 { 77 struct ceph_auth_none_info *xi = ac->private; 78 79 xi->starting = false; 80 return result; 81 } 82 83 static void ceph_auth_none_destroy_authorizer(struct ceph_authorizer *a) 84 { 85 kfree(a); 86 } 87 88 /* 89 * build an 'authorizer' with our entity_name and global_id. it is 90 * identical for all services we connect to. 91 */ 92 static int ceph_auth_none_create_authorizer( 93 struct ceph_auth_client *ac, int peer_type, 94 struct ceph_auth_handshake *auth) 95 { 96 struct ceph_none_authorizer *au; 97 int ret; 98 99 au = kmalloc(sizeof(*au), GFP_NOFS); 100 if (!au) 101 return -ENOMEM; 102 103 au->base.destroy = ceph_auth_none_destroy_authorizer; 104 105 ret = ceph_auth_none_build_authorizer(ac, au); 106 if (ret) { 107 kfree(au); 108 return ret; 109 } 110 111 auth->authorizer = (struct ceph_authorizer *) au; 112 auth->authorizer_buf = au->buf; 113 auth->authorizer_buf_len = au->buf_len; 114 auth->authorizer_reply_buf = au->reply_buf; 115 auth->authorizer_reply_buf_len = sizeof (au->reply_buf); 116 117 return 0; 118 } 119 120 static const struct ceph_auth_client_ops ceph_auth_none_ops = { 121 .reset = reset, 122 .destroy = destroy, 123 .is_authenticated = is_authenticated, 124 .should_authenticate = should_authenticate, 125 .build_request = build_request, 126 .handle_reply = handle_reply, 127 .create_authorizer = ceph_auth_none_create_authorizer, 128 }; 129 130 int ceph_auth_none_init(struct ceph_auth_client *ac) 131 { 132 struct ceph_auth_none_info *xi; 133 134 dout("ceph_auth_none_init %p\n", ac); 135 xi = kzalloc(sizeof(*xi), GFP_NOFS); 136 if (!xi) 137 return -ENOMEM; 138 139 xi->starting = true; 140 141 ac->protocol = CEPH_AUTH_NONE; 142 ac->private = xi; 143 ac->ops = &ceph_auth_none_ops; 144 return 0; 145 } 146