diff options
Diffstat (limited to 'sql/encryption_keys.cc')
-rw-r--r-- | sql/encryption_keys.cc | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/sql/encryption_keys.cc b/sql/encryption_keys.cc new file mode 100644 index 00000000000..f924ad1c599 --- /dev/null +++ b/sql/encryption_keys.cc @@ -0,0 +1,110 @@ +#include <my_global.h> +#include <mysql/plugin_encryption_key_management.h> +#include <my_crypt_key_management.h> +#include "log.h" +#include "sql_plugin.h" + +#ifndef DBUG_OFF +my_bool debug_use_static_encryption_keys = 0; +uint opt_debug_encryption_key_version = 0; +#endif + +/* there can be only one encryption key management plugin enabled */ +static plugin_ref encryption_key_manager= 0; +static struct st_mariadb_encryption_key_management *handle; + +uint get_latest_encryption_key_version() +{ +#ifndef DBUG_OFF + if (debug_use_static_encryption_keys) + { + //mysql_mutex_lock(&LOCK_global_system_variables); + uint res = opt_debug_encryption_key_version; + //mysql_mutex_unlock(&LOCK_global_system_variables); + return res; + } +#endif + + if (encryption_key_manager) + return handle->get_latest_key_version(); + + return BAD_ENCRYPTION_KEY_VERSION; +} + +uint has_encryption_key(uint version) +{ + if (encryption_key_manager) + return handle->has_key_version(version); + + return 0; +} + +uint get_encryption_key_size(uint version) +{ + if (encryption_key_manager) + return handle->get_key_size(version); + + return 0; +} + +int get_encryption_key(uint version, uchar* key, uint size) +{ +#ifndef DBUG_OFF + if (debug_use_static_encryption_keys) + { + memset(key, 0, size); + // Just don't support tiny keys, no point anyway. + if (size < 4) + return 1; + + mi_int4store(key, version); + return 0; + } +#endif + + if (encryption_key_manager) + return handle->get_key(version, key, size); + + return 1; +} + +int get_encryption_iv(uint version, uchar* iv, uint size) +{ + if (encryption_key_manager) + return handle->get_iv(version, iv, size); + + return 1; +} + +int initialize_encryption_key_management_plugin(st_plugin_int *plugin) +{ + if (encryption_key_manager) + return 1; + + if (plugin->plugin->init && plugin->plugin->init(plugin)) + { + sql_print_error("Plugin '%s' init function returned error.", + plugin->name.str); + return 1; + } + + encryption_key_manager= plugin_lock(NULL, plugin_int_to_ref(plugin)); + handle= (struct st_mariadb_encryption_key_management*) + plugin->plugin->info; + return 0; +} + +int finalize_encryption_key_management_plugin(st_plugin_int *plugin) +{ + DBUG_ASSERT(encryption_key_manager); + + if (plugin->plugin->deinit && plugin->plugin->deinit(NULL)) + { + DBUG_PRINT("warning", ("Plugin '%s' deinit function returned error.", + plugin->name.str)); + } + plugin_unlock(NULL, encryption_key_manager); + encryption_key_manager= 0; + return 0; +} + |