fis-gtm/sr_unix/gtmcrypt_dbk_ref.h

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 */