diff options
Diffstat (limited to 'src/objclass/class_api.cc')
-rw-r--r-- | src/objclass/class_api.cc | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/objclass/class_api.cc b/src/objclass/class_api.cc index 79f5af70e98..d49890d2d4a 100644 --- a/src/objclass/class_api.cc +++ b/src/objclass/class_api.cc @@ -8,6 +8,9 @@ #include "osd/ClassHandler.h" +#include "auth/Crypto.h" +#include "common/armor.h" + static ClassHandler *ch; void cls_initialize(ClassHandler *h) @@ -542,3 +545,33 @@ int cls_cxx_map_remove_key(cls_method_context_t hctx, const string &key) return (*pctx)->pg->do_osd_ops(*pctx, ops); } +int cls_gen_random_bytes(char *buf, int size) +{ + return get_random_bytes(buf, size); +} + +int cls_gen_rand_base64(char *dest, int size) /* size should be the required string size + 1 */ +{ + char buf[size]; + char tmp_dest[size + 4]; /* so that there's space for the extra '=' characters, and some */ + int ret; + + ret = cls_gen_random_bytes(buf, sizeof(buf)); + if (ret < 0) { + generic_derr << "cannot get random bytes: " << ret << dendl; + return -1; + } + + ret = ceph_armor(tmp_dest, &tmp_dest[sizeof(tmp_dest)], + (const char *)buf, ((const char *)buf) + ((size - 1) * 3 + 4 - 1) / 4); + if (ret < 0) { + generic_derr << "ceph_armor failed" << dendl; + return -1; + } + tmp_dest[ret] = '\0'; + memcpy(dest, tmp_dest, size); + dest[size] = '\0'; + + return 0; +} + |