diff options
| -rw-r--r-- | fs/ceph/super.c | 2 | ||||
| -rw-r--r-- | include/linux/ceph/auth.h | 4 | ||||
| -rw-r--r-- | include/linux/ceph/libceph.h | 2 | ||||
| -rw-r--r-- | net/ceph/auth.c | 8 | ||||
| -rw-r--r-- | net/ceph/auth_x.c | 8 | ||||
| -rw-r--r-- | net/ceph/ceph_common.c | 43 | ||||
| -rw-r--r-- | net/ceph/crypto.c | 11 | ||||
| -rw-r--r-- | net/ceph/crypto.h | 2 | ||||
| -rw-r--r-- | net/ceph/mon_client.c | 2 |
9 files changed, 63 insertions, 19 deletions
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index a9e78b4a258c..f2f77fd3c14c 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
| @@ -353,7 +353,7 @@ static int ceph_show_options(struct seq_file *m, struct vfsmount *mnt) | |||
| 353 | 353 | ||
| 354 | if (opt->name) | 354 | if (opt->name) |
| 355 | seq_printf(m, ",name=%s", opt->name); | 355 | seq_printf(m, ",name=%s", opt->name); |
| 356 | if (opt->secret) | 356 | if (opt->key) |
| 357 | seq_puts(m, ",secret=<hidden>"); | 357 | seq_puts(m, ",secret=<hidden>"); |
| 358 | 358 | ||
| 359 | if (opt->mount_timeout != CEPH_MOUNT_TIMEOUT_DEFAULT) | 359 | if (opt->mount_timeout != CEPH_MOUNT_TIMEOUT_DEFAULT) |
diff --git a/include/linux/ceph/auth.h b/include/linux/ceph/auth.h index 7fff521d7eb5..aa13392a7efb 100644 --- a/include/linux/ceph/auth.h +++ b/include/linux/ceph/auth.h | |||
| @@ -67,12 +67,12 @@ struct ceph_auth_client { | |||
| 67 | bool negotiating; /* true if negotiating protocol */ | 67 | bool negotiating; /* true if negotiating protocol */ |
| 68 | const char *name; /* entity name */ | 68 | const char *name; /* entity name */ |
| 69 | u64 global_id; /* our unique id in system */ | 69 | u64 global_id; /* our unique id in system */ |
| 70 | const char *secret; /* our secret key */ | 70 | const struct ceph_crypto_key *key; /* our secret key */ |
| 71 | unsigned want_keys; /* which services we want */ | 71 | unsigned want_keys; /* which services we want */ |
| 72 | }; | 72 | }; |
| 73 | 73 | ||
| 74 | extern struct ceph_auth_client *ceph_auth_init(const char *name, | 74 | extern struct ceph_auth_client *ceph_auth_init(const char *name, |
| 75 | const char *secret); | 75 | const struct ceph_crypto_key *key); |
| 76 | extern void ceph_auth_destroy(struct ceph_auth_client *ac); | 76 | extern void ceph_auth_destroy(struct ceph_auth_client *ac); |
| 77 | 77 | ||
| 78 | extern void ceph_auth_reset(struct ceph_auth_client *ac); | 78 | extern void ceph_auth_reset(struct ceph_auth_client *ac); |
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h index 0d2e0fffb470..6365f041745b 100644 --- a/include/linux/ceph/libceph.h +++ b/include/linux/ceph/libceph.h | |||
| @@ -61,7 +61,7 @@ struct ceph_options { | |||
| 61 | pointer type of args */ | 61 | pointer type of args */ |
| 62 | int num_mon; | 62 | int num_mon; |
| 63 | char *name; | 63 | char *name; |
| 64 | char *secret; | 64 | struct ceph_crypto_key *key; |
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | /* | 67 | /* |
diff --git a/net/ceph/auth.c b/net/ceph/auth.c index 549c1f43e1d5..b4bf4ac090f1 100644 --- a/net/ceph/auth.c +++ b/net/ceph/auth.c | |||
| @@ -35,12 +35,12 @@ static int ceph_auth_init_protocol(struct ceph_auth_client *ac, int protocol) | |||
| 35 | /* | 35 | /* |
| 36 | * setup, teardown. | 36 | * setup, teardown. |
| 37 | */ | 37 | */ |
| 38 | struct ceph_auth_client *ceph_auth_init(const char *name, const char *secret) | 38 | struct ceph_auth_client *ceph_auth_init(const char *name, const struct ceph_crypto_key *key) |
| 39 | { | 39 | { |
| 40 | struct ceph_auth_client *ac; | 40 | struct ceph_auth_client *ac; |
| 41 | int ret; | 41 | int ret; |
| 42 | 42 | ||
| 43 | dout("auth_init name '%s' secret '%s'\n", name, secret); | 43 | dout("auth_init name '%s'\n", name); |
| 44 | 44 | ||
| 45 | ret = -ENOMEM; | 45 | ret = -ENOMEM; |
| 46 | ac = kzalloc(sizeof(*ac), GFP_NOFS); | 46 | ac = kzalloc(sizeof(*ac), GFP_NOFS); |
| @@ -52,8 +52,8 @@ struct ceph_auth_client *ceph_auth_init(const char *name, const char *secret) | |||
| 52 | ac->name = name; | 52 | ac->name = name; |
| 53 | else | 53 | else |
| 54 | ac->name = CEPH_AUTH_NAME_DEFAULT; | 54 | ac->name = CEPH_AUTH_NAME_DEFAULT; |
| 55 | dout("auth_init name %s secret %s\n", ac->name, secret); | 55 | dout("auth_init name %s\n", ac->name); |
| 56 | ac->secret = secret; | 56 | ac->key = key; |
| 57 | return ac; | 57 | return ac; |
| 58 | 58 | ||
| 59 | out: | 59 | out: |
diff --git a/net/ceph/auth_x.c b/net/ceph/auth_x.c index 7fd5dfcf6e18..1587dc6010c6 100644 --- a/net/ceph/auth_x.c +++ b/net/ceph/auth_x.c | |||
| @@ -662,14 +662,16 @@ int ceph_x_init(struct ceph_auth_client *ac) | |||
| 662 | goto out; | 662 | goto out; |
| 663 | 663 | ||
| 664 | ret = -EINVAL; | 664 | ret = -EINVAL; |
| 665 | if (!ac->secret) { | 665 | if (!ac->key) { |
| 666 | pr_err("no secret set (for auth_x protocol)\n"); | 666 | pr_err("no secret set (for auth_x protocol)\n"); |
| 667 | goto out_nomem; | 667 | goto out_nomem; |
| 668 | } | 668 | } |
| 669 | 669 | ||
| 670 | ret = ceph_crypto_key_unarmor(&xi->secret, ac->secret); | 670 | ret = ceph_crypto_key_clone(&xi->secret, ac->key); |
| 671 | if (ret) | 671 | if (ret < 0) { |
| 672 | pr_err("cannot clone key: %d\n", ret); | ||
| 672 | goto out_nomem; | 673 | goto out_nomem; |
| 674 | } | ||
| 673 | 675 | ||
| 674 | xi->starting = true; | 676 | xi->starting = true; |
| 675 | xi->ticket_handlers = RB_ROOT; | 677 | xi->ticket_handlers = RB_ROOT; |
diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c index 9bbb356b12e7..02e084f29d24 100644 --- a/net/ceph/ceph_common.c +++ b/net/ceph/ceph_common.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/ceph/decode.h> | 20 | #include <linux/ceph/decode.h> |
| 21 | #include <linux/ceph/mon_client.h> | 21 | #include <linux/ceph/mon_client.h> |
| 22 | #include <linux/ceph/auth.h> | 22 | #include <linux/ceph/auth.h> |
| 23 | #include "crypto.h" | ||
| 23 | 24 | ||
| 24 | 25 | ||
| 25 | 26 | ||
| @@ -117,9 +118,29 @@ int ceph_compare_options(struct ceph_options *new_opt, | |||
| 117 | if (ret) | 118 | if (ret) |
| 118 | return ret; | 119 | return ret; |
| 119 | 120 | ||
| 120 | ret = strcmp_null(opt1->secret, opt2->secret); | 121 | if (opt1->key && !opt2->key) |
| 121 | if (ret) | 122 | return -1; |
| 122 | return ret; | 123 | if (!opt1->key && opt2->key) |
| 124 | return 1; | ||
| 125 | if (opt1->key && opt2->key) { | ||
| 126 | if (opt1->key->type != opt2->key->type) | ||
| 127 | return -1; | ||
| 128 | if (opt1->key->created.tv_sec != opt2->key->created.tv_sec) | ||
| 129 | return -1; | ||
| 130 | if (opt1->key->created.tv_nsec != opt2->key->created.tv_nsec) | ||
| 131 | return -1; | ||
| 132 | if (opt1->key->len != opt2->key->len) | ||
| 133 | return -1; | ||
| 134 | if (opt1->key->key && !opt2->key->key) | ||
| 135 | return -1; | ||
| 136 | if (!opt1->key->key && opt2->key->key) | ||
| 137 | return 1; | ||
| 138 | if (opt1->key->key && opt2->key->key) { | ||
| 139 | ret = memcmp(opt1->key->key, opt2->key->key, opt1->key->len); | ||
| 140 | if (ret) | ||
| 141 | return ret; | ||
| 142 | } | ||
| 143 | } | ||
| 123 | 144 | ||
| 124 | /* any matching mon ip implies a match */ | 145 | /* any matching mon ip implies a match */ |
| 125 | for (i = 0; i < opt1->num_mon; i++) { | 146 | for (i = 0; i < opt1->num_mon; i++) { |
| @@ -203,7 +224,10 @@ void ceph_destroy_options(struct ceph_options *opt) | |||
| 203 | { | 224 | { |
| 204 | dout("destroy_options %p\n", opt); | 225 | dout("destroy_options %p\n", opt); |
| 205 | kfree(opt->name); | 226 | kfree(opt->name); |
| 206 | kfree(opt->secret); | 227 | if (opt->key) { |
| 228 | ceph_crypto_key_destroy(opt->key); | ||
| 229 | kfree(opt->key); | ||
| 230 | } | ||
| 207 | kfree(opt); | 231 | kfree(opt); |
| 208 | } | 232 | } |
| 209 | EXPORT_SYMBOL(ceph_destroy_options); | 233 | EXPORT_SYMBOL(ceph_destroy_options); |
| @@ -295,9 +319,14 @@ int ceph_parse_options(struct ceph_options **popt, char *options, | |||
| 295 | GFP_KERNEL); | 319 | GFP_KERNEL); |
| 296 | break; | 320 | break; |
| 297 | case Opt_secret: | 321 | case Opt_secret: |
| 298 | opt->secret = kstrndup(argstr[0].from, | 322 | opt->key = kzalloc(sizeof(*opt->key), GFP_KERNEL); |
| 299 | argstr[0].to-argstr[0].from, | 323 | if (!opt->key) { |
| 300 | GFP_KERNEL); | 324 | err = -ENOMEM; |
| 325 | goto out; | ||
| 326 | } | ||
| 327 | err = ceph_crypto_key_unarmor(opt->key, argstr[0].from); | ||
| 328 | if (err < 0) | ||
| 329 | goto out; | ||
| 301 | break; | 330 | break; |
| 302 | 331 | ||
| 303 | /* misc */ | 332 | /* misc */ |
diff --git a/net/ceph/crypto.c b/net/ceph/crypto.c index 7b505b0c983f..75f0893fa11f 100644 --- a/net/ceph/crypto.c +++ b/net/ceph/crypto.c | |||
| @@ -9,6 +9,17 @@ | |||
| 9 | #include <linux/ceph/decode.h> | 9 | #include <linux/ceph/decode.h> |
| 10 | #include "crypto.h" | 10 | #include "crypto.h" |
| 11 | 11 | ||
| 12 | int ceph_crypto_key_clone(struct ceph_crypto_key *dst, | ||
| 13 | const struct ceph_crypto_key *src) | ||
| 14 | { | ||
| 15 | memcpy(dst, src, sizeof(struct ceph_crypto_key)); | ||
| 16 | dst->key = kmalloc(src->len, GFP_NOFS); | ||
| 17 | if (!dst->key) | ||
| 18 | return -ENOMEM; | ||
| 19 | memcpy(dst->key, src->key, src->len); | ||
| 20 | return 0; | ||
| 21 | } | ||
| 22 | |||
| 12 | int ceph_crypto_key_encode(struct ceph_crypto_key *key, void **p, void *end) | 23 | int ceph_crypto_key_encode(struct ceph_crypto_key *key, void **p, void *end) |
| 13 | { | 24 | { |
| 14 | if (*p + sizeof(u16) + sizeof(key->created) + | 25 | if (*p + sizeof(u16) + sizeof(key->created) + |
diff --git a/net/ceph/crypto.h b/net/ceph/crypto.h index f9eccace592b..6cf6edc91ec4 100644 --- a/net/ceph/crypto.h +++ b/net/ceph/crypto.h | |||
| @@ -19,6 +19,8 @@ static inline void ceph_crypto_key_destroy(struct ceph_crypto_key *key) | |||
| 19 | kfree(key->key); | 19 | kfree(key->key); |
| 20 | } | 20 | } |
| 21 | 21 | ||
| 22 | extern int ceph_crypto_key_clone(struct ceph_crypto_key *dst, | ||
| 23 | const struct ceph_crypto_key *src); | ||
| 22 | extern int ceph_crypto_key_encode(struct ceph_crypto_key *key, | 24 | extern int ceph_crypto_key_encode(struct ceph_crypto_key *key, |
| 23 | void **p, void *end); | 25 | void **p, void *end); |
| 24 | extern int ceph_crypto_key_decode(struct ceph_crypto_key *key, | 26 | extern int ceph_crypto_key_decode(struct ceph_crypto_key *key, |
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c index 8a079399174a..cbe31fa45508 100644 --- a/net/ceph/mon_client.c +++ b/net/ceph/mon_client.c | |||
| @@ -759,7 +759,7 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl) | |||
| 759 | 759 | ||
| 760 | /* authentication */ | 760 | /* authentication */ |
| 761 | monc->auth = ceph_auth_init(cl->options->name, | 761 | monc->auth = ceph_auth_init(cl->options->name, |
| 762 | cl->options->secret); | 762 | cl->options->key); |
| 763 | if (IS_ERR(monc->auth)) | 763 | if (IS_ERR(monc->auth)) |
| 764 | return PTR_ERR(monc->auth); | 764 | return PTR_ERR(monc->auth); |
| 765 | monc->auth->want_keys = | 765 | monc->auth->want_keys = |
