Blame test/v3nametest.c

Packit Service 084de1
/*
Packit Service 084de1
 * Copyright 2012-2018 The OpenSSL Project Authors. All Rights Reserved.
Packit Service 084de1
 *
Packit Service 084de1
 * Licensed under the OpenSSL license (the "License").  You may not use
Packit Service 084de1
 * this file except in compliance with the License.  You can obtain a copy
Packit Service 084de1
 * in the file LICENSE in the source distribution or at
Packit Service 084de1
 * https://www.openssl.org/source/license.html
Packit Service 084de1
 */
Packit Service 084de1
Packit Service 084de1
#include <string.h>
Packit Service 084de1
Packit Service 084de1
#include <openssl/e_os2.h>
Packit Service 084de1
#include <openssl/x509.h>
Packit Service 084de1
#include <openssl/x509v3.h>
Packit Service 084de1
#include "internal/nelem.h"
Packit Service 084de1
#include "testutil.h"
Packit Service 084de1
Packit Service 084de1
#ifdef OPENSSL_SYS_WINDOWS
Packit Service 084de1
# define strcasecmp _stricmp
Packit Service 084de1
#endif
Packit Service 084de1
Packit Service 084de1
static const char *const names[] = {
Packit Service 084de1
    "a", "b", ".", "*", "@",
Packit Service 084de1
    ".a", "a.", ".b", "b.", ".*", "*.", "*@", "@*", "a@", "@a", "b@", "..",
Packit Service 084de1
    "-example.com", "example-.com",
Packit Service 084de1
    "@@", "**", "*.com", "*com", "*.*.com", "*com", "com*", "*example.com",
Packit Service 084de1
    "*@example.com", "test@*.example.com", "example.com", "www.example.com",
Packit Service 084de1
    "test.www.example.com", "*.example.com", "*.www.example.com",
Packit Service 084de1
    "test.*.example.com", "www.*.com",
Packit Service 084de1
    ".www.example.com", "*www.example.com",
Packit Service 084de1
    "example.net", "xn--rger-koa.example.com",
Packit Service 084de1
    "*.xn--rger-koa.example.com", "www.xn--rger-koa.example.com",
Packit Service 084de1
    "*.good--example.com", "www.good--example.com",
Packit Service 084de1
    "*.xn--bar.com", "xn--foo.xn--bar.com",
Packit Service 084de1
    "a.example.com", "b.example.com",
Packit Service 084de1
    "postmaster@example.com", "Postmaster@example.com",
Packit Service 084de1
    "postmaster@EXAMPLE.COM",
Packit Service 084de1
    NULL
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
static const char *const exceptions[] = {
Packit Service 084de1
    "set CN: host: [*.example.com] matches [a.example.com]",
Packit Service 084de1
    "set CN: host: [*.example.com] matches [b.example.com]",
Packit Service 084de1
    "set CN: host: [*.example.com] matches [www.example.com]",
Packit Service 084de1
    "set CN: host: [*.example.com] matches [xn--rger-koa.example.com]",
Packit Service 084de1
    "set CN: host: [*.www.example.com] matches [test.www.example.com]",
Packit Service 084de1
    "set CN: host: [*.www.example.com] matches [.www.example.com]",
Packit Service 084de1
    "set CN: host: [*www.example.com] matches [www.example.com]",
Packit Service 084de1
    "set CN: host: [test.www.example.com] matches [.www.example.com]",
Packit Service 084de1
    "set CN: host: [*.xn--rger-koa.example.com] matches [www.xn--rger-koa.example.com]",
Packit Service 084de1
    "set CN: host: [*.xn--bar.com] matches [xn--foo.xn--bar.com]",
Packit Service 084de1
    "set CN: host: [*.good--example.com] matches [www.good--example.com]",
Packit Service 084de1
    "set CN: host-no-wildcards: [*.www.example.com] matches [.www.example.com]",
Packit Service 084de1
    "set CN: host-no-wildcards: [test.www.example.com] matches [.www.example.com]",
Packit Service 084de1
    "set emailAddress: email: [postmaster@example.com] does not match [Postmaster@example.com]",
Packit Service 084de1
    "set emailAddress: email: [postmaster@EXAMPLE.COM] does not match [Postmaster@example.com]",
Packit Service 084de1
    "set emailAddress: email: [Postmaster@example.com] does not match [postmaster@example.com]",
Packit Service 084de1
    "set emailAddress: email: [Postmaster@example.com] does not match [postmaster@EXAMPLE.COM]",
Packit Service 084de1
    "set dnsName: host: [*.example.com] matches [www.example.com]",
Packit Service 084de1
    "set dnsName: host: [*.example.com] matches [a.example.com]",
Packit Service 084de1
    "set dnsName: host: [*.example.com] matches [b.example.com]",
Packit Service 084de1
    "set dnsName: host: [*.example.com] matches [xn--rger-koa.example.com]",
Packit Service 084de1
    "set dnsName: host: [*.www.example.com] matches [test.www.example.com]",
Packit Service 084de1
    "set dnsName: host-no-wildcards: [*.www.example.com] matches [.www.example.com]",
Packit Service 084de1
    "set dnsName: host-no-wildcards: [test.www.example.com] matches [.www.example.com]",
Packit Service 084de1
    "set dnsName: host: [*.www.example.com] matches [.www.example.com]",
Packit Service 084de1
    "set dnsName: host: [*www.example.com] matches [www.example.com]",
Packit Service 084de1
    "set dnsName: host: [test.www.example.com] matches [.www.example.com]",
Packit Service 084de1
    "set dnsName: host: [*.xn--rger-koa.example.com] matches [www.xn--rger-koa.example.com]",
Packit Service 084de1
    "set dnsName: host: [*.xn--bar.com] matches [xn--foo.xn--bar.com]",
Packit Service 084de1
    "set dnsName: host: [*.good--example.com] matches [www.good--example.com]",
Packit Service 084de1
    "set rfc822Name: email: [postmaster@example.com] does not match [Postmaster@example.com]",
Packit Service 084de1
    "set rfc822Name: email: [Postmaster@example.com] does not match [postmaster@example.com]",
Packit Service 084de1
    "set rfc822Name: email: [Postmaster@example.com] does not match [postmaster@EXAMPLE.COM]",
Packit Service 084de1
    "set rfc822Name: email: [postmaster@EXAMPLE.COM] does not match [Postmaster@example.com]",
Packit Service 084de1
    NULL
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
static int is_exception(const char *msg)
Packit Service 084de1
{
Packit Service 084de1
    const char *const *p;
Packit Service 084de1
Packit Service 084de1
    for (p = exceptions; *p; ++p)
Packit Service 084de1
        if (strcmp(msg, *p) == 0)
Packit Service 084de1
            return 1;
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_cn(X509 *crt, ...)
Packit Service 084de1
{
Packit Service 084de1
    int ret = 0;
Packit Service 084de1
    X509_NAME *n = NULL;
Packit Service 084de1
    va_list ap;
Packit Service 084de1
Packit Service 084de1
    va_start(ap, crt);
Packit Service 084de1
    n = X509_NAME_new();
Packit Service 084de1
    if (n == NULL)
Packit Service 084de1
        goto out;
Packit Service 084de1
Packit Service 084de1
    while (1) {
Packit Service 084de1
        int nid;
Packit Service 084de1
        const char *name;
Packit Service 084de1
Packit Service 084de1
        nid = va_arg(ap, int);
Packit Service 084de1
        if (nid == 0)
Packit Service 084de1
            break;
Packit Service 084de1
        name = va_arg(ap, const char *);
Packit Service 084de1
        if (!X509_NAME_add_entry_by_NID(n, nid, MBSTRING_ASC,
Packit Service 084de1
                                        (unsigned char *)name, -1, -1, 1))
Packit Service 084de1
            goto out;
Packit Service 084de1
    }
Packit Service 084de1
    if (!X509_set_subject_name(crt, n))
Packit Service 084de1
        goto out;
Packit Service 084de1
    ret = 1;
Packit Service 084de1
 out:
Packit Service 084de1
    X509_NAME_free(n);
Packit Service 084de1
    va_end(ap);
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
/*-
Packit Service 084de1
int             X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc);
Packit Service 084de1
X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex,
Packit Service 084de1
                        int nid, int crit, ASN1_OCTET_STRING *data);
Packit Service 084de1
int             X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc);
Packit Service 084de1
*/
Packit Service 084de1
Packit Service 084de1
static int set_altname(X509 *crt, ...)
Packit Service 084de1
{
Packit Service 084de1
    int ret = 0;
Packit Service 084de1
    GENERAL_NAMES *gens = NULL;
Packit Service 084de1
    GENERAL_NAME *gen = NULL;
Packit Service 084de1
    ASN1_IA5STRING *ia5 = NULL;
Packit Service 084de1
    va_list ap;
Packit Service 084de1
    va_start(ap, crt);
Packit Service 084de1
    gens = sk_GENERAL_NAME_new_null();
Packit Service 084de1
    if (gens == NULL)
Packit Service 084de1
        goto out;
Packit Service 084de1
    while (1) {
Packit Service 084de1
        int type;
Packit Service 084de1
        const char *name;
Packit Service 084de1
        type = va_arg(ap, int);
Packit Service 084de1
        if (type == 0)
Packit Service 084de1
            break;
Packit Service 084de1
        name = va_arg(ap, const char *);
Packit Service 084de1
Packit Service 084de1
        gen = GENERAL_NAME_new();
Packit Service 084de1
        if (gen == NULL)
Packit Service 084de1
            goto out;
Packit Service 084de1
        ia5 = ASN1_IA5STRING_new();
Packit Service 084de1
        if (ia5 == NULL)
Packit Service 084de1
            goto out;
Packit Service 084de1
        if (!ASN1_STRING_set(ia5, name, -1))
Packit Service 084de1
            goto out;
Packit Service 084de1
        switch (type) {
Packit Service 084de1
        case GEN_EMAIL:
Packit Service 084de1
        case GEN_DNS:
Packit Service 084de1
            GENERAL_NAME_set0_value(gen, type, ia5);
Packit Service 084de1
            ia5 = NULL;
Packit Service 084de1
            break;
Packit Service 084de1
        default:
Packit Service 084de1
            abort();
Packit Service 084de1
        }
Packit Service 084de1
        sk_GENERAL_NAME_push(gens, gen);
Packit Service 084de1
        gen = NULL;
Packit Service 084de1
    }
Packit Service 084de1
    if (!X509_add1_ext_i2d(crt, NID_subject_alt_name, gens, 0, 0))
Packit Service 084de1
        goto out;
Packit Service 084de1
    ret = 1;
Packit Service 084de1
 out:
Packit Service 084de1
    ASN1_IA5STRING_free(ia5);
Packit Service 084de1
    GENERAL_NAME_free(gen);
Packit Service 084de1
    GENERAL_NAMES_free(gens);
Packit Service 084de1
    va_end(ap);
Packit Service 084de1
    return ret;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_cn1(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_cn(crt, NID_commonName, name, 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_cn_and_email(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_cn(crt, NID_commonName, name,
Packit Service 084de1
                  NID_pkcs9_emailAddress, "dummy@example.com", 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_cn2(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_cn(crt, NID_commonName, "dummy value",
Packit Service 084de1
                  NID_commonName, name, 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_cn3(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_cn(crt, NID_commonName, name,
Packit Service 084de1
                  NID_commonName, "dummy value", 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_email1(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_cn(crt, NID_pkcs9_emailAddress, name, 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_email2(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_cn(crt, NID_pkcs9_emailAddress, "dummy@example.com",
Packit Service 084de1
                  NID_pkcs9_emailAddress, name, 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_email3(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_cn(crt, NID_pkcs9_emailAddress, name,
Packit Service 084de1
                  NID_pkcs9_emailAddress, "dummy@example.com", 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_email_and_cn(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_cn(crt, NID_pkcs9_emailAddress, name,
Packit Service 084de1
                  NID_commonName, "www.example.org", 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_altname_dns(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_altname(crt, GEN_DNS, name, 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int set_altname_email(X509 *crt, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    return set_altname(crt, GEN_EMAIL, name, 0);
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
struct set_name_fn {
Packit Service 084de1
    int (*fn) (X509 *, const char *);
Packit Service 084de1
    const char *name;
Packit Service 084de1
    int host;
Packit Service 084de1
    int email;
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
static const struct set_name_fn name_fns[] = {
Packit Service 084de1
    {set_cn1, "set CN", 1, 0},
Packit Service 084de1
    {set_cn2, "set CN", 1, 0},
Packit Service 084de1
    {set_cn3, "set CN", 1, 0},
Packit Service 084de1
    {set_cn_and_email, "set CN", 1, 0},
Packit Service 084de1
    {set_email1, "set emailAddress", 0, 1},
Packit Service 084de1
    {set_email2, "set emailAddress", 0, 1},
Packit Service 084de1
    {set_email3, "set emailAddress", 0, 1},
Packit Service 084de1
    {set_email_and_cn, "set emailAddress", 0, 1},
Packit Service 084de1
    {set_altname_dns, "set dnsName", 1, 0},
Packit Service 084de1
    {set_altname_email, "set rfc822Name", 0, 1},
Packit Service 084de1
};
Packit Service 084de1
Packit Service 084de1
static X509 *make_cert(void)
Packit Service 084de1
{
Packit Service 084de1
    X509 *crt = NULL;
Packit Service 084de1
Packit Service 084de1
    if (!TEST_ptr(crt = X509_new()))
Packit Service 084de1
        return NULL;
Packit Service 084de1
    if (!TEST_true(X509_set_version(crt, 2))) {
Packit Service 084de1
        X509_free(crt);
Packit Service 084de1
        return NULL;
Packit Service 084de1
    }
Packit Service 084de1
    return crt;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int check_message(const struct set_name_fn *fn, const char *op,
Packit Service 084de1
                         const char *nameincert, int match, const char *name)
Packit Service 084de1
{
Packit Service 084de1
    char msg[1024];
Packit Service 084de1
Packit Service 084de1
    if (match < 0)
Packit Service 084de1
        return 1;
Packit Service 084de1
    BIO_snprintf(msg, sizeof(msg), "%s: %s: [%s] %s [%s]",
Packit Service 084de1
                 fn->name, op, nameincert,
Packit Service 084de1
                 match ? "matches" : "does not match", name);
Packit Service 084de1
    if (is_exception(msg))
Packit Service 084de1
        return 1;
Packit Service 084de1
    TEST_error("%s", msg);
Packit Service 084de1
    return 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int run_cert(X509 *crt, const char *nameincert,
Packit Service 084de1
                     const struct set_name_fn *fn)
Packit Service 084de1
{
Packit Service 084de1
    const char *const *pname = names;
Packit Service 084de1
    int failed = 0;
Packit Service 084de1
Packit Service 084de1
    for (; *pname != NULL; ++pname) {
Packit Service 084de1
        int samename = strcasecmp(nameincert, *pname) == 0;
Packit Service 084de1
        size_t namelen = strlen(*pname);
Packit Service 084de1
        char *name = OPENSSL_malloc(namelen);
Packit Service 084de1
        int match, ret;
Packit Service 084de1
Packit Service 084de1
        memcpy(name, *pname, namelen);
Packit Service 084de1
Packit Service 084de1
        match = -1;
Packit Service 084de1
        if (!TEST_int_ge(ret = X509_check_host(crt, name, namelen, 0, NULL),
Packit Service 084de1
                         0)) {
Packit Service 084de1
            failed = 1;
Packit Service 084de1
        } else if (fn->host) {
Packit Service 084de1
            if (ret == 1 && !samename)
Packit Service 084de1
                match = 1;
Packit Service 084de1
            if (ret == 0 && samename)
Packit Service 084de1
                match = 0;
Packit Service 084de1
        } else if (ret == 1)
Packit Service 084de1
            match = 1;
Packit Service 084de1
        if (!TEST_true(check_message(fn, "host", nameincert, match, *pname)))
Packit Service 084de1
            failed = 1;
Packit Service 084de1
Packit Service 084de1
        match = -1;
Packit Service 084de1
        if (!TEST_int_ge(ret = X509_check_host(crt, name, namelen,
Packit Service 084de1
                                               X509_CHECK_FLAG_NO_WILDCARDS,
Packit Service 084de1
                                               NULL), 0)) {
Packit Service 084de1
            failed = 1;
Packit Service 084de1
        } else if (fn->host) {
Packit Service 084de1
            if (ret == 1 && !samename)
Packit Service 084de1
                match = 1;
Packit Service 084de1
            if (ret == 0 && samename)
Packit Service 084de1
                match = 0;
Packit Service 084de1
        } else if (ret == 1)
Packit Service 084de1
            match = 1;
Packit Service 084de1
        if (!TEST_true(check_message(fn, "host-no-wildcards",
Packit Service 084de1
                                     nameincert, match, *pname)))
Packit Service 084de1
            failed = 1;
Packit Service 084de1
Packit Service 084de1
        match = -1;
Packit Service 084de1
        ret = X509_check_email(crt, name, namelen, 0);
Packit Service 084de1
        if (fn->email) {
Packit Service 084de1
            if (ret && !samename)
Packit Service 084de1
                match = 1;
Packit Service 084de1
            if (!ret && samename && strchr(nameincert, '@') != NULL)
Packit Service 084de1
                match = 0;
Packit Service 084de1
        } else if (ret)
Packit Service 084de1
            match = 1;
Packit Service 084de1
        if (!TEST_true(check_message(fn, "email", nameincert, match, *pname)))
Packit Service 084de1
            failed = 1;
Packit Service 084de1
        OPENSSL_free(name);
Packit Service 084de1
    }
Packit Service 084de1
Packit Service 084de1
    return failed == 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service 084de1
static int call_run_cert(int i)
Packit Service 084de1
{
Packit Service 084de1
    int failed = 0;
Packit Service 084de1
    const struct set_name_fn *pfn = &name_fns[i];
Packit Service 084de1
    X509 *crt;
Packit Service 084de1
    const char *const *pname;
Packit Service 084de1
Packit Service 084de1
    TEST_info("%s", pfn->name);
Packit Service 084de1
    for (pname = names; *pname != NULL; pname++) {
Packit Service 084de1
        if (!TEST_ptr(crt = make_cert())
Packit Service 084de1
             || !TEST_true(pfn->fn(crt, *pname))
Packit Service 084de1
             || !run_cert(crt, *pname, pfn))
Packit Service 084de1
            failed = 1;
Packit Service 084de1
        X509_free(crt);
Packit Service 084de1
    }
Packit Service 084de1
    return failed == 0;
Packit Service 084de1
}
Packit Service 084de1
Packit Service dd46e1
struct gennamedata {
Packit Service dd46e1
    const unsigned char der[22];
Packit Service dd46e1
    size_t derlen;
Packit Service dd46e1
} gennames[] = {
Packit Service dd46e1
    {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [0] {
Packit Service dd46e1
        *   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     SEQUENCE {}
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa0, 0x13, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
Packit Service dd46e1
            0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x02, 0x30, 0x00
Packit Service dd46e1
        },
Packit Service dd46e1
        21
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [0] {
Packit Service dd46e1
        *   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     [APPLICATION 0] {}
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa0, 0x13, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
Packit Service dd46e1
            0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x02, 0x60, 0x00
Packit Service dd46e1
        },
Packit Service dd46e1
        21
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [0] {
Packit Service dd46e1
        *   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     UTF8String { "a" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
Packit Service dd46e1
            0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x03, 0x0c, 0x01, 0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        22
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [0] {
Packit Service dd46e1
        *   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.2 }
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     UTF8String { "a" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
Packit Service dd46e1
            0x01, 0x84, 0xb7, 0x09, 0x02, 0x02, 0xa0, 0x03, 0x0c, 0x01, 0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        22
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [0] {
Packit Service dd46e1
        *   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     UTF8String { "b" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
Packit Service dd46e1
            0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x03, 0x0c, 0x01, 0x62
Packit Service dd46e1
        },
Packit Service dd46e1
        22
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [0] {
Packit Service dd46e1
        *   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     BOOLEAN { TRUE }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
Packit Service dd46e1
            0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x03, 0x01, 0x01, 0xff
Packit Service dd46e1
        },
Packit Service dd46e1
        22
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [0] {
Packit Service dd46e1
        *   OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     BOOLEAN { FALSE }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
Packit Service dd46e1
            0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x03, 0x01, 0x01, 0x00
Packit Service dd46e1
        },
Packit Service dd46e1
        22
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [1 PRIMITIVE] { "a" } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x81, 0x01, 0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        3
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [1 PRIMITIVE] { "b" } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x81, 0x01, 0x62
Packit Service dd46e1
        },
Packit Service dd46e1
        3
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [2 PRIMITIVE] { "a" } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x82, 0x01, 0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        3
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [2 PRIMITIVE] { "b" } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x82, 0x01, 0x62
Packit Service dd46e1
        },
Packit Service dd46e1
        3
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [4] {
Packit Service dd46e1
        *   SEQUENCE {
Packit Service dd46e1
        *     SET {
Packit Service dd46e1
        *       SEQUENCE {
Packit Service dd46e1
        *         # commonName
Packit Service dd46e1
        *         OBJECT_IDENTIFIER { 2.5.4.3 }
Packit Service dd46e1
        *         UTF8String { "a" }
Packit Service dd46e1
        *       }
Packit Service dd46e1
        *     }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa4, 0x0e, 0x30, 0x0c, 0x31, 0x0a, 0x30, 0x08, 0x06, 0x03, 0x55,
Packit Service dd46e1
            0x04, 0x03, 0x0c, 0x01, 0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        16
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [4] {
Packit Service dd46e1
        *   SEQUENCE {
Packit Service dd46e1
        *     SET {
Packit Service dd46e1
        *       SEQUENCE {
Packit Service dd46e1
        *         # commonName
Packit Service dd46e1
        *         OBJECT_IDENTIFIER { 2.5.4.3 }
Packit Service dd46e1
        *         UTF8String { "b" }
Packit Service dd46e1
        *       }
Packit Service dd46e1
        *     }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa4, 0x0e, 0x30, 0x0c, 0x31, 0x0a, 0x30, 0x08, 0x06, 0x03, 0x55,
Packit Service dd46e1
            0x04, 0x03, 0x0c, 0x01, 0x62
Packit Service dd46e1
        },
Packit Service dd46e1
        16
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [5] {
Packit Service dd46e1
        *   [1] {
Packit Service dd46e1
        *     UTF8String { "a" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa5, 0x05, 0xa1, 0x03, 0x0c, 0x01, 0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        7
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [5] {
Packit Service dd46e1
        *   [1] {
Packit Service dd46e1
        *     UTF8String { "b" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa5, 0x05, 0xa1, 0x03, 0x0c, 0x01, 0x62
Packit Service dd46e1
        },
Packit Service dd46e1
        7
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [5] {
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     UTF8String {}
Packit Service dd46e1
        *   }
Packit Service dd46e1
        *   [1] {
Packit Service dd46e1
        *     UTF8String { "a" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa5, 0x09, 0xa0, 0x02, 0x0c, 0x00, 0xa1, 0x03, 0x0c, 0x01, 0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        11
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [5] {
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     UTF8String { "a" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        *   [1] {
Packit Service dd46e1
        *     UTF8String { "a" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa5, 0x0a, 0xa0, 0x03, 0x0c, 0x01, 0x61, 0xa1, 0x03, 0x0c, 0x01,
Packit Service dd46e1
            0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        12
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /*
Packit Service dd46e1
        * [5] {
Packit Service dd46e1
        *   [0] {
Packit Service dd46e1
        *     UTF8String { "b" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        *   [1] {
Packit Service dd46e1
        *     UTF8String { "a" }
Packit Service dd46e1
        *   }
Packit Service dd46e1
        * }
Packit Service dd46e1
        */
Packit Service dd46e1
        {
Packit Service dd46e1
            0xa5, 0x0a, 0xa0, 0x03, 0x0c, 0x01, 0x62, 0xa1, 0x03, 0x0c, 0x01,
Packit Service dd46e1
            0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        12
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [6 PRIMITIVE] { "a" } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x86, 0x01, 0x61
Packit Service dd46e1
        },
Packit Service dd46e1
        3
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [6 PRIMITIVE] { "b" } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x86, 0x01, 0x62
Packit Service dd46e1
        },
Packit Service dd46e1
        3
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [7 PRIMITIVE] { `11111111` } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x87, 0x04, 0x11, 0x11, 0x11, 0x11
Packit Service dd46e1
        },
Packit Service dd46e1
        6
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [7 PRIMITIVE] { `22222222`} */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x87, 0x04, 0x22, 0x22, 0x22, 0x22
Packit Service dd46e1
        },
Packit Service dd46e1
        6
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [7 PRIMITIVE] { `11111111111111111111111111111111` } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x87, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
Packit Service dd46e1
            0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11
Packit Service dd46e1
        },
Packit Service dd46e1
        18
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [7 PRIMITIVE] { `22222222222222222222222222222222` } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x87, 0x10, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
Packit Service dd46e1
            0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22
Packit Service dd46e1
        },
Packit Service dd46e1
        18
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [8 PRIMITIVE] { 1.2.840.113554.4.1.72585.2.1 } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x88, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84,
Packit Service dd46e1
            0xb7, 0x09, 0x02, 0x01
Packit Service dd46e1
        },
Packit Service dd46e1
        15
Packit Service dd46e1
    }, {
Packit Service dd46e1
        /* [8 PRIMITIVE] { 1.2.840.113554.4.1.72585.2.2 } */
Packit Service dd46e1
        {
Packit Service dd46e1
            0x88, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84,
Packit Service dd46e1
            0xb7, 0x09, 0x02, 0x02
Packit Service dd46e1
        },
Packit Service dd46e1
        15
Packit Service dd46e1
    }
Packit Service dd46e1
};
Packit Service dd46e1
Packit Service dd46e1
static int test_GENERAL_NAME_cmp(void)
Packit Service dd46e1
{
Packit Service dd46e1
    size_t i, j;
Packit Service dd46e1
    GENERAL_NAME **namesa = OPENSSL_malloc(sizeof(*namesa)
Packit Service dd46e1
                                           * OSSL_NELEM(gennames));
Packit Service dd46e1
    GENERAL_NAME **namesb = OPENSSL_malloc(sizeof(*namesb)
Packit Service dd46e1
                                           * OSSL_NELEM(gennames));
Packit Service dd46e1
    int testresult = 0;
Packit Service dd46e1
Packit Service dd46e1
    if (!TEST_ptr(namesa) || !TEST_ptr(namesb))
Packit Service dd46e1
        goto end;
Packit Service dd46e1
Packit Service dd46e1
    for (i = 0; i < OSSL_NELEM(gennames); i++) {
Packit Service dd46e1
        const unsigned char *derp = gennames[i].der;
Packit Service dd46e1
Packit Service dd46e1
        /*
Packit Service dd46e1
         * We create two versions of each GENERAL_NAME so that we ensure when
Packit Service dd46e1
         * we compare them they are always different pointers.
Packit Service dd46e1
         */
Packit Service dd46e1
        namesa[i] = d2i_GENERAL_NAME(NULL, &derp, gennames[i].derlen);
Packit Service dd46e1
        derp = gennames[i].der;
Packit Service dd46e1
        namesb[i] = d2i_GENERAL_NAME(NULL, &derp, gennames[i].derlen);
Packit Service dd46e1
        if (!TEST_ptr(namesa[i]) || !TEST_ptr(namesb[i]))
Packit Service dd46e1
            goto end;
Packit Service dd46e1
    }
Packit Service dd46e1
Packit Service dd46e1
    /* Every name should be equal to itself and not equal to any others. */
Packit Service dd46e1
    for (i = 0; i < OSSL_NELEM(gennames); i++) {
Packit Service dd46e1
        for (j = 0; j < OSSL_NELEM(gennames); j++) {
Packit Service dd46e1
            if (i == j) {
Packit Service dd46e1
                if (!TEST_int_eq(GENERAL_NAME_cmp(namesa[i], namesb[j]), 0))
Packit Service dd46e1
                    goto end;
Packit Service dd46e1
            } else {
Packit Service dd46e1
                if (!TEST_int_ne(GENERAL_NAME_cmp(namesa[i], namesb[j]), 0))
Packit Service dd46e1
                    goto end;
Packit Service dd46e1
            }
Packit Service dd46e1
        }
Packit Service dd46e1
    }
Packit Service dd46e1
    testresult = 1;
Packit Service dd46e1
Packit Service dd46e1
 end:
Packit Service dd46e1
    for (i = 0; i < OSSL_NELEM(gennames); i++) {
Packit Service dd46e1
        if (namesa != NULL)
Packit Service dd46e1
            GENERAL_NAME_free(namesa[i]);
Packit Service dd46e1
        if (namesb != NULL)
Packit Service dd46e1
            GENERAL_NAME_free(namesb[i]);
Packit Service dd46e1
    }
Packit Service dd46e1
    OPENSSL_free(namesa);
Packit Service dd46e1
    OPENSSL_free(namesb);
Packit Service dd46e1
Packit Service dd46e1
    return testresult;
Packit Service dd46e1
}
Packit Service dd46e1
Packit Service 084de1
int setup_tests(void)
Packit Service 084de1
{
Packit Service 084de1
    ADD_ALL_TESTS(call_run_cert, OSSL_NELEM(name_fns));
Packit Service dd46e1
    ADD_TEST(test_GENERAL_NAME_cmp);
Packit Service 084de1
    return 1;
Packit Service 084de1
}