4 #include "gtest/gtest.h"
5 #include "include/types.h"
6 #include "auth/Crypto.h"
7 #include "common/Clock.h"
8 #include "common/ceph_crypto.h"
9 #include "common/ceph_context.h"
10 #include "global/global_context.h"
12 class CryptoEnvironment: public ::testing::Environment {
14 void SetUp() override {
15 ceph::crypto::init(g_ceph_context);
19 TEST(AES, ValidateSecret) {
20 CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
23 for (l=0; l<16; l++) {
26 err = h->validate_secret(bp);
27 EXPECT_EQ(-EINVAL, err);
30 for (l=16; l<50; l++) {
33 err = h->validate_secret(bp);
39 CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
41 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
42 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
44 bufferptr secret(secret_s, sizeof(secret_s));
46 unsigned char plaintext_s[] = {
47 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
48 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
51 plaintext.append((char *)plaintext_s, sizeof(plaintext_s));
55 CryptoKeyHandler *kh = h->get_key_handler(secret, error);
56 int r = kh->encrypt(plaintext, cipher, &error);
60 unsigned char want_cipher[] = {
61 0xb3, 0x8f, 0x5b, 0xc9, 0x35, 0x4c, 0xf8, 0xc6,
62 0x13, 0x15, 0x66, 0x6f, 0x37, 0xd7, 0x79, 0x3a,
63 0x11, 0x90, 0x7b, 0xe9, 0xd8, 0x3c, 0x35, 0x70,
64 0x58, 0x7b, 0x97, 0x9b, 0x03, 0xd2, 0xa5, 0x01,
66 char cipher_s[sizeof(want_cipher)];
68 ASSERT_EQ(sizeof(cipher_s), cipher.length());
69 cipher.copy(0, sizeof(cipher_s), &cipher_s[0]);
72 err = memcmp(cipher_s, want_cipher, sizeof(want_cipher));
79 CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
81 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
82 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
84 bufferptr secret(secret_s, sizeof(secret_s));
86 unsigned char cipher_s[] = {
87 0xb3, 0x8f, 0x5b, 0xc9, 0x35, 0x4c, 0xf8, 0xc6,
88 0x13, 0x15, 0x66, 0x6f, 0x37, 0xd7, 0x79, 0x3a,
89 0x11, 0x90, 0x7b, 0xe9, 0xd8, 0x3c, 0x35, 0x70,
90 0x58, 0x7b, 0x97, 0x9b, 0x03, 0xd2, 0xa5, 0x01,
93 cipher.append((char *)cipher_s, sizeof(cipher_s));
95 unsigned char want_plaintext[] = {
96 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
97 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
99 char plaintext_s[sizeof(want_plaintext)];
102 bufferlist plaintext;
103 CryptoKeyHandler *kh = h->get_key_handler(secret, error);
104 int r = kh->decrypt(cipher, plaintext, &error);
106 ASSERT_EQ(error, "");
108 ASSERT_EQ(sizeof(plaintext_s), plaintext.length());
109 plaintext.copy(0, sizeof(plaintext_s), &plaintext_s[0]);
112 err = memcmp(plaintext_s, want_plaintext, sizeof(want_plaintext));
122 err = get_random_bytes(secret_s, sizeof(secret_s));
124 bufferptr secret(secret_s, sizeof(secret_s));
126 char orig_plaintext_s[1024];
127 err = get_random_bytes(orig_plaintext_s, sizeof(orig_plaintext_s));
130 bufferlist plaintext;
131 plaintext.append(orig_plaintext_s, sizeof(orig_plaintext_s));
133 for (int i=0; i<10000; i++) {
136 CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
139 CryptoKeyHandler *kh = h->get_key_handler(secret, error);
140 int r = kh->encrypt(plaintext, cipher, &error);
142 ASSERT_EQ(error, "");
149 CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
151 CryptoKeyHandler *ckh = h->get_key_handler(secret, error);
152 int r = ckh->decrypt(cipher, plaintext, &error);
154 ASSERT_EQ(error, "");
160 char plaintext_s[sizeof(orig_plaintext_s)];
161 plaintext.copy(0, sizeof(plaintext_s), &plaintext_s[0]);
162 err = memcmp(plaintext_s, orig_plaintext_s, sizeof(orig_plaintext_s));
168 get_random_bytes(k.c_str(), k.length());
169 CryptoKey key(CEPH_CRYPTO_AES, ceph_clock_now(), k);
173 get_random_bytes(r.c_str(), r.length());
176 utime_t start = ceph_clock_now();
179 for (int i=0; i<n; ++i) {
182 int r = key.encrypt(g_ceph_context, data, encoded, &error);
186 utime_t end = ceph_clock_now();
187 utime_t dur = end - start;
188 cout << n << " encoded in " << dur << std::endl;