18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci#include <linux/ceph/ceph_debug.h>
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/err.h>
68c2ecf20Sopenharmony_ci#include <linux/module.h>
78c2ecf20Sopenharmony_ci#include <linux/random.h>
88c2ecf20Sopenharmony_ci#include <linux/slab.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/ceph/decode.h>
118c2ecf20Sopenharmony_ci#include <linux/ceph/auth.h>
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include "auth_none.h"
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_cistatic void reset(struct ceph_auth_client *ac)
168c2ecf20Sopenharmony_ci{
178c2ecf20Sopenharmony_ci	struct ceph_auth_none_info *xi = ac->private;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	xi->starting = true;
208c2ecf20Sopenharmony_ci}
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistatic void destroy(struct ceph_auth_client *ac)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	kfree(ac->private);
258c2ecf20Sopenharmony_ci	ac->private = NULL;
268c2ecf20Sopenharmony_ci}
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistatic int is_authenticated(struct ceph_auth_client *ac)
298c2ecf20Sopenharmony_ci{
308c2ecf20Sopenharmony_ci	struct ceph_auth_none_info *xi = ac->private;
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	return !xi->starting;
338c2ecf20Sopenharmony_ci}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic int should_authenticate(struct ceph_auth_client *ac)
368c2ecf20Sopenharmony_ci{
378c2ecf20Sopenharmony_ci	struct ceph_auth_none_info *xi = ac->private;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	return xi->starting;
408c2ecf20Sopenharmony_ci}
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_cistatic int ceph_auth_none_build_authorizer(struct ceph_auth_client *ac,
438c2ecf20Sopenharmony_ci					   struct ceph_none_authorizer *au)
448c2ecf20Sopenharmony_ci{
458c2ecf20Sopenharmony_ci	void *p = au->buf;
468c2ecf20Sopenharmony_ci	void *const end = p + sizeof(au->buf);
478c2ecf20Sopenharmony_ci	int ret;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	ceph_encode_8_safe(&p, end, 1, e_range);
508c2ecf20Sopenharmony_ci	ret = ceph_auth_entity_name_encode(ac->name, &p, end);
518c2ecf20Sopenharmony_ci	if (ret < 0)
528c2ecf20Sopenharmony_ci		return ret;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	ceph_encode_64_safe(&p, end, ac->global_id, e_range);
558c2ecf20Sopenharmony_ci	au->buf_len = p - (void *)au->buf;
568c2ecf20Sopenharmony_ci	dout("%s built authorizer len %d\n", __func__, au->buf_len);
578c2ecf20Sopenharmony_ci	return 0;
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_cie_range:
608c2ecf20Sopenharmony_ci	return -ERANGE;
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_cistatic int build_request(struct ceph_auth_client *ac, void *buf, void *end)
648c2ecf20Sopenharmony_ci{
658c2ecf20Sopenharmony_ci	return 0;
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci/*
698c2ecf20Sopenharmony_ci * the generic auth code decode the global_id, and we carry no actual
708c2ecf20Sopenharmony_ci * authenticate state, so nothing happens here.
718c2ecf20Sopenharmony_ci */
728c2ecf20Sopenharmony_cistatic int handle_reply(struct ceph_auth_client *ac, int result,
738c2ecf20Sopenharmony_ci			void *buf, void *end)
748c2ecf20Sopenharmony_ci{
758c2ecf20Sopenharmony_ci	struct ceph_auth_none_info *xi = ac->private;
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	xi->starting = false;
788c2ecf20Sopenharmony_ci	return result;
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistatic void ceph_auth_none_destroy_authorizer(struct ceph_authorizer *a)
828c2ecf20Sopenharmony_ci{
838c2ecf20Sopenharmony_ci	kfree(a);
848c2ecf20Sopenharmony_ci}
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci/*
878c2ecf20Sopenharmony_ci * build an 'authorizer' with our entity_name and global_id.  it is
888c2ecf20Sopenharmony_ci * identical for all services we connect to.
898c2ecf20Sopenharmony_ci */
908c2ecf20Sopenharmony_cistatic int ceph_auth_none_create_authorizer(
918c2ecf20Sopenharmony_ci	struct ceph_auth_client *ac, int peer_type,
928c2ecf20Sopenharmony_ci	struct ceph_auth_handshake *auth)
938c2ecf20Sopenharmony_ci{
948c2ecf20Sopenharmony_ci	struct ceph_none_authorizer *au;
958c2ecf20Sopenharmony_ci	int ret;
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	au = kmalloc(sizeof(*au), GFP_NOFS);
988c2ecf20Sopenharmony_ci	if (!au)
998c2ecf20Sopenharmony_ci		return -ENOMEM;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	au->base.destroy = ceph_auth_none_destroy_authorizer;
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci	ret = ceph_auth_none_build_authorizer(ac, au);
1048c2ecf20Sopenharmony_ci	if (ret) {
1058c2ecf20Sopenharmony_ci		kfree(au);
1068c2ecf20Sopenharmony_ci		return ret;
1078c2ecf20Sopenharmony_ci	}
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	auth->authorizer = (struct ceph_authorizer *) au;
1108c2ecf20Sopenharmony_ci	auth->authorizer_buf = au->buf;
1118c2ecf20Sopenharmony_ci	auth->authorizer_buf_len = au->buf_len;
1128c2ecf20Sopenharmony_ci	auth->authorizer_reply_buf = au->reply_buf;
1138c2ecf20Sopenharmony_ci	auth->authorizer_reply_buf_len = sizeof (au->reply_buf);
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	return 0;
1168c2ecf20Sopenharmony_ci}
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_cistatic const struct ceph_auth_client_ops ceph_auth_none_ops = {
1198c2ecf20Sopenharmony_ci	.name = "none",
1208c2ecf20Sopenharmony_ci	.reset = reset,
1218c2ecf20Sopenharmony_ci	.destroy = destroy,
1228c2ecf20Sopenharmony_ci	.is_authenticated = is_authenticated,
1238c2ecf20Sopenharmony_ci	.should_authenticate = should_authenticate,
1248c2ecf20Sopenharmony_ci	.build_request = build_request,
1258c2ecf20Sopenharmony_ci	.handle_reply = handle_reply,
1268c2ecf20Sopenharmony_ci	.create_authorizer = ceph_auth_none_create_authorizer,
1278c2ecf20Sopenharmony_ci};
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ciint ceph_auth_none_init(struct ceph_auth_client *ac)
1308c2ecf20Sopenharmony_ci{
1318c2ecf20Sopenharmony_ci	struct ceph_auth_none_info *xi;
1328c2ecf20Sopenharmony_ci
1338c2ecf20Sopenharmony_ci	dout("ceph_auth_none_init %p\n", ac);
1348c2ecf20Sopenharmony_ci	xi = kzalloc(sizeof(*xi), GFP_NOFS);
1358c2ecf20Sopenharmony_ci	if (!xi)
1368c2ecf20Sopenharmony_ci		return -ENOMEM;
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci	xi->starting = true;
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	ac->protocol = CEPH_AUTH_NONE;
1418c2ecf20Sopenharmony_ci	ac->private = xi;
1428c2ecf20Sopenharmony_ci	ac->ops = &ceph_auth_none_ops;
1438c2ecf20Sopenharmony_ci	return 0;
1448c2ecf20Sopenharmony_ci}
145