// ---------------------------------------------------
-int CryptoNone::
-create(bufferptr& secret)
+int CryptoNone::create(bufferptr& secret)
{
return 0;
}
-int CryptoNone::
-validate_secret(bufferptr& secret)
+int CryptoNone::validate_secret(bufferptr& secret)
{
return 0;
}
-void CryptoNone::
-encrypt(const bufferptr& secret, const bufferlist& in,
- bufferlist& out, std::string &error) const
+void CryptoNone::encrypt(const bufferptr& secret, const bufferlist& in,
+ bufferlist& out, std::string &error) const
{
out = in;
}
-void CryptoNone::
-decrypt(const bufferptr& secret, const bufferlist& in,
- bufferlist& out, std::string &error) const
+void CryptoNone::decrypt(const bufferptr& secret, const bufferlist& in,
+ bufferlist& out, std::string &error) const
{
out = in;
}
return 0;
}
-void CryptoAES::
-encrypt(const bufferptr& secret, const bufferlist& in, bufferlist& out,
- std::string &error) const
+void CryptoAES::encrypt(const bufferptr& secret, const bufferlist& in, bufferlist& out,
+ std::string &error) const
{
if (secret.length() < AES_KEY_LEN) {
error = "key is too short";
#endif
}
-void CryptoAES::
-decrypt(const bufferptr& secret, const bufferlist& in,
- bufferlist& out, std::string &error) const
+void CryptoAES::decrypt(const bufferptr& secret, const bufferlist& in,
+ bufferlist& out, std::string &error) const
{
#ifdef USE_CRYPTOPP
const unsigned char *key = (const unsigned char *)secret.c_str();
this->type = type;
created = ceph_clock_now(cct);
- CryptoHandler *h = get_crypto_handler(type);
+ CryptoHandler *h = cct->get_crypto_handler(type);
if (!h)
return -EOPNOTSUPP;
int ret = h->validate_secret(s);
type = t;
created = ceph_clock_now(cct);
- CryptoHandler *h = get_crypto_handler(type);
+ CryptoHandler *h = cct->get_crypto_handler(type);
if (!h)
return -EOPNOTSUPP;
return h->create(secret);
}
-void CryptoKey::
-encrypt(const bufferlist& in, bufferlist& out, std::string &error) const
+void CryptoKey::encrypt(CephContext *cct, const bufferlist& in, bufferlist& out, std::string &error) const
{
- CryptoHandler *h = get_crypto_handler(type);
+ CryptoHandler *h = cct->get_crypto_handler(type);
if (!h) {
ostringstream oss;
oss << "CryptoKey::encrypt: key type " << type << " not supported.";
h->encrypt(this->secret, in, out, error);
}
-void CryptoKey::
-decrypt(const bufferlist& in, bufferlist& out, std::string &error) const
+void CryptoKey::decrypt(CephContext *cct, const bufferlist& in, bufferlist& out, std::string &error) const
{
- CryptoHandler *h = get_crypto_handler(type);
+ CryptoHandler *h = cct->get_crypto_handler(type);
if (!h) {
ostringstream oss;
oss << "CryptoKey::decrypt: key type " << type << " not supported.";
// --
int create(CephContext *cct, int type);
- void encrypt(const bufferlist& in, bufferlist& out, std::string &error) const;
- void decrypt(const bufferlist& in, bufferlist& out, std::string &error) const;
+ void encrypt(CephContext *cct, const bufferlist& in, bufferlist& out, std::string &error) const;
+ void decrypt(CephContext *cct, const bufferlist& in, bufferlist& out, std::string &error) const;
void to_str(std::string& s) const;
};
CephXAuthenticate req;
get_random_bytes((char *)&req.client_challenge, sizeof(req.client_challenge));
std::string error;
- cephx_calc_client_server_challenge(secret, server_challenge,
+ cephx_calc_client_server_challenge(cct, secret, server_challenge,
req.client_challenge, &req.key, error);
if (!error.empty()) {
ldout(cct, 20) << "cephx_calc_client_server_challenge error: " << error << dendl;
CryptoKey secret_key;
keyring->get_secret(cct->_conf->name, secret_key);
std::string error;
- decode_decrypt(secrets, secret_key, indata, error);
+ decode_decrypt(cct, secrets, secret_key, indata, error);
if (error.empty()) {
rotating_secrets->set_secrets(secrets);
} else {
bool KeyServer::generate_secret(CryptoKey& secret)
{
bufferptr bp;
- CryptoHandler *crypto = get_crypto_handler(CEPH_CRYPTO_AES);
+ CryptoHandler *crypto = cct->get_crypto_handler(CEPH_CRYPTO_AES);
if (!crypto)
return false;
RotatingSecrets secrets = rotate_iter->second;
std::string error;
- encode_encrypt(secrets, specific_key, enc_bl, error);
+ encode_encrypt(cct, secrets, specific_key, enc_bl, error);
if (!error.empty())
return false;
-void cephx_calc_client_server_challenge(CryptoKey& secret, uint64_t server_challenge,
+void cephx_calc_client_server_challenge(CephContext *cct, CryptoKey& secret, uint64_t server_challenge,
uint64_t client_challenge, uint64_t *key, std::string &ret)
{
CephXChallengeBlob b;
bufferlist enc;
std::string error;
- encode_encrypt(b, secret, enc, error);
+ encode_encrypt(cct, b, secret, enc, error);
if (!error.empty())
return;
<< " ticket_info.ticket.name=" << ticket_info.ticket.name.to_str() << dendl;
blob.secret_id = info.secret_id;
std::string error;
- encode_encrypt_enc_bl(ticket_info, info.service_secret, blob.blob, error);
+ encode_encrypt_enc_bl(cct, ticket_info, info.service_secret, blob.blob, error);
if (!error.empty()) {
ldout(cct, -1) << "cephx_build_service_ticket_blob failed with error "
<< error << dendl;
msg_a.session_key = info.session_key;
msg_a.validity = info.validity;
std::string error;
- encode_encrypt(msg_a, principal_secret, reply, error);
+ encode_encrypt(cct, msg_a, principal_secret, reply, error);
if (!error.empty()) {
ldout(cct, -1) << "error encoding encrypted: " << error << dendl;
return false;
::encode((__u8)should_encrypt_ticket, reply);
if (should_encrypt_ticket) {
- encode_encrypt(service_ticket_bl, ticket_enc_key, reply, error);
+ encode_encrypt(cct, service_ticket_bl, ticket_enc_key, reply, error);
if (!error.empty()) {
ldout(cct, -1) << "error encoding encrypted ticket: " << error << dendl;
return false;
CephXServiceTicket msg_a;
std::string error;
- decode_decrypt(msg_a, secret, indata, error);
+ decode_decrypt(cct, msg_a, secret, indata, error);
if (!error.empty()) {
ldout(cct, 0) << "verify_service_ticket_reply: failed decode_decrypt with secret "
<< secret << ": " << error << dendl;
if (ticket_enc) {
ldout(cct, 10) << " got encrypted ticket" << dendl;
std::string error;
- decode_decrypt(service_ticket_bl, session_key, indata, error);
+ decode_decrypt(cct, service_ticket_bl, session_key, indata, error);
if (!error.empty()) {
ldout(cct, 10) << "verify_service_ticket_reply: decode_decrypt failed "
<< "with " << error << dendl;
msg.nonce = a->nonce;
std::string error;
- encode_encrypt(msg, session_key, a->bl, error);
+ encode_encrypt(cct, msg, session_key, a->bl, error);
if (!error.empty()) {
ldout(cct, 0) << "failed to encrypt authorizer: " << error << dendl;
delete a;
}
std::string error;
- decode_decrypt_enc_bl(ticket_info, service_secret, ticket_blob.blob, error);
+ decode_decrypt_enc_bl(cct, ticket_info, service_secret, ticket_blob.blob, error);
if (!error.empty()) {
ldout(cct, 0) << "ceph_decode_ticket could not decrypt ticket info. error:"
<< error << dendl;
}
}
std::string error;
- decode_decrypt_enc_bl(ticket_info, service_secret, ticket.blob, error);
+ decode_decrypt_enc_bl(cct, ticket_info, service_secret, ticket.blob, error);
if (!error.empty()) {
ldout(cct, 0) << "verify_authorizer could not decrypt ticket info: error: "
<< error << dendl;
// CephXAuthorize
CephXAuthorize auth_msg;
- decode_decrypt(auth_msg, ticket_info.session_key, indata, error);
+ decode_decrypt(cct, auth_msg, ticket_info.session_key, indata, error);
if (!error.empty()) {
ldout(cct, 0) << "verify_authorizercould not decrypt authorize request: error: "
<< error << dendl;
CephXAuthorizeReply reply;
// reply.trans_id = auth_msg.trans_id;
reply.nonce_plus_one = auth_msg.nonce + 1;
- encode_encrypt(reply, ticket_info.session_key, reply_bl, error);
+ encode_encrypt(cct, reply, ticket_info.session_key, reply_bl, error);
if (!error.empty()) {
ldout(cct, 10) << "verify_authorizer: encode_encrypt error: " << error << dendl;
return false;
try {
std::string error;
- decode_decrypt(reply, session_key, indata, error);
+ decode_decrypt(cct, reply, session_key, indata, error);
if (!error.empty()) {
ldout(cct, 0) << "verify_authorizer_reply coudln't decrypt with " << session_key
<< ": error: " << error << dendl;
};
WRITE_CLASS_ENCODER(CephXChallengeBlob)
-void cephx_calc_client_server_challenge(CryptoKey& secret, uint64_t server_challenge, uint64_t client_challenge,
- uint64_t *key, std::string &error);
+void cephx_calc_client_server_challenge(CephContext *cct,
+ CryptoKey& secret, uint64_t server_challenge, uint64_t client_challenge,
+ uint64_t *key, std::string &error);
/*
extern bool cephx_build_service_ticket_blob(CephContext *cct,
- CephXSessionAuthInfo& ticket_info, CephXTicketBlob& blob);
+ CephXSessionAuthInfo& ticket_info, CephXTicketBlob& blob);
-extern void cephx_build_service_ticket_request(uint32_t keys,
- bufferlist& request);
+extern void cephx_build_service_ticket_request(CephContext *cct,
+ uint32_t keys,
+ bufferlist& request);
extern bool cephx_build_service_ticket_reply(CephContext *cct,
CryptoKey& principal_secret,
#define AUTH_ENC_MAGIC 0xff009cad8826aa55ull
template <typename T>
-void decode_decrypt_enc_bl(T& t, CryptoKey key, bufferlist& bl_enc,
+void decode_decrypt_enc_bl(CephContext *cct, T& t, CryptoKey key, bufferlist& bl_enc,
std::string &error)
{
uint64_t magic;
bufferlist bl;
- key.decrypt(bl_enc, bl, error);
+ key.decrypt(cct, bl_enc, bl, error);
if (!error.empty())
return;
}
template <typename T>
-void encode_encrypt_enc_bl(const T& t, const CryptoKey& key,
+void encode_encrypt_enc_bl(CephContext *cct, const T& t, const CryptoKey& key,
bufferlist& out, std::string &error)
{
bufferlist bl;
::encode(magic, bl);
::encode(t, bl);
- key.encrypt(bl, out, error);
+ key.encrypt(cct, bl, out, error);
}
template <typename T>
-void decode_decrypt(T& t, const CryptoKey key,
+void decode_decrypt(CephContext *cct, T& t, const CryptoKey key,
bufferlist::iterator& iter, std::string &error)
{
bufferlist bl_enc;
::decode(bl_enc, iter);
- decode_decrypt_enc_bl(t, key, bl_enc, error);
+ decode_decrypt_enc_bl(cct, t, key, bl_enc, error);
}
template <typename T>
-void encode_encrypt(const T& t, const CryptoKey& key,
+void encode_encrypt(CephContext *cct, const T& t, const CryptoKey& key,
bufferlist& out, std::string &error)
{
bufferlist bl_enc;
- encode_encrypt_enc_bl(t, key, bl_enc, error);
+ encode_encrypt_enc_bl(cct, t, key, bl_enc, error);
if (!error.empty())
return;
::encode(bl_enc, out);
uint64_t expected_key;
std::string error;
- cephx_calc_client_server_challenge(secret, server_challenge,
+ cephx_calc_client_server_challenge(cct, secret, server_challenge,
req.client_challenge, &expected_key, error);
if (!error.empty()) {
ldout(cct, 0) << " cephx_calc_client_server_challenge error: " << error << dendl;
#include "common/lockdep.h"
#include "common/Formatter.h"
#include "log/Log.h"
+#include "auth/Crypto.h"
#include <iostream>
#include <pthread.h>
_admin_socket(NULL),
_perf_counters_collection(NULL),
_perf_counters_conf_obs(NULL),
- _heartbeat_map(NULL)
+ _heartbeat_map(NULL),
+ _crypto_none(NULL),
+ _crypto_aes(NULL)
{
pthread_spin_init(&_service_thread_lock, PTHREAD_PROCESS_SHARED);
_admin_socket->register_command("log flush", _admin_hook, "flush log entries to log file");
_admin_socket->register_command("log dump", _admin_hook, "dump recent log entries to log file");
_admin_socket->register_command("log reopen", _admin_hook, "reopen log file");
+
+ _crypto_none = new CryptoNone;
+ _crypto_aes = new CryptoAES;
}
CephContext::~CephContext()
delete _conf;
pthread_spin_destroy(&_service_thread_lock);
+ delete _crypto_none;
+ delete _crypto_aes;
}
void CephContext::start_service_thread()
{
return _admin_socket;
}
+
+CryptoHandler *CephContext::get_crypto_handler(int type)
+{
+ switch (type) {
+ case CEPH_CRYPTO_NONE:
+ return _crypto_none;
+ case CEPH_CRYPTO_AES:
+ return _crypto_aes;
+ default:
+ return NULL;
+ }
+}
class md_config_obs_t;
class md_config_t;
class CephContextHook;
+class CryptoNone;
+class CryptoAES;
+class CryptoHandler;
namespace ceph {
class HeartbeatMap;
*/
void do_command(std::string command, std::string args, bufferlist *out);
+ /**
+ * get a crypto handler
+ */
+ CryptoHandler *get_crypto_handler(int type);
+
private:
CephContext(const CephContext &rhs);
CephContext &operator=(const CephContext &rhs);
CephContextHook *_admin_hook;
ceph::HeartbeatMap *_heartbeat_map;
+
+ // crypto
+ CryptoNone *_crypto_none;
+ CryptoAES *_crypto_aes;
};
#endif
::testing::Environment* const crypto_env = ::testing::AddGlobalTestEnvironment(new CryptoEnvironment);
TEST(AES, ValidateSecret) {
- CryptoHandler *h = get_crypto_handler(CEPH_CRYPTO_AES);
+ CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
int l;
for (l=0; l<16; l++) {
}
TEST(AES, Encrypt) {
- CryptoHandler *h = get_crypto_handler(CEPH_CRYPTO_AES);
+ CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
char secret_s[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
}
TEST(AES, Decrypt) {
- CryptoHandler *h = get_crypto_handler(CEPH_CRYPTO_AES);
+ CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
char secret_s[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
for (int i=0; i<10000; i++) {
bufferlist cipher;
{
- CryptoHandler *h = get_crypto_handler(CEPH_CRYPTO_AES);
+ CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
std::string error;
h->encrypt(secret, plaintext, cipher, error);
plaintext.clear();
{
- CryptoHandler *h = get_crypto_handler(CEPH_CRYPTO_AES);
+ CryptoHandler *h = g_ceph_context->get_crypto_handler(CEPH_CRYPTO_AES);
std::string error;
h->decrypt(secret, cipher, plaintext, error);
ASSERT_EQ(error, "");
bufferlist enc_out;
std::string error;
- key.encrypt(enc_in, enc_out, error);
+ key.encrypt(g_ceph_context, enc_in, enc_out, error);
if (!error.empty()) {
dout(0) << "couldn't encode! error " << error << dendl;
exit(1);
dec_in = enc_out;
- key.decrypt(dec_in, dec_out, error);
+ key.decrypt(g_ceph_context, dec_in, dec_out, error);
if (!error.empty()) {
dout(0) << "couldn't decode! error " << error << dendl;
exit(1);