diff options
Diffstat (limited to 'TPM2-Plugin/lib/tpm2_util.c')
-rw-r--r-- | TPM2-Plugin/lib/tpm2_util.c | 347 |
1 files changed, 0 insertions, 347 deletions
diff --git a/TPM2-Plugin/lib/tpm2_util.c b/TPM2-Plugin/lib/tpm2_util.c deleted file mode 100644 index c0a6cc4..0000000 --- a/TPM2-Plugin/lib/tpm2_util.c +++ /dev/null @@ -1,347 +0,0 @@ -//**********************************************************************; -// Copyright (c) 2017, Intel Corporation -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. 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. -// -// 3. Neither the name of Intel 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 <ctype.h> -#include <errno.h> -#include <stdbool.h> -#include <stdlib.h> -#include <string.h> - -#include "log.h" -#include "files.h" -#include "tpm2_alg_util.h" -#include "tpm2_attr_util.h" -#include "tpm2_tool.h" -#include "tpm2_util.h" - -bool tpm2_util_concat_buffer(TPM2B_MAX_BUFFER *result, TPM2B *append) { - - if (!result || !append) { - return false; - } - - if ((result->size + append->size) < result->size) { - return false; - } - - if ((result->size + append->size) > TPM2_MAX_DIGEST_BUFFER) { - return false; - } - - memcpy(&result->buffer[result->size], append->buffer, append->size); - result->size += append->size; - - return true; -} - -bool tpm2_util_string_to_uint16(const char *str, uint16_t *value) { - - uint32_t tmp; - bool result = tpm2_util_string_to_uint32(str, &tmp); - if (!result) { - return false; - } - - /* overflow on 16 bits? */ - if (tmp > UINT16_MAX) { - return false; - } - - *value = (uint16_t) tmp; - return true; -} - -bool tpm2_util_string_to_uint32(const char *str, uint32_t *value) { - - char *endptr; - - if (str == NULL || *str == '\0') { - return false; - } - - /* clear errno before the call, should be 0 afterwards */ - errno = 0; - uint32_t tmp = strtoul(str, &endptr, 0); - if (errno) { - return false; - } - - /* - * The entire string should be able to be converted or fail - * We already checked that str starts with a null byte, so no - * need to check that again per the man page. - */ - if (*endptr != '\0') { - return false; - } - - *value = tmp; - return true; -} - -int tpm2_util_hex_to_byte_structure(const char *inStr, UINT16 *byteLength, - BYTE *byteBuffer) { - int strLength; //if the inStr likes "1a2b...", no prefix "0x" - int i = 0; - if (inStr == NULL || byteLength == NULL || byteBuffer == NULL) - return -1; - strLength = strlen(inStr); - if (strLength % 2) - return -2; - for (i = 0; i < strLength; i++) { - if (!isxdigit(inStr[i])) - return -3; - } - - if (*byteLength < strLength / 2) - return -4; - - *byteLength = strLength / 2; - - for (i = 0; i < *byteLength; i++) { - char tmpStr[4] = { 0 }; - tmpStr[0] = inStr[i * 2]; - tmpStr[1] = inStr[i * 2 + 1]; - byteBuffer[i] = strtol(tmpStr, NULL, 16); - } - return 0; -} - -void tpm2_util_hexdump(const BYTE *data, size_t len) { - - if (!output_enabled) { - return; - } - - size_t i; - for (i=0; i < len; i++) { - printf("%02x", data[i]); - } -} - -bool tpm2_util_hexdump_file(FILE *fd, size_t len) { - BYTE* buff = (BYTE*)malloc(len); - if (!buff) { - LOG_ERR("malloc() failed"); - return false; - } - - bool res = files_read_bytes(fd, buff, len); - if (!res) { - LOG_ERR("Failed to read file"); - free(buff); - return false; - } - - tpm2_util_hexdump(buff, len); - - free(buff); - return true; -} - -bool tpm2_util_print_tpm2b_file(FILE *fd) -{ - UINT16 len; - bool res = files_read_16(fd, &len); - if(!res) { - LOG_ERR("File read failed"); - return false; - } - return tpm2_util_hexdump_file(fd, len); -} - -bool tpm2_util_is_big_endian(void) { - - uint32_t test_word; - uint8_t *test_byte; - - test_word = 0xFF000000; - test_byte = (uint8_t *) (&test_word); - - return test_byte[0] == 0xFF; -} - -#define STRING_BYTES_ENDIAN_CONVERT(size) \ - UINT##size tpm2_util_endian_swap_##size(UINT##size data) { \ - \ - UINT##size converted; \ - UINT8 *bytes = (UINT8 *)&data; \ - UINT8 *tmp = (UINT8 *)&converted; \ - \ - size_t i; \ - for(i=0; i < sizeof(UINT##size); i ++) { \ - tmp[i] = bytes[sizeof(UINT##size) - i - 1]; \ - } \ - \ - return converted; \ - } - -STRING_BYTES_ENDIAN_CONVERT(16) -STRING_BYTES_ENDIAN_CONVERT(32) -STRING_BYTES_ENDIAN_CONVERT(64) - -#define STRING_BYTES_ENDIAN_HTON(size) \ - UINT##size tpm2_util_hton_##size(UINT##size data) { \ - \ - bool is_big_endian = tpm2_util_is_big_endian(); \ - if (is_big_endian) { \ - return data; \ - } \ - \ - return tpm2_util_endian_swap_##size(data); \ - } - -STRING_BYTES_ENDIAN_HTON(16) -STRING_BYTES_ENDIAN_HTON(32) -STRING_BYTES_ENDIAN_HTON(64) - -/* - * Converting from host-to-network (hton) or network-to-host (ntoh) is - * the same operation: if endianess differs between host and data, swap - * endianess. Thus we can just call the hton routines, but have some nice - * names for folks. - */ -UINT16 tpm2_util_ntoh_16(UINT16 data) { - return tpm2_util_hton_16(data); -} - -UINT32 tpm2_util_ntoh_32(UINT32 data) { - return tpm2_util_hton_32(data); -} -UINT64 tpm2_util_ntoh_64(UINT64 data) { - return tpm2_util_hton_64(data); -} - -UINT32 tpm2_util_pop_count(UINT32 data) { - - static const UINT8 bits_per_nibble[] = - {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4}; - - UINT8 count = 0; - UINT8 *d = (UINT8 *)&data; - - size_t i; - for (i=0; i < sizeof(data); i++) { - count += bits_per_nibble[d[i] & 0x0f]; - count += bits_per_nibble[d[i] >> 4]; - } - - return count; -} - -#define TPM2_UTIL_KEYDATA_INIT { .len = 0 }; - -typedef struct tpm2_util_keydata tpm2_util_keydata; -struct tpm2_util_keydata { - UINT16 len; - struct { - const char *name; - TPM2B *value; - } entries[2]; -}; - -static void tpm2_util_public_to_keydata(TPM2B_PUBLIC *public, tpm2_util_keydata *keydata) { - - switch (public->publicArea.type) { - case TPM2_ALG_RSA: - keydata->len = 1; - keydata->entries[0].name = tpm2_alg_util_algtostr(public->publicArea.type); - keydata->entries[0].value = (TPM2B *)&public->publicArea.unique.rsa; - return; - case TPM2_ALG_KEYEDHASH: - keydata->len = 1; - keydata->entries[0].name = tpm2_alg_util_algtostr(public->publicArea.type); - keydata->entries[0].value = (TPM2B *)&public->publicArea.unique.keyedHash; - return; - case TPM2_ALG_SYMCIPHER: - keydata->len = 1; - keydata->entries[0].name = tpm2_alg_util_algtostr(public->publicArea.type); - keydata->entries[0].value = (TPM2B *)&public->publicArea.unique.sym; - return; - case TPM2_ALG_ECC: - keydata->len = 2; - keydata->entries[0].name = "x"; - keydata->entries[0].value = (TPM2B *)&public->publicArea.unique.ecc.x; - keydata->entries[1].name = "y"; - keydata->entries[1].value = (TPM2B *)&public->publicArea.unique.ecc.y; - return; - default: - LOG_WARN("The algorithm type(0x%4.4x) is not supported", - public->publicArea.type); - } - - return; -} - -void print_yaml_indent(size_t indent_count) { - while (indent_count--) { - tpm2_tool_output(" "); - } -} - -void tpm2_util_tpma_object_to_yaml(TPMA_OBJECT obj) { - - char *attrs = tpm2_attr_util_obj_attrtostr(obj); - tpm2_tool_output("attributes:\n"); - tpm2_tool_output(" value: %s\n", attrs); - tpm2_tool_output(" raw: 0x%x\n", obj); - free(attrs); -} - -void tpm2_util_public_to_yaml(TPM2B_PUBLIC *public) { - - tpm2_tool_output("algorithm:\n"); - tpm2_tool_output(" value: %s\n", tpm2_alg_util_algtostr(public->publicArea.nameAlg)); - tpm2_tool_output(" raw: 0x%x\n", public->publicArea.nameAlg); - - tpm2_util_tpma_object_to_yaml(public->publicArea.objectAttributes); - - tpm2_tool_output("type: \n"); - tpm2_tool_output(" value: %s\n", tpm2_alg_util_algtostr(public->publicArea.type)); - tpm2_tool_output(" raw: 0x%x\n", public->publicArea.type); - - tpm2_util_keydata keydata = TPM2_UTIL_KEYDATA_INIT; - tpm2_util_public_to_keydata(public, &keydata); - - UINT16 i; - /* if no keydata len will be 0 and it wont print */ - for (i=0; i < keydata.len; i++) { - tpm2_tool_output(" %s: ", keydata.entries[i].name); - tpm2_util_print_tpm2b(keydata.entries[i].value); - tpm2_tool_output("\n"); - } - - if (public->publicArea.authPolicy.size) { - tpm2_tool_output("authorization policy: "); - tpm2_util_hexdump(public->publicArea.authPolicy.buffer, - public->publicArea.authPolicy.size); - tpm2_tool_output("\n"); - } -} |