Blame libfreerdp/crypto/test/Test_x509_cert_info.c

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