blob: a6747789fe5c25679d99fcc42b74042ea29251a3 [file] [log] [blame]
Sage Weil4e7a5dc2009-11-18 16:19:57 -08001#ifndef _FS_CEPH_AUTH_H
2#define _FS_CEPH_AUTH_H
3
Yehuda Sadeh3d14c5d2010-04-06 15:14:15 -07004#include <linux/ceph/types.h>
5#include <linux/ceph/buffer.h>
Sage Weil4e7a5dc2009-11-18 16:19:57 -08006
7/*
8 * Abstract interface for communicating with the authenticate module.
9 * There is some handshake that takes place between us and the monitor
10 * to acquire the necessary keys. These are used to generate an
11 * 'authorizer' that we use when connecting to a service (mds, osd).
12 */
13
14struct ceph_auth_client;
Yan, Zheng33d07332014-11-04 16:33:37 +080015struct ceph_msg;
Sage Weil4e7a5dc2009-11-18 16:19:57 -080016
Ilya Dryomov6c1ea262016-04-11 19:34:49 +020017struct ceph_authorizer {
18 void (*destroy)(struct ceph_authorizer *);
19};
20
Alex Elder6c4a1912012-05-16 15:16:38 -050021struct ceph_auth_handshake {
22 struct ceph_authorizer *authorizer;
23 void *authorizer_buf;
24 size_t authorizer_buf_len;
25 void *authorizer_reply_buf;
26 size_t authorizer_reply_buf_len;
Yan, Zheng33d07332014-11-04 16:33:37 +080027 int (*sign_message)(struct ceph_auth_handshake *auth,
28 struct ceph_msg *msg);
29 int (*check_message_signature)(struct ceph_auth_handshake *auth,
30 struct ceph_msg *msg);
Alex Elder6c4a1912012-05-16 15:16:38 -050031};
32
Sage Weil4e7a5dc2009-11-18 16:19:57 -080033struct ceph_auth_client_ops {
Sage Weil559c1e02010-05-14 09:55:18 -070034 const char *name;
35
Sage Weil4e7a5dc2009-11-18 16:19:57 -080036 /*
37 * true if we are authenticated and can connect to
38 * services.
39 */
40 int (*is_authenticated)(struct ceph_auth_client *ac);
41
42 /*
Sage Weila41359f2010-05-25 15:39:06 -070043 * true if we should (re)authenticate, e.g., when our tickets
44 * are getting old and crusty.
45 */
46 int (*should_authenticate)(struct ceph_auth_client *ac);
47
48 /*
Sage Weil4e7a5dc2009-11-18 16:19:57 -080049 * build requests and process replies during monitor
50 * handshake. if handle_reply returns -EAGAIN, we build
51 * another request.
52 */
53 int (*build_request)(struct ceph_auth_client *ac, void *buf, void *end);
54 int (*handle_reply)(struct ceph_auth_client *ac, int result,
55 void *buf, void *end);
56
57 /*
58 * Create authorizer for connecting to a service, and verify
59 * the response to authenticate the service.
60 */
61 int (*create_authorizer)(struct ceph_auth_client *ac, int peer_type,
Alex Elder74f18692012-05-16 15:16:39 -050062 struct ceph_auth_handshake *auth);
Sage Weil0bed9b52013-03-25 10:26:01 -070063 /* ensure that an existing authorizer is up to date */
64 int (*update_authorizer)(struct ceph_auth_client *ac, int peer_type,
65 struct ceph_auth_handshake *auth);
Sage Weil4e7a5dc2009-11-18 16:19:57 -080066 int (*verify_authorizer_reply)(struct ceph_auth_client *ac,
Ilya Dryomov0dde5842016-12-02 16:35:09 +010067 struct ceph_authorizer *a);
Sage Weil9bd2e6f2010-02-02 16:21:06 -080068 void (*invalidate_authorizer)(struct ceph_auth_client *ac,
69 int peer_type);
Sage Weil4e7a5dc2009-11-18 16:19:57 -080070
71 /* reset when we (re)connect to a monitor */
72 void (*reset)(struct ceph_auth_client *ac);
73
74 void (*destroy)(struct ceph_auth_client *ac);
Yan, Zheng33d07332014-11-04 16:33:37 +080075
76 int (*sign_message)(struct ceph_auth_handshake *auth,
77 struct ceph_msg *msg);
78 int (*check_message_signature)(struct ceph_auth_handshake *auth,
79 struct ceph_msg *msg);
Sage Weil4e7a5dc2009-11-18 16:19:57 -080080};
81
82struct ceph_auth_client {
83 u32 protocol; /* CEPH_AUTH_* */
84 void *private; /* for use by protocol implementation */
85 const struct ceph_auth_client_ops *ops; /* null iff protocol==0 */
86
87 bool negotiating; /* true if negotiating protocol */
88 const char *name; /* entity name */
89 u64 global_id; /* our unique id in system */
Tommi Virtanen8323c3a2011-03-25 16:32:57 -070090 const struct ceph_crypto_key *key; /* our secret key */
Sage Weil4e7a5dc2009-11-18 16:19:57 -080091 unsigned want_keys; /* which services we want */
Sage Weile9966072013-03-25 10:26:30 -070092
93 struct mutex mutex;
Sage Weil4e7a5dc2009-11-18 16:19:57 -080094};
95
96extern struct ceph_auth_client *ceph_auth_init(const char *name,
Tommi Virtanen8323c3a2011-03-25 16:32:57 -070097 const struct ceph_crypto_key *key);
Sage Weil4e7a5dc2009-11-18 16:19:57 -080098extern void ceph_auth_destroy(struct ceph_auth_client *ac);
99
100extern void ceph_auth_reset(struct ceph_auth_client *ac);
101
102extern int ceph_auth_build_hello(struct ceph_auth_client *ac,
103 void *buf, size_t len);
104extern int ceph_handle_auth_reply(struct ceph_auth_client *ac,
105 void *buf, size_t len,
106 void *reply_buf, size_t reply_len);
Ilya Dryomovf01d5cb2016-06-02 16:45:08 +0200107int ceph_auth_entity_name_encode(const char *name, void **p, void *end);
Sage Weil4e7a5dc2009-11-18 16:19:57 -0800108
Sage Weil9bd2e6f2010-02-02 16:21:06 -0800109extern int ceph_build_auth(struct ceph_auth_client *ac,
110 void *msg_buf, size_t msg_len);
111
112extern int ceph_auth_is_authenticated(struct ceph_auth_client *ac);
Sage Weil27859f92013-03-25 10:26:14 -0700113extern int ceph_auth_create_authorizer(struct ceph_auth_client *ac,
114 int peer_type,
115 struct ceph_auth_handshake *auth);
Ilya Dryomov6c1ea262016-04-11 19:34:49 +0200116void ceph_auth_destroy_authorizer(struct ceph_authorizer *a);
Sage Weil27859f92013-03-25 10:26:14 -0700117extern int ceph_auth_update_authorizer(struct ceph_auth_client *ac,
118 int peer_type,
119 struct ceph_auth_handshake *a);
120extern int ceph_auth_verify_authorizer_reply(struct ceph_auth_client *ac,
Ilya Dryomov0dde5842016-12-02 16:35:09 +0100121 struct ceph_authorizer *a);
Sage Weil27859f92013-03-25 10:26:14 -0700122extern void ceph_auth_invalidate_authorizer(struct ceph_auth_client *ac,
123 int peer_type);
Sage Weil9bd2e6f2010-02-02 16:21:06 -0800124
Yan, Zheng33d07332014-11-04 16:33:37 +0800125static inline int ceph_auth_sign_message(struct ceph_auth_handshake *auth,
126 struct ceph_msg *msg)
127{
128 if (auth->sign_message)
129 return auth->sign_message(auth, msg);
130 return 0;
131}
132
133static inline
134int ceph_auth_check_message_signature(struct ceph_auth_handshake *auth,
135 struct ceph_msg *msg)
136{
137 if (auth->check_message_signature)
138 return auth->check_message_signature(auth, msg);
139 return 0;
140}
Sage Weil4e7a5dc2009-11-18 16:19:57 -0800141#endif