⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cryptotest.c

📁 A Linux port of the OpenBSD/FreeBSD Cryptographic Framework (OCF). This port aims to bring full asyn
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (!alg->ishash) {		for (i = 0; i < count; i++) {			cop.ses = sop.ses;			cop.op = COP_ENCRYPT;			cop.flags = opflags;			cop.len = size;			cop.src = cleartext;			cop.dst = ciphertext;			cop.mac = 0;			cop.iv = iv;			if (swap_data)				swap_buf(cleartext, size);			if (swap_data)				swap_buf(ciphertext, size);			if (swap_iv)				swap_buf(iv, N(iv));			if (ioctl(fd, CIOCCRYPT, &cop) < 0)				err(1, "line %d:ioctl(CIOCCRYPT)", __LINE__);			if (swap_data)				swap_buf(cleartext, size);			if (swap_data)				swap_buf(ciphertext, size);			if (swap_iv)				swap_buf(iv, N(iv));			if (verify && bcmp(ciphertext, cleartext, size) == 0) {				printf("cipher text unchanged:");				hexdump(ciphertext, size);			}			if (verbose) {				printf("ciphertext:");				hexdump(ciphertext, MIN(size, CHUNK));				printf("cipheriv:");				hexdump(iv, MIN(size, CHUNK));			}			memset(cleartext, 'x', MIN(size, CHUNK));			cop.ses = sop.ses;			cop.op = COP_DECRYPT;			cop.flags = opflags;			cop.len = size;			cop.src = ciphertext;			cop.dst = cleartext;			cop.mac = 0;			cop.iv = iv;			if (swap_data)				swap_buf(cleartext, size);			if (swap_data)				swap_buf(ciphertext, size);			if (swap_iv)				swap_buf(iv, N(iv));			if (ioctl(fd, CIOCCRYPT, &cop) < 0)				err(1, "line %d:ioctl(CIOCCRYPT)", __LINE__);			if (swap_data)				swap_buf(cleartext, size);			if (swap_data)				swap_buf(ciphertext, size);			if (swap_iv)				swap_buf(iv, N(iv));			if (verify && bcmp(cleartext, originaltext, size) != 0) {				printf("decrypt mismatch:\n");				printf("original:");				hexdump(originaltext, size);				printf("cleartext:");				hexdump(cleartext, size);			}		}	} else {		for (i = 0; i < count; i++) {			cop.ses = sop.ses;			cop.op = 0;			cop.flags = opflags;			cop.len = size;			cop.src = cleartext;			cop.dst = 0;			cop.mac = ciphertext;			cop.iv = 0;			if (ioctl(fd, CIOCCRYPT, &cop) < 0)				err(1, "line %d:ioctl(CIOCCRYPT)", __LINE__);			if (verbose) {				printf("ciphertext:");				hexdump(ciphertext, size);			}		}	}	gettimeofday(&stop, NULL); 	if (ioctl(fd, CIOCFSESSION, &sop.ses) < 0)		perror("ioctl(CIOCFSESSION)");	if (verbose) {		printf("cleartext:");		hexdump(cleartext, MIN(size, CHUNK));	}	timersub(&stop, &start, tv);	if (sop.key)		free(sop.key);	if (sop.mackey)		free(sop.mackey);	free(originaltext);	close(fd);}#ifdef __FreeBSD__static voidresetstats(){	struct cryptostats stats;	size_t slen;	slen = sizeof (stats);	if (sysctlbyname("kern.crypto_stats", &stats, &slen, NULL, 0) < 0) {		perror("kern.crypto_stats");		return;	}	bzero(&stats.cs_invoke, sizeof (stats.cs_invoke));	bzero(&stats.cs_done, sizeof (stats.cs_done));	bzero(&stats.cs_cb, sizeof (stats.cs_cb));	bzero(&stats.cs_finis, sizeof (stats.cs_finis));	stats.cs_invoke.min.tv_sec = 10000;	stats.cs_done.min.tv_sec = 10000;	stats.cs_cb.min.tv_sec = 10000;	stats.cs_finis.min.tv_sec = 10000;	if (sysctlbyname("kern.crypto_stats", NULL, NULL, &stats, sizeof (stats)) < 0)		perror("kern.cryptostats");}static voidprintt(const char* tag, struct cryptotstat *ts){	uint64_t avg, min, max;	if (ts->count == 0)		return;	avg = (1000000000LL*ts->acc.tv_sec + ts->acc.tv_nsec) / ts->count;	min = 1000000000LL*ts->min.tv_sec + ts->min.tv_nsec;	max = 1000000000LL*ts->max.tv_sec + ts->max.tv_nsec;	printf("%16.16s: avg %6llu ns : min %6llu ns : max %7llu ns [%u samps]\n",		tag, avg, min, max, ts->count);}#endifstatic voidruntests(struct alg *alg, int count, int size, u_long cmd, int threads, int profile){	int i, status;	double t;	void *region;	struct timeval *tvp;#ifdef __FreeBSD__	int otiming;#endif	if (size % alg->blocksize) {		if (verbose)			printf("skipping blocksize %u 'cuz not a multiple of "				"%s blocksize %u\n",				size, alg->name, alg->blocksize);		return;	}	region = mmap(NULL, threads * sizeof (struct timeval),			PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);	if (region == MAP_FAILED) {		perror("mmap");		return;	}	tvp = (struct timeval *) region;#ifdef __FreeBSD__	if (profile) {		size_t tlen = sizeof (otiming);		int timing = 1;		resetstats();		if (sysctlbyname("debug.crypto_timing", &otiming, &tlen,				&timing, sizeof (timing)) < 0)			perror("debug.crypto_timing");	}#endif	if (threads > 1) {		for (i = 0; i < threads; i++)			if (fork() == 0) {				runtest(alg, count, size, cmd, &tvp[i]);				exit(0);			}		while (waitpid(WAIT_MYPGRP, &status, 0) != -1)			;	} else		runtest(alg, count, size, cmd, tvp);	t = 0;	for (i = 0; i < threads; i++)		t += (((double)tvp[i].tv_sec * 1000000 + tvp[i].tv_usec) / 1000000);	if (t) {		int nops = alg->ishash ? count : 2*count;#if 0		t /= threads;		printf("%6.3lf sec, %7d %6s crypts, %7d bytes, %8.0lf bytes/sec, %7.1lf Mbit/sec\n",		    t, nops, alg->name, size, (double)nops*size / t,		    (double)nops*size / t * 8 / 1024 / 1024);#else		nops *= threads;		printf("%8.3lf sec, %7d %6s crypts, %7d bytes, %8.0lf byte/sec, %7.1lf Mb/sec\n",		    t, nops, alg->name, size, (double)nops*size / t,		    (double)nops*size / t * 8 / 1024 / 1024);#endif	}#ifdef __FreeBSD__	if (profile) {		struct cryptostats stats;		size_t slen = sizeof (stats);		if (sysctlbyname("debug.crypto_timing", NULL, NULL,				&otiming, sizeof (otiming)) < 0)			perror("debug.crypto_timing");		if (sysctlbyname("kern.crypto_stats", &stats, &slen, NULL, 0) < 0)			perror("kern.cryptostats");		if (stats.cs_invoke.count) {			printt("dispatch->invoke", &stats.cs_invoke);			printt("invoke->done", &stats.cs_done);			printt("done->cb", &stats.cs_cb);			printt("cb->finis", &stats.cs_finis);		}	}#endif	if (munmap(region, threads * sizeof (struct timeval)) != 0)		perror("munmap");	fflush(stdout);}intmain(int argc, char **argv){	struct alg *alg = NULL;	int count = 1;	int sizes[128], nsizes = 0;	u_long cmd = CIOCGSESSION2;	int testall = 0;	int maxthreads = 1;	int profile = 0;	int i, ch;	srandom(time(0));	while ((ch = getopt(argc, argv, "cpzsva:bd:t:S:VKD")) != -1) {		switch (ch) {		case 'V': swap_iv = 1; break;		case 'K': swap_key = 1; break;		case 'D': swap_data = 1; break;#ifdef CIOCGSSESSION		case 's':			cmd = CIOCGSSESSION;			break;#endif		case 'v':			verbose++;			break;		case 'a':			alg = getalgbyname(optarg);			if (alg == NULL) {				if (streq(optarg, "rijndael"))					alg = getalgbyname("aes");				else					usage(argv[0]);			}			break;		case 'S':			srandom(atoi(optarg));			break;		case 'd':			crid = crlookup(optarg);			break;		case 't':			maxthreads = atoi(optarg);			break;		case 'z':			testall = 1;			break;		case 'p':			profile = 1;			break;		case 'b':			opflags |= COP_F_BATCH;			break;		case 'c':			verify = 1;			break;		default:			usage(argv[0]);		}	}	argc -= optind, argv += optind;	if (argc > 0)		count = atoi(argv[0]);	while (argc > 1) {		int s = atoi(argv[1]);		if (nsizes < N(sizes)) {			sizes[nsizes++] = s;		} else {			printf("Too many sizes, ignoring %u\n", s);		}		argc--, argv++;	}	if (nsizes == 0) {		if (alg)			sizes[nsizes++] = alg->blocksize;		else			sizes[nsizes++] = 8;		if (testall) {			/*			 * OCF is limited to CRYPTO_MAX_DATA_LEN, so make it 256 bytes less			 * for safety sakes.			 */			while (sizes[nsizes-1] < (CRYPTO_MAX_DATA_LEN - 256)) {				sizes[nsizes] = sizes[nsizes-1]<<1;				if (sizes[nsizes] > CRYPTO_MAX_DATA_LEN)					sizes[nsizes] -= 256;				nsizes++;			}		}	}	if (testall) {		for (i = 0; i < N(algorithms); i++) {			int j;			alg = &algorithms[i];			for (j = 0; j < nsizes; j++)				runtests(alg, count, sizes[j], cmd, maxthreads, profile);		}	} else {		if (alg == NULL)			alg = getalgbycode(CRYPTO_3DES_CBC);		for (i = 0; i < nsizes; i++)			runtests(alg, count, sizes[i], cmd, maxthreads, profile);	}	return (0);}voidhexdump(char *p, int n){	int i, off;	for (off = 0; n > 0; off += 16, n -= 16) {		printf("%s%04x:", off == 0 ? "\n" : "", off);		i = (n >= 16 ? 16 : n);		do {			printf(" %02x", *p++ & 0xff);		} while (--i);		printf("\n");	}}

⌨️ 快捷键说明

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