|
Packit |
549fdc |
/*
|
|
Packit |
549fdc |
* Copyright (C) 2006-2012 Free Software Foundation, Inc.
|
|
Packit |
549fdc |
* Author: Simon Josefsson, Howard Chu
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* This file is part of GnuTLS.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* GnuTLS is free software; you can redistribute it and/or modify it
|
|
Packit |
549fdc |
* under the terms of the GNU General Public License as published by
|
|
Packit |
549fdc |
* the Free Software Foundation; either version 3 of the License, or
|
|
Packit |
549fdc |
* (at your option) any later version.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* GnuTLS is distributed in the hope that it will be useful, but
|
|
Packit |
549fdc |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
549fdc |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
549fdc |
* General Public License for more details.
|
|
Packit |
549fdc |
*
|
|
Packit |
549fdc |
* You should have received a copy of the GNU General Public License
|
|
Packit |
549fdc |
* along with GnuTLS; if not, write to the Free Software Foundation,
|
|
Packit |
549fdc |
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
Packit |
549fdc |
*/
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
#ifdef HAVE_CONFIG_H
|
|
Packit |
549fdc |
#include "config.h"
|
|
Packit |
549fdc |
#endif
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
#include <stdio.h>
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
#include <gnutls/gnutls.h>
|
|
Packit |
549fdc |
#include <gnutls/x509.h>
|
|
Packit |
549fdc |
#include "utils.h"
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
static char pem[] =
|
|
Packit |
549fdc |
"-----BEGIN CERTIFICATE-----\n"
|
|
Packit |
549fdc |
"MIIE8jCCAtqgAwIBAgIDAkQVMA0GCSqGSIb3DQEBBQUAMHkxEDAOBgNVBAoTB1Jv\n"
|
|
Packit |
549fdc |
"b3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAGA1UEAxMZ\n"
|
|
Packit |
549fdc |
"Q0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSc3VwcG9y\n"
|
|
Packit |
549fdc |
"dEBjYWNlcnQub3JnMB4XDTA2MDUxNTE1MjEzMVoXDTA3MDUxNTE1MjEzMVowPjEY\n"
|
|
Packit |
549fdc |
"MBYGA1UEAxMPQ0FjZXJ0IFdvVCBVc2VyMSIwIAYJKoZIhvcNAQkBFhNzaW1vbkBq\n"
|
|
Packit |
549fdc |
"b3NlZnNzb24ub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuddO\n"
|
|
Packit |
549fdc |
"vxr7gfof8Ejtk/EOC16m0UdymQhwQwfPM5wWKJCJK9l5GoXSHe+s/+6HPLhXo2do\n"
|
|
Packit |
549fdc |
"byUS6X3w7ODO6MGnlWALJUapUa2LinofYwYWFVlOlwyuN2lW+xQgeQjn24R8Glzl\n"
|
|
Packit |
549fdc |
"KQ2f5C9JOE3RSGnHr7VH/6JJy+rPovh+gqKHjt9UH6Su1LFEQGUg+x+CVPAluYty\n"
|
|
Packit |
549fdc |
"ECfHdAad2Gcbgn3vkMyKEF6VAKR/G9uDb7bBVuA73UWkUtDi3dekM882UqH5HQRj\n"
|
|
Packit |
549fdc |
"mGYoGJk49PQ52jGftXNIDyHDOYWXTl9W64dHKRGaW0LOrkLrodjMPdudTvSsoWzK\n"
|
|
Packit |
549fdc |
"DpMMdHLsFx2/+MAsPwIDAQABo4G9MIG6MAwGA1UdEwEB/wQCMAAwVgYJYIZIAYb4\n"
|
|
Packit |
549fdc |
"QgENBEkWR1RvIGdldCB5b3VyIG93biBjZXJ0aWZpY2F0ZSBmb3IgRlJFRSBoZWFk\n"
|
|
Packit |
549fdc |
"IG92ZXIgdG8gaHR0cDovL3d3dy5DQWNlcnQub3JnMDIGCCsGAQUFBwEBBCYwJDAi\n"
|
|
Packit |
549fdc |
"BggrBgEFBQcwAYYWaHR0cDovL29jc3AuY2FjZXJ0Lm9yZzAeBgNVHREEFzAVgRNz\n"
|
|
Packit |
549fdc |
"aW1vbkBqb3NlZnNzb24ub3JnMA0GCSqGSIb3DQEBBQUAA4ICAQCXhyNfM8ozU2Jw\n"
|
|
Packit |
549fdc |
"H+XEDgrt3lUgnUbXQC+AGXdj4ZIJXQfHOCCQxZOO6Oe9V0rxldO3M5tQi92yRjci\n"
|
|
Packit |
549fdc |
"aa892MCVPxTkJLR0h4Kx4JfeTtSvl+9nWPSRrZbPTdWZ3ecnCyrfLfEas6pZp1ur\n"
|
|
Packit |
549fdc |
"lJkaEksAg5dGNrvJGPqBbF6A44b1wlBTCHEBZy2n/7Qml7Nhydymq2nFhDtlQJ6X\n"
|
|
Packit |
549fdc |
"w+6juM85vaEII6kuNatk2OcMJG9R0JxbC0e+PPI1jk7wuAz4WIMyj+ZudGNOTWKN\n"
|
|
Packit |
549fdc |
"3ohK9v0/EE1/S+KMy3T7fzMkbKkwAQZzQNoDf8bSzvDwtZsoudA4Kcloz8a/iKEH\n"
|
|
Packit |
549fdc |
"C9nKYBU8sFBd1cYV7ocFhN2awvuVnBlfsEN4eO5TRA50hmLxwt5D8Vs2v55n1kl6\n"
|
|
Packit |
549fdc |
"7PBo6H2ZMfbQcws731k4RpOqQcU+2yl/wBlDChOOO95mbJ31tqMh27yIjIemgD6Z\n"
|
|
Packit |
549fdc |
"jxL92AgHPzSFy/nyqmZ1ADcnB5fC5WsEYyr9tPM1gpjJEsi95YIBrO7Uyt4tj5U3\n"
|
|
Packit |
549fdc |
"dYDvbU+Mg1r0gJi61wciuyAllwKfu9aqkCjJKQGHrTimWzRa6RPygaojWIEmap89\n"
|
|
Packit |
549fdc |
"bHarWgDg9CKVP1DggVkcD838s//kE1Vl2DReyfAtEQ1agSXLFncgxL+yOi1o3lcq\n"
|
|
Packit |
549fdc |
"+dmDgpDn168TY1Iug80uVKg7AfkLrA==\n" "-----END CERTIFICATE-----\n";
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
static void print_dn(gnutls_x509_dn_t dn)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
int i, j, ret = 0;
|
|
Packit |
549fdc |
gnutls_x509_ava_st ava;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
for (i = 0; ret == 0; i++)
|
|
Packit |
549fdc |
for (j = 0; ret == 0; j++) {
|
|
Packit |
549fdc |
ret = gnutls_x509_dn_get_rdn_ava(dn, i, j, &ava);
|
|
Packit |
549fdc |
if (ret == GNUTLS_E_ASN1_ELEMENT_NOT_FOUND) {
|
|
Packit |
549fdc |
if (j > 0) {
|
|
Packit |
549fdc |
j = 0;
|
|
Packit |
549fdc |
ret = 0;
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
break;
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("get_rdn_ava %d\n", ret);
|
|
Packit |
549fdc |
if (debug)
|
|
Packit |
549fdc |
printf
|
|
Packit |
549fdc |
("dn[%d][%d] OID=%.*s\n\tDATA=%.*s\n",
|
|
Packit |
549fdc |
i, j, ava.oid.size, ava.oid.data,
|
|
Packit |
549fdc |
ava.value.size, ava.value.data);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
void doit(void)
|
|
Packit |
549fdc |
{
|
|
Packit |
549fdc |
int ret;
|
|
Packit |
549fdc |
gnutls_datum_t pem_cert = { (unsigned char *) pem, sizeof(pem) };
|
|
Packit |
549fdc |
gnutls_x509_crt_t cert;
|
|
Packit |
549fdc |
gnutls_datum_t strdn;
|
|
Packit |
549fdc |
gnutls_x509_dn_t xdn;
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = global_init();
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("init %d\n", ret);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_x509_crt_init(&cert);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("crt_init %d\n", ret);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_x509_crt_import(cert, &pem_cert, GNUTLS_X509_FMT_PEM);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("crt_import %d\n", ret);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_x509_crt_get_issuer(cert, &xdn;;
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("get_issuer %d\n", ret);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (debug) {
|
|
Packit |
549fdc |
printf("Issuer:\n");
|
|
Packit |
549fdc |
print_dn(xdn);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
ret = gnutls_x509_crt_get_subject(cert, &xdn;;
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("get_subject %d\n", ret);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* test the original function behavior */
|
|
Packit |
549fdc |
ret = gnutls_x509_dn_get_str(xdn, &strdn);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("gnutls_x509_dn_get_str %d\n", ret);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (strdn.size != 44 || strcmp((char*)strdn.data, "CN=CAcert WoT User,EMAIL=simon@josefsson.org") != 0) {
|
|
Packit |
549fdc |
fail("gnutls_x509_dn_get_str string comparison failed: '%s'/%d\n", strdn.data, strdn.size);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
gnutls_free(strdn.data);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* test the new function behavior */
|
|
Packit |
549fdc |
ret = gnutls_x509_dn_get_str2(xdn, &strdn, 0);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("gnutls_x509_dn_get_str2 %d\n", ret);
|
|
Packit |
549fdc |
if (strdn.size != 44 || strcmp((char*)strdn.data, "EMAIL=simon@josefsson.org,CN=CAcert WoT User") != 0) {
|
|
Packit |
549fdc |
fail("gnutls_x509_dn_get_str2 string comparison failed: '%s'/%d\n", strdn.data, strdn.size);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
gnutls_free(strdn.data);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
/* test the new/compat function behavior */
|
|
Packit |
549fdc |
ret = gnutls_x509_dn_get_str2(xdn, &strdn, GNUTLS_X509_DN_FLAG_COMPAT);
|
|
Packit |
549fdc |
if (ret < 0)
|
|
Packit |
549fdc |
fail("gnutls_x509_dn_get_str2 %d\n", ret);
|
|
Packit |
549fdc |
if (strdn.size != 44 || strcmp((char*)strdn.data, "CN=CAcert WoT User,EMAIL=simon@josefsson.org") != 0) {
|
|
Packit |
549fdc |
fail("gnutls_x509_dn_get_str2 string comparison failed: '%s'/%d\n", strdn.data, strdn.size);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
gnutls_free(strdn.data);
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (debug) {
|
|
Packit |
549fdc |
printf("Subject:\n");
|
|
Packit |
549fdc |
print_dn(xdn);
|
|
Packit |
549fdc |
}
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
if (debug)
|
|
Packit |
549fdc |
success("done\n");
|
|
Packit |
549fdc |
|
|
Packit |
549fdc |
gnutls_x509_crt_deinit(cert);
|
|
Packit |
549fdc |
gnutls_global_deinit();
|
|
Packit |
549fdc |
}
|