blob: 71afd5bc601373c0bb0deab027662742f719adea [file] [log] [blame]
/********************************************************************************/
/* */
/* TPM Debug Utilities */
/* Written by Ken Goldman */
/* IBM Thomas J. Watson Research Center */
/* $Id: tpm_debug.c 4179 2010-11-10 20:10:24Z kgoldman $ */
/* */
/* (c) Copyright IBM Corporation 2006, 2010. */
/* */
/* All rights reserved. */
/* */
/* Redistribution and use in source and binary forms, with or without */
/* modification, are permitted provided that the following conditions are */
/* met: */
/* */
/* Redistributions of source code must retain the above copyright notice, */
/* this list of conditions and the following disclaimer. */
/* */
/* Redistributions in binary form must reproduce the above copyright */
/* notice, this list of conditions and the following disclaimer in the */
/* documentation and/or other materials provided with the distribution. */
/* */
/* Neither the names of the IBM Corporation nor the names of its */
/* contributors may be used to endorse or promote products derived from */
/* this software without specific prior written permission. */
/* */
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR */
/* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
/* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, */
/* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY */
/* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE */
/* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
/********************************************************************************/
#include <config.h>
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdarg.h>
#include "swtpm_debug.h"
#include "logging.h"
/*
* SWTPM_AppendPrintf() print and append to buffer
*
* @buffer: pointer to existing buffer or pointer to NULL to start a new buffer
* @fmt: typical printf fmt
* @...: varagr printf parameters
*
*/
static int SWTPM_AppendPrintf(char **buffer, const char *fmt, ...)
{
va_list ap;
int n, len = 0;
char *dest = NULL, *nbuffer;
va_start(ap, fmt);
n = vasprintf(&dest, fmt, ap);
va_end(ap);
if (n < 0)
return n;
if (*buffer)
len = strlen(*buffer);
nbuffer = malloc(len + n + 1);
if (!nbuffer) {
free(dest);
return -1;
}
if (*buffer)
memcpy(nbuffer, *buffer, len);
memcpy(&nbuffer[len], dest, n);
nbuffer[len + n] = 0;
free(dest);
free(*buffer);
*buffer = nbuffer;
return len + n;
}
/* SWTPM_PrintAll() prints 'string', the length, and then the entire byte array
*/
void SWTPM_PrintAll(const char *string, const char *indentation,
const unsigned char* buff, uint32_t length)
{
uint32_t i;
int indent;
char *linebuffer = NULL;
indent = log_check_string(string);
if (indent < 0)
return;
if (buff != NULL) {
logprintf(STDERR_FILENO, "%s length %u\n", string, length);
SWTPM_AppendPrintf(&linebuffer, "%s", indentation);
for (i = 0 ; i < length ; i++) {
if (i && !( i % 16 )) {
SWTPM_AppendPrintf(&linebuffer, "\n");
logprintfA(STDERR_FILENO, 0, linebuffer);
free(linebuffer);
linebuffer = NULL;
SWTPM_AppendPrintf(&linebuffer, "%s", indentation);
}
SWTPM_AppendPrintf(&linebuffer, "%.2X ", buff[i]);
}
SWTPM_AppendPrintf(&linebuffer, "\n");
logprintf(STDERR_FILENO, "%s", linebuffer);
free(linebuffer);
}
else {
logprintf(STDERR_FILENO, "%s null\n", string);
}
return;
}