int wind_stringprep(const uint32_t *in, size_t in_len, uint32_t *out, size_t *out_len, wind_profile_flags flags) { size_t tmp_len = in_len * 3; uint32_t *tmp; int ret; size_t olen; if (in_len == 0) { *out_len = 0; return 0; } tmp = malloc(tmp_len * sizeof(uint32_t)); if (tmp == NULL) return ENOMEM; ret = _wind_stringprep_map(in, in_len, tmp, &tmp_len, flags); if (ret) { free(tmp); return ret; } olen = *out_len; ret = _wind_stringprep_normalize(tmp, tmp_len, tmp, &olen); if (ret) { free(tmp); return ret; } ret = _wind_stringprep_prohibited(tmp, olen, flags); if (ret) { free(tmp); return ret; } ret = _wind_stringprep_testbidi(tmp, olen, flags); if (ret) { free(tmp); return ret; } /* Insignificant Character Handling for ldap-prep */ if (flags & WIND_PROFILE_LDAP_CASE_EXACT_ATTRIBUTE) { ret = _wind_ldap_case_exact_attribute(tmp, olen, out, out_len); #if 0 } else if (flags & WIND_PROFILE_LDAP_CASE_EXACT_ASSERTION) { } else if (flags & WIND_PROFILE_LDAP_NUMERIC) { } else if (flags & WIND_PROFILE_LDAP_TELEPHONE) { #endif } else { memcpy(out, tmp, sizeof(out[0]) * olen); *out_len = olen; } free(tmp); return ret; }
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: %u %u != %u\n", i, (unsigned)olen, (unsigned)t->olen); failures++; continue; } if (memcmp(t->out, out, sizeof(out[0]) * olen) != 0) { printf("memcmp: %u\n", i); failures++; continue; } } return failures != 0; }