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