162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/ceph/ceph_debug.h>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/err.h>
662306a36Sopenharmony_ci#include <linux/module.h>
762306a36Sopenharmony_ci#include <linux/random.h>
862306a36Sopenharmony_ci#include <linux/slab.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/ceph/decode.h>
1162306a36Sopenharmony_ci#include <linux/ceph/auth.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "auth_none.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic void reset(struct ceph_auth_client *ac)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	struct ceph_auth_none_info *xi = ac->private;
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci	xi->starting = true;
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic void destroy(struct ceph_auth_client *ac)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	kfree(ac->private);
2562306a36Sopenharmony_ci	ac->private = NULL;
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic int is_authenticated(struct ceph_auth_client *ac)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	struct ceph_auth_none_info *xi = ac->private;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	return !xi->starting;
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic int should_authenticate(struct ceph_auth_client *ac)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	struct ceph_auth_none_info *xi = ac->private;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	return xi->starting;
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic int ceph_auth_none_build_authorizer(struct ceph_auth_client *ac,
4362306a36Sopenharmony_ci					   struct ceph_none_authorizer *au)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	void *p = au->buf;
4662306a36Sopenharmony_ci	void *const end = p + sizeof(au->buf);
4762306a36Sopenharmony_ci	int ret;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	ceph_encode_8_safe(&p, end, 1, e_range);
5062306a36Sopenharmony_ci	ret = ceph_auth_entity_name_encode(ac->name, &p, end);
5162306a36Sopenharmony_ci	if (ret < 0)
5262306a36Sopenharmony_ci		return ret;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	ceph_encode_64_safe(&p, end, ac->global_id, e_range);
5562306a36Sopenharmony_ci	au->buf_len = p - (void *)au->buf;
5662306a36Sopenharmony_ci	dout("%s built authorizer len %d\n", __func__, au->buf_len);
5762306a36Sopenharmony_ci	return 0;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cie_range:
6062306a36Sopenharmony_ci	return -ERANGE;
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic int build_request(struct ceph_auth_client *ac, void *buf, void *end)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	return 0;
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/*
6962306a36Sopenharmony_ci * the generic auth code decode the global_id, and we carry no actual
7062306a36Sopenharmony_ci * authenticate state, so nothing happens here.
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_cistatic int handle_reply(struct ceph_auth_client *ac, u64 global_id,
7362306a36Sopenharmony_ci			void *buf, void *end, u8 *session_key,
7462306a36Sopenharmony_ci			int *session_key_len, u8 *con_secret,
7562306a36Sopenharmony_ci			int *con_secret_len)
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci	struct ceph_auth_none_info *xi = ac->private;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	xi->starting = false;
8062306a36Sopenharmony_ci	ceph_auth_set_global_id(ac, global_id);
8162306a36Sopenharmony_ci	return 0;
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistatic void ceph_auth_none_destroy_authorizer(struct ceph_authorizer *a)
8562306a36Sopenharmony_ci{
8662306a36Sopenharmony_ci	kfree(a);
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci/*
9062306a36Sopenharmony_ci * build an 'authorizer' with our entity_name and global_id.  it is
9162306a36Sopenharmony_ci * identical for all services we connect to.
9262306a36Sopenharmony_ci */
9362306a36Sopenharmony_cistatic int ceph_auth_none_create_authorizer(
9462306a36Sopenharmony_ci	struct ceph_auth_client *ac, int peer_type,
9562306a36Sopenharmony_ci	struct ceph_auth_handshake *auth)
9662306a36Sopenharmony_ci{
9762306a36Sopenharmony_ci	struct ceph_none_authorizer *au;
9862306a36Sopenharmony_ci	int ret;
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	au = kmalloc(sizeof(*au), GFP_NOFS);
10162306a36Sopenharmony_ci	if (!au)
10262306a36Sopenharmony_ci		return -ENOMEM;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	au->base.destroy = ceph_auth_none_destroy_authorizer;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	ret = ceph_auth_none_build_authorizer(ac, au);
10762306a36Sopenharmony_ci	if (ret) {
10862306a36Sopenharmony_ci		kfree(au);
10962306a36Sopenharmony_ci		return ret;
11062306a36Sopenharmony_ci	}
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	auth->authorizer = (struct ceph_authorizer *) au;
11362306a36Sopenharmony_ci	auth->authorizer_buf = au->buf;
11462306a36Sopenharmony_ci	auth->authorizer_buf_len = au->buf_len;
11562306a36Sopenharmony_ci	auth->authorizer_reply_buf = NULL;
11662306a36Sopenharmony_ci	auth->authorizer_reply_buf_len = 0;
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	return 0;
11962306a36Sopenharmony_ci}
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_cistatic const struct ceph_auth_client_ops ceph_auth_none_ops = {
12262306a36Sopenharmony_ci	.reset = reset,
12362306a36Sopenharmony_ci	.destroy = destroy,
12462306a36Sopenharmony_ci	.is_authenticated = is_authenticated,
12562306a36Sopenharmony_ci	.should_authenticate = should_authenticate,
12662306a36Sopenharmony_ci	.build_request = build_request,
12762306a36Sopenharmony_ci	.handle_reply = handle_reply,
12862306a36Sopenharmony_ci	.create_authorizer = ceph_auth_none_create_authorizer,
12962306a36Sopenharmony_ci};
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ciint ceph_auth_none_init(struct ceph_auth_client *ac)
13262306a36Sopenharmony_ci{
13362306a36Sopenharmony_ci	struct ceph_auth_none_info *xi;
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	dout("ceph_auth_none_init %p\n", ac);
13662306a36Sopenharmony_ci	xi = kzalloc(sizeof(*xi), GFP_NOFS);
13762306a36Sopenharmony_ci	if (!xi)
13862306a36Sopenharmony_ci		return -ENOMEM;
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	xi->starting = true;
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci	ac->protocol = CEPH_AUTH_NONE;
14362306a36Sopenharmony_ci	ac->private = xi;
14462306a36Sopenharmony_ci	ac->ops = &ceph_auth_none_ops;
14562306a36Sopenharmony_ci	return 0;
14662306a36Sopenharmony_ci}
147