28 #include <openssl/conf.h> 29 #include <openssl/evp.h> 30 #include <openssl/err.h> 31 #include <openssl/sha.h> 32 #include <openssl/rand.h> 34 #include <sys/types.h> 56 #define off_signals(new_mask, old_mask) \ 58 sigfillset (&(new_mask)); \ 59 sigdelset (&(new_mask), SIGINT); \ 60 sigdelset (&(new_mask), SIGQUIT); \ 61 sigdelset (&(new_mask), SIGTERM); \ 62 sigdelset (&(new_mask), SIGHUP); \ 63 sigdelset (&(new_mask), SIGABRT); \ 64 sigprocmask (SIG_SETMASK, &(new_mask), &(old_mask)); \ 66 #define restore_signals(old_mask) sigprocmask(SIG_SETMASK, &(old_mask), NULL) 79 static bool tde_validate_mk (
const unsigned char *master_key,
const unsigned char *mk_hash);
80 static void tde_make_mk_hash (
const unsigned char *master_key,
unsigned char *mk_hash);
84 unsigned char *dk_cipher);
86 unsigned char *dk_plain);
94 const unsigned char *key,
const unsigned char *nonce,
unsigned char *cipher_buffer);
96 const unsigned char *key,
const unsigned char *nonce,
unsigned char *plain_buffer);
108 char mk_path[PATH_MAX] = { 0, };
118 char recdes_buffer[
sizeof (int) +
sizeof (
TDE_KEYINFO)];
119 int repid_and_flag_bits = 0;
139 err =
tde_add_mk (vdes, default_mk, created_time, &mk_index);
196 memcpy (recdes_buffer, &repid_and_flag_bits,
sizeof (
int));
197 memcpy (recdes_buffer +
sizeof (
int), &keyinfo,
sizeof (
TDE_KEYINFO));
201 recdes.
data = (
char *) recdes_buffer;
213 HFID_COPY (&tde_Keyinfo_hfid, keyinfo_hfid);
234 char mk_path_buffer[PATH_MAX] = { 0, };
235 const char *mk_path =
NULL;
241 if (mk_path_given !=
NULL)
243 mk_path = mk_path_given;
254 mk_path = mk_path_buffer;
270 HFID_COPY (&tde_Keyinfo_hfid, keyinfo_hfid);
314 #if !defined(WINDOWS) 315 sigset_t new_mask, old_mask;
344 #if !defined(WINDOWS) 362 #if !defined(WINDOWS) 363 sigset_t new_mask, old_mask;
367 if (lseek (vdes, 0L, SEEK_SET) != 0L)
381 #if !defined(WINDOWS) 441 if (lseek (from_vdes, 0L, SEEK_SET) != 0L)
448 while ((nread = read (from_vdes, buffer, 4096)) > 0)
450 char *out_ptr = buffer;
451 ssize_t nwritten = -1;
455 nwritten = write (to_vdes, out_ptr, nread);
462 else if (errno != EINTR)
477 if (!keep_dest_mount)
494 char *mk_path =
NULL;
495 const char *base_name =
NULL;
498 if (ignore_parm || mk_path ==
NULL || mk_path[0] ==
'\0')
562 char recdes_buffer[
sizeof (int) +
sizeof (
TDE_KEYINFO)];
568 recdes.
data = (
char *) recdes_buffer;
571 scan =
heap_first (thread_p, &tde_Keyinfo_hfid,
NULL, &tde_Keyinfo_oid, &recdes, &scan_cache,
COPY);
582 memcpy (keyinfo, recdes_buffer +
sizeof (
int),
sizeof (
TDE_KEYINFO));
600 char recdes_buffer[
sizeof (int) +
sizeof (
TDE_KEYINFO)];
601 int repid_and_flag_bits = 0;
608 memcpy (recdes_buffer, &repid_and_flag_bits,
sizeof (
int));
609 memcpy (recdes_buffer +
sizeof (
int), keyinfo,
sizeof (
TDE_KEYINFO));
612 recdes.
data = (
char *) recdes_buffer;
764 unsigned char hash[SHA256_DIGEST_LENGTH];
790 SHA256_Init (&sha_ctx);
792 SHA256_Final (mk_hash, &sha_ctx);
827 unsigned char *dk_cipher)
847 unsigned char *dk_plain)
901 const unsigned char *data_key;
915 memcpy (nonce, &tmp_nonce,
sizeof (tmp_nonce));
921 memcpy (nonce, &iopage_plain->
prv.
lsa, sizeof (iopage_plain->
prv.
lsa));
954 const unsigned char *data_key;
1000 const unsigned char *data_key;
1030 const unsigned char *data_key;
1063 const unsigned char *nonce,
unsigned char *cipher_buffer)
1065 EVP_CIPHER_CTX *ctx;
1066 const EVP_CIPHER *cipher_type;
1071 if ((ctx = EVP_CIPHER_CTX_new ()) ==
NULL)
1079 cipher_type = EVP_aes_256_ctr ();
1082 cipher_type = EVP_aria_256_ctr ();
1090 if (EVP_EncryptInit_ex (ctx, cipher_type,
NULL, key, nonce) != 1)
1095 if (EVP_EncryptUpdate (ctx, cipher_buffer, &len, plain_buffer, length) != 1)
1103 if (EVP_EncryptFinal_ex (ctx, cipher_buffer + len, &len) != 1)
1112 assert (cipher_len == length);
1117 EVP_CIPHER_CTX_free (ctx);
1142 const unsigned char *nonce,
unsigned char *plain_buffer)
1144 EVP_CIPHER_CTX *ctx;
1145 const EVP_CIPHER *cipher_type;
1150 if ((ctx = EVP_CIPHER_CTX_new ()) ==
NULL)
1158 cipher_type = EVP_aes_256_ctr ();
1161 cipher_type = EVP_aria_256_ctr ();
1169 if (EVP_DecryptInit_ex (ctx, cipher_type,
NULL, key, nonce) != 1)
1174 if (EVP_DecryptUpdate (ctx, plain_buffer, &len, cipher_buffer, length) != 1)
1181 if (EVP_DecryptFinal_ex (ctx, plain_buffer + len, &len) != 1)
1189 assert (plain_len == length);
1194 EVP_CIPHER_CTX_free (ctx);
1248 char mk_path[PATH_MAX] = { 0, };
1251 time_t created_time;
1265 err =
tde_find_mk (vdes, mk_index, master_key, &created_time);
1290 err =
tde_change_mk (thread_p, mk_index, master_key, created_time);
1321 *created_time = time (
NULL);
1337 printf (
"%02x", master_key[i]);
1351 tde_add_mk (
int vdes,
const unsigned char *master_key, time_t created_time,
int *mk_index)
1358 #if !defined(WINDOWS) 1359 sigset_t new_mask, old_mask;
1402 location = lseek (vdes, 0, SEEK_CUR);
1420 #if !defined(WINDOWS) 1437 tde_find_mk (
int vdes,
int mk_index,
unsigned char *master_key, time_t * created_time)
1443 #if !defined(WINDOWS) 1444 sigset_t new_mask, old_mask;
1450 if (lseek (vdes, location, SEEK_SET) != location)
1468 if (master_key !=
NULL)
1473 if (created_time !=
NULL)
1481 #if !defined(WINDOWS) 1512 #if !defined(WINDOWS) 1513 sigset_t new_mask, old_mask;
1519 if (lseek (vdes, location, SEEK_SET) != location)
1555 #if !defined(WINDOWS) 1575 #if !defined(WINDOWS) 1576 sigset_t new_mask, old_mask;
1582 if (lseek (vdes, location, SEEK_SET) != location)
1608 #if !defined(WINDOWS) 1633 int cnt_invalid = 0;
1637 #if !defined(WINDOWS) 1638 sigset_t new_mask, old_mask;
1647 printf (
"Keys Information: \n");
1665 printf (
"created on %s", ctime_buf);
1678 printf (
"The number of keys: %d\n", cnt_valid);
1680 #if !defined(WINDOWS)
int xtde_get_mk_info(THREAD_ENTRY *thread_p, int *mk_index, time_t *created_time, time_t *set_time)
static int tde_update_keyinfo(THREAD_ENTRY *thread_p, const TDE_KEYINFO *keyinfo)
void fileio_unformat_and_rename(THREAD_ENTRY *thread_p, const char *vol_label_p, const char *new_label_p)
#define TDE_MK_FILE_ITEM_OFFSET(index)
#define ER_TDE_INVALID_MASTER_KEY
int heap_scancache_start_modify(THREAD_ENTRY *thread_p, HEAP_SCANCACHE *scan_cache, const HFID *hfid, const OID *class_oid, int op_type, MVCC_SNAPSHOT *mvcc_snapshot)
#define TDE_MK_FILE_ITEM_INDEX(offset)
#define TDE_DATA_PAGE_ENC_LENGTH
void fileio_make_keys_name_given_path(char *keys_name_p, const char *keys_path_p, const char *db_name_p)
static int tde_create_dk(unsigned char *data_key)
#define TDE_DATA_PAGE_NONCE_LENGTH
#define ER_TDE_MAX_KEY_FILE
#define ASSERT_ERROR_AND_SET(error_code)
int xtde_change_mk_without_flock(THREAD_ENTRY *thread_p, const int mk_index)
static bool tde_validate_mk(const unsigned char *master_key, const unsigned char *mk_hash)
int tde_initialize(THREAD_ENTRY *thread_p, HFID *keyinfo_hfid)
#define TDE_LOG_PAGE_ENC_OFFSET
#define off_signals(new_mask, old_mask)
bool fileio_is_volume_exist(const char *vol_label_p)
int64_t temp_write_counter
static int tde_load_dks(const unsigned char *master_key, const TDE_KEYINFO *keyinfo)
const VOLID LOG_DBCOPY_VOLID
int heap_scancache_end(THREAD_ENTRY *thread_p, HEAP_SCANCACHE *scan_cache)
char * fileio_get_volume_label_by_fd(int vol_fd, bool is_peek)
#define COPY_OID(dest_oid_ptr, src_oid_ptr)
int fileio_mount(THREAD_ENTRY *thread_p, const char *db_full_name_p, const char *vol_label_p, VOLID vol_id, int lock_wait, bool is_do_sync)
#define ER_TDE_ENCRYPTION_ERROR
static int tde_encrypt_internal(const unsigned char *plain_buffer, int length, TDE_ALGORITHM tde_algo, const unsigned char *key, const unsigned char *nonce, unsigned char *cipher_buffer)
const char * er_get_msglog_filename(void)
int tde_delete_mk(int vdes, int mk_index)
#define ER_BO_CANNOT_CREATE_VOL
#define ER_BO_VOLUME_EXISTS
#define TDE_DATA_PAGE_ENC_OFFSET
const char * tde_get_algorithm_name(TDE_ALGORITHM tde_algo)
const char * boot_db_full_name()
#define TDE_LOG_PAGE_ENC_LENGTH
void er_set(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
const char * fileio_get_base_file_name(const char *full_name_p)
static void tde_dk_nonce(TDE_DATA_KEY_TYPE dk_type, unsigned char *dk_nonce)
void fileio_close(int vol_fd)
#define TDE_DATA_KEY_LENGTH
#define CUBRID_MAGIC_MAX_LENGTH
int tde_add_mk(int vdes, const unsigned char *master_key, time_t created_time, int *mk_index)
static int tde_encrypt_dk(const unsigned char *dk_plain, TDE_DATA_KEY_TYPE dk_type, const unsigned char *master_key, unsigned char *dk_cipher)
#define SINGLE_ROW_UPDATE
#define restore_signals(old_mask)
void tde_print_mk(const unsigned char *master_key)
int heap_update_logical(THREAD_ENTRY *thread_p, HEAP_OPERATION_CONTEXT *context)
void tde_make_keys_file_fullname(char *keys_vol_fullname, const char *db_full_name, bool ignore_parm)
void heap_create_update_context(HEAP_OPERATION_CONTEXT *context, HFID *hfid_p, OID *oid_p, OID *class_oid_p, RECDES *recdes_p, HEAP_SCANCACHE *scancache_p, UPDATE_INPLACE_STYLE in_place)
LOG_PAGEID logical_pageid
void heap_create_insert_context(HEAP_OPERATION_CONTEXT *context, HFID *hfid_p, OID *class_oid_p, RECDES *recdes_p, HEAP_SCANCACHE *scancache_p)
unsigned char perm_key[TDE_DATA_KEY_LENGTH]
int tde_get_keyinfo(THREAD_ENTRY *thread_p, TDE_KEYINFO *keyinfo)
void fileio_dismount(THREAD_ENTRY *thread_p, int vol_fd)
int heap_insert_logical(THREAD_ENTRY *thread_p, HEAP_OPERATION_CONTEXT *context, PGBUF_WATCHER *home_hint_p)
int tde_create_mk(unsigned char *master_key, time_t *created_time)
static OID tde_Keyinfo_oid
static void cleanup(int signo)
static int tde_decrypt_internal(const unsigned char *cipher_buffer, int length, TDE_ALGORITHM tde_algo, const unsigned char *key, const unsigned char *nonce, unsigned char *plain_buffer)
static int tde_decrypt_dk(const unsigned char *dk_cipher, TDE_DATA_KEY_TYPE dk_type, const unsigned char *master_key, unsigned char *dk_plain)
int tde_find_mk(int vdes, int mk_index, unsigned char *master_key, time_t *created_time)
int tde_find_first_mk(int vdes, int *mk_index, unsigned char *master_key, time_t *created_time)
int tde_change_mk(THREAD_ENTRY *thread_p, const int mk_index, const unsigned char *master_key, const time_t created_time)
unsigned char mk_hash[TDE_MASTER_KEY_LENGTH]
#define TDE_MK_FILE_CONTENTS_START
void er_set_with_oserror(int severity, const char *file_name, const int line_no, int err_id, int num_args,...)
void fileio_make_keys_name(char *keys_name_p, const char *db_full_name_p)
int tde_load_mk(int vdes, const TDE_KEYINFO *keyinfo, unsigned char *master_key)
SCAN_CODE heap_first(THREAD_ENTRY *thread_p, const HFID *hfid, OID *class_oid, OID *oid, RECDES *recdes, HEAP_SCANCACHE *scan_cache, int ispeeking)
static HFID tde_Keyinfo_hfid
unsigned char dk_perm[TDE_DATA_KEY_LENGTH]
#define TDE_MK_FILE_ITEM_SIZE
#define HFID_IS_NULL(hfid)
static void tde_make_mk_hash(const unsigned char *master_key, unsigned char *mk_hash)
const VOLID LOG_DBTDE_KEYS_VOLID
bool tde_validate_keys_file(int vdes)
unsigned char temp_key[TDE_DATA_KEY_LENGTH]
int tde_cipher_initialize(THREAD_ENTRY *thread_p, const HFID *keyinfo_hfid, const char *mk_path_given)
#define ER_TDE_KEY_CREATION_FAIL
int heap_scancache_quick_start_with_class_hfid(THREAD_ENTRY *thread_p, HEAP_SCANCACHE *scan_cache, const HFID *hfid)
int tde_decrypt_data_page(const FILEIO_PAGE *iopage_cipher, TDE_ALGORITHM tde_algo, bool is_temp, FILEIO_PAGE *iopage_plain)
static void print_value(FIELD_NAME name, const void *value, FIELD_TYPE type)
char * prm_get_string_value(PARAM_ID prm_id)
int tde_copy_keys_file(THREAD_ENTRY *thread_p, const char *dest_fullname, const char *src_fullname, bool keep_dest_mount, bool keep_src_mount)
unsigned char dk_temp[TDE_DATA_KEY_LENGTH]
#define TDE_DK_NONCE_LENGTH
enum tde_data_key_type TDE_DATA_KEY_TYPE
void heap_flush(THREAD_ENTRY *thread_p, const OID *oid)
TDE_DATA_KEY_SET data_keys
#define ER_TDE_DECRYPTION_ERROR
#define ER_TDE_MASTER_KEY_NOT_FOUND
unsigned char log_key[TDE_DATA_KEY_LENGTH]
#define TDE_LOG_PAGE_NONCE_LENGTH
#define ER_TDE_INVALID_KEYS_FILE
static int tde_create_keys_file(const char *keyfile_fullname)
#define TDE_MK_FILE_ITEM_COUNT_MAX
#define CUBRID_MAGIC_KEYS
int tde_encrypt_data_page(const FILEIO_PAGE *iopage_plain, TDE_ALGORITHM tde_algo, bool is_temp, FILEIO_PAGE *iopage_cipher)
unsigned char master_key[TDE_MASTER_KEY_LENGTH]
#define ER_TDE_CIPHER_IS_NOT_LOADED
int tde_decrypt_log_page(const LOG_PAGE *logpage_cipher, TDE_ALGORITHM tde_algo, LOG_PAGE *logpage_plain)
int tde_dump_mks(int vdes, bool print_value)
int fileio_open(const char *vol_label_p, int flags, int mode)
#define HFID_COPY(hfid_ptr1, hfid_ptr2)
unsigned char dk_log[TDE_DATA_KEY_LENGTH]
#define TDE_MASTER_KEY_LENGTH
static int tde_generate_keyinfo(TDE_KEYINFO *keyinfo, int mk_index, const unsigned char *master_key, const time_t created_time, const TDE_DATA_KEY_SET *dks)
int tde_encrypt_log_page(const LOG_PAGE *logpage_plain, TDE_ALGORITHM tde_algo, LOG_PAGE *logpage_cipher)