modutil.c

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 875 行 · 第 1/2 页

C
875
字号
		break;	case DISABLE_COMMAND:		break;	case ENABLE_COMMAND:		break;	case FIPS_COMMAND:		if(PL_strcasecmp(fipsArg, "true") &&			PL_strcasecmp(fipsArg, "false")) {			PR_fprintf(PR_STDERR, errStrings[INVALID_FIPS_ARG]);			return INVALID_FIPS_ARG;		}		break;	case JAR_COMMAND:		if(installDir == NULL) {			PR_fprintf(PR_STDERR, errStrings[MISSING_PARAM_ERR],				commandNames[JAR_COMMAND], optionStrings[INSTALLDIR_ARG]);			return MISSING_PARAM_ERR;		}		break;	case LIST_COMMAND:		break;	case UNDEFAULT_COMMAND:	case DEFAULT_COMMAND:		if(mechanisms == NULL) {			PR_fprintf(PR_STDERR, errStrings[MISSING_PARAM_ERR],				commandNames[command], optionStrings[MECHANISMS_ARG]);			return MISSING_PARAM_ERR;		}		break;	default:		/* Ignore this here */		break;	}	return SUCCESS;}/******************************************************************** * * i n i t _ c r y p t o * * Does crypto initialization that all commands will require. * If -nocertdb option is specified, don't open key or cert db (we don't * need them if we aren't going to be verifying signatures).  This is * because serverland doesn't always have cert and key database files * available. */static Errorinit_crypto(PRBool create, PRBool readOnly){	char *moddbname=NULL, *dir, *keydbname, *certdbname;	PRBool free_moddbname = PR_FALSE;	Error retval;	if(SECU_ConfigDirectory(dbdir)[0] == '\0') {		PR_fprintf(PR_STDERR, errStrings[NO_DBDIR_ERR]);		retval=NO_DBDIR_ERR;		goto loser;	}	moddbname = SECU_SECModDBName(); /* this changes later in the function */	dir = SECU_ConfigDirectory(NULL);	keydbname = SECU_KeyDBNameCallback(NULL, PRIVATE_KEY_DB_FILE_VERSION);	certdbname = SECU_CertDBNameCallback(NULL, CERT_DB_FILE_VERSION);	/* Make sure db directory exists and is readable */	if(PR_Access(dir, PR_ACCESS_EXISTS) != PR_SUCCESS) {		PR_fprintf(PR_STDERR, errStrings[DIR_DOESNT_EXIST_ERR], dir);		retval = DIR_DOESNT_EXIST_ERR;		goto loser;	} else if(PR_Access(dir, PR_ACCESS_READ_OK) != PR_SUCCESS) {		PR_fprintf(PR_STDERR, errStrings[DIR_NOT_READABLE_ERR], dir);		retval = DIR_NOT_READABLE_ERR;		goto loser;	}	/* Check for the proper permissions on databases */	if(create) {		/* Make sure dbs don't already exist, and the directory is			writeable */		if(PR_Access(moddbname, PR_ACCESS_EXISTS)==PR_SUCCESS) {			PR_fprintf(PR_STDERR, errStrings[FILE_ALREADY_EXISTS_ERR],			  moddbname);			retval=FILE_ALREADY_EXISTS_ERR;			goto loser;		} else if(PR_Access(keydbname, PR_ACCESS_EXISTS)==PR_SUCCESS) {			PR_fprintf(PR_STDERR, errStrings[FILE_ALREADY_EXISTS_ERR], keydbname);			retval=FILE_ALREADY_EXISTS_ERR;			goto loser;		} else if(PR_Access(certdbname, PR_ACCESS_EXISTS)==PR_SUCCESS) {			PR_fprintf(PR_STDERR, errStrings[FILE_ALREADY_EXISTS_ERR],certdbname);			retval=FILE_ALREADY_EXISTS_ERR;			goto loser;		} else if(PR_Access(dir, PR_ACCESS_WRITE_OK) != PR_SUCCESS) {			PR_fprintf(PR_STDERR, errStrings[DIR_NOT_WRITEABLE_ERR], dir);			retval=DIR_NOT_WRITEABLE_ERR;			goto loser;		}	} else {		/* Make sure dbs are readable and writeable */		if(PR_Access(moddbname, PR_ACCESS_READ_OK) != PR_SUCCESS) {#ifndef XP_PC			/* in serverland, they always use secmod.db, even on UNIX. Try			   this */			moddbname = PR_smprintf("%s/secmod.db", dir);			free_moddbname = PR_TRUE;			if(PR_Access(moddbname, PR_ACCESS_READ_OK) != PR_SUCCESS) {#endif			PR_fprintf(PR_STDERR, errStrings[FILE_NOT_READABLE_ERR], moddbname);			retval=FILE_NOT_READABLE_ERR;			goto loser;#ifndef XP_PC			}#endif		}		if(!nocertdb) { /* don't open cert and key db if -nocertdb */			if(PR_Access(keydbname, PR_ACCESS_READ_OK) != PR_SUCCESS) {				PR_fprintf(PR_STDERR, errStrings[FILE_NOT_READABLE_ERR],				  keydbname);				retval=FILE_NOT_READABLE_ERR;				goto loser;			}			if(PR_Access(certdbname, PR_ACCESS_READ_OK) != PR_SUCCESS) {				PR_fprintf(PR_STDERR, errStrings[FILE_NOT_READABLE_ERR],				  certdbname);				retval=FILE_NOT_READABLE_ERR;				goto loser;			}		}		/* Check for write access if we'll be making changes */		if( !readOnly ) {			if(PR_Access(moddbname, PR_ACCESS_WRITE_OK) != PR_SUCCESS) {				PR_fprintf(PR_STDERR, errStrings[FILE_NOT_WRITEABLE_ERR],				  moddbname);				retval=FILE_NOT_WRITEABLE_ERR;				goto loser;			}			if(!nocertdb) { /* don't open key and cert db if -nocertdb */				if(PR_Access(keydbname, PR_ACCESS_WRITE_OK)															!= PR_SUCCESS) {					PR_fprintf(PR_STDERR, errStrings[FILE_NOT_WRITEABLE_ERR],					  keydbname);					retval=FILE_NOT_WRITEABLE_ERR;					goto loser;				}				if(PR_Access(certdbname, PR_ACCESS_WRITE_OK)															!= PR_SUCCESS) {					PR_fprintf(PR_STDERR, errStrings[FILE_NOT_WRITEABLE_ERR],					  certdbname);					retval=FILE_NOT_WRITEABLE_ERR;					goto loser;				}			}		}		PR_fprintf(PR_STDOUT, msgStrings[USING_DBDIR_MSG],		  SECU_ConfigDirectory(NULL));	}	SEC_Init();	/* Open/create key database */	RNG_RNGInit(); /* This is required before SECU_OpenKeyDB */	RNG_SystemInfoForRNG();	if(!nocertdb) {		if(create) PR_fprintf(PR_STDOUT, msgStrings[CREATING_DB_MSG],		  keydbname);		if(SECU_OpenKeyDB(readOnly) == NULL) {			PR_fprintf(PR_STDERR, "\n");			PR_fprintf(PR_STDERR, errStrings[DB_ACCESS_ERR], keydbname);			retval=DB_ACCESS_ERR;			goto loser;		}		if(create) PR_fprintf(PR_STDOUT, msgStrings[DONE_MSG]);	}	/* Open/create cert database */	if(!nocertdb) {		if(create) PR_fprintf(PR_STDOUT, msgStrings[CREATING_DB_MSG],		  certdbname);		if(SECU_OpenCertDB(readOnly) == NULL) {			PR_fprintf(PR_STDERR, "\n");			PR_fprintf(PR_STDERR, errStrings[DB_ACCESS_ERR], certdbname);			retval=DB_ACCESS_ERR;			goto loser;		}		if(create) PR_fprintf(PR_STDOUT, msgStrings[DONE_MSG]);	}	/* Open/create module database */	if(create) PR_fprintf(PR_STDOUT, msgStrings[CREATING_DB_MSG], moddbname);	SECMOD_init(moddbname);	if(create) PR_fprintf(PR_STDOUT, msgStrings[DONE_MSG]);	retval=SUCCESS;loser:	if(free_moddbname) {		PR_Free(moddbname);	}	return retval;}/************************************************************************* * * u s a g e */static voidusage(){	PR_fprintf(PR_STDOUT,"\nNetscape Cryptographic Module Utility\n""Usage: modutil [command] [options]\n\n""                            COMMANDS\n""---------------------------------------------------------------------------\n""-add MODULE_NAME                 Add the named module to the module database\n""   -libfile LIBRARY_FILE         The name of the file (.so or .dll)\n""                                 containing the implementation of PKCS #11\n""   [-ciphers CIPHER_LIST]        Enable the given ciphers on this module\n""   [-mechanisms MECHANISM_LIST]  Make the module a default provider of the\n""                                 given mechanisms\n""-changepw TOKEN                  Change the password on the named token\n""   [-pwfile FILE]                The old password is in this file\n""   [-newpwfile FILE]             The new password is in this file\n""-create                          Create a new set of security databases\n""-default MODULE                  Make the given module a default provider\n""   -mechanisms MECHANISM_LIST    of the given mechanisms\n""   [-slot SLOT]                  limit change to only the given slot\n""-delete MODULE                   Remove the named module from the module\n""                                 database\n""-disable MODULE                  Disable the named module\n""   [-slot SLOT]                  Disable only the named slot on the module\n""-enable MODULE                   Enable the named module\n""   [-slot SLOT]                  Enable only the named slot on the module\n""-fips [ true | false ]           If true, enable FIPS mode.  If false,\n""                                 disable FIPS mode\n""-force                           Do not run interactively\n""-jar JARFILE                     Install a PKCS #11 module from the given\n""                                 JAR file in the PKCS #11 JAR format\n""   -installdir DIR               Use DIR as the root directory of the\n""                                 installation\n""   [-tempdir DIR]                Use DIR as the temporary installation\n""                                 directory. If not specified, the current\n""                                 directory is used\n""-list [MODULE]                   Lists information about the specified module\n""                                 or about all modules if none is specified\n""-undefault MODULE                The given module is NOT a default provider\n""   -mechanisms MECHANISM_LIST    of the listed mechanisms\n""   [-slot SLOT]                  limit change to only the given slot\n""---------------------------------------------------------------------------\n""\n""                             OPTIONS\n""---------------------------------------------------------------------------\n""-dbdir DIR                       Directory DIR contains the security databases\n""-nocertdb                        Do not load certificate or key databases. No\n""                                 verification will be performed on JAR files.\n""---------------------------------------------------------------------------\n""\n""Mechanism lists are colon-separated.  The following mechanisms are recognized:\n""RSA, DSA, RC2, RC4, RC5, DES, DH, FORTEZZA, SHA1, MD5, MD2, SSL, TLS, RANDOM,\n"" FRIENDLY\n""\n""Cipher lists are colon-separated.  The following ciphers are recognized:\n""FORTEZZA\n""\nQuestions or bug reports should be sent to modutil-support@netscape.com.\n");}/************************************************************************* * * m a i n */intmain(int argc, char *argv[]){	int errcode = SUCCESS;	PRBool createdb, readOnly;#define STDINBUF_SIZE 80	char stdinbuf[STDINBUF_SIZE];	PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);	if(parse_args(argc, argv) != SUCCESS) {		usage();		errcode = INVALID_USAGE_ERR;		goto loser;	}	if(verify_params() != SUCCESS) {		usage();		errcode = INVALID_USAGE_ERR;		goto loser;	}	if(command==NO_COMMAND) {		PR_fprintf(PR_STDERR, errStrings[NO_COMMAND_ERR]);		usage();		errcode = INVALID_USAGE_ERR;		goto loser;	}	/* Set up crypto stuff */	createdb = command==CREATE_COMMAND;	readOnly = command==LIST_COMMAND;	/* Make sure browser is not running if we're writing to a database */	/* Do this before initializing crypto */	if(!readOnly && !force) {		char *response;		PR_fprintf(PR_STDOUT, msgStrings[BROWSER_RUNNING_MSG]);		if( ! PR_fgets(stdinbuf, STDINBUF_SIZE, PR_STDIN)) {			PR_fprintf(PR_STDERR, errStrings[STDIN_READ_ERR]);			errcode = STDIN_READ_ERR;			goto loser;		}		if( (response=strtok(stdinbuf, " \r\n\t")) ) {			if(!PL_strcasecmp(response, "q")) {				PR_fprintf(PR_STDOUT, msgStrings[ABORTING_MSG]);				errcode = SUCCESS;				goto loser;			}		}		PR_fprintf(PR_STDOUT, "\n");	}	errcode = init_crypto(createdb, readOnly);	if( errcode != SUCCESS) {		goto loser;	}	/* Execute the command */	switch(command) {	case ADD_COMMAND:		errcode = AddModule(moduleName, libFile, ciphers, mechanisms);		break;	case CHANGEPW_COMMAND:		errcode = ChangePW(tokenName, pwFile, newpwFile);		break;	case CREATE_COMMAND:		/* The work was already done in init_crypto() */		break;	case DEFAULT_COMMAND:		errcode = SetDefaultModule(moduleName, slotName, mechanisms);		break;	case DELETE_COMMAND:		errcode = DeleteModule(moduleName);		break;	case DISABLE_COMMAND:		errcode = EnableModule(moduleName, slotName, PR_FALSE);		break;	case ENABLE_COMMAND:		errcode = EnableModule(moduleName, slotName, PR_TRUE);		break;	case FIPS_COMMAND:		errcode = FipsMode(fipsArg);		break;	case JAR_COMMAND:		Pk11Install_SetErrorHandler(install_error);		errcode = Pk11Install_DoInstall(jarFile, installDir, tempDir,						PR_STDOUT, force, nocertdb);		break;	case LIST_COMMAND:		if(moduleName) {			errcode = ListModule(moduleName);		} else {			errcode = ListModules();		}		break;	case UNDEFAULT_COMMAND:		errcode = UnsetDefaultModule(moduleName, slotName, mechanisms);		break;	default:		PR_fprintf(PR_STDERR, "This command is not supported yet.\n");		errcode = INVALID_USAGE_ERR;		break;	}loser:	PR_Cleanup();	return errcode;}/************************************************************************ * * i n s t a l l _ e r r o r * * Callback function to handle errors in PK11 JAR file installation. */static voidinstall_error(char *message){	PR_fprintf(PR_STDERR, "Install error: %s\n", message);}/************************************************************************* * * o u t _ o f _ m e m o r y */voidout_of_memory(void){	PR_fprintf(PR_STDERR, errStrings[OUT_OF_MEM_ERR]);	exit(OUT_OF_MEM_ERR);}/************************************************************************** * * P R _ f g e t s * * fgets implemented with NSPR. */static char*PR_fgets(char *buf, int size, PRFileDesc *file){	int i;	int status;	char c;	i=0;	while(i < size-1) {		status = PR_Read(file, (void*) &c, 1);		if(status==-1) {			return NULL;		} else if(status==0) {			break;		}		buf[i++] = c;		if(c=='\n') {			break;		}	}	buf[i]='\0';	return buf;}

⌨️ 快捷键说明

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