Beispiel #1
0
static void
lookup(const char *name)
{
    unsigned i;
    char encoded[1024];
    char *ep;
    int ret;
    struct addrinfo hints;
    struct addrinfo *ai;

    size_t u_len = strlen(name);
    uint32_t *u = malloc(u_len * sizeof(uint32_t));
    size_t norm_len = u_len * 2;
    uint32_t *norm = malloc(norm_len * sizeof(uint32_t));

    if (u == NULL && u_len != 0)
        errx(1, "malloc failed");
    if (norm == NULL && norm_len != 0)
        errx(1, "malloc failed");

    ret = wind_utf8ucs4(name, u, &u_len);
    if (ret)
        errx(1, "utf8 conversion failed");
    ret = wind_stringprep(u, u_len, norm, &norm_len, WIND_PROFILE_NAME);
    if (ret)
        errx(1, "stringprep failed");
    free(u);

    ep = encoded;
    for (i = 0; i < norm_len; ++i) {
        unsigned j;
        size_t len;

        for (j = i; j < norm_len && !is_separator(norm[j]); ++j)
            ;
        len = sizeof(encoded) - (ep - encoded);
        ret = wind_punycode_label_toascii(norm + i, j - i, ep, &len);
        if (ret)
            errx(1, "punycode failed");

        ep += len;
        *ep++ = '.';
        i = j;
    }
    *ep = '\0';
    free(norm);

    printf("Converted \"%s\" into \"%s\"\n", name, encoded);

    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_CANONNAME;
    ret = getaddrinfo(encoded, NULL, &hints, &ai);
    if(ret)
        errx(1, "getaddrinfo failed: %s", gai_strerror(ret));
    printf("canonical-name: %s\n", ai->ai_canonname);
    freeaddrinfo(ai);
}
Beispiel #2
0
int
main(void)
{
    uint32_t out[MAX_LENGTH];
    unsigned failures = 0;
    unsigned i;
    size_t olen;
    int ret;


    for (i = 0; i < sizeof(testcases)/sizeof(testcases[0]); ++i) {
	const struct testcase *t = &testcases[i];

	olen = sizeof(out)/sizeof(out[0]);
	assert(olen > t->olen);

	ret = _wind_ldap_case_exact_attribute(t->in, t->ilen, out, &olen);
	if (ret) {
	    printf("wlcea: %u: %d\n", i, ret);
	    ++failures;
	    continue;
	}
	if (olen != t->olen) {
	    printf("len wlcea: %u %u != %u\n", i,
		   (unsigned)olen, (unsigned)t->olen);
	    failures++;
	    continue;
	}
	if (memcmp(t->out, out, sizeof(out[0]) * olen) != 0) {
	    printf("memcmp wlcea: %u\n", i);
	    failures++;
	    continue;
	}
    }

    for (i = 0; i < sizeof(testcases2)/sizeof(testcases2[0]); ++i) {
	const struct testcase *t = &testcases2[i];

	olen = sizeof(out)/sizeof(out[0]);
	assert(olen > t->olen);

	ret = wind_stringprep(t->in, t->ilen, out, &olen,
			      WIND_PROFILE_LDAP_CASE);

	if (ret) {
	    printf("wsplc: %u: %d\n", i, ret);
	    ++failures;
	    continue;
	}

	if (olen != t->olen) {
	    printf("strlen wsplc: %u: %d\n", i, ret);
	    ++failures;
	    continue;
	}
	if (memcmp(t->out, out, sizeof(out[0]) * olen) != 0) {
	    printf("memcmp wsplc: %u\n", i);
	    failures++;
	    continue;
	}
    }

    return failures != 0;
}
Beispiel #3
0
static int
dsstringprep(const DirectoryString *ds, uint32_t **rname, size_t *rlen)
{
    wind_profile_flags flags;
    size_t i, len;
    int ret;
    uint32_t *name;

    *rname = NULL;
    *rlen = 0;

    switch(ds->element) {
    case choice_DirectoryString_ia5String:
	flags = WIND_PROFILE_LDAP;
	COPYVOIDARRAY(ds, ia5String, len, name);
	break;
    case choice_DirectoryString_printableString:
	flags = WIND_PROFILE_LDAP;
	flags |= WIND_PROFILE_LDAP_CASE_EXACT_ATTRIBUTE;
	COPYVOIDARRAY(ds, printableString, len, name);
	break;
    case choice_DirectoryString_teletexString:
	flags = WIND_PROFILE_LDAP_CASE;
	COPYCHARARRAY(ds, teletexString, len, name);
	break;
    case choice_DirectoryString_bmpString:
	flags = WIND_PROFILE_LDAP;
	COPYVALARRAY(ds, bmpString, len, name);
	break;
    case choice_DirectoryString_universalString:
	flags = WIND_PROFILE_LDAP;
	COPYVALARRAY(ds, universalString, len, name);
	break;
    case choice_DirectoryString_utf8String:
	flags = WIND_PROFILE_LDAP;
	ret = wind_utf8ucs4_length(ds->u.utf8String, &len);
	if (ret)
	    return ret;
	name = malloc(len * sizeof(name[0]));
	if (name == NULL)
	    return ENOMEM;
	ret = wind_utf8ucs4(ds->u.utf8String, name, &len);
	if (ret) {
	    free(name);
	    return ret;
	}
	break;
    default:
	_hx509_abort("unknown directory type: %d", ds->element);
    }

    *rlen = len;
    /* try a couple of times to get the length right, XXX gross */
    for (i = 0; i < 4; i++) {
	*rlen = *rlen * 2;
	*rname = malloc(*rlen * sizeof((*rname)[0]));

	ret = wind_stringprep(name, len, *rname, rlen, flags);
	if (ret == WIND_ERR_OVERRUN) {
	    free(*rname);
	    *rname = NULL;
	    continue;
	} else
	    break;
    }
    free(name);
    if (ret) {
	if (*rname)
	    free(*rname);
	*rname = NULL;
	*rlen = 0;
	return ret;
    }

    return 0;
}