75 lines
2.1 KiB
C
75 lines
2.1 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2009 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. *
|
|
* *
|
|
****************************************************************/
|
|
#include "mdef.h"
|
|
#include "gtm_string.h"
|
|
#include "gtm_stdio.h"
|
|
#include "gdsroot.h"
|
|
#include "gdsbt.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "jnl.h"
|
|
#include "util.h"
|
|
#include "gtmio.h"
|
|
#include "gtmcrypt.h"
|
|
#include "mu_decrypt.h"
|
|
|
|
#define WITHIN_PRINTABLE_RANGE(c) (31 < (unsigned char)c && 127 > (unsigned char)c)
|
|
/* Given a file (journal or database), the function extracts the buffer of the given length at the given offset and displays it
|
|
* on the STDIN. Note that, the offset and length should match the values at the encryption time. In case of journal files,
|
|
* this offset could be obtained for every record using a detailed journal extract. */
|
|
int mu_decrypt(char *fname, uint4 off, uint4 len)
|
|
{
|
|
# ifdef GTM_CRYPT
|
|
int fd, n_len, save_errno, status, i;
|
|
char hash[GTMCRYPT_HASH_LEN], *buff;
|
|
boolean_t is_encrypted;
|
|
gtmcrypt_key_t key_handle;
|
|
|
|
assert(fname);
|
|
assert(STRLEN(fname));
|
|
n_len = STRLEN(fname);
|
|
GET_FD_HASH(fname, n_len, fd, hash, is_encrypted);
|
|
buff = (char *)malloc(len);
|
|
LSEEKREAD(fd, off, buff, len, save_errno);
|
|
if (0 != save_errno)
|
|
{
|
|
close(fd);
|
|
GC_DISPLAY_FILE_ERROR_AND_RETURN("Error reading from file !AD", fname, n_len, save_errno);
|
|
}
|
|
if (is_encrypted)
|
|
{
|
|
INIT_PROC_ENCRYPTION(status);
|
|
GTMCRYPT_GETKEY(hash, key_handle, status);
|
|
if (0 == status)
|
|
GTMCRYPT_DECODE_FAST(key_handle, buff, len, NULL, status);
|
|
if (0 != status)
|
|
{
|
|
close(fd);
|
|
free(buff);
|
|
GC_RTS_ERROR(status, fname);
|
|
}
|
|
}
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
if (WITHIN_PRINTABLE_RANGE(buff[i]))
|
|
PRINTF("%c", buff[i]);
|
|
else
|
|
PRINTF("%c", '.');
|
|
}
|
|
free(buff);
|
|
close(fd);
|
|
#endif
|
|
return SS_NORMAL;
|
|
|
|
}
|