Blame libfreerdp/crypto/test/Test_x509_cert_info.c

Packit Service fa4841
#include <freerdp/crypto/crypto.h>
Packit Service fa4841
Packit Service fa4841
typedef char* (*get_field_pr)(X509*);
Packit Service fa4841
typedef struct
Packit Service fa4841
{
Packit Service fa4841
	enum
Packit Service fa4841
	{
Packit Service fa4841
		DISABLED,
Packit Service fa4841
		ENABLED,
Packit Service fa4841
	} status;
Packit Service fa4841
	const char* field_description;
Packit Service fa4841
	get_field_pr get_field;
Packit Service fa4841
	const char* expected_result;
Packit Service fa4841
} certificate_test_t;
Packit Service fa4841
Packit Service fa4841
static char* crypto_cert_subject_common_name_wo_length(X509* xcert)
Packit Service fa4841
{
Packit Service fa4841
	int length;
Packit Service fa4841
	return crypto_cert_subject_common_name(xcert, &length);
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static char* certificate_path(void)
Packit Service fa4841
{
Packit Service fa4841
	/*
Packit Service fa4841
	Assume the .pem file is in the same directory as this source file.
Packit Service fa4841
	Assume that __FILE__ will be a valid path to this file, even from the current working directory
Packit Service fa4841
	where the tests are run. (ie. no chdir occurs between compilation and test running, or __FILE__
Packit Service fa4841
	is an absolute path).
Packit Service fa4841
	*/
Packit Service fa4841
#if defined(_WIN32)
Packit Service fa4841
	static const char dirsep = '\\';
Packit Service fa4841
#else
Packit Service fa4841
	static const char dirsep = '/';
Packit Service fa4841
#endif
Packit Service fa4841
	static const char filename[] = "Test_x509_cert_info.pem";
Packit Service fa4841
	const char* file = __FILE__;
Packit Service fa4841
	const char* last_dirsep = strrchr(file, dirsep);
Packit Service fa4841
Packit Service fa4841
	if (last_dirsep)
Packit Service fa4841
	{
Packit Service fa4841
		const size_t filenameLen = strnlen(filename, sizeof(filename));
Packit Service fa4841
		const size_t dirsepLen = last_dirsep - file + 1;
Packit Service fa4841
		char* result = malloc(dirsepLen + filenameLen + 1);
Packit Service fa4841
		if (!result)
Packit Service fa4841
			return NULL;
Packit Service fa4841
		strncpy(result, file, dirsepLen);
Packit Service fa4841
		strncpy(result + dirsepLen, filename, filenameLen + 1);
Packit Service fa4841
		return result;
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
		/* No dirsep => relative path in same directory */
Packit Service fa4841
		return _strdup(filename);
Packit Service fa4841
	}
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
static const certificate_test_t certificate_tests[] = {
Packit Service fa4841
Packit Service fa4841
	{ ENABLED, "Certificate Common Name", crypto_cert_subject_common_name_wo_length,
Packit Service fa4841
	  "TESTJEAN TESTMARTIN 9999999" },
Packit Service fa4841
Packit Service fa4841
	{ ENABLED, "Certificate subject", crypto_cert_subject,
Packit Service fa4841
	  "CN = TESTJEAN TESTMARTIN 9999999, C = FR, O = MINISTERE DES TESTS, OU = 0002 110014016, OU "
Packit Service fa4841
	  "= PERSONNES, UID = 9999999, GN = TESTJEAN, SN = TESTMARTIN" },
Packit Service fa4841
Packit Service fa4841
	{ DISABLED, "Kerberos principal name", 0, "testjean.testmartin@kpn.test.example.com" },
Packit Service fa4841
Packit Service fa4841
	{ ENABLED, "Certificate e-mail", crypto_cert_get_email, "testjean.testmartin@test.example.com"
Packit Service fa4841
Packit Service fa4841
	},
Packit Service fa4841
Packit Service fa4841
	{ ENABLED, "Microsoft's Universal Principal Name", crypto_cert_get_upn,
Packit Service fa4841
	  "testjean.testmartin.9999999@upn.test.example.com" },
Packit Service fa4841
Packit Service fa4841
	{ ENABLED, "Certificate issuer", crypto_cert_issuer,
Packit Service fa4841
	  "CN = ADMINISTRATION CENTRALE DES TESTS, C = FR, O = MINISTERE DES TESTS, OU = 0002 "
Packit Service fa4841
	  "110014016" },
Packit Service fa4841
};
Packit Service fa4841
Packit Service fa4841
static int TestCertificateFile(const char* certificate_path,
Packit Service fa4841
                               const certificate_test_t* certificate_tests, int count)
Packit Service fa4841
{
Packit Service fa4841
	X509* certificate;
Packit Service fa4841
	FILE* certificate_file = fopen(certificate_path, "r");
Packit Service fa4841
	int success = 0;
Packit Service fa4841
	int i;
Packit Service fa4841
Packit Service fa4841
	if (!certificate_file)
Packit Service fa4841
	{
Packit Service fa4841
		printf("%s: failure: cannot open certificate file '%s'\n", __FUNCTION__, certificate_path);
Packit Service fa4841
		return -1;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	certificate = PEM_read_X509(certificate_file, 0, 0, 0);
Packit Service fa4841
	fclose(certificate_file);
Packit Service fa4841
Packit Service fa4841
	if (!certificate)
Packit Service fa4841
	{
Packit Service fa4841
		printf("%s: failure: cannot read certificate file '%s'\n", __FUNCTION__, certificate_path);
Packit Service fa4841
		success = -1;
Packit Service fa4841
		goto fail;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	for (i = 0; i < count; i++)
Packit Service fa4841
	{
Packit Service fa4841
		char* result;
Packit Service fa4841
Packit Service fa4841
		if (certificate_tests[i].status == DISABLED)
Packit Service fa4841
		{
Packit Service fa4841
			continue;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		result = (certificate_tests[i].get_field ? certificate_tests[i].get_field(certificate) : 0);
Packit Service fa4841
Packit Service fa4841
		if (result)
Packit Service fa4841
		{
Packit Service fa4841
			printf("%s: crypto got %-40s -> \"%s\"\n", __FUNCTION__,
Packit Service fa4841
			       certificate_tests[i].field_description, result);
Packit Service fa4841
Packit Service fa4841
			if (0 != strcmp(result, certificate_tests[i].expected_result))
Packit Service fa4841
			{
Packit Service fa4841
				printf("%s: failure: for %s, actual: \"%s\", expected \"%s\"\n", __FUNCTION__,
Packit Service fa4841
				       certificate_tests[i].field_description, result,
Packit Service fa4841
				       certificate_tests[i].expected_result);
Packit Service fa4841
				success = -1;
Packit Service fa4841
			}
Packit Service fa4841
Packit Service fa4841
			free(result);
Packit Service fa4841
		}
Packit Service fa4841
		else
Packit Service fa4841
		{
Packit Service fa4841
			printf("%s: failure: cannot get %s\n", __FUNCTION__,
Packit Service fa4841
			       certificate_tests[i].field_description);
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
fail:
Packit Service fa4841
	X509_free(certificate);
Packit Service fa4841
	return success;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
int Test_x509_cert_info(int argc, char* argv[])
Packit Service fa4841
{
Packit Service fa4841
	char* cert_path = certificate_path();
Packit Service fa4841
	int ret;
Packit Service fa4841
	WINPR_UNUSED(argc);
Packit Service fa4841
	WINPR_UNUSED(argv);
Packit Service fa4841
	ret = TestCertificateFile(cert_path, certificate_tests, ARRAYSIZE(certificate_tests));
Packit Service fa4841
	free(cert_path);
Packit Service fa4841
	return ret;
Packit Service fa4841
}