summaryrefslogtreecommitdiff
path: root/src/objclass/class_api.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/objclass/class_api.cc')
-rw-r--r--src/objclass/class_api.cc33
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;
+}
+