chgkeyauth.c

来自「IBM开发的TPM的驱动, 有少量的例子可以供参考」· C语言 代码 · 共 193 行

C
193
字号
/****************************************************************************//*                                                                          *//*                              Change Key Auth                             *//*                                                                          *//*                           Written by J. Kravitz                          *//*                                                                          *//*                     IBM Thomas J. Watson Research Center                 *//*                                                                          *//*                               Version 1.1                                *//*                                                                          *//*                         Last Revision 15 Apr 2003                        *//*                                                                          *//*                           Copyright (C) 2004 IBM                         *//*                                                                          *//****************************************************************************/#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <string.h>#include <netinet/in.h>#include <unistd.h>#include <getopt.h>#include "tpmfunc.h"#define	VALID_ARGS	"p:?"static int ParseArgs(int argc, char *argv[]);static void usage();static char *parpass = NULL;int main(int argc, char *argv[]){	int ret;	struct stat sbuf;	unsigned char keyblob[4096];	unsigned int keyblen;	unsigned char outblob[4096];	unsigned int outblen;	unsigned int handle;	unsigned char filename[256];	unsigned char filename2[256];	unsigned char parphash[20];	unsigned char newphash[20];	unsigned char keyphash[20];	unsigned char *passptr1;	FILE *outfile;	FILE *ainfile;	keydata key;	unsigned char *keypass;	unsigned char *newpass;	unsigned char *keyname;	unsigned char *parhndl;	int nxtarg;	nxtarg = ParseArgs(argc, argv);	if (argc < (nxtarg + 4))		usage();	TPM_setlog(0);	parhndl = argv[nxtarg + 0];	keyname = argv[nxtarg + 1];	keypass = argv[nxtarg + 2];	newpass = argv[nxtarg + 3];	/*	 ** convert parent key handle from hex	 */	ret = sscanf(parhndl, "%x", &handle);	if (ret != 1) {		fprintf(stderr, "Invalid argument '%s'\n", parhndl);		exit(2);	}	/*	 ** use the SHA1 hash of the password string as the Parent Key Authorization Data	 */	if (parpass != NULL) {		TSS_sha1(parpass, strlen(parpass), parphash);		passptr1 = parphash;	} else		passptr1 = NULL;	/*	 ** use the SHA1 hash of the password string as the Key Authorization Data	 */	TSS_sha1(keypass, strlen(keypass), keyphash);	/*	 ** use the SHA1 hash of the password string as the New Authorization Data	 */	TSS_sha1(newpass, strlen(newpass), newphash);	/*	 ** read the key blob	 */	ainfile = fopen(keyname, "r");	if (ainfile == NULL) {		fprintf(stderr, "Unable to open key file\n");		exit(3);	}	stat(keyname, &sbuf);	keyblen = (int) sbuf.st_size;	ret = fread(keyblob, 1, keyblen, ainfile);	if (ret != keyblen) {		fprintf(stderr, "Unable to read key file\n");		exit(4);	}	fclose(ainfile);	TSS_KeyExtract(keyblob, &key);	ret = TPM_ChangeAuth(handle, passptr1, keyphash, newphash, &key);	if (ret != 0) {		fprintf(stderr, "Error %s from TPM_ChangeAuth\n",			TPM_GetErrMsg(ret));		exit(5);	}	ret = TPM_BuildKey(outblob, &key);	if ((ret & ERR_MASK) != 0)		return ret;	outblen = ret;	sprintf(filename2, "%s.save", keyname);	sprintf(filename, "%s", keyname);	ret = rename(filename, filename2);	if (ret != 0) {		fprintf(stderr, "Unable to rename old key file\n");		exit(6);	}	outfile = fopen(filename, "w");	if (outfile == NULL) {		fprintf(stderr, "Unable to create new key file\n");		exit(7);	}	ret = fwrite(outblob, 1, outblen, outfile);	if (ret != outblen) {		fprintf(stderr, "Unable to write new key file\n");		exit(8);	}	fclose(outfile);	exit(0);}/**************************************************************************//*                                                                        *//*  Parse Arguments                                                       *//*                                                                        *//**************************************************************************/static int ParseArgs(int argc, char *argv[]){	extern char *optarg;	extern int optind;	int opt;	if (argc == 2 && *argv[1] == '?')		usage();	/*	 * Loop over the command line looking for arguments.	 */	while ((opt = getopt(argc, argv, VALID_ARGS)) != -1) {		switch (opt) {		case 'p':			if (*optarg == '-') {				fprintf(stderr,					"option -p missing an argument\n");				usage();			}			parpass = optarg;			break;		case '?':		default:			usage();		}	}	return optind;}static void usage(){	fprintf(stderr,		"Usage: chgkeyauth [options] <parent key handle> <key file name> <old key password> <new key password>\n");	fprintf(stderr, "\n");	fprintf(stderr, "   Where the arguments are...\n");	fprintf(stderr,		"    <parent key handle>   is the parent key handle in hex\n");	fprintf(stderr,		"    <key file name>       is the name of the key file\n");	fprintf(stderr,		"    <old key password>    is the current key password\n");	fprintf(stderr,		"    <new key password>    is the new key password\n");	fprintf(stderr, "\n");	fprintf(stderr, "   Where the <options> are...\n");	fprintf(stderr,		"    -p <parpass>      to specify the parent key use password\n");	fprintf(stderr,		"    -?                print usage information (this message)\n");	exit(1);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?