283
* XXX this function is broken, it needs to compare code points, not
288
prune_space(const unsigned char **s)
295
_hx509_name_ds_cmp(const DirectoryString *ds1, const DirectoryString *ds2)
299
c = ds1->element - ds2->element;
303
switch(ds1->element) {
284
#define COPYCHARARRAY(_ds,_el,_l,_n) \
285
(_l) = strlen(_ds->u._el); \
286
(_n) = malloc((_l) * sizeof((_n)[0])); \
289
for (i = 0; i < (_l); i++) \
290
(_n)[i] = _ds->u._el[i]
293
#define COPYVALARRAY(_ds,_el,_l,_n) \
294
(_l) = _ds->u._el.length; \
295
(_n) = malloc((_l) * sizeof((_n)[0])); \
298
for (i = 0; i < (_l); i++) \
299
(_n)[i] = _ds->u._el.data[i]
301
#define COPYVOIDARRAY(_ds,_el,_l,_n) \
302
(_l) = _ds->u._el.length; \
303
(_n) = malloc((_l) * sizeof((_n)[0])); \
306
for (i = 0; i < (_l); i++) \
307
(_n)[i] = ((unsigned char *)_ds->u._el.data)[i]
312
dsstringprep(const DirectoryString *ds, uint32_t **rname, size_t *rlen)
314
wind_profile_flags flags = 0;
322
switch(ds->element) {
304
323
case choice_DirectoryString_ia5String:
305
c = strcmp(ds1->u.ia5String, ds2->u.ia5String);
324
COPYCHARARRAY(ds, ia5String, len, name);
326
case choice_DirectoryString_printableString:
327
flags = WIND_PROFILE_LDAP_CASE_EXACT_ATTRIBUTE;
328
COPYCHARARRAY(ds, printableString, len, name);
307
330
case choice_DirectoryString_teletexString:
308
c = der_heim_octet_string_cmp(&ds1->u.teletexString,
309
&ds2->u.teletexString);
311
case choice_DirectoryString_printableString: {
312
const unsigned char *s1 = (unsigned char*)ds1->u.printableString;
313
const unsigned char *s2 = (unsigned char*)ds2->u.printableString;
314
prune_space(&s1); prune_space(&s2);
316
if (toupper(*s1) != toupper(*s2)) {
317
c = toupper(*s1) - toupper(*s2);
320
if (*s1 == ' ') { prune_space(&s1); prune_space(&s2); }
323
prune_space(&s1); prune_space(&s2);
331
COPYVOIDARRAY(ds, teletexString, len, name);
333
case choice_DirectoryString_bmpString:
334
COPYVALARRAY(ds, bmpString, len, name);
336
case choice_DirectoryString_universalString:
337
COPYVALARRAY(ds, universalString, len, name);
327
339
case choice_DirectoryString_utf8String:
328
c = strcmp(ds1->u.utf8String, ds2->u.utf8String);
330
case choice_DirectoryString_universalString:
331
c = der_heim_universal_string_cmp(&ds1->u.universalString,
332
&ds2->u.universalString);
334
case choice_DirectoryString_bmpString:
335
c = der_heim_bmp_string_cmp(&ds1->u.bmpString,
340
ret = wind_utf8ucs4_length(ds->u.utf8String, &len);
343
name = malloc(len * sizeof(name[0]));
346
ret = wind_utf8ucs4(ds->u.utf8String, name, &len);
346
_hx509_name_cmp(const Name *n1, const Name *n2)
350
c = n1->u.rdnSequence.len - n2->u.rdnSequence.len;
351
_hx509_abort("unknown directory type: %d", ds->element);
355
/* try a couple of times to get the length right, XXX gross */
356
for (i = 0; i < 4; i++) {
358
*rname = malloc(*rlen * sizeof((*rname)[0]));
360
ret = wind_stringprep(name, len, *rname, rlen,
361
WIND_PROFILE_LDAP|flags);
362
if (ret == WIND_ERR_OVERRUN) {
382
_hx509_name_ds_cmp(const DirectoryString *ds1,
383
const DirectoryString *ds2,
386
uint32_t *ds1lp, *ds2lp;
387
size_t ds1len, ds2len;
390
ret = dsstringprep(ds1, &ds1lp, &ds1len);
393
ret = dsstringprep(ds2, &ds2lp, &ds2len);
399
if (ds1len != ds2len)
400
*diff = ds1len - ds2len;
402
*diff = memcmp(ds1lp, ds2lp, ds1len * sizeof(ds1lp[0]));
411
_hx509_name_cmp(const Name *n1, const Name *n2, int *c)
415
*c = n1->u.rdnSequence.len - n2->u.rdnSequence.len;
354
419
for (i = 0 ; i < n1->u.rdnSequence.len; i++) {
355
c = n1->u.rdnSequence.val[i].len - n2->u.rdnSequence.val[i].len;
420
*c = n1->u.rdnSequence.val[i].len - n2->u.rdnSequence.val[i].len;
359
424
for (j = 0; j < n1->u.rdnSequence.val[i].len; j++) {
360
c = der_heim_oid_cmp(&n1->u.rdnSequence.val[i].val[j].type,
361
&n1->u.rdnSequence.val[i].val[j].type);
425
*c = der_heim_oid_cmp(&n1->u.rdnSequence.val[i].val[j].type,
426
&n1->u.rdnSequence.val[i].val[j].type);
365
c = _hx509_name_ds_cmp(&n1->u.rdnSequence.val[i].val[j].value,
366
&n2->u.rdnSequence.val[i].val[j].value);
430
ret = _hx509_name_ds_cmp(&n1->u.rdnSequence.val[i].val[j].value,
431
&n2->u.rdnSequence.val[i].val[j].value,