1 /*
2  * The Initial Developer of the Original Code is International
3  * Business Machines Corporation. Portions created by IBM
4  * Corporation are Copyright (C) 2009 International Business
5  * Machines Corporation. All Rights Reserved.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the Common Public License as published by
9  * IBM Corporation; either version 1 of the License, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * Common Public License for more details.
16  *
17  * You should have received a copy of the Common Public License
18  * along with this program; if not, a copy can be viewed at
19  * http://www.opensource.org/licenses/cpl1.0.php.
20  */
21 #include <limits.h>
22 #include "tpm_tspi.h"
23 #include "tpm_utils.h"
24 #include "tpm_unseal.h"
25 
help(const char * aCmd)26 static void help(const char *aCmd)
27 {
28 	logCmdHelp(aCmd);
29 	logCmdOption("-i, --infile FILE",
30 		     _
31 		     ("Filename containing data to unseal."));
32 	logCmdOption("-o, --outfile FILE",
33 		     _
34 		     ("Filename to write unsealed data to.  Default is STDOUT."));
35 	logCmdOption("-z, --srk-well-known",
36 		     _
37 		     ("Use 20 bytes of zeros (TSS_WELL_KNOWN_SECRET) as the SRK secret."));
38 }
39 
40 static char in_filename[PATH_MAX] = "", out_filename[PATH_MAX] = "";
41 static BOOL srkWellKnown = FALSE;
42 
parse(const int aOpt,const char * aArg)43 static int parse(const int aOpt, const char *aArg)
44 {
45 	int rc = -1;
46 
47 	switch (aOpt) {
48 	case 'i':
49 		if (aArg) {
50 			strncpy(in_filename, aArg, PATH_MAX);
51 			rc = 0;
52 		}
53 		break;
54 	case 'o':
55 		if (aArg) {
56 			strncpy(out_filename, aArg, PATH_MAX);
57 			rc = 0;
58 		}
59 		break;
60 	case 'z':
61 		srkWellKnown = TRUE;
62 		rc = 0;
63 		break;
64 	default:
65 		break;
66 	}
67 	return rc;
68 
69 }
70 
main(int argc,char ** argv)71 int main(int argc, char **argv)
72 {
73 
74 	struct option opts[] =
75 	    { {"infile", required_argument, NULL, 'i'},
76 	      {"outfile", required_argument, NULL, 'o'},
77 	      {"srk-well-known", no_argument, NULL, 'z'},
78 	};
79 	FILE *fp;
80 	int rc=0, tss_size=0, i;
81 	unsigned char* tss_data = NULL;
82 
83 	if (genericOptHandler(argc, argv, "i:o:z", opts,
84 			      sizeof(opts) / sizeof(struct option), parse,
85 			      help) != 0)
86 		return rc;
87 
88 	rc = tpmUnsealFile(in_filename, &tss_data, &tss_size, srkWellKnown);
89 
90 	if (strlen(out_filename) == 0) {
91 		for (i=0; i < tss_size; i++)
92 			printf("%c", tss_data[i]);
93 		goto out;
94 	} else if ((fp = fopen(out_filename, "w")) == NULL) {
95 			logError(_("Unable to open output file\n"));
96 			goto out;
97 	}
98 
99 	if (fwrite(tss_data, tss_size, 1, fp) != 1) {
100 		logError(_("Unable to write output file\n"));
101 		goto out;
102 	}
103 	fclose(fp);
104 out:
105 	free(tss_data);
106 	return rc;
107 }
108