New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rgw: s3 server-side encryption (SSE-C, SSE-KMS) #11049

Merged
merged 32 commits into from Apr 18, 2017

Conversation

Projects
None yet
6 participants
@aclamk
Contributor

aclamk commented Sep 12, 2016

This is s3 encryption. Now with ISAL plugins.

TODO for merge:

  • fix attribute encoding
  • default value for plugin_crypto_accelerator
  • rebase
  • teuthology run on rebase
  • mask out keys when logging request headers
  • adapt to use existing interfaces in auth/Crypto.h
@ghost

This comment has been minimized.

ghost commented Nov 17, 2016

jenkins test this please (no logs)

2 similar comments
@ghost

This comment has been minimized.

ghost commented Nov 21, 2016

jenkins test this please (no logs)

@ghost

This comment has been minimized.

ghost commented Nov 22, 2016

jenkins test this please (no logs)

@ghost ghost added the rgw label Nov 23, 2016

boost::string_ref keymd5 =
get_crypt_attribute(s->info.env, parts, X_AMZ_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY_MD5);
std::string keymd5_bin = from_base64(keymd5);
if (keymd5_bin.size() != CEPH_CRYPTO_MD5_DIGESTSIZE) {

This comment has been minimized.

@chuang-he

chuang-he Dec 12, 2016

the keymd5_bin.size is 32 in my test, What's wrong?

This comment has been minimized.

@aclamk

aclamk Dec 15, 2016

Contributor

@chuang-he I imagine that in request you used to test this, your field "x-amz-server-side-encryption-customer-key-md5" was set to 256 bit long sequence. It should have been "base64-encoded 128-bit MD5 digest of the encryption key according to RFC 1321. "

This comment has been minimized.

@chuang-he

chuang-he Dec 21, 2016

128-bit MD5 digest is 32 bytes hexadecimal number, whether need to be converted to ASCII?
➜ ~ echo -n "12345678901234567890123456789012" | md5sum
767179c7a2bff19651ce97d294c30cfb -

This comment has been minimized.

@aclamk

aclamk Jan 12, 2017

Contributor

@chuang-he yes, but it needs to be base64 encoded:
➜ ~ echo -n "12345678901234567890123456789012" | md5sum | head -c 32 | xxd -r -p | base64
dnF5x6K/8ZZRzpfSlMMM+w==

@cbodley

This comment has been minimized.

Contributor

cbodley commented Dec 16, 2016

i pushed a rebase of this branch to https://github.com/ceph/ceph-ci/commits/wip-rgw-encryption for teuthology runs. in doing so, i found that the new crypto plugin needs some packaging support - i added a couple commits to that branch for rpms and debs. you can track the progress of the teuthology run here: http://pulpito.ceph.com/cbodley-2016-12-16_09:35:29-rgw-wip-rgw-encryption---basic-mira/

also note that the jenkins build check is complaining about a segfault:

148/156 Test #155: unittest_rgw_crypto .....................***Exception: SegFault  0.60 sec
2016-12-15 09:12:49.967585 7f32babf5880 -1 did not load config file, using default settings.
*** Caught signal (Segmentation fault) **
 in thread 7f32babf5880 thread_name:unittest_rgw_cr

@cbodley cbodley self-assigned this Dec 19, 2016

@cbodley

This comment has been minimized.

Contributor

cbodley commented Dec 19, 2016

a number of s3/swift test failures in the results - seeing terminate called after throwing an instance of 'ceph::buffer::end_of_buffer' coming from RGWGetObj_Decompress::handle_data()

@cbodley cbodley referenced this pull request Jan 12, 2017

Merged

Fixed critical, stupid bug. #3

/* test keys for testing purposes */
boost::string_ref key = key_id.substr(sizeof("testkey-")-1);
std::string master_key;
if (key == "1") master_key = "012345678901234567890123456789012345";

This comment has been minimized.

@yehudasa

yehudasa Jan 18, 2017

Member

@aclamk can you put a #warning here so that we don't forget about it?

This comment has been minimized.

@aclamk

aclamk Jan 19, 2017

Contributor

@yehudasa

  1. Would it be ok, if I just change it to "rgw-internal-testkey-1"? The actual security risk is only that someone will have idea to create on barbican key with such name.
  2. Do we have some predefined macro define that we set in debug builds?

This comment has been minimized.

@yehudasa

yehudasa Apr 10, 2017

Member

@aclamk maybe add a special define just for the sake of testing this? this will ensure that we're not going to leak it accidentally. The define can also define the name of the key to use.

This comment has been minimized.

@aclamk

aclamk Apr 11, 2017

Contributor

@yehudasa This hardcoded values are no longer present. Instread, configuration variable "rgw_crypt_s3_kms_encryption_keys" was created. It is intended for testing only, and is marked as such.

@cbodley

This comment has been minimized.

Contributor

cbodley commented Feb 1, 2017

if ((size % AES_256_IVSIZE) != 0) {
return false;
}
struct cbc_key_data *keys_blk = (struct cbc_key_data*) memalign(16, sizeof(struct cbc_key_data));

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

you should be able to use std::aligned_storage here to avoid this heap allocation. something like this?

std::aligned_storage<sizeof(struct cbc_key_data), 16>::type storage;
struct cbc_key_data *keys_blk = (struct cbc_key_data*) &storage;

This comment has been minimized.

@aclamk

aclamk Feb 8, 2017

Contributor

done.

static const int AES_256_KEYSIZE = 256/8;
virtual bool cbc_encrypt(unsigned char* out, const unsigned char* in, size_t size,
const unsigned char (&iv)[AES_256_IVSIZE],
const unsigned char (&key)[AES_256_KEYSIZE]) = 0;

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

on the one hand, i like that the expected sizes of the iv and key parameters are documented here. on the other hand, arrays passed as function parameters are error-prone because they don't behave like normal arrays on the stack (with respect to sizeof(), for example), and the compiler doesn't actually check that you're passing in an array of that size

can we use std::array<> for these arguments instead? for example:

using iv_t = std::array<unsigned char, AES_256_IVSIZE>;
using key_t = std::array<unsigned char, AES_256_KEYSIZE>;

virtual bool cbc_encrypt(unsigned char* out, const unsigned char* in, size_t size,
                         const iv_t &iv, const key_t &key) = 0;

This comment has been minimized.

@aclamk

aclamk Feb 8, 2017

Contributor
  1. will add documentation
  2. what is being passed is not arrays, it is array references. It is impossible to pass array of different size if argument is array reference. Should I change to std::array ?

This comment has been minimized.

@cbodley

cbodley Feb 9, 2017

Contributor

It is impossible to pass array of different size if argument is array reference

very cool, i didn't know :) i was just remembering one of Linus' rants about array arguments in c

Should I change to std::array ?

up to you, whatever you think looks better

}
return src.substr(start, end - start + 1);
}

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

can the boost string algorithms help with this? try boost::algorithm::trim()

edit: i see that boost::algorithm::trim() doesn't work with boost::string_ref, unfortunately. though you could simplify the helper function a bit:

  while (src.size() && std::isspace(src.front())) {
    src.remove_prefix(1);
  }
  while (src.size() && std::isspace(src.back())) {
    src.remove_suffix(1);
  }
  return src;

This comment has been minimized.

@aclamk

aclamk Feb 9, 2017

Contributor

I like it. Adapted.

}
}
done:
return res;

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

can we just replace the instances of goto done with return res?

This comment has been minimized.

@aclamk

aclamk Feb 9, 2017

Contributor

deleted gotos. I hate multiple returns, but I agree. gotos are more ugly.

std::stringstream ss;
jf.flush(ss);
token_req.set_post_data(ss.str());
token_req.set_send_length(ss.str().length());

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

std::stringstream::str() returns a copy of its internal string by value, so avoid calling it twice here:

    auto str = ss.str();
    token_req.set_post_data(str);
    token_req.set_send_length(str.length());
++iter;
}
while (iter != input.buffers().end()) {
off_t cnt = std::min((off_t)(iter->length() - plaintext_pos), (off_t)(size - crypt_pos));

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

you can call std::min<off_t>() explicitly to avoid duplicating the cast to (off_t):

off_t cnt = std::min<off_t>(iter->length() - plaintext_pos, size - crypt_pos);

This comment has been minimized.

@aclamk

aclamk Feb 9, 2017

Contributor

Nice hint, I love it.

return -EINVAL;
}
if (url[url.size() - 1] != '/') {

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

can simplify with url.back()

This comment has been minimized.

@aclamk

aclamk Feb 9, 2017

Contributor

ack.

e.SetKey( key, key_size );
e.ProcessData(data_out, data_in, data_size);
res = true;
} catch( CryptoPP::Exception& ex ) {

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

can you log this error and print ex.what()?

This comment has been minimized.

@aclamk

aclamk Feb 9, 2017

Contributor

Done.

return CHUNK_SIZE;
}
#ifdef USE_CRYPTOPP

This comment has been minimized.

@cbodley

cbodley Feb 3, 2017

Contributor

it's unfortunate that we only select one of cryptopp or nss, because that makes it hard to test that both implementations are working. it would be really nice if we could run unit tests on both as part of 'make check'. any ideas there?

@@ -847,6 +847,8 @@ rm -rf %{buildroot}
%{_libdir}/ceph/erasure-code/libec_*.so*
%dir %{_libdir}/ceph/compressor
%{_libdir}/ceph/compressor/libceph_*.so*
%dir %{_libdir}/ceph/crypto

This comment has been minimized.

@chuang-he

chuang-he Feb 7, 2017

crypto, rather than cryptoaccel ?

MD5 key_hash;
uint8_t key_hash_res[CEPH_CRYPTO_MD5_DIGESTSIZE];
key_hash.Update((uint8_t*)key_bin.c_str(), key_bin.size());
key_hash.Final(key_hash_res);

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

please use the byte type expected by the Digest interface, and prefer static_cast (which won't let you accidentally cast away const):

      byte key_hash_res[CEPH_CRYPTO_MD5_DIGESTSIZE];
      key_hash.Update(static_cast<const byte*>(key_bin.c_str()), key_bin.size());

This comment has been minimized.

@aclamk

aclamk Feb 13, 2017

Contributor

Improved.

map<string, bufferlist>& attrs,
map<string, post_form_part, const ltstr_nocase>* parts,
std::unique_ptr<BlockCrypt>* block_crypt,
std::map<std::string, std::string>& crypt_http_responses)

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

consider factoring out each encryption mode into a separate helper function. for example, s3_prepare_encrypt() will call either of prepare_encrypt_aes(), prepare_encrypt_kms() or prepare_encrypt_default() depending on the headers. same with s3_prepare_decrypt()

/* no other encryption mode, check if default encryption is selected */
if (s->cct->_conf->rgw_crypt_default_encryption_key != "") {
std::string master_encryption_key = from_base64(std::string(s->cct->_conf->rgw_crypt_default_encryption_key));

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

isn't rgw_crypt_default_encryption_key already a std::string?

This comment has been minimized.

@aclamk

aclamk Feb 13, 2017

Contributor

Fixed.

uint8_t actual_key[AES_256_KEYSIZE];
if (AES_256_ECB_encrypt(s->cct,
(uint8_t*)master_encryption_key.c_str(), AES_256_KEYSIZE,
(uint8_t*)key_selector.c_str(),

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

static_cast<const uint8_t*> for the casts

This comment has been minimized.

@aclamk

aclamk Feb 13, 2017

Contributor

replaced missing (uint8_t*) to reinterpret_cast-s

}
}
return value;
}

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

for set_attr() and get_str_attribute(), it shouldn't be necessary to run the strings through ::encode() and ::decode() to store the string length. the bufferlist itself will remember the length

// encode
std::string value = "foo";
bufferlist bl;
bl.append(value.c_str(), value.size());

// decode
std::string decoded = bl.to_str();

This comment has been minimized.

@cbodley

cbodley Feb 23, 2017

Contributor

@aclamk does this one make sense? am i missing something about the need to encode a length in the buffer?

}
off_t bl_ofs = 0;
if (cache.length() > 0) {
//append before operation.

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

i'm not sure we need a special case to handle this cache piece. can't we just prepend it to bl and run encryption on bl as usual? that should simplify the stuff dealing with bl_ofs below

bl.claim_prepend(cache); // also clears cache

This comment has been minimized.

@aclamk

aclamk Feb 9, 2017

Contributor

Yes, this looks like good idea. Implementing.

//save remainder
off_t remainder = (bl.length() - bl_ofs) - aligned_size;
if(remainder > 0) {
cache.append(bl.get_contiguous(bl_ofs + aligned_size, remainder), remainder);

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

is there a requirement for contiguous buffers here? we don't want to force it to reallocate the buffer just to make it contiguous. and passing the resulting const char* to bufferlist::append() means we have to actually copy the data, when we could otherwise share references to the underlying raw buffers. bufferlist::copy() should do the right thing when there are multiple buffers:

bl.copy(bl_ofs + aligned_size, remainder, cache);

This comment has been minimized.

@aclamk

aclamk Feb 11, 2017

Contributor

Done

std::string& actual_key) {
std::string secret_url;
if (get_barbican_url(cct, secret_url) < 0) {
return -EINVAL;

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

if get_barbican_url() is returning an error code, we should return that instead of -EINVAL here

This comment has been minimized.

@aclamk

aclamk Feb 11, 2017

Contributor

Sure.

if (secret_req.get_http_status() >=200 &&
secret_req.get_http_status() < 300 &&
secret_bl.length() == AES_256_KEYSIZE) {
actual_key = std::string(secret_bl.c_str(), secret_bl.length());

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

can use bufferlist::to_str() for this. in the unlikely case that secret_bl contains more than one buffer, bufferlist::c_str() would have to reallocate a contiguous buffer in order to return a const char* - bufferlist::to_str() can avoid this by iterating over each buffer::ptr

This comment has been minimized.

@aclamk

aclamk Feb 13, 2017

Contributor

Done.

static_assert(X_AMZ_SERVER_SIDE_ENCRYPTION_LAST == sizeof(crypt_options)/sizeof(*crypt_options), "Missing items in crypt_options");
if (parts != nullptr) {
map<string, struct post_form_part, ltstr_nocase>::iterator iter
= parts->find(crypt_options[option].post_part_name);

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

auto iter = is a bit easier on the eyes :)

private:
static const uint8_t IV[AES_256_IVSIZE];
CephContext* cct;
uint8_t key[AES_256_KEYSIZE];

This comment has been minimized.

@cbodley

cbodley Feb 7, 2017

Contributor

according to the docs for customer keys:

When you upload an object, Amazon S3 uses the encryption key you provide to apply AES-256 encryption to your data and removes the encryption key from memory.

we might want to provide a similar guarantee by zeroing this memory on destruction. the key is also stored in a std::string in s3_prepare_en/decrypt(), in addition to the headers in s->info.env. do you think it's worth the trouble?

This comment has been minimized.

@aclamk

aclamk Feb 13, 2017

Contributor

Im not sure. I expect that in near future, we will implement KMS key cache.
In any case - clearing all places that use keys should not be very difficult.

This comment has been minimized.

@cbodley

cbodley Feb 13, 2017

Contributor

okay. i think clearing it in this destructor is a good idea, but it's probably overkill to clear it everywhere else in the call path

This comment has been minimized.

@aclamk

aclamk Feb 20, 2017

Contributor

Wiped all temporary occurences of actual encryption key. Still, this is not fully h/w safe, as changes are not written to memory immediatelly.

@cbodley

This comment has been minimized.

Contributor

cbodley commented Feb 9, 2017

regarding the directory structure of the new crypto plugin stuff, I'd like to see it resemble the erasure-code and compressor plugins:

ceph/src/crypto/
  crypto_accel.h crypto_plugin.h

ceph/src/crypto/isa-l/
  isal_crypto_accel.cc  isal_crypto_accel.h  isal_crypto_plugin.cc  isal_crypto_plugin.h

ceph/src/crypto/isa-l/isa-l_crypto/ [submodule]

what do you think?

size_t key_size,
uint8_t* data_in,
uint8_t* data_out,
size_t data_size);

This comment has been minimized.

@cbodley

cbodley Feb 9, 2017

Contributor

the signature of AES_256_ECB_encrypt() is different in rgw_crypt.cc, and it doesn't look like there are any external callers. can we just remove this declaration?

This comment has been minimized.

@aclamk

aclamk Feb 13, 2017

Contributor

I fixed the parameters instead.

@@ -0,0 +1,38 @@
set(isal_dir ${CMAKE_SOURCE_DIR}/src/crypto/isa-l/isa-l_crypto)

This comment has been minimized.

@cbodley

cbodley Feb 13, 2017

Contributor

can use CMAKE_CURRENT_SOURCE_DIR to refer to the directory where this CMakeLists.txt lives, so

set(isal_dir ${CMAKE_CURRENT_SOURCE_DIR}/isa-l_crypto)
ASSERT_NE(aes.get(), nullptr);
size_t block_size = aes->get_block_size();
ASSERT_NE(block_size, 0);

This comment has been minimized.

@cbodley

cbodley Feb 15, 2017

Contributor

a few compiler warnings in this file:
warning: comparison between signed and unsigned integer expressions

@cbodley

This comment has been minimized.

Contributor

cbodley commented Feb 15, 2017

one of the conflicts is a change to the signature of RGWPutObjDataProcessor::throttle_data(). i added a commit to the wip-rgw-encryption testing branch at ceph/ceph-ci@d6d9553 if that helps

if (! req_sse.empty()) {
if (req_sse != "aws:kms") {
return -ERR_INVALID_REQUEST;
}

This comment has been minimized.

@cbodley

cbodley Feb 15, 2017

Contributor

// TODO: fail if the request is not made via SSL or signed with SigV4

This comment has been minimized.

@aclamk

aclamk Feb 20, 2017

Contributor

@cbodley Done. No keys accepted from non-ssl connections.

if (! req_sse_ca.empty()) {
if (req_sse_ca != "AES256") {
return -ERR_INVALID_REQUEST;
}

This comment has been minimized.

@cbodley

cbodley Feb 15, 2017

Contributor

// TODO: fail if the request is not made via SSL

note that you can check this with s->info.env->exists("SERVER_PORT_SECURE"). that will make testing more complicated, but nobody should be sending their keys over http in plaintext

This comment has been minimized.

@cbodley

cbodley Feb 16, 2017

Contributor

this was discussed in the standup today. we'd like to add this check, along with a new config variable that teuthology can use to disable it. something like this?

if (s->cct->_conf->rgw_crypt_require_ssl &&
    !s->info.env->exists("SERVER_PORT_SECURE")) {
  return -ERR_INVALID_REQUEST;
}
OPTION(rgw_crypt_require_ssl, OPT_BOOL, true) // requests including encryption key headers must be sent over ssl
@cbodley

This comment has been minimized.

Contributor

cbodley commented Feb 15, 2017

@aclamk a question about SSE-C: are we supposed to be encrypting metadata as well? it mentions that the customer-key headers are accepted for HEAD requests

for SSE-KMS, the headers are not supported for HEAD requests, and they specifically say:

SSE-KMS encrypts only the object data. Any object metadata is not encrypted.

edit: for SSE-C, we probably don't need to encrypt metadata, but we should require a customer-key header that matches the object's RGW_ATTR_CRYPT_KEYMD5

@cbodley cbodley referenced this pull request Feb 17, 2017

Merged

doc: rgw server-side encryption and barbican #13483

4 of 4 tasks complete
@aclamk

This comment has been minimized.

Contributor

aclamk commented Feb 20, 2017

@cbodley We already check RGW_ATTR_CRYPT_KEYMD5 against x-amz-server-side-encryption-customer-key-md5 :
if ((memcmp(key_hash_res, keymd5_bin.c_str(), CEPH_CRYPTO_MD5_DIGESTSIZE) != 0) ||
(get_str_attribute(attrs, RGW_ATTR_CRYPT_KEYMD5) != keymd5_bin)) {
return -ERR_INVALID_DIGEST;
}

@cbodley

This comment has been minimized.

Contributor

cbodley commented Feb 20, 2017

We already check RGW_ATTR_CRYPT_KEYMD5 against x-amz-server-side-encryption-customer-key-md5

this check happens in s3_prepare_decrypt(), which is called by RGWGetObj_ObjStore_S3::get_decrypt_filter(). but it looks like RGWGetObj::execute() doesn't call this until after it handles the HEAD case:

  if (!get_data || ofs > end) { // <-- get_data is false for HEAD requests
    send_response_data(bl, 0, 0);
    return;
  }

  attr_iter = attrs.find(RGW_ATTR_MANIFEST);
  op_ret = this->get_decrypt_filter(&decrypt, filter, ...);

could you please add a s3test case for this?

aclamk and others added some commits Jan 23, 2017

Got rid of hardcoded aws:kms keys
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Fixed problem with unloading plugins on exit.
Fixed shortened life span of g_ceph_context

Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Improved code.
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Clearing up code, continued.
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Changed dir structure of crypto/isal
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Deleted memory where keys were used.
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Fixed HEAD for encrypted objects.
Now transactions for encrypted objects require encryped connection.
Added option to suppress this requirement.

Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
rgw: don't encode length with crypto attrs
Signed-off-by: Casey Bodley <cbodley@redhat.com>
test/rgw: fix compiler warnings in test_rgw_crypto
Signed-off-by: Casey Bodley <cbodley@redhat.com>
rgw: set default plugin_crypto_accelerator = crypto_isal
Signed-off-by: Casey Bodley <cbodley@redhat.com>
rgw: suppress logs that can leak customer key
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Signed-off-by: Radoslaw Zarzynski <rzarzynski@mirantis.com>
Change 'cryptoaccel'->'crypto' for searching for crypto acceleration …
…plugin.

Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Added TODOs to remember to reuse auth/Crypt.
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Moved crypt_sanitize operator<< from namespace std to namespace rgw::…
…crypt_sanitize.

Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Converting TODO comments to warnings to make them more conspicuous.
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
Got rid of unneeded rgw::crypt_sanitize:: .
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
rgw: Synced with interfaces that use rgw_raw_obj.
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
test/rgw: updated test_rgw_crypto to use rgw_raw_obj
Signed-off-by: Casey Bodley <cbodley@redhat.com>
common, arch, intel: added recognition of AESNI features
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
radosgw, crypto plugin: now isal_crypto_plugin initializates only if …
…CPU supports AESNI and SSE4.1

Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
radosgw: fixes after rebase
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
radosgw: added more sanitization from printing keys
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
radosgw, encryption: Now only once attempt to load plugin if it fails.
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
radosgw, encryption: little fixes
Signed-off-by: Adam Kupczyk <akupczyk@mirantis.com>
@aclamk

This comment has been minimized.

Contributor

aclamk commented Apr 5, 2017

...and rebased.

@cbodley cbodley merged commit 95b3a8a into ceph:master Apr 18, 2017

2 of 3 checks passed

Unmodifed Submodules Approval needed: modified submodules found
Details
Signed-off-by all commits in this PR are signed
Details
default Build finished.
Details
@cbodley

This comment has been minimized.

Contributor

cbodley commented Apr 18, 2017

@aclamk thanks for all your hard work and patience during review!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment