Home | History | Annotate | Line # | Download | only in tcs
      1 
      2 /*
      3  * Licensed Materials - Property of IBM
      4  *
      5  * trousers - An open source TCG Software Stack
      6  *
      7  * (C) Copyright International Business Machines Corp. 2004-2006
      8  *
      9  */
     10 
     11 
     12 #include <stdlib.h>
     13 #include <stdio.h>
     14 #include <string.h>
     15 #include <unistd.h>
     16 #include <sys/types.h>
     17 #include <sys/stat.h>
     18 #include <sys/mman.h>
     19 #include <fcntl.h>
     20 #include <errno.h>
     21 
     22 #include "trousers/tss.h"
     23 #include "trousers_types.h"
     24 #include "trousers_types.h"
     25 #include "tcs_tsp.h"
     26 #include "tcs_utils.h"
     27 #include "tcs_int_literals.h"
     28 #include "tcsps.h"
     29 #include "tcslog.h"
     30 #include "tcsd_wrap.h"
     31 #include "tcsd.h"
     32 #include "tcs_aik.h"
     33 
     34 void
     35 LoadBlob_SYMMETRIC_KEY(UINT64 *offset, BYTE *blob, TCPA_SYMMETRIC_KEY *key)
     36 {
     37 	LoadBlob_UINT32(offset, key->algId, blob);
     38 	LoadBlob_UINT16(offset, key->encScheme, blob);
     39 	LoadBlob_UINT16(offset, key->size, blob);
     40 
     41 	if (key->size > 0) {
     42 		LoadBlob(offset, key->size, blob, key->data);
     43 	} else {
     44 		key->data = NULL;
     45 	}
     46 }
     47 
     48 TSS_RESULT
     49 UnloadBlob_SYMMETRIC_KEY(UINT64 *offset, BYTE *blob, TCPA_SYMMETRIC_KEY *key)
     50 {
     51 	if (!key) {
     52 		UINT16 size;
     53 
     54 		UnloadBlob_UINT32(offset, NULL, blob);
     55 		UnloadBlob_UINT16(offset, NULL, blob);
     56 		UnloadBlob_UINT16(offset, &size, blob);
     57 
     58 		if (size > 0)
     59 			UnloadBlob(offset, size, blob, NULL);
     60 
     61 		return TSS_SUCCESS;
     62 	}
     63 
     64 	UnloadBlob_UINT32(offset, &key->algId, blob);
     65 	UnloadBlob_UINT16(offset, &key->encScheme, blob);
     66 	UnloadBlob_UINT16(offset, &key->size, blob);
     67 
     68 	if (key->size > 0) {
     69 		key->data = (BYTE *)malloc(key->size);
     70 		if (key->data == NULL) {
     71 			LogError("malloc of %hu bytes failed.", key->size);
     72 			key->size = 0;
     73 			return TCSERR(TSS_E_OUTOFMEMORY);
     74 		}
     75 		UnloadBlob(offset, key->size, blob, key->data);
     76 	} else {
     77 		key->data = NULL;
     78 	}
     79 
     80 	return TSS_SUCCESS;
     81 }
     82 
     83 void
     84 get_credential(UINT32 type, UINT32 *size, BYTE **cred)
     85 {
     86 	int rc, fd;
     87 	char *path = NULL;
     88 	void *file = NULL;
     89 	struct stat stat_buf;
     90 	size_t file_size;
     91 
     92 	switch (type) {
     93 		case TSS_TCS_CREDENTIAL_PLATFORMCERT:
     94 			path = tcsd_options.platform_cred;
     95 			break;
     96 		case TSS_TCS_CREDENTIAL_TPM_CC:
     97 			path = tcsd_options.conformance_cred;
     98 			break;
     99 		case TSS_TCS_CREDENTIAL_EKCERT:
    100 			path = tcsd_options.endorsement_cred;
    101 			break;
    102 		default:
    103 			LogDebugFn("Bad credential type");
    104 			break;
    105 	}
    106 
    107 	if (path == NULL)
    108 		goto done;
    109 
    110 	if ((fd = open(path, O_RDONLY)) < 0) {
    111 		LogError("open(%s): %s", path, strerror(errno));
    112 		goto done;
    113 	}
    114 
    115 	if ((rc = fstat(fd, &stat_buf)) == -1) {
    116 		LogError("Error stating credential: %s: %s", path, strerror(errno));
    117 		close(fd);
    118 		goto done;
    119 	}
    120 
    121 	file_size = (size_t)stat_buf.st_size;
    122 
    123 	LogDebugFn("%s, (%zd bytes)", path, file_size);
    124 
    125 	file = mmap(0, file_size, PROT_READ, MAP_PRIVATE, fd, 0);
    126 	if (file == MAP_FAILED) {
    127 		LogError("Error reading credential: %s: %s", path, strerror(errno));
    128 		close(fd);
    129 		goto done;
    130 	}
    131 	close(fd);
    132 
    133 	if ((*cred = malloc(file_size)) == NULL) {
    134 		LogError("malloc of %zd bytes failed.", file_size);
    135 		munmap(file, file_size);
    136 		goto done;
    137 	}
    138 
    139 	memcpy(*cred, file, file_size);
    140 	*size = file_size;
    141 	munmap(file, file_size);
    142 
    143 	return;
    144 done:
    145 	*cred = NULL;
    146 	*size = 0;
    147 }
    148