from ceph_volume.util import encryption
+import base64
+class TestGetKeySize(object):
+ def test_get_size_from_conf_default(self, conf_ceph_stub):
+ conf_ceph_stub('''
+ [global]
+ fsid=asdf
+ ''')
+ assert encryption.get_key_size_from_conf() == '512'
+
+ def test_get_size_from_conf_custom(self, conf_ceph_stub):
+ conf_ceph_stub('''
+ [global]
+ fsid=asdf
+ [osd]
+ osd_dmcrypt_key_size=256
+ ''')
+ assert encryption.get_key_size_from_conf() == '256'
+
+ def test_get_size_from_conf_custom_invalid(self, conf_ceph_stub):
+ conf_ceph_stub('''
+ [global]
+ fsid=asdf
+ [osd]
+ osd_dmcrypt_key_size=1024
+ ''')
+ assert encryption.get_key_size_from_conf() == '512'
class TestStatus(object):
class TestDmcryptKey(object):
- def test_dmcrypt_with_default_size(self, conf_ceph_stub):
- conf_ceph_stub('[global]\nfsid=asdf-lkjh')
- result = encryption.create_dmcrypt_key()
- assert len(result) == 172
-
- def test_dmcrypt_with_custom_size(self, conf_ceph_stub):
- conf_ceph_stub('''
- [global]
- fsid=asdf
- [osd]
- osd_dmcrypt_size=8
- ''')
+ def test_dmcrypt(self):
result = encryption.create_dmcrypt_key()
- assert len(result) == 172
+ assert len(base64.b64decode(result)) == 128
logger = logging.getLogger(__name__)
-
-def create_dmcrypt_key():
+def get_key_size_from_conf():
"""
- Create the secret dm-crypt key used to decrypt a device.
+ Return the osd dmcrypt key size from config file.
+ Default is 512.
"""
- # get the customizable dmcrypt key size (in bits) from ceph.conf fallback
- # to the default of 1024
- dmcrypt_key_size = conf.ceph.get_safe(
+ default_key_size = '512'
+ key_size = conf.ceph.get_safe(
'osd',
'osd_dmcrypt_key_size',
- default=1024,
- )
- # The size of the key is defined in bits, so we must transform that
- # value to bytes (dividing by 8) because we read in bytes, not bits
- random_string = os.urandom(int(dmcrypt_key_size / 8))
+ default='512')
+
+ if key_size not in ['256', '512']:
+ logger.warning(("Invalid value set for osd_dmcrypt_key_size ({}). "
+ "Falling back to {}bits".format(key_size, default_key_size)))
+ return default_key_size
+
+ return key_size
+
+def create_dmcrypt_key():
+ """
+ Create the secret dm-crypt key (KEK) used to encrypt/decrypt the Volume Key.
+ """
+ random_string = os.urandom(128)
key = base64.b64encode(random_string).decode('utf-8')
return key
command = [
'cryptsetup',
'--batch-mode', # do not prompt
+ '--key-size',
+ get_key_size_from_conf(),
'--key-file', # misnomer, should be key
'-', # because we indicate stdin for the key here
'luksFormat',
"""
command = [
'cryptsetup',
+ '--key-size',
+ get_key_size_from_conf(),
'--key-file',
'-',
'--allow-discards', # allow discards (aka TRIM) requests for device