Spdk/python/spdk/sma/volume/crypto.py
Michal Berger 588dfe314b Add SPDX header to various files
They were missed by the initial set of patches which introduced this
header as a mandatory one across different types of files.

Signed-off-by: Michal Berger <michal.berger@intel.com>
Change-Id: I3f9b37d41298c843e1648e72fe8593768ccd37e0
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15423
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
2022-11-29 08:27:51 +00:00

92 lines
2.5 KiB
Python

# SPDX-License-Identifier: BSD-3-Clause
# Copyright (C) 2022 Intel Corporation.
# All rights reserved.
import grpc
import logging
log = logging.getLogger(__name__)
class CryptoException(Exception):
def __init__(self, code, message):
self.code = code
self.message = message
class CryptoEngine:
def __init__(self, name):
self.name = name
def init(self, client, params):
"""Initialize crypto engine"""
self._client = client
def setup(self, volume_id, key, cipher, key2=None):
"""Set up crypto on a given volume"""
raise NotImplementedError()
def cleanup(self, volume_id):
"""
Disable crypto on a given volume. If crypto was not configured on that volume, this method
is a no-op and shouldn't raise any exceptions.
"""
raise NotImplementedError()
def verify(self, volume_id, key, cipher, key2=None):
"""
Verify that specified crypto parameters match those that are currently deployed on a given
volume. If key is None, this mehtod ensures that the volume doesn't use crypto. If
something is wrong (e.g. keys don't match, different cipher is used, etc.), this method
raises CryptoException.
"""
raise NotImplementedError()
def get_crypto_bdev(self, volume_id):
"""
Return the name of a crypto bdev on a given volume. This method might return volume_id if
crypto engine doesn't create a separate crypto bdev to set up crypto. If crypto is
disabled on a given volue, this method returns None.
"""
raise NotImplementedError()
class CryptoEngineNop(CryptoEngine):
def __init__(self):
super().__init__('nop')
def setup(self, volume_id, key, cipher, key2=None):
raise CryptoException(grpc.StatusCode.INVALID_ARGUMENT, 'Crypto is disabled')
def cleanup(self, volume_id):
pass
def verify(self, volume_id, key, cipher, key2=None):
pass
def get_crypto_bdev(self, volume_id):
return None
_crypto_engine = None
_crypto_engines = {}
def get_crypto_engine():
return _crypto_engine
def set_crypto_engine(name):
global _crypto_engine
engine = _crypto_engines.get(name)
if engine is None:
raise ValueError(f'Unknown crypto engine: {name}')
log.info(f'Setting crypto engine: {name}')
_crypto_engine = engine
def register_crypto_engine(engine):
global _crypto_engines
_crypto_engines[engine.name] = engine