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 15static void reset(struct ceph_auth_client *ac) 16{ 17 struct ceph_auth_none_info *xi = ac->private; 18 19 xi->starting = true; 20} 21 22static void destroy(struct ceph_auth_client *ac) 23{ 24 kfree(ac->private); 25 ac->private = NULL; 26} 27 28static 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 35static 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 42static 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 59e_range: 60 return -ERANGE; 61} 62 63static 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 */ 72static int handle_reply(struct ceph_auth_client *ac, int result, 73 void *buf, void *end) 74{ 75 struct ceph_auth_none_info *xi = ac->private; 76 77 xi->starting = false; 78 return result; 79} 80 81static void ceph_auth_none_destroy_authorizer(struct ceph_authorizer *a) 82{ 83 kfree(a); 84} 85 86/* 87 * build an 'authorizer' with our entity_name and global_id. it is 88 * identical for all services we connect to. 89 */ 90static int ceph_auth_none_create_authorizer( 91 struct ceph_auth_client *ac, int peer_type, 92 struct ceph_auth_handshake *auth) 93{ 94 struct ceph_none_authorizer *au; 95 int ret; 96 97 au = kmalloc(sizeof(*au), GFP_NOFS); 98 if (!au) 99 return -ENOMEM; 100 101 au->base.destroy = ceph_auth_none_destroy_authorizer; 102 103 ret = ceph_auth_none_build_authorizer(ac, au); 104 if (ret) { 105 kfree(au); 106 return ret; 107 } 108 109 auth->authorizer = (struct ceph_authorizer *) au; 110 auth->authorizer_buf = au->buf; 111 auth->authorizer_buf_len = au->buf_len; 112 auth->authorizer_reply_buf = au->reply_buf; 113 auth->authorizer_reply_buf_len = sizeof (au->reply_buf); 114 115 return 0; 116} 117 118static const struct ceph_auth_client_ops ceph_auth_none_ops = { 119 .name = "none", 120 .reset = reset, 121 .destroy = destroy, 122 .is_authenticated = is_authenticated, 123 .should_authenticate = should_authenticate, 124 .build_request = build_request, 125 .handle_reply = handle_reply, 126 .create_authorizer = ceph_auth_none_create_authorizer, 127}; 128 129int ceph_auth_none_init(struct ceph_auth_client *ac) 130{ 131 struct ceph_auth_none_info *xi; 132 133 dout("ceph_auth_none_init %p\n", ac); 134 xi = kzalloc(sizeof(*xi), GFP_NOFS); 135 if (!xi) 136 return -ENOMEM; 137 138 xi->starting = true; 139 140 ac->protocol = CEPH_AUTH_NONE; 141 ac->private = xi; 142 ac->ops = &ceph_auth_none_ops; 143 return 0; 144} 145