blapitest.c

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

C
1,834
字号
	PQGParams *params;      /* DSA only */	unsigned int rounds;    /* RC5 only */	unsigned int wordsize;  /* RC5 only */	unsigned int rsapubexp; /* RSA only */	unsigned int repetitions; /* performance tests only */} blapitestInfo;/* Macros for performance timing. */#define TIMESTART() \	if (info->performance) \		time1 = PR_IntervalNow();#define TIMEFINISH(mode, nb) \	if (info->performance) { \		time2 = (PRIntervalTime)(PR_IntervalNow() - time1); \		time1 = PR_IntervalToMilliseconds(time2); \		printf("%s,%d,%.3f\n", mode, nb, ((float)(time1))/info->repetitions); \	}SECStatusfillitem(SECItem *item, int numbytes, char *filename){	if (item->len == 0)		return get_and_write_random_bytes(item, numbytes, filename);	return SECSuccess;}/**************************  DES ************************//*  encrypt/decrypt for all DES */static SECStatusdes_common(DESContext *descx, blapitestInfo *info){	PRInt32 maxsize;	SECStatus rv;	PRIntervalTime time1, time2;	int i, numiter;	numiter = info->repetitions;	maxsize = info->in.len;	info->out.data = (unsigned char *)PORT_ZAlloc(maxsize);	if (info->encrypt) {		TIMESTART();		for (i=0; i<numiter; i++)			rv = DES_Encrypt(descx, info->out.data, &info->out.len, maxsize,			                 info->in.data, info->in.len);		TIMEFINISH("DES ENCRYPT", maxsize);		if (rv) {			fprintf(stderr, "%s:  Failed to encrypt!\n", progName);			CHECKERROR(rv, __LINE__);		}	} else {		TIMESTART();		for (i=0; i<numiter; i++)			rv = DES_Decrypt(descx, info->out.data, &info->out.len, maxsize,			                 info->in.data, info->in.len);		TIMEFINISH("DES DECRYPT", maxsize);		if (rv) {			fprintf(stderr, "%s:  Failed to decrypt!\n", progName);			CHECKERROR(rv, __LINE__);		}	}	return rv;}/*  DES codebook mode */static SECStatusdes_ecb_test(blapitestInfo *info){	SECStatus rv;	DESContext *descx;	PRIntervalTime time1, time2;	int i, numiter = info->repetitions;	fillitem(&info->key, DES_KEY_LENGTH, "tmp.key");	fillitem(&info->in, info->bufsize, "tmp.pt");	TIMESTART();	for (i=0; i<numiter-1; i++) {		descx = DES_CreateContext(info->key.data, NULL, NSS_DES, info->encrypt);		DES_DestroyContext(descx, PR_TRUE);	}	descx = DES_CreateContext(info->key.data, NULL, NSS_DES, info->encrypt);	TIMEFINISH("DES ECB CONTEXT CREATE", info->key.len);	if (!descx) {		fprintf(stderr,"%s:  Failed to create encryption context!\n", progName);		return SECFailure;	}	rv = des_common(descx, info);	CHECKERROR(rv, __LINE__);	DES_DestroyContext(descx, PR_TRUE);	return rv;}/*  DES chaining mode */static SECStatusdes_cbc_test(blapitestInfo *info){	SECStatus rv;	DESContext *descx;	PRIntervalTime time1, time2;	int i, numiter = info->repetitions;	fillitem(&info->key, DES_KEY_LENGTH, "tmp.key");	fillitem(&info->in, info->bufsize, "tmp.pt");	fillitem(&info->iv, DES_KEY_LENGTH, "tmp.iv");	TIMESTART();	for (i=0; i<numiter-1; i++) {		descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_CBC, 		                          info->encrypt);		DES_DestroyContext(descx, PR_TRUE);	}	descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_CBC, 	                          info->encrypt);	TIMEFINISH("DES CBC CONTEXT CREATE", info->key.len);	if (!descx) {		PR_fprintf(PR_STDERR, 		  "%s:  Failed to create encryption context!\n", progName);		return SECFailure;	}	if (info->performance) {		/*  In chaining mode, repeated iterations of the encryption		 *  function using the same context will alter the final output.		 *  So, once the performance test is done, reset the context		 *  and perform a single iteration to obtain the correct result.		 */		int tmp = info->repetitions;		rv = des_common(descx, info);		DES_DestroyContext(descx, PR_TRUE);		descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_CBC, 	                          info->encrypt);		info->performance = PR_FALSE;		info->repetitions = 1;		rv = des_common(descx, info);		info->performance = PR_TRUE;		info->repetitions = tmp;	} else {		rv = des_common(descx, info);	}	CHECKERROR(rv, __LINE__);	DES_DestroyContext(descx, PR_TRUE);	return rv;}/*  3-key Triple-DES codebook mode */static SECStatusdes_ede_ecb_test(blapitestInfo *info){	SECStatus rv;	DESContext *descx;	PRIntervalTime time1, time2;	int i, numiter = info->repetitions;	fillitem(&info->key, 3*DES_KEY_LENGTH, "tmp.key");	fillitem(&info->in, info->bufsize, "tmp.pt");	TIMESTART();	for (i=0; i<numiter-1; i++) {		descx = DES_CreateContext(info->key.data, NULL, NSS_DES_EDE3,		                          info->encrypt);		DES_DestroyContext(descx, PR_TRUE);	}	descx = DES_CreateContext(info->key.data, NULL, NSS_DES_EDE3,	                          info->encrypt);	TIMEFINISH("3DES ECB CONTEXT CREATE", info->key.len);	if (!descx) {		fprintf(stderr,"%s:  Failed to create encryption context!\n", progName);		return SECFailure;	}	rv = des_common(descx, info);	CHECKERROR(rv, __LINE__);	DES_DestroyContext(descx, PR_TRUE);	return rv;}/*  3-key Triple-DES chaining mode */static SECStatusdes_ede_cbc_test(blapitestInfo *info){	SECStatus rv;	DESContext *descx;	PRIntervalTime time1, time2;	int i, numiter = info->repetitions;	fillitem(&info->key, 3*DES_KEY_LENGTH, "tmp.key");	fillitem(&info->in, info->bufsize, "tmp.pt");	fillitem(&info->iv, DES_KEY_LENGTH, "tmp.iv");	TIMESTART();	for (i=0; i<numiter-1; i++) {		descx = DES_CreateContext(info->key.data, info->iv.data, 		                          NSS_DES_EDE3_CBC, info->encrypt);		DES_DestroyContext(descx, PR_TRUE);	}	descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_EDE3_CBC, 	                          info->encrypt);	TIMEFINISH("3DES CBC CONTEXT CREATE", info->key.len);	if (!descx) {		fprintf(stderr,"%s:  Failed to create encryption context!\n", progName);		return SECFailure;	}	if (info->performance) {		/*  In chaining mode, repeated iterations of the encryption		 *  function using the same context will alter the final output.		 *  So, once the performance test is done, reset the context		 *  and perform a single iteration to obtain the correct result.		 */		int tmp = info->repetitions;		rv = des_common(descx, info);		DES_DestroyContext(descx, PR_TRUE);		descx = DES_CreateContext(info->key.data, info->iv.data, 		                          NSS_DES_EDE3_CBC, info->encrypt);		info->performance = PR_FALSE;		info->repetitions = 1;		rv = des_common(descx, info);		info->performance = PR_TRUE;		info->repetitions = tmp;	} else {		rv = des_common(descx, info);	}	CHECKERROR(rv, __LINE__);	DES_DestroyContext(descx, PR_TRUE);	return rv;}/**************************  RC2 ************************//*  RC2 ECB */static SECStatusrc2_ecb_test(blapitestInfo *info){	SECStatus rv;	RC2Context *rc2cx;	PRIntervalTime time1, time2;	int i, numiter = info->repetitions;	fillitem(&info->key, info->keysize, "tmp.key");	fillitem(&info->in, info->bufsize, "tmp.pt");	TIMESTART();	for (i=0; i<numiter-1; i++) {		rc2cx = RC2_CreateContext(info->key.data, info->key.len, NULL, 		                          NSS_RC2, info->key.len);		RC2_DestroyContext(rc2cx, PR_TRUE);	}	rc2cx = RC2_CreateContext(info->key.data, info->key.len, NULL, 	                          NSS_RC2, info->key.len);	TIMEFINISH("RC2 ECB CONTEXT CREATE", info->key.len);	if (!rc2cx) {		fprintf(stderr,"%s:  Failed to create encryption context!\n", progName);		return SECFailure;	}	info->out.len = 2*info->in.len;	info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len);	if (info->encrypt) {		TIMESTART();		for (i=0; i<numiter; i++)			rv = RC2_Encrypt(rc2cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		TIMEFINISH("RC2 ECB ENCRYPT", info->in.len);		CHECKERROR(rv, __LINE__);	} else {		TIMESTART();		for (i=0; i<numiter; i++)			rv = RC2_Decrypt(rc2cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		TIMEFINISH("RC2 ECB DECRYPT", info->in.len);		CHECKERROR(rv, __LINE__);	}	RC2_DestroyContext(rc2cx, PR_TRUE);	return rv;}/*  RC2 CBC */static SECStatusrc2_cbc_test(blapitestInfo *info){	SECStatus rv;	RC2Context *rc2cx;	PRIntervalTime time1, time2;	int i, numiter = info->repetitions;	fillitem(&info->key, info->keysize, "tmp.key");	fillitem(&info->in, info->bufsize, "tmp.pt");	fillitem(&info->iv, info->bufsize, "tmp.iv");	TIMESTART();	for (i=0; i<numiter-1; i++) {		rc2cx = RC2_CreateContext(info->key.data, info->key.len, info->iv.data, 		                          NSS_RC2_CBC, info->key.len);		RC2_DestroyContext(rc2cx, PR_TRUE);	}	rc2cx = RC2_CreateContext(info->key.data, info->key.len, info->iv.data, 	                          NSS_RC2_CBC, info->key.len);	TIMEFINISH("RC2 CBC CONTEXT CREATE", info->key.len);	if (!rc2cx) {		fprintf(stderr,"%s:  Failed to create encryption context!\n", progName);		return SECFailure;	}	info->out.len = 2*info->in.len;	info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len);	if (info->encrypt) {		TIMESTART();		for (i=0; i<numiter; i++)			rv = RC2_Encrypt(rc2cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		TIMEFINISH("RC2 CBC ENCRYPT", info->in.len);		if (info->performance) {			/*  reset the context */			RC2_DestroyContext(rc2cx, PR_TRUE);			rc2cx = RC2_CreateContext(info->key.data, info->key.len, 			                         info->iv.data, NSS_RC2_CBC, info->key.len);			rv = RC2_Encrypt(rc2cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		}		CHECKERROR(rv, __LINE__);		if (rv) {			fprintf(stderr, "%s:  Failed to encrypt!\n", progName);			CHECKERROR(rv, __LINE__);		}	} else {		TIMESTART();		for (i=0; i<numiter; i++)			rv = RC2_Decrypt(rc2cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		TIMEFINISH("RC2 CBC DECRYPT", info->in.len);		if (info->performance) {			/*  reset the context */			RC2_DestroyContext(rc2cx, PR_TRUE);			rc2cx = RC2_CreateContext(info->key.data, info->key.len, 			                         info->iv.data, NSS_RC2_CBC, info->key.len);			rv = RC2_Decrypt(rc2cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		}		if (rv) {			fprintf(stderr, "%s:  Failed to decrypt!\n", progName);			CHECKERROR(rv, __LINE__);		}	}	RC2_DestroyContext(rc2cx, PR_TRUE);	return rv;}/**************************  RC4 ************************/static SECStatusrc4_test(blapitestInfo *info){	SECStatus rv;	RC4Context *rc4cx;	PRIntervalTime time1, time2;	int i, numiter;	numiter = info->repetitions;	fillitem(&info->key, info->keysize, "tmp.key");	fillitem(&info->in, info->bufsize, "tmp.pt");	TIMESTART();	for (i=0; i<numiter-1; i++) {		rc4cx = RC4_CreateContext(info->key.data, info->key.len);		RC4_DestroyContext(rc4cx, PR_TRUE);	}	rc4cx = RC4_CreateContext(info->key.data, info->key.len);	TIMEFINISH("RC4 CONTEXT CREATE", info->key.len);	if (!rc4cx) {		fprintf(stderr,"%s:  Failed to create encryption context!\n", progName);		return SECFailure;	}	info->out.len = 2*info->in.len;	info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len);	if (info->encrypt) {		TIMESTART();		for (i=0; i<numiter; i++)			rv = RC4_Encrypt(rc4cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		TIMEFINISH("RC4 ENCRYPT", info->in.len);		if (info->performance) {			/*  reset the context */			RC4_DestroyContext(rc4cx, PR_TRUE);			rc4cx = RC4_CreateContext(info->key.data, info->key.len);			rv = RC4_Encrypt(rc4cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		}		if (rv) {			fprintf(stderr, "%s:  Failed to encrypt!\n", progName);			CHECKERROR(rv, __LINE__);		}	} else {		TIMESTART();		for (i=0; i<numiter; i++)			rv = RC4_Decrypt(rc4cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		TIMEFINISH("RC4 DECRYPT", info->in.len);		if (info->performance) {			/*  reset the context */			RC4_DestroyContext(rc4cx, PR_TRUE);			rc4cx = RC4_CreateContext(info->key.data, info->key.len);			rv = RC4_Decrypt(rc4cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		}		if (rv) {			fprintf(stderr, "%s:  Failed to decrypt!\n", progName);			CHECKERROR(rv, __LINE__);		}	}	RC4_DestroyContext(rc4cx, PR_TRUE);	return rv;}#if NSS_SOFTOKEN_DOES_RC5/**************************  RC5 ************************//*  RC5 ECB */static SECStatusrc5_ecb_test(blapitestInfo *info){	SECStatus rv;	RC5Context *rc5cx;	PRIntervalTime time1, time2;	int i, numiter;	numiter = info->repetitions;	fillitem(&info->key, info->keysize, "tmp.key");	fillitem(&info->in, info->bufsize, "tmp.pt");	TIMESTART();	for (i=0; i<numiter-1; i++) {		rc5cx = RC5_CreateContext(&info->key, info->rounds, info->wordsize, 		                          NULL, NSS_RC5);		RC5_DestroyContext(rc5cx, PR_TRUE);	}	rc5cx = RC5_CreateContext(&info->key, info->rounds, info->wordsize, 	                          NULL, NSS_RC5);	TIMEFINISH("RC5 ECB CONTEXT CREATE", info->key.len);	if (!rc5cx) {		fprintf(stderr,"%s:  Failed to create encryption context!\n", progName);		return SECFailure;	}	info->out.len = 2*info->in.len;	info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len);	if (info->encrypt) {		TIMESTART();		for (i=0; i<numiter; i++)			rv = RC5_Encrypt(rc5cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		TIMEFINISH("RC5 ECB ENCRYPT", info->in.len);		if (rv) {			fprintf(stderr, "%s:  Failed to encrypt!\n", progName);			CHECKERROR(rv, __LINE__);		}	} else {		TIMESTART();		for (i=0; i<numiter; i++)			rv = RC5_Decrypt(rc5cx, info->out.data, &info->out.len, 			                 info->out.len, info->in.data, info->in.len);		TIMEFINISH("RC5 ECB ENCRYPT", info->in.len);		if (rv) {			fprintf(stderr, "%s:  Failed to decrypt!\n", progName);			CHECKERROR(rv, __LINE__);		}	}	RC5_DestroyContext(rc5cx, PR_TRUE);	return rv;}/*  RC5 CBC */static SECStatus

⌨️ 快捷键说明

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