Exemple #1
0
static int cp_hash_init_test(struct cp_test *test, size_t len)
{
	unsigned char *scratchpad = NULL;
#define MAX_KEYLEN 128
	unsigned char data[MAX_KEYLEN];

	dbg("Initializing hash test %s\n", test->testname);
	if (!test->driver_name) {
		printf(DRIVER_NAME": missing driver_name for %s\n",
		       test->testname);
		return -EFAULT;
	}

	if (kcapi_md_init(&test->u.hash.handle, test->driver_name)) {
		printf(DRIVER_NAME": could not allocate shash handle for "
		       "%s\n", test->driver_name);
		goto out;
	}

	/* HMAC */
	if (test->u.hash.hmac) {
		if (kcapi_md_blocksize(&test->u.hash.handle) > MAX_KEYLEN) {
			printf(DRIVER_NAME": key length for cipher %s too large %u\n",
			       test->driver_name,
			       kcapi_md_blocksize(&test->u.hash.handle));
			goto out;
		}
		cp_read_random(data, kcapi_md_blocksize(&test->u.hash.handle));
		if (kcapi_md_setkey(&test->u.hash.handle, data,
				    kcapi_md_blocksize(&test->u.hash.handle))) {
			printf(DRIVER_NAME": key could not be set\n");
			goto out;
		}
	}

	if (len < 4)
		len = 4;

	if (posix_memalign((void *)&scratchpad,
			   kcapi_md_blocksize(&test->u.hash.handle),
			   kcapi_md_blocksize(&test->u.hash.handle) * len)){
		printf(DRIVER_NAME": could not allocate scratchpad for "
		       "%s\n", test->driver_name);
		goto out;
	}

	cp_read_random(scratchpad,
		       kcapi_md_blocksize(&test->u.hash.handle) * len);

	test->u.hash.inputlen = len * kcapi_md_blocksize(&test->u.hash.handle);
	test->u.hash.scratchpad = scratchpad;
	return 0;

out:
	kcapi_md_destroy(&test->u.hash.handle);
	if (scratchpad)
		free(scratchpad);
	return -ENOMEM;
}
/****************************************************************************
 * Random Number Generators
 ****************************************************************************/
static int cp_rng_init_test(struct cp_test *test, size_t len)
{
	unsigned char *scratchpad = NULL;
#define SEEDSIZE 64
	unsigned char seed[SEEDSIZE];

	dbg("Initializing RNG test %s\n", test->testname);
	if (!test->driver_name) {
		printf(DRIVER_NAME": missing driver_name for %s\n",
		       test->testname);
		return -EFAULT;
	}

	if (kcapi_rng_init(&test->u.rng.handle, test->driver_name, 0)) {
		printf(DRIVER_NAME": could not allocate rng handle for "
		       "%s\n", test->driver_name);
		goto out;
	}
	dbg("testing RNG %s allocated\n", test->driver_name);

	cp_read_random(seed, SEEDSIZE);
	if (kcapi_rng_seed(&test->u.rng.handle, seed, SEEDSIZE)) {
		printf(DRIVER_NAME": seed could not be set\n");
		goto out;
	}

	if (!len)
		len = 1;
	if (posix_memalign((void *)&scratchpad, 16,
			   test->u.rng.blocksize * len)) {
		printf(DRIVER_NAME": could not allocate scratchpad for "
		       "%s\n", test->driver_name);
		goto out;
	}

	test->u.rng.scratchpad = scratchpad;
	test->u.rng.inputlen = len * test->u.rng.blocksize;

	return 0;

out:
	kcapi_rng_destroy(&test->u.rng.handle);
	if (scratchpad)
		free(scratchpad);
	return -ENOMEM;
}