Blame tests/x509sign-verify-common.h

Packit Service 4684c1
#ifndef GNUTLS_TESTS_X509SIGN_VERIFY_COMMON_H
Packit Service 4684c1
#define GNUTLS_TESTS_X509SIGN_VERIFY_COMMON_H
Packit Service 4684c1
Packit Service 4684c1
static void tls_log_func(int level, const char *str)
Packit Service 4684c1
{
Packit Service 4684c1
	fprintf(stderr, "<%d> %s", level, str);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
/* sha1 hash of "hello" string */
Packit Service 4684c1
const gnutls_datum_t sha1_data = {
Packit Service 4684c1
	(void *)
Packit Service 4684c1
	    "\xaa\xf4\xc6\x1d\xdc\xc5\xe8\xa2\xda\xbe"
Packit Service 4684c1
	    "\xde\x0f\x3b\x48\x2c\xd9\xae\xa9\x43\x4d",
Packit Service 4684c1
	20
Packit Service 4684c1
};
Packit Service 4684c1
Packit Service 4684c1
/* sha1 hash of "hello" string */
Packit Service 4684c1
const gnutls_datum_t sha256_data = {
Packit Service 4684c1
	(void *)
Packit Service 4684c1
	    "\x2c\xf2\x4d\xba\x5f\xb0\xa3\x0e\x26\xe8"
Packit Service 4684c1
	    "\x3b\x2a\xc5\xb9\xe2\x9e\x1b\x16\x1e\x5c"
Packit Service 4684c1
	    "\x1f\xa7\x42\x5e\x73\x04\x33\x62\x93\x8b"
Packit Service 4684c1
	    "\x98\x24",
Packit Service 4684c1
	32
Packit Service 4684c1
};
Packit Service 4684c1
Packit Service 4684c1
/* gost r 34.11-94 hash of "hello" string */
Packit Service 4684c1
const gnutls_datum_t gostr94_data = {
Packit Service 4684c1
	(void *)
Packit Service 4684c1
	    "\x92\xea\x6d\xdb\xaf\x40\x02\x0d\xf3\x65"
Packit Service 4684c1
	    "\x1f\x27\x8f\xd7\x15\x12\x17\xa2\x4a\xa8"
Packit Service 4684c1
	    "\xd2\x2e\xbd\x25\x19\xcf\xd4\xd8\x9e\x64"
Packit Service 4684c1
	    "\x50\xea",
Packit Service 4684c1
	32
Packit Service 4684c1
};
Packit Service 4684c1
Packit Service 4684c1
/* Streebog-256 hash of "hello" string */
Packit Service 4684c1
const gnutls_datum_t streebog256_data = {
Packit Service 4684c1
	(void *)
Packit Service 4684c1
	    "\x3f\xb0\x70\x0a\x41\xce\x6e\x41\x41\x3b"
Packit Service 4684c1
	    "\xa7\x64\xf9\x8b\xf2\x13\x5b\xa6\xde\xd5"
Packit Service 4684c1
	    "\x16\xbe\xa2\xfa\xe8\x42\x9c\xc5\xbd\xd4"
Packit Service 4684c1
	    "\x6d\x6d",
Packit Service 4684c1
	32
Packit Service 4684c1
};
Packit Service 4684c1
Packit Service 4684c1
/* Streebog-512 hash of "hello" string */
Packit Service 4684c1
const gnutls_datum_t streebog512_data = {
Packit Service 4684c1
	(void *)
Packit Service 4684c1
	    "\x8d\xf4\x14\x26\x09\x66\xbe\xb7\xb3\x4d"
Packit Service 4684c1
	    "\x92\x07\x63\x07\x9e\x15\xdf\x1f\x63\x29"
Packit Service 4684c1
	    "\x7e\xb3\xdd\x43\x11\xe8\xb5\x85\xd4\xbf"
Packit Service 4684c1
	    "\x2f\x59\x23\x21\x4f\x1d\xfe\xd3\xfd\xee"
Packit Service 4684c1
	    "\x4a\xaf\x01\x83\x30\xa1\x2a\xcd\xe0\xef"
Packit Service 4684c1
	    "\xcc\x33\x8e\xb5\x29\x22\xf3\xe5\x71\x21"
Packit Service 4684c1
	    "\x2d\x42\xc8\xde",
Packit Service 4684c1
	64
Packit Service 4684c1
};
Packit Service 4684c1
Packit Service 4684c1
const gnutls_datum_t invalid_hash_data = {
Packit Service 4684c1
	(void *)
Packit Service 4684c1
	    "\xaa\xf4\xc6\x1d\xdc\xca\xe8\xa2\xda\xbe"
Packit Service 4684c1
	    "\xde\x0f\x3b\x48\x2c\xb9\xae\xa9\x43\x4d",
Packit Service 4684c1
	20
Packit Service 4684c1
};
Packit Service 4684c1
Packit Service 4684c1
const gnutls_datum_t raw_data = {
Packit Service 4684c1
	(void *)"hello",
Packit Service 4684c1
	5
Packit Service 4684c1
};
Packit Service 4684c1
Packit Service 4684c1
Packit Service 4684c1
static void print_keys(gnutls_privkey_t privkey, gnutls_pubkey_t pubkey)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_x509_privkey_t xkey;
Packit Service 4684c1
	gnutls_datum_t out;
Packit Service 4684c1
	int ret = gnutls_privkey_export_x509(privkey, &xkey);
Packit Service 4684c1
Packit Service 4684c1
	if (ret < 0)
Packit Service 4684c1
		fail("error in privkey export\n");
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_x509_privkey_export2(xkey, GNUTLS_X509_FMT_PEM, &out;;
Packit Service 4684c1
	if (ret < 0)
Packit Service 4684c1
		fail("error in privkey export\n");
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "%s\n", out.data);
Packit Service 4684c1
	gnutls_free(out.data);
Packit Service 4684c1
Packit Service 4684c1
	ret = gnutls_pubkey_export2(pubkey, GNUTLS_X509_FMT_PEM, &out;;
Packit Service 4684c1
	if (ret < 0)
Packit Service 4684c1
		fail("error in pubkey export\n");
Packit Service 4684c1
Packit Service 4684c1
	fprintf(stderr, "%s\n", out.data);
Packit Service 4684c1
	gnutls_free(out.data);
Packit Service 4684c1
Packit Service 4684c1
	gnutls_x509_privkey_deinit(xkey);
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
#define ERR fail("Failure at: %s (%s-%s) (iter: %d)\n", gnutls_sign_get_name(sign_algo), gnutls_pk_get_name(pk), gnutls_digest_get_name(hash), j);
Packit Service 4684c1
static
Packit Service 4684c1
void test_sig(gnutls_pk_algorithm_t pk, unsigned hash, unsigned bits)
Packit Service 4684c1
{
Packit Service 4684c1
	gnutls_pubkey_t pubkey;
Packit Service 4684c1
	gnutls_privkey_t privkey;
Packit Service 4684c1
	gnutls_sign_algorithm_t sign_algo;
Packit Service 4684c1
	gnutls_datum_t signature;
Packit Service 4684c1
	const gnutls_datum_t *hash_data;
Packit Service 4684c1
	int ret;
Packit Service 4684c1
	unsigned j;
Packit Service 4684c1
	unsigned vflags = 0;
Packit Service 4684c1
Packit Service 4684c1
	if (hash == GNUTLS_DIG_SHA1) {
Packit Service 4684c1
		hash_data = &sha1_data;
Packit Service 4684c1
		vflags |= GNUTLS_VERIFY_ALLOW_SIGN_WITH_SHA1;
Packit Service 4684c1
	} else if (hash == GNUTLS_DIG_SHA256)
Packit Service 4684c1
		hash_data = &sha256_data;
Packit Service 4684c1
	else if (hash == GNUTLS_DIG_GOSTR_94)
Packit Service 4684c1
		hash_data = &gostr94_data;
Packit Service 4684c1
	else if (hash == GNUTLS_DIG_STREEBOG_256)
Packit Service 4684c1
		hash_data = &streebog256_data;
Packit Service 4684c1
	else if (hash == GNUTLS_DIG_STREEBOG_512)
Packit Service 4684c1
		hash_data = &streebog512_data;
Packit Service 4684c1
	else
Packit Service 4684c1
		abort();
Packit Service 4684c1
Packit Service 4684c1
	sign_algo =
Packit Service 4684c1
	    gnutls_pk_to_sign(pk, hash);
Packit Service 4684c1
Packit Service 4684c1
	for (j = 0; j < 100; j++) {
Packit Service 4684c1
		ret = gnutls_pubkey_init(&pubkey);
Packit Service 4684c1
		if (ret < 0)
Packit Service 4684c1
			ERR;
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_privkey_init(&privkey);
Packit Service 4684c1
		if (ret < 0)
Packit Service 4684c1
			ERR;
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_privkey_generate(privkey, pk, bits, 0);
Packit Service 4684c1
		if (ret < 0)
Packit Service 4684c1
			ERR;
Packit Service 4684c1
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_privkey_sign_hash(privkey, hash,
Packit Service 4684c1
					     0, hash_data,
Packit Service 4684c1
					     &signature);
Packit Service 4684c1
		if (ret < 0)
Packit Service 4684c1
			ERR;
Packit Service 4684c1
Packit Service 4684c1
		ret = gnutls_pubkey_import_privkey(pubkey, privkey, GNUTLS_KEY_DIGITAL_SIGNATURE, 0);
Packit Service 4684c1
		if (ret < 0)
Packit Service 4684c1
			ERR;
Packit Service 4684c1
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pubkey_verify_hash2(pubkey,
Packit Service 4684c1
						sign_algo, vflags,
Packit Service 4684c1
						hash_data, &signature);
Packit Service 4684c1
		if (ret < 0) {
Packit Service 4684c1
			print_keys(privkey, pubkey);
Packit Service 4684c1
			ERR;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		/* should fail */
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pubkey_verify_hash2(pubkey,
Packit Service 4684c1
						sign_algo, vflags,
Packit Service 4684c1
						&invalid_hash_data,
Packit Service 4684c1
						&signature);
Packit Service 4684c1
		if (ret != GNUTLS_E_PK_SIG_VERIFY_FAILED) {
Packit Service 4684c1
			print_keys(privkey, pubkey);
Packit Service 4684c1
			ERR;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		sign_algo =
Packit Service 4684c1
		    gnutls_pk_to_sign(gnutls_pubkey_get_pk_algorithm
Packit Service 4684c1
				      (pubkey, NULL), hash);
Packit Service 4684c1
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pubkey_verify_hash2(pubkey, sign_algo, vflags,
Packit Service 4684c1
						hash_data, &signature);
Packit Service 4684c1
		if (ret < 0)
Packit Service 4684c1
			ERR;
Packit Service 4684c1
Packit Service 4684c1
		/* should fail */
Packit Service 4684c1
		ret =
Packit Service 4684c1
		    gnutls_pubkey_verify_hash2(pubkey, sign_algo, vflags,
Packit Service 4684c1
						&invalid_hash_data,
Packit Service 4684c1
						&signature);
Packit Service 4684c1
		if (ret != GNUTLS_E_PK_SIG_VERIFY_FAILED) {
Packit Service 4684c1
			print_keys(privkey, pubkey);
Packit Service 4684c1
			ERR;
Packit Service 4684c1
		}
Packit Service 4684c1
Packit Service 4684c1
		/* test the raw interface */
Packit Service 4684c1
		gnutls_free(signature.data);
Packit Service 4684c1
		signature.data = NULL;
Packit Service 4684c1
Packit Service 4684c1
		if (pk == GNUTLS_PK_RSA) {
Packit Service 4684c1
			ret =
Packit Service 4684c1
			    gnutls_privkey_sign_hash(privkey,
Packit Service 4684c1
						     hash,
Packit Service 4684c1
						     GNUTLS_PRIVKEY_SIGN_FLAG_TLS1_RSA,
Packit Service 4684c1
						     hash_data,
Packit Service 4684c1
						     &signature);
Packit Service 4684c1
			if (ret < 0)
Packit Service 4684c1
				ERR;
Packit Service 4684c1
Packit Service 4684c1
			sign_algo =
Packit Service 4684c1
			    gnutls_pk_to_sign
Packit Service 4684c1
			    (gnutls_pubkey_get_pk_algorithm
Packit Service 4684c1
			     (pubkey, NULL), hash);
Packit Service 4684c1
Packit Service 4684c1
			ret =
Packit Service 4684c1
			    gnutls_pubkey_verify_hash2(pubkey,
Packit Service 4684c1
							sign_algo,
Packit Service 4684c1
							vflags|GNUTLS_PUBKEY_VERIFY_FLAG_TLS1_RSA,
Packit Service 4684c1
							hash_data,
Packit Service 4684c1
							&signature);
Packit Service 4684c1
			if (ret < 0) {
Packit Service 4684c1
				print_keys(privkey, pubkey);
Packit Service 4684c1
				ERR;
Packit Service 4684c1
			}
Packit Service 4684c1
Packit Service 4684c1
		}
Packit Service 4684c1
		gnutls_free(signature.data);
Packit Service 4684c1
		gnutls_privkey_deinit(privkey);
Packit Service 4684c1
		gnutls_pubkey_deinit(pubkey);
Packit Service 4684c1
	}
Packit Service 4684c1
}
Packit Service 4684c1
Packit Service 4684c1
#endif /* GNUTLS_TESTS_X509SIGN_VERIFY_COMMON_H */