118 lines
4.4 KiB
C
118 lines
4.4 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2009, 2010 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#ifndef GTMCRYPT_DBK_REF_H
|
|
#define GTMCRYPT_DBK_REF_H
|
|
|
|
typedef struct
|
|
{
|
|
xc_string_t db_name, key_filename; /* name of the database and corresponding key found in the db key file */
|
|
xc_string_t key_string, hash; /* plain text key and it's hash */
|
|
xc_fileid_ptr_t fileid; /* if valid, unique file id representation of the database path */
|
|
int fileid_dirty, sym_key_dirty; /* indicates if the db and the key file are valid accessible path */
|
|
int index; /* A positive integer (initialized to -1) indicating the ith entry in the db key
|
|
* file. This value is returned to the caller and subsequently passed to the
|
|
* plugin to get the key for the corresponding database. */
|
|
struct db_key_map *next; /* Pointer to the next entry in the linked list */
|
|
crypt_key_t encr_key_handle, decr_key_handle; /* Pointer to the actual key handles typedef'ed to the underlying
|
|
* encryption library. */
|
|
}db_key_map;
|
|
|
|
|
|
void gc_dbk_scrub_entries(void);
|
|
xc_status_t gc_dbk_is_db_key_file_modified(void);
|
|
db_key_map* gc_dbk_get_entry_by_fileid(xc_fileid_ptr_t fileid);
|
|
db_key_map* gc_dbk_get_entry_by_hash(xc_string_t *hash);
|
|
dbkeyfile_line_type gc_dbk_get_line_info (char *buf, char *data);
|
|
xc_status_t gc_dbk_load_gtm_dbkeys(FILE **gtm_dbkeys);
|
|
xc_status_t gc_dbk_load_entries_from_file(void);
|
|
xc_status_t gc_dbk_fill_sym_key_and_hash(xc_fileid_ptr_t req_fileid, char *req_hash);
|
|
void gc_dbk_get_hash(db_key_map *entry, xc_string_t *hash);
|
|
|
|
|
|
#define GC_FREE_DB_KEY_MAP(X) \
|
|
{ \
|
|
GC_FREE((X)->db_name.address); \
|
|
GC_FREE((X)->key_filename.address); \
|
|
memset((X)->key_string.address, 0, GTM_KEY_MAX);\
|
|
GC_FREE((X)->key_string.address); \
|
|
GC_FREE((X)->hash.address); \
|
|
gtm_xcfileid_free_fptr((X)->fileid); \
|
|
GC_FREE(X); \
|
|
}
|
|
|
|
#define GC_NEW_DB_KEYMAP(X) \
|
|
{ \
|
|
GC_MALLOC(X, SIZEOF(db_key_map), db_key_map); \
|
|
memset(X, 0, SIZEOF(db_key_map)); \
|
|
GC_MALLOC(X->db_name.address, GTM_PATH_MAX, char); \
|
|
memset((X)->db_name.address, 0, GTM_PATH_MAX); \
|
|
GC_MALLOC(X->key_filename.address, GTM_PATH_MAX, char); \
|
|
memset((X)->key_filename.address, 0, GTM_PATH_MAX); \
|
|
GC_MALLOC(X->key_string.address, GTM_PATH_MAX, char); \
|
|
memset((X)->key_string.address, 0, GTM_KEY_MAX); \
|
|
GC_MALLOC(X->hash.address, GTMCRYPT_HASH_LEN, char); \
|
|
memset((X)->hash.address, 0, GTMCRYPT_HASH_LEN); \
|
|
(X)->fileid_dirty = TRUE; \
|
|
(X)->sym_key_dirty = TRUE; \
|
|
(X)->fileid = NULL; \
|
|
(X)->index = 0; \
|
|
}
|
|
|
|
#define GC_DBK_LOAD_KEY_FILE \
|
|
{ \
|
|
if (0 != gc_dbk_load_entries_from_file()) \
|
|
return GC_FAILURE; \
|
|
}
|
|
|
|
/* After the preliminary search, if we haven't found our entry in the in-memory linked list for the
|
|
* given hash/fileid, we try reloading the db key file(if it has been changed since last time) and then
|
|
* we re-organize our in-memory linked list and try to search again.
|
|
*/
|
|
#define GC_DBK_RELOAD_IF_NEEDED(entry, RC, fileid, req_hash) \
|
|
{ \
|
|
if (NULL == entry) \
|
|
{ \
|
|
if (TRUE == gc_dbk_is_db_key_file_modified()) \
|
|
GC_DBK_LOAD_KEY_FILE; \
|
|
RC = gc_dbk_fill_sym_key_and_hash(fileid, req_hash); \
|
|
} \
|
|
}
|
|
|
|
#define GC_DBK_GET_ENTRY_FROM_HANDLE(handle, entry, ret) \
|
|
{ \
|
|
int idx; \
|
|
\
|
|
idx = (int)handle; \
|
|
if (idx < 0 || (idx > num_entries)) \
|
|
{ \
|
|
snprintf(err_string, ERR_STRLEN, "%s", "Encryption handle corrupted."); \
|
|
entry = NULL; \
|
|
return ret; \
|
|
} else \
|
|
entry = (db_key_map *)fast_lookup_entry[idx]; \
|
|
}
|
|
|
|
#define GC_DBK_FILENAME_TO_ID(filename, fileid) \
|
|
{ \
|
|
if (TRUE != gtm_filename_to_id_fptr(filename, &fileid)) \
|
|
{ \
|
|
snprintf(err_string, ERR_STRLEN, "database file %s not found", filename->address); \
|
|
return GC_FAILURE; \
|
|
} \
|
|
}
|
|
|
|
#define GC_DBK_SET_FIRST_ENTRY(cur) db_map_root = (db_key_map *)cur
|
|
#define GC_DBK_GET_FIRST_ENTRY() db_map_root
|
|
#define GC_DBK_GET_NEXT_ENTRY(cur) (db_key_map *) cur->next
|
|
|
|
#endif /* GTMCRYPT_DBK_REF_H */
|